@agent-native/core 0.12.11 → 0.12.12
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/dist/cli/workspace-dev.js +15 -11
- package/dist/cli/workspace-dev.js.map +1 -1
- package/dist/client/NewWorkspaceAppFlow.d.ts.map +1 -1
- package/dist/client/NewWorkspaceAppFlow.js +5 -2
- package/dist/client/NewWorkspaceAppFlow.js.map +1 -1
- package/dist/client/extensions/ExtensionsListPage.d.ts.map +1 -1
- package/dist/client/extensions/ExtensionsListPage.js +2 -2
- package/dist/client/extensions/ExtensionsListPage.js.map +1 -1
- package/dist/client/vite-dev-recovery-script.d.ts.map +1 -1
- package/dist/client/vite-dev-recovery-script.js +10 -1
- package/dist/client/vite-dev-recovery-script.js.map +1 -1
- package/dist/templates/default/app/root.tsx +14 -1
- package/dist/templates/default/package.json +0 -1
- package/dist/vite/client.d.ts +2 -0
- package/dist/vite/client.d.ts.map +1 -1
- package/dist/vite/client.js +2 -0
- package/dist/vite/client.js.map +1 -1
- package/package.json +1 -1
- package/src/templates/default/app/root.tsx +14 -1
- package/src/templates/default/package.json +0 -1
|
@@ -81,6 +81,18 @@ const defaultApp = process.env.WORKSPACE_DEFAULT_APP &&
|
|
|
81
81
|
: appById.has("dispatch")
|
|
82
82
|
? "dispatch"
|
|
83
83
|
: apps[0].id;
|
|
84
|
+
function isChildDevServerUrlLine(line) {
|
|
85
|
+
return /^\s*➜\s+(?:Local|Network):\s+https?:\/\/(?:localhost|127\.0\.0\.1|\[::1\]):\d+(?:\/\S*)?\s*$/i.test(line);
|
|
86
|
+
}
|
|
87
|
+
function pipeAppOutput(prefix, chunk, write) {
|
|
88
|
+
const lines = String(chunk)
|
|
89
|
+
.split(/\r?\n/)
|
|
90
|
+
.filter(Boolean)
|
|
91
|
+
.filter((line) => !isChildDevServerUrlLine(line));
|
|
92
|
+
if (lines.length === 0)
|
|
93
|
+
return;
|
|
94
|
+
write(lines.map((line) => `${prefix} ${line}`).join("\n") + "\n");
|
|
95
|
+
}
|
|
84
96
|
function syncApps() {
|
|
85
97
|
const discovered = discoverApps();
|
|
86
98
|
for (const app of discovered) {
|
|
@@ -176,18 +188,10 @@ function startApp(app) {
|
|
|
176
188
|
app.process = child;
|
|
177
189
|
const prefix = `[${app.id}]`;
|
|
178
190
|
child.stdout?.on("data", (chunk) => {
|
|
179
|
-
process.stdout.write(
|
|
180
|
-
.split(/\r?\n/)
|
|
181
|
-
.filter(Boolean)
|
|
182
|
-
.map((line) => `${prefix} ${line}`)
|
|
183
|
-
.join("\n") + "\n");
|
|
191
|
+
pipeAppOutput(prefix, chunk, (value) => process.stdout.write(value));
|
|
184
192
|
});
|
|
185
193
|
child.stderr?.on("data", (chunk) => {
|
|
186
|
-
process.stderr.write(
|
|
187
|
-
.split(/\r?\n/)
|
|
188
|
-
.filter(Boolean)
|
|
189
|
-
.map((line) => `${prefix} ${line}`)
|
|
190
|
-
.join("\n") + "\n");
|
|
194
|
+
pipeAppOutput(prefix, chunk, (value) => process.stderr.write(value));
|
|
191
195
|
});
|
|
192
196
|
child.on("exit", (code) => {
|
|
193
197
|
if (code === 0 || shuttingDown)
|
|
@@ -439,8 +443,8 @@ function listen(port, attempts = 20) {
|
|
|
439
443
|
const address = server.address();
|
|
440
444
|
const actualPort = typeof address === "object" && address ? address.port : port;
|
|
441
445
|
gatewayUrl = `http://${gatewayHost}:${actualPort}`;
|
|
442
|
-
console.log(`[workspace] Gateway: http://${gatewayHost}:${actualPort}`);
|
|
443
446
|
console.log(`[workspace] Default: http://${gatewayHost}:${actualPort}/${defaultApp}`);
|
|
447
|
+
console.log(`[workspace] Gateway: http://${gatewayHost}:${actualPort}`);
|
|
444
448
|
for (const app of apps) {
|
|
445
449
|
console.log(`[workspace] ${app.id}: /${app.id} -> 127.0.0.1:${app.port}`);
|
|
446
450
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace-dev.js","sourceRoot":"","sources":["../../src/cli/workspace-dev.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env tsx\nimport { spawn, type ChildProcess } from \"node:child_process\";\nimport fs from \"node:fs\";\nimport http from \"node:http\";\nimport net from \"node:net\";\nimport path from \"node:path\";\nimport type { Duplex } from \"node:stream\";\nimport * as Sentry from \"@sentry/node\";\nimport { extractOAuthStateAppId } from \"../shared/oauth-state.js\";\n\ninterface WorkspaceApp {\n id: string;\n name: string;\n dir: string;\n port: number;\n process?: ChildProcess;\n /**\n * Set true once we've successfully connected to the upstream. After that we\n * skip the readiness probe on every request — the child server stays\n * listening for the rest of the dev session.\n */\n ready?: boolean;\n}\n\nconst root = process.cwd();\nconst appsDir = path.join(root, \"apps\");\nfs.mkdirSync(path.join(root, \"data\"), { recursive: true });\nconst gatewayHost = process.env.WORKSPACE_HOST || \"127.0.0.1\";\nconst requestedPort = Number(\n process.env.WORKSPACE_PORT || process.env.PORT || 8080,\n);\nconst appPortStart = Number(process.env.WORKSPACE_APP_PORT_START || 8100);\nconst forceVite = process.env.WORKSPACE_VITE_FORCE === \"1\";\nlet gatewayUrl = `http://${gatewayHost}:${requestedPort}`;\n\nfunction readJson(file: string): any {\n try {\n return JSON.parse(fs.readFileSync(file, \"utf8\"));\n } catch {\n return null;\n }\n}\n\nfunction discoverApps(): WorkspaceApp[] {\n if (!fs.existsSync(appsDir)) return [];\n // existsSync → readdirSync is a TOCTOU race — appsDir can vanish between\n // the two calls (e.g. user running `git checkout` on the workspace mid-dev).\n // Treat ENOENT as \"no apps right now\" and let the next 2s sync recover.\n // Other errors get surfaced to Sentry so we learn about new failure modes.\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(appsDir, { withFileTypes: true });\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code !== \"ENOENT\") {\n console.warn(\n `[workspace] Could not read ${appsDir} (${code ?? \"unknown\"}): ` +\n `${(err as Error).message}`,\n );\n Sentry.captureException(err, {\n tags: { handled: \"dev-discover-readdir\" },\n level: \"warning\",\n });\n }\n return [];\n }\n return entries\n .filter((entry) => entry.isDirectory())\n .map((entry) => {\n const dir = path.join(appsDir, entry.name);\n const pkg = readJson(path.join(dir, \"package.json\"));\n if (!pkg) return null;\n return {\n id: entry.name,\n name: pkg.displayName || pkg.name || entry.name,\n dir,\n port: appPortStart,\n } satisfies WorkspaceApp;\n })\n .filter((app): app is WorkspaceApp => !!app)\n .sort((a, b) => {\n if (a.id === \"dispatch\") return -1;\n if (b.id === \"dispatch\") return 1;\n return a.id.localeCompare(b.id);\n })\n .map((app, index) => ({ ...app, port: appPortStart + index }));\n}\n\nconst apps = discoverApps();\nif (apps.length === 0) {\n console.error(\"[workspace] No apps found under ./apps\");\n process.exit(1);\n}\n\nconst appById = new Map(apps.map((app) => [app.id, app]));\nconst defaultApp =\n process.env.WORKSPACE_DEFAULT_APP &&\n appById.has(process.env.WORKSPACE_DEFAULT_APP)\n ? process.env.WORKSPACE_DEFAULT_APP\n : appById.has(\"dispatch\")\n ? \"dispatch\"\n : apps[0].id;\n\nfunction syncApps(): void {\n const discovered = discoverApps();\n for (const app of discovered) {\n if (appById.has(app.id)) continue;\n const usedPorts = new Set(apps.map((existing) => existing.port));\n let port = appPortStart;\n while (usedPorts.has(port)) port++;\n const next = { ...app, port };\n apps.push(next);\n apps.sort((a, b) => {\n if (a.id === \"dispatch\") return -1;\n if (b.id === \"dispatch\") return 1;\n return a.id.localeCompare(b.id);\n });\n appById.set(next.id, next);\n console.log(`[workspace] Detected new app: /${next.id}`);\n startApp(next);\n }\n}\n\nlet syncTimer: NodeJS.Timeout | undefined;\nfunction scheduleSync(): void {\n if (syncTimer) clearTimeout(syncTimer);\n syncTimer = setTimeout(syncApps, 400);\n}\n\nfunction firstPathSegment(url: string | undefined): string | null {\n if (!url) return null;\n try {\n const parsed = new URL(url, \"http://workspace.local\");\n const [segment] = parsed.pathname.split(\"/\").filter(Boolean);\n return segment || null;\n } catch {\n return null;\n }\n}\n\nfunction appForRequest(req: http.IncomingMessage): WorkspaceApp | null {\n const params = new URL(req.url || \"/\", \"http://workspace.local\").searchParams;\n const explicit = params.get(\"_app\");\n if (explicit && appById.has(explicit)) return appById.get(explicit) ?? null;\n\n const direct = firstPathSegment(req.url);\n if (direct && appById.has(direct)) return appById.get(direct) ?? null;\n\n const fromState = extractOAuthStateAppId(params.get(\"state\"));\n if (fromState && appById.has(fromState)) {\n return appById.get(fromState) ?? null;\n }\n\n const referer = req.headers.referer;\n const fromReferer =\n typeof referer === \"string\" ? firstPathSegment(referer) : null;\n return fromReferer && appById.has(fromReferer)\n ? (appById.get(fromReferer) ?? null)\n : null;\n}\n\nfunction startApp(app: WorkspaceApp): void {\n const basePath = `/${app.id}`;\n const workspaceAppsJson = JSON.stringify(\n apps.map((workspaceApp) => ({\n id: workspaceApp.id,\n name: workspaceApp.name,\n path: `/${workspaceApp.id}`,\n })),\n );\n const child = spawn(\n \"pnpm\",\n [\n \"--dir\",\n app.dir,\n \"exec\",\n \"vite\",\n \"--host\",\n \"127.0.0.1\",\n \"--port\",\n String(app.port),\n \"--strictPort\",\n ...(forceVite ? [\"--force\"] : []),\n ],\n {\n cwd: root,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n env: {\n ...process.env,\n APP_NAME: app.id,\n AGENT_NATIVE_WORKSPACE: \"1\",\n AGENT_NATIVE_WORKSPACE_APPS_JSON: workspaceAppsJson,\n APP_BASE_PATH: basePath,\n VITE_AGENT_NATIVE_WORKSPACE: \"1\",\n VITE_APP_BASE_PATH: basePath,\n PORT: String(app.port),\n WORKSPACE_GATEWAY_URL: gatewayUrl,\n },\n },\n );\n app.process = child;\n\n const prefix = `[${app.id}]`;\n child.stdout?.on(\"data\", (chunk) => {\n process.stdout.write(\n String(chunk)\n .split(/\\r?\\n/)\n .filter(Boolean)\n .map((line) => `${prefix} ${line}`)\n .join(\"\\n\") + \"\\n\",\n );\n });\n child.stderr?.on(\"data\", (chunk) => {\n process.stderr.write(\n String(chunk)\n .split(/\\r?\\n/)\n .filter(Boolean)\n .map((line) => `${prefix} ${line}`)\n .join(\"\\n\") + \"\\n\",\n );\n });\n child.on(\"exit\", (code) => {\n if (code === 0 || shuttingDown) return;\n console.error(`${prefix} exited with code ${code}`);\n });\n}\n\nfunction renderIndex(): string {\n return `<!doctype html>\n<html>\n <head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <title>Agent-Native Workspace</title>\n <style>\n body { font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif; margin: 0; padding: 32px; background: #fafafa; color: #171717; }\n main { max-width: 760px; margin: 0 auto; }\n a { color: inherit; text-decoration: none; }\n .grid { display: grid; gap: 12px; margin-top: 20px; }\n .card { display: flex; justify-content: space-between; border: 1px solid #d4d4d4; border-radius: 8px; padding: 14px 16px; background: white; }\n .muted { color: #737373; }\n </style>\n </head>\n <body>\n <main>\n <h1>Agent-Native Workspace</h1>\n <p class=\"muted\">Open an app below. Dispatch is the workspace control plane.</p>\n <div class=\"grid\">\n ${apps\n .map(\n (app) =>\n `<a class=\"card\" href=\"/${app.id}\"><strong>${app.name}</strong><span class=\"muted\">/${app.id}</span></a>`,\n )\n .join(\"\")}\n </div>\n </main>\n </body>\n</html>`;\n}\n\n// On `pnpm dev` the gateway answers requests immediately, but each app's vite\n// server takes a beat to bind its port. Without retry, the user sees an\n// \"App is not ready yet: ECONNREFUSED\" banner on the first page load and has\n// to refresh manually. We do a quick pre-flight TCP connect with retry so\n// startup is invisible for the common case (small/no body, slow boot).\nconst PROXY_READY_TIMEOUT_MS = Number(\n process.env.WORKSPACE_PROXY_READY_TIMEOUT_MS ?? 30_000,\n);\nconst PROXY_READY_RETRY_DELAY_MS = 250;\n\nfunction probePort(port: number, timeoutMs = 1_000): Promise<boolean> {\n return new Promise((resolve) => {\n const socket = new net.Socket();\n let settled = false;\n const finish = (ok: boolean) => {\n if (settled) return;\n settled = true;\n socket.destroy();\n resolve(ok);\n };\n socket.setTimeout(timeoutMs);\n socket.once(\"connect\", () => finish(true));\n socket.once(\"error\", () => finish(false));\n socket.once(\"timeout\", () => finish(false));\n socket.connect(port, \"127.0.0.1\");\n });\n}\n\nasync function waitForPort(port: number, deadline: number): Promise<boolean> {\n while (Date.now() < deadline) {\n if (await probePort(port)) return true;\n await new Promise((r) => setTimeout(r, PROXY_READY_RETRY_DELAY_MS));\n }\n return false;\n}\n\nfunction proxyHttp(\n app: WorkspaceApp,\n req: http.IncomingMessage,\n res: http.ServerResponse,\n): void {\n const dispatch = () => {\n const headers = { ...req.headers, host: `127.0.0.1:${app.port}` };\n const proxyReq = http.request(\n {\n hostname: \"127.0.0.1\",\n port: app.port,\n method: req.method,\n path: req.url,\n headers,\n },\n (proxyRes) => {\n app.ready = true;\n res.writeHead(proxyRes.statusCode ?? 502, proxyRes.headers);\n proxyRes.pipe(res);\n },\n );\n\n proxyReq.on(\"error\", (err) => {\n if (res.headersSent) {\n res.end();\n return;\n }\n res.writeHead(502, { \"content-type\": \"text/plain\" });\n res.end(`App \"${app.id}\" is not ready yet: ${err.message}`);\n });\n\n req.pipe(proxyReq);\n };\n\n // Fast path: the upstream has accepted at least one request before, so it's\n // listening. Skip the probe so steady-state requests stay zero-latency.\n if (app.ready) {\n dispatch();\n return;\n }\n\n // Cold path: hold the request open while the child server boots. Node\n // keeps the request body in paused mode until a consumer attaches via\n // pipe(), so awaiting waitForPort() doesn't lose data.\n void waitForPort(app.port, Date.now() + PROXY_READY_TIMEOUT_MS).then(\n (ready) => {\n if (!ready) {\n if (!res.headersSent) {\n res.writeHead(502, { \"content-type\": \"text/plain\" });\n res.end(\n `App \"${app.id}\" is not ready yet: connect ECONNREFUSED 127.0.0.1:${app.port}`,\n );\n } else {\n res.end();\n }\n return;\n }\n app.ready = true;\n dispatch();\n },\n );\n}\n\nfunction proxyUpgrade(\n app: WorkspaceApp,\n req: http.IncomingMessage,\n socket: Duplex,\n head: Buffer,\n): void {\n const target = net.connect(app.port, \"127.0.0.1\", () => {\n const headers = Object.entries({\n ...req.headers,\n host: `127.0.0.1:${app.port}`,\n })\n .flatMap(([key, value]) =>\n Array.isArray(value)\n ? value.map((item) => `${key}: ${item}`)\n : [`${key}: ${value ?? \"\"}`],\n )\n .join(\"\\r\\n\");\n target.write(\n `${req.method} ${req.url} HTTP/${req.httpVersion}\\r\\n${headers}\\r\\n\\r\\n`,\n );\n if (head.length) target.write(head);\n socket.pipe(target).pipe(socket);\n });\n\n target.on(\"error\", () => socket.destroy());\n}\n\nlet shuttingDown = false;\nlet workspaceStarted = false;\n\nfunction handleWatcherError(err: NodeJS.ErrnoException): void {\n // ENOSPC: system inotify watcher limit hit (Linux). Userland-fixable;\n // capture as a warning so we still see frequency in Sentry but don't get\n // paged. Print actionable guidance and continue without watching — the\n // 2s polling interval below keeps app discovery working.\n if (err.code === \"ENOSPC\") {\n console.warn(\n `[workspace] Recursive file watcher hit the system limit (ENOSPC). ` +\n `New apps will still be detected via polling every ~2s. ` +\n `On Linux you can raise the limit with ` +\n `\\`sudo sysctl fs.inotify.max_user_watches=524288\\` ` +\n `(persist via /etc/sysctl.d/*.conf). On macOS/Windows this usually ` +\n `means too many other watchers are running.`,\n );\n Sentry.captureException(err, {\n tags: { handled: \"dev-watch-enospc\" },\n level: \"warning\",\n });\n return;\n }\n // ENOENT: a watched directory disappeared (or a transient subdir under\n // appsDir vanished mid-enumeration). Benign — the polling fallback and\n // future scheduleSync calls will re-establish state. Don't capture.\n if (err.code === \"ENOENT\") {\n console.debug(\n `[workspace] Recursive file watcher saw a directory disappear ` +\n `(ENOENT: ${err.path ?? \"unknown\"}). Polling fallback will recover.`,\n );\n return;\n }\n // Unknown failure mode — keep the dev experience alive (polling still\n // runs) but surface to Sentry as a warning so we learn about new cases.\n console.warn(\n `[workspace] Recursive file watcher failed (${err.code ?? \"unknown\"}): ${err.message}. ` +\n `Falling back to polling.`,\n );\n Sentry.captureException(err, {\n tags: { handled: \"dev-watch-unknown\" },\n level: \"warning\",\n });\n}\n\nfunction startWorkspaceProcesses(): void {\n if (workspaceStarted) return;\n workspaceStarted = true;\n for (const app of apps) startApp(app);\n try {\n const watcher = fs.watch(appsDir, { recursive: true }, scheduleSync);\n // Async errors (e.g. ENOENT when a subdir vanishes mid-watch) surface on\n // the watcher rather than the original call site. Without an `error`\n // listener, Node would treat them as uncaught and crash the dev process.\n watcher.on(\"error\", (err) => {\n handleWatcherError(err as NodeJS.ErrnoException);\n });\n } catch (err) {\n handleWatcherError(err as NodeJS.ErrnoException);\n }\n setInterval(syncApps, 2_000).unref();\n}\n\nfunction openBrowser(url: string): void {\n if (process.env.WORKSPACE_NO_OPEN === \"1\") return;\n const command =\n process.platform === \"darwin\"\n ? \"open\"\n : process.platform === \"win32\"\n ? \"cmd\"\n : \"xdg-open\";\n const args = process.platform === \"win32\" ? [\"/c\", \"start\", \"\", url] : [url];\n const child = spawn(command, args, {\n stdio: \"ignore\",\n detached: true,\n });\n child.unref();\n}\n\nconst server = http.createServer((req, res) => {\n if (req.url === \"/\" || req.url === \"/index.html\") {\n res.writeHead(302, { location: `/${defaultApp}` });\n res.end();\n return;\n }\n\n if (req.url === \"/_workspace/apps\") {\n res.writeHead(200, { \"content-type\": \"application/json\" });\n res.end(\n JSON.stringify(\n apps.map((app) => ({\n id: app.id,\n name: app.name,\n path: `/${app.id}`,\n port: app.port,\n })),\n ),\n );\n return;\n }\n\n const app = appForRequest(req);\n if (!app) {\n res.writeHead(404, { \"content-type\": \"text/html\" });\n res.end(renderIndex());\n return;\n }\n proxyHttp(app, req, res);\n});\n\nserver.on(\"upgrade\", (req, socket, head) => {\n const app = appForRequest(req);\n if (!app) {\n socket.destroy();\n return;\n }\n proxyUpgrade(app, req, socket, head);\n});\n\nfunction listen(port: number, attempts = 20): void {\n server.once(\"error\", (err: NodeJS.ErrnoException) => {\n if (err.code === \"EADDRINUSE\" && attempts > 0) {\n listen(port + 1, attempts - 1);\n return;\n }\n console.error(`[workspace] Could not start gateway: ${err.message}`);\n process.exit(1);\n });\n server.listen(port, gatewayHost, () => {\n const address = server.address();\n const actualPort =\n typeof address === \"object\" && address ? address.port : port;\n gatewayUrl = `http://${gatewayHost}:${actualPort}`;\n console.log(`[workspace] Gateway: http://${gatewayHost}:${actualPort}`);\n console.log(\n `[workspace] Default: http://${gatewayHost}:${actualPort}/${defaultApp}`,\n );\n for (const app of apps) {\n console.log(`[workspace] ${app.id}: /${app.id} -> 127.0.0.1:${app.port}`);\n }\n startWorkspaceProcesses();\n openBrowser(`http://${gatewayHost}:${actualPort}/${defaultApp}`);\n });\n}\n\nfunction shutdown(): void {\n if (shuttingDown) return;\n shuttingDown = true;\n server.close();\n for (const app of apps) {\n app.process?.kill(\"SIGTERM\");\n }\n setTimeout(() => process.exit(0), 300).unref();\n}\n\nprocess.on(\"SIGINT\", shutdown);\nprocess.on(\"SIGTERM\", shutdown);\n\nlisten(requestedPort);\n"]}
|
|
1
|
+
{"version":3,"file":"workspace-dev.js","sourceRoot":"","sources":["../../src/cli/workspace-dev.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,KAAK,EAAqB,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,GAAG,MAAM,UAAU,CAAC;AAC3B,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,KAAK,MAAM,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAgBlE,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;AAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AACxC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC3D,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,WAAW,CAAC;AAC9D,MAAM,aAAa,GAAG,MAAM,CAC1B,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CACvD,CAAC;AACF,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,IAAI,CAAC,CAAC;AAC1E,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,GAAG,CAAC;AAC3D,IAAI,UAAU,GAAG,UAAU,WAAW,IAAI,aAAa,EAAE,CAAC;AAE1D,SAAS,QAAQ,CAAC,IAAY;IAC5B,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IACnD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,YAAY;IACnB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,CAAC;IACvC,yEAAyE;IACzE,6EAA6E;IAC7E,wEAAwE;IACxE,2EAA2E;IAC3E,IAAI,OAAoB,CAAC;IACzB,IAAI,CAAC;QACH,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,GAAI,GAA6B,CAAC,IAAI,CAAC;QACjD,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,OAAO,CAAC,IAAI,CACV,8BAA8B,OAAO,KAAK,IAAI,IAAI,SAAS,KAAK;gBAC9D,GAAI,GAAa,CAAC,OAAO,EAAE,CAC9B,CAAC;YACF,MAAM,CAAC,gBAAgB,CAAC,GAAG,EAAE;gBAC3B,IAAI,EAAE,EAAE,OAAO,EAAE,sBAAsB,EAAE;gBACzC,KAAK,EAAE,SAAS;aACjB,CAAC,CAAC;QACL,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,OAAO;SACX,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;SACtC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACb,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC;QACrD,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QACtB,OAAO;YACL,EAAE,EAAE,KAAK,CAAC,IAAI;YACd,IAAI,EAAE,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI;YAC/C,GAAG;YACH,IAAI,EAAE,YAAY;SACI,CAAC;IAC3B,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,GAAG,EAAuB,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;SAC3C,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACb,IAAI,CAAC,CAAC,EAAE,KAAK,UAAU;YAAE,OAAO,CAAC,CAAC,CAAC;QACnC,IAAI,CAAC,CAAC,EAAE,KAAK,UAAU;YAAE,OAAO,CAAC,CAAC;QAClC,OAAO,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAClC,CAAC,CAAC;SACD,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,IAAI,EAAE,YAAY,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,IAAI,GAAG,YAAY,EAAE,CAAC;AAC5B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;IACtB,OAAO,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;IACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;AAC1D,MAAM,UAAU,GACd,OAAO,CAAC,GAAG,CAAC,qBAAqB;IACjC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;IAC5C,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB;IACnC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;QACvB,CAAC,CAAC,UAAU;QACZ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAEnB,SAAS,uBAAuB,CAAC,IAAY;IAC3C,OAAO,+FAA+F,CAAC,IAAI,CACzG,IAAI,CACL,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CACpB,MAAc,EACd,KAAc,EACd,KAA8B;IAE9B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;SACxB,KAAK,CAAC,OAAO,CAAC;SACd,MAAM,CAAC,OAAO,CAAC;SACf,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAC;IACpD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAC/B,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;AACpE,CAAC;AAED,SAAS,QAAQ;IACf,MAAM,UAAU,GAAG,YAAY,EAAE,CAAC;IAClC,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,SAAS;QAClC,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;QACjE,IAAI,IAAI,GAAG,YAAY,CAAC;QACxB,OAAO,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,IAAI,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,EAAE,GAAG,GAAG,EAAE,IAAI,EAAE,CAAC;QAC9B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChB,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACjB,IAAI,CAAC,CAAC,EAAE,KAAK,UAAU;gBAAE,OAAO,CAAC,CAAC,CAAC;YACnC,IAAI,CAAC,CAAC,EAAE,KAAK,UAAU;gBAAE,OAAO,CAAC,CAAC;YAClC,OAAO,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,kCAAkC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QACzD,QAAQ,CAAC,IAAI,CAAC,CAAC;IACjB,CAAC;AACH,CAAC;AAED,IAAI,SAAqC,CAAC;AAC1C,SAAS,YAAY;IACnB,IAAI,SAAS;QAAE,YAAY,CAAC,SAAS,CAAC,CAAC;IACvC,SAAS,GAAG,UAAU,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;AACxC,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAuB;IAC/C,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,EAAE,wBAAwB,CAAC,CAAC;QACtD,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC7D,OAAO,OAAO,IAAI,IAAI,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,GAAyB;IAC9C,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,wBAAwB,CAAC,CAAC,YAAY,CAAC;IAC9E,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACpC,IAAI,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;QAAE,OAAO,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC;IAE5E,MAAM,MAAM,GAAG,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACzC,IAAI,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;QAAE,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC;IAEtE,MAAM,SAAS,GAAG,sBAAsB,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9D,IAAI,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;QACxC,OAAO,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC;IACxC,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC;IACpC,MAAM,WAAW,GACf,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACjE,OAAO,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;QAC5C,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC;QACpC,CAAC,CAAC,IAAI,CAAC;AACX,CAAC;AAED,SAAS,QAAQ,CAAC,GAAiB;IACjC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;IAC9B,MAAM,iBAAiB,GAAG,IAAI,CAAC,SAAS,CACtC,IAAI,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;QAC1B,EAAE,EAAE,YAAY,CAAC,EAAE;QACnB,IAAI,EAAE,YAAY,CAAC,IAAI;QACvB,IAAI,EAAE,IAAI,YAAY,CAAC,EAAE,EAAE;KAC5B,CAAC,CAAC,CACJ,CAAC;IACF,MAAM,KAAK,GAAG,KAAK,CACjB,MAAM,EACN;QACE,OAAO;QACP,GAAG,CAAC,GAAG;QACP,MAAM;QACN,MAAM;QACN,QAAQ;QACR,WAAW;QACX,QAAQ;QACR,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;QAChB,cAAc;QACd,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KAClC,EACD;QACE,GAAG,EAAE,IAAI;QACT,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;QACjC,GAAG,EAAE;YACH,GAAG,OAAO,CAAC,GAAG;YACd,QAAQ,EAAE,GAAG,CAAC,EAAE;YAChB,sBAAsB,EAAE,GAAG;YAC3B,gCAAgC,EAAE,iBAAiB;YACnD,aAAa,EAAE,QAAQ;YACvB,2BAA2B,EAAE,GAAG;YAChC,kBAAkB,EAAE,QAAQ;YAC5B,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;YACtB,qBAAqB,EAAE,UAAU;SAClC;KACF,CACF,CAAC;IACF,GAAG,CAAC,OAAO,GAAG,KAAK,CAAC;IAEpB,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,EAAE,GAAG,CAAC;IAC7B,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;QACjC,aAAa,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IACH,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;QACjC,aAAa,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IACH,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;QACxB,IAAI,IAAI,KAAK,CAAC,IAAI,YAAY;YAAE,OAAO;QACvC,OAAO,CAAC,KAAK,CAAC,GAAG,MAAM,qBAAqB,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,WAAW;IAClB,OAAO;;;;;;;;;;;;;;;;;;;;UAoBC,IAAI;SACH,GAAG,CACF,CAAC,GAAG,EAAE,EAAE,CACN,0BAA0B,GAAG,CAAC,EAAE,aAAa,GAAG,CAAC,IAAI,iCAAiC,GAAG,CAAC,EAAE,aAAa,CAC5G;SACA,IAAI,CAAC,EAAE,CAAC;;;;QAIX,CAAC;AACT,CAAC;AAED,8EAA8E;AAC9E,wEAAwE;AACxE,6EAA6E;AAC7E,0EAA0E;AAC1E,uEAAuE;AACvE,MAAM,sBAAsB,GAAG,MAAM,CACnC,OAAO,CAAC,GAAG,CAAC,gCAAgC,IAAI,MAAM,CACvD,CAAC;AACF,MAAM,0BAA0B,GAAG,GAAG,CAAC;AAEvC,SAAS,SAAS,CAAC,IAAY,EAAE,SAAS,GAAG,KAAK;IAChD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QAChC,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,MAAM,MAAM,GAAG,CAAC,EAAW,EAAE,EAAE;YAC7B,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,MAAM,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO,CAAC,EAAE,CAAC,CAAC;QACd,CAAC,CAAC;QACF,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAC7B,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3C,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC1C,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC5C,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,IAAY,EAAE,QAAgB;IACvD,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC7B,IAAI,MAAM,SAAS,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QACvC,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,0BAA0B,CAAC,CAAC,CAAC;IACtE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,SAAS,CAChB,GAAiB,EACjB,GAAyB,EACzB,GAAwB;IAExB,MAAM,QAAQ,GAAG,GAAG,EAAE;QACpB,MAAM,OAAO,GAAG,EAAE,GAAG,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,aAAa,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;QAClE,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAC3B;YACE,QAAQ,EAAE,WAAW;YACrB,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,IAAI,EAAE,GAAG,CAAC,GAAG;YACb,OAAO;SACR,EACD,CAAC,QAAQ,EAAE,EAAE;YACX,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC;YACjB,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU,IAAI,GAAG,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC5D,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrB,CAAC,CACF,CAAC;QAEF,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YAC3B,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;gBACpB,GAAG,CAAC,GAAG,EAAE,CAAC;gBACV,OAAO;YACT,CAAC;YACD,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC,CAAC;YACrD,GAAG,CAAC,GAAG,CAAC,QAAQ,GAAG,CAAC,EAAE,uBAAuB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACrB,CAAC,CAAC;IAEF,4EAA4E;IAC5E,wEAAwE;IACxE,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;QACd,QAAQ,EAAE,CAAC;QACX,OAAO;IACT,CAAC;IAED,sEAAsE;IACtE,sEAAsE;IACtE,uDAAuD;IACvD,KAAK,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,sBAAsB,CAAC,CAAC,IAAI,CAClE,CAAC,KAAK,EAAE,EAAE;QACR,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;gBACrB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC,CAAC;gBACrD,GAAG,CAAC,GAAG,CACL,QAAQ,GAAG,CAAC,EAAE,sDAAsD,GAAG,CAAC,IAAI,EAAE,CAC/E,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,GAAG,EAAE,CAAC;YACZ,CAAC;YACD,OAAO;QACT,CAAC;QACD,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC;QACjB,QAAQ,EAAE,CAAC;IACb,CAAC,CACF,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CACnB,GAAiB,EACjB,GAAyB,EACzB,MAAc,EACd,IAAY;IAEZ,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE;QACrD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;YAC7B,GAAG,GAAG,CAAC,OAAO;YACd,IAAI,EAAE,aAAa,GAAG,CAAC,IAAI,EAAE;SAC9B,CAAC;aACC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CACxB,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YAClB,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,IAAI,EAAE,CAAC;YACxC,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,KAAK,IAAI,EAAE,EAAE,CAAC,CAC/B;aACA,IAAI,CAAC,MAAM,CAAC,CAAC;QAChB,MAAM,CAAC,KAAK,CACV,GAAG,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,GAAG,SAAS,GAAG,CAAC,WAAW,OAAO,OAAO,UAAU,CACzE,CAAC;QACF,IAAI,IAAI,CAAC,MAAM;YAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;AAC7C,CAAC;AAED,IAAI,YAAY,GAAG,KAAK,CAAC;AACzB,IAAI,gBAAgB,GAAG,KAAK,CAAC;AAE7B,SAAS,kBAAkB,CAAC,GAA0B;IACpD,sEAAsE;IACtE,yEAAyE;IACzE,uEAAuE;IACvE,yDAAyD;IACzD,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC1B,OAAO,CAAC,IAAI,CACV,oEAAoE;YAClE,yDAAyD;YACzD,wCAAwC;YACxC,qDAAqD;YACrD,oEAAoE;YACpE,4CAA4C,CAC/C,CAAC;QACF,MAAM,CAAC,gBAAgB,CAAC,GAAG,EAAE;YAC3B,IAAI,EAAE,EAAE,OAAO,EAAE,kBAAkB,EAAE;YACrC,KAAK,EAAE,SAAS;SACjB,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IACD,uEAAuE;IACvE,uEAAuE;IACvE,oEAAoE;IACpE,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC1B,OAAO,CAAC,KAAK,CACX,+DAA+D;YAC7D,YAAY,GAAG,CAAC,IAAI,IAAI,SAAS,mCAAmC,CACvE,CAAC;QACF,OAAO;IACT,CAAC;IACD,sEAAsE;IACtE,wEAAwE;IACxE,OAAO,CAAC,IAAI,CACV,8CAA8C,GAAG,CAAC,IAAI,IAAI,SAAS,MAAM,GAAG,CAAC,OAAO,IAAI;QACtF,0BAA0B,CAC7B,CAAC;IACF,MAAM,CAAC,gBAAgB,CAAC,GAAG,EAAE;QAC3B,IAAI,EAAE,EAAE,OAAO,EAAE,mBAAmB,EAAE;QACtC,KAAK,EAAE,SAAS;KACjB,CAAC,CAAC;AACL,CAAC;AAED,SAAS,uBAAuB;IAC9B,IAAI,gBAAgB;QAAE,OAAO;IAC7B,gBAAgB,GAAG,IAAI,CAAC;IACxB,KAAK,MAAM,GAAG,IAAI,IAAI;QAAE,QAAQ,CAAC,GAAG,CAAC,CAAC;IACtC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,YAAY,CAAC,CAAC;QACrE,yEAAyE;QACzE,qEAAqE;QACrE,yEAAyE;QACzE,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YAC1B,kBAAkB,CAAC,GAA4B,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,kBAAkB,CAAC,GAA4B,CAAC,CAAC;IACnD,CAAC;IACD,WAAW,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;AACvC,CAAC;AAED,SAAS,WAAW,CAAC,GAAW;IAC9B,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,GAAG;QAAE,OAAO;IAClD,MAAM,OAAO,GACX,OAAO,CAAC,QAAQ,KAAK,QAAQ;QAC3B,CAAC,CAAC,MAAM;QACR,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO;YAC5B,CAAC,CAAC,KAAK;YACP,CAAC,CAAC,UAAU,CAAC;IACnB,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC7E,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE;QACjC,KAAK,EAAE,QAAQ;QACf,QAAQ,EAAE,IAAI;KACf,CAAC,CAAC;IACH,KAAK,CAAC,KAAK,EAAE,CAAC;AAChB,CAAC;AAED,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;IAC5C,IAAI,GAAG,CAAC,GAAG,KAAK,GAAG,IAAI,GAAG,CAAC,GAAG,KAAK,aAAa,EAAE,CAAC;QACjD,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,IAAI,UAAU,EAAE,EAAE,CAAC,CAAC;QACnD,GAAG,CAAC,GAAG,EAAE,CAAC;QACV,OAAO;IACT,CAAC;IAED,IAAI,GAAG,CAAC,GAAG,KAAK,kBAAkB,EAAE,CAAC;QACnC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAC3D,GAAG,CAAC,GAAG,CACL,IAAI,CAAC,SAAS,CACZ,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACjB,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,IAAI,EAAE,IAAI,GAAG,CAAC,EAAE,EAAE;YAClB,IAAI,EAAE,GAAG,CAAC,IAAI;SACf,CAAC,CAAC,CACJ,CACF,CAAC;QACF,OAAO;IACT,CAAC;IAED,MAAM,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IAC/B,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,CAAC;QACpD,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;QACvB,OAAO;IACT,CAAC;IACD,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAC3B,CAAC,CAAC,CAAC;AAEH,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;IACzC,MAAM,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IAC/B,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,CAAC,OAAO,EAAE,CAAC;QACjB,OAAO;IACT,CAAC;IACD,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;AACvC,CAAC,CAAC,CAAC;AAEH,SAAS,MAAM,CAAC,IAAY,EAAE,QAAQ,GAAG,EAAE;IACzC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,GAA0B,EAAE,EAAE;QAClD,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;YAC9C,MAAM,CAAC,IAAI,GAAG,CAAC,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC;YAC/B,OAAO;QACT,CAAC;QACD,OAAO,CAAC,KAAK,CAAC,wCAAwC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE;QACpC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;QACjC,MAAM,UAAU,GACd,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QAC/D,UAAU,GAAG,UAAU,WAAW,IAAI,UAAU,EAAE,CAAC;QACnD,OAAO,CAAC,GAAG,CACT,+BAA+B,WAAW,IAAI,UAAU,IAAI,UAAU,EAAE,CACzE,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,+BAA+B,WAAW,IAAI,UAAU,EAAE,CAAC,CAAC;QACxE,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,eAAe,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,iBAAiB,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QAC5E,CAAC;QACD,uBAAuB,EAAE,CAAC;QAC1B,WAAW,CAAC,UAAU,WAAW,IAAI,UAAU,IAAI,UAAU,EAAE,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,QAAQ;IACf,IAAI,YAAY;QAAE,OAAO;IACzB,YAAY,GAAG,IAAI,CAAC;IACpB,MAAM,CAAC,KAAK,EAAE,CAAC;IACf,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IAC/B,CAAC;IACD,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC;AACjD,CAAC;AAED,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AAEhC,MAAM,CAAC,aAAa,CAAC,CAAC","sourcesContent":["#!/usr/bin/env tsx\nimport { spawn, type ChildProcess } from \"node:child_process\";\nimport fs from \"node:fs\";\nimport http from \"node:http\";\nimport net from \"node:net\";\nimport path from \"node:path\";\nimport type { Duplex } from \"node:stream\";\nimport * as Sentry from \"@sentry/node\";\nimport { extractOAuthStateAppId } from \"../shared/oauth-state.js\";\n\ninterface WorkspaceApp {\n id: string;\n name: string;\n dir: string;\n port: number;\n process?: ChildProcess;\n /**\n * Set true once we've successfully connected to the upstream. After that we\n * skip the readiness probe on every request — the child server stays\n * listening for the rest of the dev session.\n */\n ready?: boolean;\n}\n\nconst root = process.cwd();\nconst appsDir = path.join(root, \"apps\");\nfs.mkdirSync(path.join(root, \"data\"), { recursive: true });\nconst gatewayHost = process.env.WORKSPACE_HOST || \"127.0.0.1\";\nconst requestedPort = Number(\n process.env.WORKSPACE_PORT || process.env.PORT || 8080,\n);\nconst appPortStart = Number(process.env.WORKSPACE_APP_PORT_START || 8100);\nconst forceVite = process.env.WORKSPACE_VITE_FORCE === \"1\";\nlet gatewayUrl = `http://${gatewayHost}:${requestedPort}`;\n\nfunction readJson(file: string): any {\n try {\n return JSON.parse(fs.readFileSync(file, \"utf8\"));\n } catch {\n return null;\n }\n}\n\nfunction discoverApps(): WorkspaceApp[] {\n if (!fs.existsSync(appsDir)) return [];\n // existsSync → readdirSync is a TOCTOU race — appsDir can vanish between\n // the two calls (e.g. user running `git checkout` on the workspace mid-dev).\n // Treat ENOENT as \"no apps right now\" and let the next 2s sync recover.\n // Other errors get surfaced to Sentry so we learn about new failure modes.\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(appsDir, { withFileTypes: true });\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code !== \"ENOENT\") {\n console.warn(\n `[workspace] Could not read ${appsDir} (${code ?? \"unknown\"}): ` +\n `${(err as Error).message}`,\n );\n Sentry.captureException(err, {\n tags: { handled: \"dev-discover-readdir\" },\n level: \"warning\",\n });\n }\n return [];\n }\n return entries\n .filter((entry) => entry.isDirectory())\n .map((entry) => {\n const dir = path.join(appsDir, entry.name);\n const pkg = readJson(path.join(dir, \"package.json\"));\n if (!pkg) return null;\n return {\n id: entry.name,\n name: pkg.displayName || pkg.name || entry.name,\n dir,\n port: appPortStart,\n } satisfies WorkspaceApp;\n })\n .filter((app): app is WorkspaceApp => !!app)\n .sort((a, b) => {\n if (a.id === \"dispatch\") return -1;\n if (b.id === \"dispatch\") return 1;\n return a.id.localeCompare(b.id);\n })\n .map((app, index) => ({ ...app, port: appPortStart + index }));\n}\n\nconst apps = discoverApps();\nif (apps.length === 0) {\n console.error(\"[workspace] No apps found under ./apps\");\n process.exit(1);\n}\n\nconst appById = new Map(apps.map((app) => [app.id, app]));\nconst defaultApp =\n process.env.WORKSPACE_DEFAULT_APP &&\n appById.has(process.env.WORKSPACE_DEFAULT_APP)\n ? process.env.WORKSPACE_DEFAULT_APP\n : appById.has(\"dispatch\")\n ? \"dispatch\"\n : apps[0].id;\n\nfunction isChildDevServerUrlLine(line: string): boolean {\n return /^\\s*➜\\s+(?:Local|Network):\\s+https?:\\/\\/(?:localhost|127\\.0\\.0\\.1|\\[::1\\]):\\d+(?:\\/\\S*)?\\s*$/i.test(\n line,\n );\n}\n\nfunction pipeAppOutput(\n prefix: string,\n chunk: unknown,\n write: (value: string) => void,\n): void {\n const lines = String(chunk)\n .split(/\\r?\\n/)\n .filter(Boolean)\n .filter((line) => !isChildDevServerUrlLine(line));\n if (lines.length === 0) return;\n write(lines.map((line) => `${prefix} ${line}`).join(\"\\n\") + \"\\n\");\n}\n\nfunction syncApps(): void {\n const discovered = discoverApps();\n for (const app of discovered) {\n if (appById.has(app.id)) continue;\n const usedPorts = new Set(apps.map((existing) => existing.port));\n let port = appPortStart;\n while (usedPorts.has(port)) port++;\n const next = { ...app, port };\n apps.push(next);\n apps.sort((a, b) => {\n if (a.id === \"dispatch\") return -1;\n if (b.id === \"dispatch\") return 1;\n return a.id.localeCompare(b.id);\n });\n appById.set(next.id, next);\n console.log(`[workspace] Detected new app: /${next.id}`);\n startApp(next);\n }\n}\n\nlet syncTimer: NodeJS.Timeout | undefined;\nfunction scheduleSync(): void {\n if (syncTimer) clearTimeout(syncTimer);\n syncTimer = setTimeout(syncApps, 400);\n}\n\nfunction firstPathSegment(url: string | undefined): string | null {\n if (!url) return null;\n try {\n const parsed = new URL(url, \"http://workspace.local\");\n const [segment] = parsed.pathname.split(\"/\").filter(Boolean);\n return segment || null;\n } catch {\n return null;\n }\n}\n\nfunction appForRequest(req: http.IncomingMessage): WorkspaceApp | null {\n const params = new URL(req.url || \"/\", \"http://workspace.local\").searchParams;\n const explicit = params.get(\"_app\");\n if (explicit && appById.has(explicit)) return appById.get(explicit) ?? null;\n\n const direct = firstPathSegment(req.url);\n if (direct && appById.has(direct)) return appById.get(direct) ?? null;\n\n const fromState = extractOAuthStateAppId(params.get(\"state\"));\n if (fromState && appById.has(fromState)) {\n return appById.get(fromState) ?? null;\n }\n\n const referer = req.headers.referer;\n const fromReferer =\n typeof referer === \"string\" ? firstPathSegment(referer) : null;\n return fromReferer && appById.has(fromReferer)\n ? (appById.get(fromReferer) ?? null)\n : null;\n}\n\nfunction startApp(app: WorkspaceApp): void {\n const basePath = `/${app.id}`;\n const workspaceAppsJson = JSON.stringify(\n apps.map((workspaceApp) => ({\n id: workspaceApp.id,\n name: workspaceApp.name,\n path: `/${workspaceApp.id}`,\n })),\n );\n const child = spawn(\n \"pnpm\",\n [\n \"--dir\",\n app.dir,\n \"exec\",\n \"vite\",\n \"--host\",\n \"127.0.0.1\",\n \"--port\",\n String(app.port),\n \"--strictPort\",\n ...(forceVite ? [\"--force\"] : []),\n ],\n {\n cwd: root,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n env: {\n ...process.env,\n APP_NAME: app.id,\n AGENT_NATIVE_WORKSPACE: \"1\",\n AGENT_NATIVE_WORKSPACE_APPS_JSON: workspaceAppsJson,\n APP_BASE_PATH: basePath,\n VITE_AGENT_NATIVE_WORKSPACE: \"1\",\n VITE_APP_BASE_PATH: basePath,\n PORT: String(app.port),\n WORKSPACE_GATEWAY_URL: gatewayUrl,\n },\n },\n );\n app.process = child;\n\n const prefix = `[${app.id}]`;\n child.stdout?.on(\"data\", (chunk) => {\n pipeAppOutput(prefix, chunk, (value) => process.stdout.write(value));\n });\n child.stderr?.on(\"data\", (chunk) => {\n pipeAppOutput(prefix, chunk, (value) => process.stderr.write(value));\n });\n child.on(\"exit\", (code) => {\n if (code === 0 || shuttingDown) return;\n console.error(`${prefix} exited with code ${code}`);\n });\n}\n\nfunction renderIndex(): string {\n return `<!doctype html>\n<html>\n <head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <title>Agent-Native Workspace</title>\n <style>\n body { font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif; margin: 0; padding: 32px; background: #fafafa; color: #171717; }\n main { max-width: 760px; margin: 0 auto; }\n a { color: inherit; text-decoration: none; }\n .grid { display: grid; gap: 12px; margin-top: 20px; }\n .card { display: flex; justify-content: space-between; border: 1px solid #d4d4d4; border-radius: 8px; padding: 14px 16px; background: white; }\n .muted { color: #737373; }\n </style>\n </head>\n <body>\n <main>\n <h1>Agent-Native Workspace</h1>\n <p class=\"muted\">Open an app below. Dispatch is the workspace control plane.</p>\n <div class=\"grid\">\n ${apps\n .map(\n (app) =>\n `<a class=\"card\" href=\"/${app.id}\"><strong>${app.name}</strong><span class=\"muted\">/${app.id}</span></a>`,\n )\n .join(\"\")}\n </div>\n </main>\n </body>\n</html>`;\n}\n\n// On `pnpm dev` the gateway answers requests immediately, but each app's vite\n// server takes a beat to bind its port. Without retry, the user sees an\n// \"App is not ready yet: ECONNREFUSED\" banner on the first page load and has\n// to refresh manually. We do a quick pre-flight TCP connect with retry so\n// startup is invisible for the common case (small/no body, slow boot).\nconst PROXY_READY_TIMEOUT_MS = Number(\n process.env.WORKSPACE_PROXY_READY_TIMEOUT_MS ?? 30_000,\n);\nconst PROXY_READY_RETRY_DELAY_MS = 250;\n\nfunction probePort(port: number, timeoutMs = 1_000): Promise<boolean> {\n return new Promise((resolve) => {\n const socket = new net.Socket();\n let settled = false;\n const finish = (ok: boolean) => {\n if (settled) return;\n settled = true;\n socket.destroy();\n resolve(ok);\n };\n socket.setTimeout(timeoutMs);\n socket.once(\"connect\", () => finish(true));\n socket.once(\"error\", () => finish(false));\n socket.once(\"timeout\", () => finish(false));\n socket.connect(port, \"127.0.0.1\");\n });\n}\n\nasync function waitForPort(port: number, deadline: number): Promise<boolean> {\n while (Date.now() < deadline) {\n if (await probePort(port)) return true;\n await new Promise((r) => setTimeout(r, PROXY_READY_RETRY_DELAY_MS));\n }\n return false;\n}\n\nfunction proxyHttp(\n app: WorkspaceApp,\n req: http.IncomingMessage,\n res: http.ServerResponse,\n): void {\n const dispatch = () => {\n const headers = { ...req.headers, host: `127.0.0.1:${app.port}` };\n const proxyReq = http.request(\n {\n hostname: \"127.0.0.1\",\n port: app.port,\n method: req.method,\n path: req.url,\n headers,\n },\n (proxyRes) => {\n app.ready = true;\n res.writeHead(proxyRes.statusCode ?? 502, proxyRes.headers);\n proxyRes.pipe(res);\n },\n );\n\n proxyReq.on(\"error\", (err) => {\n if (res.headersSent) {\n res.end();\n return;\n }\n res.writeHead(502, { \"content-type\": \"text/plain\" });\n res.end(`App \"${app.id}\" is not ready yet: ${err.message}`);\n });\n\n req.pipe(proxyReq);\n };\n\n // Fast path: the upstream has accepted at least one request before, so it's\n // listening. Skip the probe so steady-state requests stay zero-latency.\n if (app.ready) {\n dispatch();\n return;\n }\n\n // Cold path: hold the request open while the child server boots. Node\n // keeps the request body in paused mode until a consumer attaches via\n // pipe(), so awaiting waitForPort() doesn't lose data.\n void waitForPort(app.port, Date.now() + PROXY_READY_TIMEOUT_MS).then(\n (ready) => {\n if (!ready) {\n if (!res.headersSent) {\n res.writeHead(502, { \"content-type\": \"text/plain\" });\n res.end(\n `App \"${app.id}\" is not ready yet: connect ECONNREFUSED 127.0.0.1:${app.port}`,\n );\n } else {\n res.end();\n }\n return;\n }\n app.ready = true;\n dispatch();\n },\n );\n}\n\nfunction proxyUpgrade(\n app: WorkspaceApp,\n req: http.IncomingMessage,\n socket: Duplex,\n head: Buffer,\n): void {\n const target = net.connect(app.port, \"127.0.0.1\", () => {\n const headers = Object.entries({\n ...req.headers,\n host: `127.0.0.1:${app.port}`,\n })\n .flatMap(([key, value]) =>\n Array.isArray(value)\n ? value.map((item) => `${key}: ${item}`)\n : [`${key}: ${value ?? \"\"}`],\n )\n .join(\"\\r\\n\");\n target.write(\n `${req.method} ${req.url} HTTP/${req.httpVersion}\\r\\n${headers}\\r\\n\\r\\n`,\n );\n if (head.length) target.write(head);\n socket.pipe(target).pipe(socket);\n });\n\n target.on(\"error\", () => socket.destroy());\n}\n\nlet shuttingDown = false;\nlet workspaceStarted = false;\n\nfunction handleWatcherError(err: NodeJS.ErrnoException): void {\n // ENOSPC: system inotify watcher limit hit (Linux). Userland-fixable;\n // capture as a warning so we still see frequency in Sentry but don't get\n // paged. Print actionable guidance and continue without watching — the\n // 2s polling interval below keeps app discovery working.\n if (err.code === \"ENOSPC\") {\n console.warn(\n `[workspace] Recursive file watcher hit the system limit (ENOSPC). ` +\n `New apps will still be detected via polling every ~2s. ` +\n `On Linux you can raise the limit with ` +\n `\\`sudo sysctl fs.inotify.max_user_watches=524288\\` ` +\n `(persist via /etc/sysctl.d/*.conf). On macOS/Windows this usually ` +\n `means too many other watchers are running.`,\n );\n Sentry.captureException(err, {\n tags: { handled: \"dev-watch-enospc\" },\n level: \"warning\",\n });\n return;\n }\n // ENOENT: a watched directory disappeared (or a transient subdir under\n // appsDir vanished mid-enumeration). Benign — the polling fallback and\n // future scheduleSync calls will re-establish state. Don't capture.\n if (err.code === \"ENOENT\") {\n console.debug(\n `[workspace] Recursive file watcher saw a directory disappear ` +\n `(ENOENT: ${err.path ?? \"unknown\"}). Polling fallback will recover.`,\n );\n return;\n }\n // Unknown failure mode — keep the dev experience alive (polling still\n // runs) but surface to Sentry as a warning so we learn about new cases.\n console.warn(\n `[workspace] Recursive file watcher failed (${err.code ?? \"unknown\"}): ${err.message}. ` +\n `Falling back to polling.`,\n );\n Sentry.captureException(err, {\n tags: { handled: \"dev-watch-unknown\" },\n level: \"warning\",\n });\n}\n\nfunction startWorkspaceProcesses(): void {\n if (workspaceStarted) return;\n workspaceStarted = true;\n for (const app of apps) startApp(app);\n try {\n const watcher = fs.watch(appsDir, { recursive: true }, scheduleSync);\n // Async errors (e.g. ENOENT when a subdir vanishes mid-watch) surface on\n // the watcher rather than the original call site. Without an `error`\n // listener, Node would treat them as uncaught and crash the dev process.\n watcher.on(\"error\", (err) => {\n handleWatcherError(err as NodeJS.ErrnoException);\n });\n } catch (err) {\n handleWatcherError(err as NodeJS.ErrnoException);\n }\n setInterval(syncApps, 2_000).unref();\n}\n\nfunction openBrowser(url: string): void {\n if (process.env.WORKSPACE_NO_OPEN === \"1\") return;\n const command =\n process.platform === \"darwin\"\n ? \"open\"\n : process.platform === \"win32\"\n ? \"cmd\"\n : \"xdg-open\";\n const args = process.platform === \"win32\" ? [\"/c\", \"start\", \"\", url] : [url];\n const child = spawn(command, args, {\n stdio: \"ignore\",\n detached: true,\n });\n child.unref();\n}\n\nconst server = http.createServer((req, res) => {\n if (req.url === \"/\" || req.url === \"/index.html\") {\n res.writeHead(302, { location: `/${defaultApp}` });\n res.end();\n return;\n }\n\n if (req.url === \"/_workspace/apps\") {\n res.writeHead(200, { \"content-type\": \"application/json\" });\n res.end(\n JSON.stringify(\n apps.map((app) => ({\n id: app.id,\n name: app.name,\n path: `/${app.id}`,\n port: app.port,\n })),\n ),\n );\n return;\n }\n\n const app = appForRequest(req);\n if (!app) {\n res.writeHead(404, { \"content-type\": \"text/html\" });\n res.end(renderIndex());\n return;\n }\n proxyHttp(app, req, res);\n});\n\nserver.on(\"upgrade\", (req, socket, head) => {\n const app = appForRequest(req);\n if (!app) {\n socket.destroy();\n return;\n }\n proxyUpgrade(app, req, socket, head);\n});\n\nfunction listen(port: number, attempts = 20): void {\n server.once(\"error\", (err: NodeJS.ErrnoException) => {\n if (err.code === \"EADDRINUSE\" && attempts > 0) {\n listen(port + 1, attempts - 1);\n return;\n }\n console.error(`[workspace] Could not start gateway: ${err.message}`);\n process.exit(1);\n });\n server.listen(port, gatewayHost, () => {\n const address = server.address();\n const actualPort =\n typeof address === \"object\" && address ? address.port : port;\n gatewayUrl = `http://${gatewayHost}:${actualPort}`;\n console.log(\n `[workspace] Default: http://${gatewayHost}:${actualPort}/${defaultApp}`,\n );\n console.log(`[workspace] Gateway: http://${gatewayHost}:${actualPort}`);\n for (const app of apps) {\n console.log(`[workspace] ${app.id}: /${app.id} -> 127.0.0.1:${app.port}`);\n }\n startWorkspaceProcesses();\n openBrowser(`http://${gatewayHost}:${actualPort}/${defaultApp}`);\n });\n}\n\nfunction shutdown(): void {\n if (shuttingDown) return;\n shuttingDown = true;\n server.close();\n for (const app of apps) {\n app.process?.kill(\"SIGTERM\");\n }\n setTimeout(() => process.exit(0), 300).unref();\n}\n\nprocess.on(\"SIGINT\", shutdown);\nprocess.on(\"SIGTERM\", shutdown);\n\nlisten(requestedPort);\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NewWorkspaceAppFlow.d.ts","sourceRoot":"","sources":["../../src/client/NewWorkspaceAppFlow.tsx"],"names":[],"mappings":"AAcA,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,wBAAwB;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;
|
|
1
|
+
{"version":3,"file":"NewWorkspaceAppFlow.d.ts","sourceRoot":"","sources":["../../src/client/NewWorkspaceAppFlow.tsx"],"names":[],"mappings":"AAcA,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,wBAAwB;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;AAkFD,wBAAgB,mBAAmB,CAAC,EAClC,SAAqB,EACrB,SAAc,EACd,gBAAgB,GACjB,EAAE,wBAAwB,2CA4N1B"}
|
|
@@ -62,15 +62,18 @@ function buildNewWorkspaceAppPrompt(input) {
|
|
|
62
62
|
`Use the workspace app layout: create it under apps/${input.appId}, mount it at /${input.appId}, keep it on the shared workspace database/hosting model, and avoid table-name collisions by namespacing any new domain tables to the app.`,
|
|
63
63
|
`If the user's prompt mentions sibling apps like Mail, Calendar, Dispatch, or other templates, treat them as existing workspace neighbors or integrations. Do not scaffold those sibling apps inside apps/${input.appId} unless the user explicitly asks to create them too.`,
|
|
64
64
|
`Do not satisfy this by adding a route, page, component, or file inside apps/starter or another existing app unless the user explicitly asks to modify that existing app.`,
|
|
65
|
+
`Use relative workspace links like /${input.appId}. Do not hardcode localhost, 127.0.0.1, 8080, 8100, or any dev port; the active workspace gateway/browser origin owns the port.`,
|
|
66
|
+
`Use the framework/template UI stack: shadcn/ui components and @tabler/icons-react. Do not add lucide-react or another icon library for standard UI.`,
|
|
67
|
+
`Ensure the React Router client entry preserves APP_BASE_PATH/VITE_APP_BASE_PATH via appBasePath().`,
|
|
65
68
|
keyList
|
|
66
69
|
? `After the app exists, grant the selected Dispatch vault keys to appId "${input.appId}" and sync them once the app server is available. Treat these as requested grants, not active grants before creation succeeds.`
|
|
67
70
|
: `Do not grant any Dispatch vault keys unless the user asks later.`,
|
|
68
71
|
``,
|
|
69
72
|
`App readiness requirements before handing off:`,
|
|
70
|
-
`-
|
|
73
|
+
`- Ensure apps/${input.appId}/package.json exists with displayName/name metadata so Dispatch and the workspace gateway discover it from the filesystem. There is no separate workspace app registry to edit.`,
|
|
71
74
|
`- Update the app manifest/package/deploy metadata needed by the existing workspace deployment model; do not leave the app relying only on local discovery.`,
|
|
72
75
|
`- Verify the app's agent card/A2A metadata is ready so Dispatch can discover and delegate to the app after deployment.`,
|
|
73
|
-
`- Include a final verification note covering
|
|
76
|
+
`- Include a final verification note covering filesystem discovery, manifest/deploy metadata, relative same-origin routing, and agent-card readiness.`,
|
|
74
77
|
`When it is ready, start or update the workspace dev server and navigate the user to /${input.appId}.`,
|
|
75
78
|
].join("\n");
|
|
76
79
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NewWorkspaceAppFlow.js","sourceRoot":"","sources":["../../src/client/NewWorkspaceAppFlow.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useEffect, useMemo, useState } from \"react\";\nimport {\n IconArrowUpRight,\n IconCheck,\n IconChevronDown,\n IconKey,\n} from \"@tabler/icons-react\";\nimport { agentNativePath, appBasePath } from \"./api-path.js\";\nimport { sendToAgentChat } from \"./agent-chat.js\";\nimport { isInBuilderFrame } from \"./builder-frame.js\";\nimport { useDevMode } from \"./use-dev-mode.js\";\nimport { getWorkspaceAppIdValidationError } from \"../shared/workspace-app-id.js\";\nimport { PromptComposer } from \"./composer/PromptComposer.js\";\n\nexport interface VaultSecretOption {\n id: string;\n name: string;\n credentialKey: string;\n provider?: string | null;\n description?: string | null;\n}\n\nexport interface NewWorkspaceAppFlowProps {\n sourceApp?: string;\n className?: string;\n dispatchBasePath?: string | null;\n}\n\nfunction slugify(value: string): string {\n return value\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .replace(/^[^a-z]+/, \"\")\n .slice(0, 48);\n}\n\nfunction titleFromPrompt(prompt: string): string {\n const cleaned = prompt\n .replace(/\\b(build|create|make|an?|the|app|tool|dashboard)\\b/gi, \" \")\n .replace(/\\s+/g, \" \")\n .trim();\n return slugify(cleaned || \"new-app\") || \"new-app\";\n}\n\nfunction actionUrl(basePath: string | null, action: string): string {\n const path = `/_agent-native/actions/${action}`;\n if (basePath === null) return agentNativePath(path);\n const normalized = basePath.replace(/\\/+$/, \"\");\n return `${normalized}${path}`;\n}\n\nfunction defaultDispatchBasePath(sourceApp?: string): string | null {\n if (sourceApp === \"dispatch\") return null;\n const base = appBasePath();\n if (base === \"/dispatch\") return null;\n return \"/dispatch\";\n}\n\nasync function fetchJson(url: string, init?: RequestInit): Promise<any> {\n const res = await fetch(url, init);\n const data = await res.json().catch(() => null);\n if (!res.ok) {\n throw new Error(\n data?.error || data?.message || `Request failed ${res.status}`,\n );\n }\n return data;\n}\n\nfunction buildNewWorkspaceAppPrompt(input: {\n appId: string;\n prompt: string;\n selectedKeys: string[];\n}): string {\n const keyList = input.selectedKeys.join(\", \");\n const grantRequest = keyList\n ? `Requested Dispatch vault key grants for this app: ${keyList}`\n : `Requested Dispatch vault key grants for this app: none`;\n\n return [\n `Create a new agent-native app in this workspace.`,\n `This is a new workspace app request, not a feature request for the current app.`,\n ``,\n `Suggested app name: ${input.appId} (you may adjust the slug if it conflicts)`,\n `User prompt: ${input.prompt.trim()}`,\n grantRequest,\n ``,\n `Pick a starter template that fits the user's prompt — analytics, calendar, content, design, dispatch, forms, mail, slides, clips, or starter when none of the others fit.`,\n `Use the workspace app layout: create it under apps/${input.appId}, mount it at /${input.appId}, keep it on the shared workspace database/hosting model, and avoid table-name collisions by namespacing any new domain tables to the app.`,\n `If the user's prompt mentions sibling apps like Mail, Calendar, Dispatch, or other templates, treat them as existing workspace neighbors or integrations. Do not scaffold those sibling apps inside apps/${input.appId} unless the user explicitly asks to create them too.`,\n `Do not satisfy this by adding a route, page, component, or file inside apps/starter or another existing app unless the user explicitly asks to modify that existing app.`,\n keyList\n ? `After the app exists, grant the selected Dispatch vault keys to appId \"${input.appId}\" and sync them once the app server is available. Treat these as requested grants, not active grants before creation succeeds.`\n : `Do not grant any Dispatch vault keys unless the user asks later.`,\n ``,\n `App readiness requirements before handing off:`,\n `- Update the workspace app registry metadata for \"${input.appId}\" (workspace-apps.json or .agent-native/workspace-apps.json, whichever this workspace uses) so Dispatch lists the app at /${input.appId} after merge/deploy.`,\n `- Update the app manifest/package/deploy metadata needed by the existing workspace deployment model; do not leave the app relying only on local discovery.`,\n `- Verify the app's agent card/A2A metadata is ready so Dispatch can discover and delegate to the app after deployment.`,\n `- Include a final verification note covering the registry entry, manifest/deploy metadata, and agent-card readiness.`,\n `When it is ready, start or update the workspace dev server and navigate the user to /${input.appId}.`,\n ].join(\"\\n\");\n}\n\nexport function NewWorkspaceAppFlow({\n sourceApp = \"starter\",\n className = \"\",\n dispatchBasePath,\n}: NewWorkspaceAppFlowProps) {\n const [selectedSecretIds, setSelectedSecretIds] = useState<string[]>([]);\n const [secrets, setSecrets] = useState<VaultSecretOption[]>([]);\n const [secretsError, setSecretsError] = useState<string | null>(null);\n const [statusMessage, setStatusMessage] = useState<string | null>(null);\n const [branchUrl, setBranchUrl] = useState<string | null>(null);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const { isDevMode } = useDevMode();\n\n const effectiveDispatchBasePath =\n dispatchBasePath === undefined\n ? defaultDispatchBasePath(sourceApp)\n : dispatchBasePath;\n\n useEffect(() => {\n let cancelled = false;\n const url = actionUrl(\n effectiveDispatchBasePath,\n \"list-vault-secret-options\",\n );\n fetchJson(url)\n .then((data) => {\n if (cancelled) return;\n setSecrets(Array.isArray(data) ? data : []);\n setSecretsError(null);\n })\n .catch((err) => {\n if (cancelled) return;\n setSecrets([]);\n setSecretsError(err?.message || \"Could not load Dispatch keys\");\n });\n return () => {\n cancelled = true;\n };\n }, [effectiveDispatchBasePath]);\n\n const selectedSecrets = useMemo(\n () => secrets.filter((secret) => selectedSecretIds.includes(secret.id)),\n [secrets, selectedSecretIds],\n );\n const selectedSecretLabel =\n selectedSecretIds.length === 0\n ? \"No keys selected\"\n : `${selectedSecretIds.length} key${selectedSecretIds.length === 1 ? \"\" : \"s\"} selected`;\n\n async function submit(rawPrompt: string) {\n const prompt = rawPrompt.trim();\n if (!prompt || isSubmitting) return;\n const appId = titleFromPrompt(prompt);\n const validationError = getWorkspaceAppIdValidationError(appId);\n if (validationError) {\n setStatusMessage(validationError);\n return;\n }\n\n const message = buildNewWorkspaceAppPrompt({\n appId,\n prompt,\n selectedKeys: selectedSecrets.map((s) => s.credentialKey),\n });\n setIsSubmitting(true);\n setStatusMessage(null);\n setBranchUrl(null);\n\n try {\n if (isInBuilderFrame()) {\n sendToAgentChat({ message, submit: true, type: \"code\" });\n setStatusMessage(\"Sent to Builder chat.\");\n } else if (isDevMode) {\n sendToAgentChat({ message, submit: true, type: \"code\", newTab: true });\n setStatusMessage(\"Sent to the local agent.\");\n } else {\n const result = await fetchJson(\n actionUrl(effectiveDispatchBasePath, \"start-workspace-app-creation\"),\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n prompt,\n appId,\n secretIds: selectedSecretIds,\n }),\n },\n );\n if (result?.mode === \"builder\") {\n setBranchUrl(result?.url || null);\n setStatusMessage(\"Builder branch created.\");\n } else {\n setStatusMessage(\n result?.message ||\n \"Builder app creation is coming soon here. Open this workspace in Builder to create an app from this prompt.\",\n );\n }\n }\n } catch (err: any) {\n setStatusMessage(err?.message || \"Could not start the new app flow.\");\n } finally {\n setIsSubmitting(false);\n }\n }\n\n function toggleSecret(id: string) {\n setSelectedSecretIds((current) =>\n current.includes(id)\n ? current.filter((existing) => existing !== id)\n : [...current, id],\n );\n }\n\n return (\n <section\n className={`mx-auto flex w-full max-w-5xl flex-col gap-5 px-4 py-6 ${className}`}\n >\n <div className=\"grid gap-5 lg:grid-cols-[minmax(0,1fr)_320px]\">\n <div className=\"flex flex-col gap-3\">\n <PromptComposer\n autoFocus\n disabled={isSubmitting}\n placeholder=\"Describe the app your teammate should be able to use...\"\n draftScope=\"dispatch:new-app\"\n onSubmit={(text) => submit(text)}\n />\n\n {statusMessage ? (\n <div className=\"rounded-md border border-border bg-muted/40 px-3 py-2 text-sm text-muted-foreground\">\n {statusMessage}\n {branchUrl ? (\n <a\n href={branchUrl}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"ml-2 inline-flex items-center gap-1 font-medium text-foreground underline\"\n >\n Open branch <IconArrowUpRight className=\"h-3 w-3\" />\n </a>\n ) : null}\n </div>\n ) : null}\n </div>\n\n <aside className=\"rounded-lg border border-border bg-card\">\n <div className=\"border-b border-border px-4 py-3\">\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"flex items-center gap-2 text-sm font-medium\">\n <IconKey className=\"h-4 w-4\" />\n Dispatch keys\n </div>\n <span className=\"shrink-0 rounded border border-border bg-background/40 px-2 py-0.5 text-[11px] text-muted-foreground\">\n {selectedSecretLabel}\n </span>\n </div>\n </div>\n <div className=\"max-h-[440px] space-y-2 overflow-y-auto p-3\">\n {secretsError ? (\n <p className=\"rounded-md border border-dashed border-border px-3 py-3 text-xs text-muted-foreground\">\n {secretsError}\n </p>\n ) : secrets.length === 0 ? (\n <p className=\"rounded-md border border-dashed border-border px-3 py-3 text-xs text-muted-foreground\">\n No Dispatch vault keys found yet.\n </p>\n ) : (\n secrets.map((secret) => {\n const selected = selectedSecretIds.includes(secret.id);\n return (\n <div\n key={secret.id}\n className={`group rounded-md border text-sm transition ${\n selected\n ? \"border-primary/45 bg-primary/5 text-foreground shadow-[inset_0_0_0_1px_hsl(var(--primary)/0.08)]\"\n : \"border-border bg-background/25 text-foreground hover:border-muted-foreground/40 hover:bg-accent/35\"\n }`}\n >\n <button\n type=\"button\"\n aria-pressed={selected}\n onClick={() => toggleSecret(secret.id)}\n className=\"flex w-full cursor-pointer items-start gap-3 rounded-md px-3 py-2 text-left focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/30\"\n >\n <span\n className={`mt-0.5 flex h-4 w-4 shrink-0 items-center justify-center rounded border transition ${\n selected\n ? \"border-primary/60 bg-primary/10 text-primary\"\n : \"border-muted-foreground/35 text-transparent group-hover:border-muted-foreground/60\"\n }`}\n >\n {selected ? <IconCheck className=\"h-3 w-3\" /> : null}\n </span>\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate font-medium\">\n {secret.credentialKey}\n </span>\n <span className=\"block truncate text-xs text-muted-foreground/70\">\n {selected\n ? \"Will be requested for this app\"\n : \"Click to request\"}\n </span>\n </span>\n </button>\n <details className=\"group/details border-t border-border/60 px-3 py-1.5 text-xs text-muted-foreground/75 open:bg-background/10\">\n <summary className=\"flex cursor-pointer list-none items-center gap-1.5 text-[11px] hover:text-muted-foreground [&::-webkit-details-marker]:hidden\">\n <IconChevronDown className=\"h-3 w-3 transition-transform group-open/details:rotate-180\" />\n Details\n </summary>\n <div className=\"mt-1.5 space-y-1 pb-0.5 pl-4\">\n <div className=\"truncate\">\n Provider: {secret.provider || \"Not specified\"}\n </div>\n <div className=\"truncate\">Name: {secret.name}</div>\n </div>\n </details>\n </div>\n );\n })\n )}\n </div>\n </aside>\n </div>\n </section>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"NewWorkspaceAppFlow.js","sourceRoot":"","sources":["../../src/client/NewWorkspaceAppFlow.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useEffect, useMemo, useState } from \"react\";\nimport {\n IconArrowUpRight,\n IconCheck,\n IconChevronDown,\n IconKey,\n} from \"@tabler/icons-react\";\nimport { agentNativePath, appBasePath } from \"./api-path.js\";\nimport { sendToAgentChat } from \"./agent-chat.js\";\nimport { isInBuilderFrame } from \"./builder-frame.js\";\nimport { useDevMode } from \"./use-dev-mode.js\";\nimport { getWorkspaceAppIdValidationError } from \"../shared/workspace-app-id.js\";\nimport { PromptComposer } from \"./composer/PromptComposer.js\";\n\nexport interface VaultSecretOption {\n id: string;\n name: string;\n credentialKey: string;\n provider?: string | null;\n description?: string | null;\n}\n\nexport interface NewWorkspaceAppFlowProps {\n sourceApp?: string;\n className?: string;\n dispatchBasePath?: string | null;\n}\n\nfunction slugify(value: string): string {\n return value\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .replace(/^[^a-z]+/, \"\")\n .slice(0, 48);\n}\n\nfunction titleFromPrompt(prompt: string): string {\n const cleaned = prompt\n .replace(/\\b(build|create|make|an?|the|app|tool|dashboard)\\b/gi, \" \")\n .replace(/\\s+/g, \" \")\n .trim();\n return slugify(cleaned || \"new-app\") || \"new-app\";\n}\n\nfunction actionUrl(basePath: string | null, action: string): string {\n const path = `/_agent-native/actions/${action}`;\n if (basePath === null) return agentNativePath(path);\n const normalized = basePath.replace(/\\/+$/, \"\");\n return `${normalized}${path}`;\n}\n\nfunction defaultDispatchBasePath(sourceApp?: string): string | null {\n if (sourceApp === \"dispatch\") return null;\n const base = appBasePath();\n if (base === \"/dispatch\") return null;\n return \"/dispatch\";\n}\n\nasync function fetchJson(url: string, init?: RequestInit): Promise<any> {\n const res = await fetch(url, init);\n const data = await res.json().catch(() => null);\n if (!res.ok) {\n throw new Error(\n data?.error || data?.message || `Request failed ${res.status}`,\n );\n }\n return data;\n}\n\nfunction buildNewWorkspaceAppPrompt(input: {\n appId: string;\n prompt: string;\n selectedKeys: string[];\n}): string {\n const keyList = input.selectedKeys.join(\", \");\n const grantRequest = keyList\n ? `Requested Dispatch vault key grants for this app: ${keyList}`\n : `Requested Dispatch vault key grants for this app: none`;\n\n return [\n `Create a new agent-native app in this workspace.`,\n `This is a new workspace app request, not a feature request for the current app.`,\n ``,\n `Suggested app name: ${input.appId} (you may adjust the slug if it conflicts)`,\n `User prompt: ${input.prompt.trim()}`,\n grantRequest,\n ``,\n `Pick a starter template that fits the user's prompt — analytics, calendar, content, design, dispatch, forms, mail, slides, clips, or starter when none of the others fit.`,\n `Use the workspace app layout: create it under apps/${input.appId}, mount it at /${input.appId}, keep it on the shared workspace database/hosting model, and avoid table-name collisions by namespacing any new domain tables to the app.`,\n `If the user's prompt mentions sibling apps like Mail, Calendar, Dispatch, or other templates, treat them as existing workspace neighbors or integrations. Do not scaffold those sibling apps inside apps/${input.appId} unless the user explicitly asks to create them too.`,\n `Do not satisfy this by adding a route, page, component, or file inside apps/starter or another existing app unless the user explicitly asks to modify that existing app.`,\n `Use relative workspace links like /${input.appId}. Do not hardcode localhost, 127.0.0.1, 8080, 8100, or any dev port; the active workspace gateway/browser origin owns the port.`,\n `Use the framework/template UI stack: shadcn/ui components and @tabler/icons-react. Do not add lucide-react or another icon library for standard UI.`,\n `Ensure the React Router client entry preserves APP_BASE_PATH/VITE_APP_BASE_PATH via appBasePath().`,\n keyList\n ? `After the app exists, grant the selected Dispatch vault keys to appId \"${input.appId}\" and sync them once the app server is available. Treat these as requested grants, not active grants before creation succeeds.`\n : `Do not grant any Dispatch vault keys unless the user asks later.`,\n ``,\n `App readiness requirements before handing off:`,\n `- Ensure apps/${input.appId}/package.json exists with displayName/name metadata so Dispatch and the workspace gateway discover it from the filesystem. There is no separate workspace app registry to edit.`,\n `- Update the app manifest/package/deploy metadata needed by the existing workspace deployment model; do not leave the app relying only on local discovery.`,\n `- Verify the app's agent card/A2A metadata is ready so Dispatch can discover and delegate to the app after deployment.`,\n `- Include a final verification note covering filesystem discovery, manifest/deploy metadata, relative same-origin routing, and agent-card readiness.`,\n `When it is ready, start or update the workspace dev server and navigate the user to /${input.appId}.`,\n ].join(\"\\n\");\n}\n\nexport function NewWorkspaceAppFlow({\n sourceApp = \"starter\",\n className = \"\",\n dispatchBasePath,\n}: NewWorkspaceAppFlowProps) {\n const [selectedSecretIds, setSelectedSecretIds] = useState<string[]>([]);\n const [secrets, setSecrets] = useState<VaultSecretOption[]>([]);\n const [secretsError, setSecretsError] = useState<string | null>(null);\n const [statusMessage, setStatusMessage] = useState<string | null>(null);\n const [branchUrl, setBranchUrl] = useState<string | null>(null);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const { isDevMode } = useDevMode();\n\n const effectiveDispatchBasePath =\n dispatchBasePath === undefined\n ? defaultDispatchBasePath(sourceApp)\n : dispatchBasePath;\n\n useEffect(() => {\n let cancelled = false;\n const url = actionUrl(\n effectiveDispatchBasePath,\n \"list-vault-secret-options\",\n );\n fetchJson(url)\n .then((data) => {\n if (cancelled) return;\n setSecrets(Array.isArray(data) ? data : []);\n setSecretsError(null);\n })\n .catch((err) => {\n if (cancelled) return;\n setSecrets([]);\n setSecretsError(err?.message || \"Could not load Dispatch keys\");\n });\n return () => {\n cancelled = true;\n };\n }, [effectiveDispatchBasePath]);\n\n const selectedSecrets = useMemo(\n () => secrets.filter((secret) => selectedSecretIds.includes(secret.id)),\n [secrets, selectedSecretIds],\n );\n const selectedSecretLabel =\n selectedSecretIds.length === 0\n ? \"No keys selected\"\n : `${selectedSecretIds.length} key${selectedSecretIds.length === 1 ? \"\" : \"s\"} selected`;\n\n async function submit(rawPrompt: string) {\n const prompt = rawPrompt.trim();\n if (!prompt || isSubmitting) return;\n const appId = titleFromPrompt(prompt);\n const validationError = getWorkspaceAppIdValidationError(appId);\n if (validationError) {\n setStatusMessage(validationError);\n return;\n }\n\n const message = buildNewWorkspaceAppPrompt({\n appId,\n prompt,\n selectedKeys: selectedSecrets.map((s) => s.credentialKey),\n });\n setIsSubmitting(true);\n setStatusMessage(null);\n setBranchUrl(null);\n\n try {\n if (isInBuilderFrame()) {\n sendToAgentChat({ message, submit: true, type: \"code\" });\n setStatusMessage(\"Sent to Builder chat.\");\n } else if (isDevMode) {\n sendToAgentChat({ message, submit: true, type: \"code\", newTab: true });\n setStatusMessage(\"Sent to the local agent.\");\n } else {\n const result = await fetchJson(\n actionUrl(effectiveDispatchBasePath, \"start-workspace-app-creation\"),\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n prompt,\n appId,\n secretIds: selectedSecretIds,\n }),\n },\n );\n if (result?.mode === \"builder\") {\n setBranchUrl(result?.url || null);\n setStatusMessage(\"Builder branch created.\");\n } else {\n setStatusMessage(\n result?.message ||\n \"Builder app creation is coming soon here. Open this workspace in Builder to create an app from this prompt.\",\n );\n }\n }\n } catch (err: any) {\n setStatusMessage(err?.message || \"Could not start the new app flow.\");\n } finally {\n setIsSubmitting(false);\n }\n }\n\n function toggleSecret(id: string) {\n setSelectedSecretIds((current) =>\n current.includes(id)\n ? current.filter((existing) => existing !== id)\n : [...current, id],\n );\n }\n\n return (\n <section\n className={`mx-auto flex w-full max-w-5xl flex-col gap-5 px-4 py-6 ${className}`}\n >\n <div className=\"grid gap-5 lg:grid-cols-[minmax(0,1fr)_320px]\">\n <div className=\"flex flex-col gap-3\">\n <PromptComposer\n autoFocus\n disabled={isSubmitting}\n placeholder=\"Describe the app your teammate should be able to use...\"\n draftScope=\"dispatch:new-app\"\n onSubmit={(text) => submit(text)}\n />\n\n {statusMessage ? (\n <div className=\"rounded-md border border-border bg-muted/40 px-3 py-2 text-sm text-muted-foreground\">\n {statusMessage}\n {branchUrl ? (\n <a\n href={branchUrl}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"ml-2 inline-flex items-center gap-1 font-medium text-foreground underline\"\n >\n Open branch <IconArrowUpRight className=\"h-3 w-3\" />\n </a>\n ) : null}\n </div>\n ) : null}\n </div>\n\n <aside className=\"rounded-lg border border-border bg-card\">\n <div className=\"border-b border-border px-4 py-3\">\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"flex items-center gap-2 text-sm font-medium\">\n <IconKey className=\"h-4 w-4\" />\n Dispatch keys\n </div>\n <span className=\"shrink-0 rounded border border-border bg-background/40 px-2 py-0.5 text-[11px] text-muted-foreground\">\n {selectedSecretLabel}\n </span>\n </div>\n </div>\n <div className=\"max-h-[440px] space-y-2 overflow-y-auto p-3\">\n {secretsError ? (\n <p className=\"rounded-md border border-dashed border-border px-3 py-3 text-xs text-muted-foreground\">\n {secretsError}\n </p>\n ) : secrets.length === 0 ? (\n <p className=\"rounded-md border border-dashed border-border px-3 py-3 text-xs text-muted-foreground\">\n No Dispatch vault keys found yet.\n </p>\n ) : (\n secrets.map((secret) => {\n const selected = selectedSecretIds.includes(secret.id);\n return (\n <div\n key={secret.id}\n className={`group rounded-md border text-sm transition ${\n selected\n ? \"border-primary/45 bg-primary/5 text-foreground shadow-[inset_0_0_0_1px_hsl(var(--primary)/0.08)]\"\n : \"border-border bg-background/25 text-foreground hover:border-muted-foreground/40 hover:bg-accent/35\"\n }`}\n >\n <button\n type=\"button\"\n aria-pressed={selected}\n onClick={() => toggleSecret(secret.id)}\n className=\"flex w-full cursor-pointer items-start gap-3 rounded-md px-3 py-2 text-left focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/30\"\n >\n <span\n className={`mt-0.5 flex h-4 w-4 shrink-0 items-center justify-center rounded border transition ${\n selected\n ? \"border-primary/60 bg-primary/10 text-primary\"\n : \"border-muted-foreground/35 text-transparent group-hover:border-muted-foreground/60\"\n }`}\n >\n {selected ? <IconCheck className=\"h-3 w-3\" /> : null}\n </span>\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate font-medium\">\n {secret.credentialKey}\n </span>\n <span className=\"block truncate text-xs text-muted-foreground/70\">\n {selected\n ? \"Will be requested for this app\"\n : \"Click to request\"}\n </span>\n </span>\n </button>\n <details className=\"group/details border-t border-border/60 px-3 py-1.5 text-xs text-muted-foreground/75 open:bg-background/10\">\n <summary className=\"flex cursor-pointer list-none items-center gap-1.5 text-[11px] hover:text-muted-foreground [&::-webkit-details-marker]:hidden\">\n <IconChevronDown className=\"h-3 w-3 transition-transform group-open/details:rotate-180\" />\n Details\n </summary>\n <div className=\"mt-1.5 space-y-1 pb-0.5 pl-4\">\n <div className=\"truncate\">\n Provider: {secret.provider || \"Not specified\"}\n </div>\n <div className=\"truncate\">Name: {secret.name}</div>\n </div>\n </details>\n </div>\n );\n })\n )}\n </div>\n </aside>\n </div>\n </section>\n );\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExtensionsListPage.d.ts","sourceRoot":"","sources":["../../../src/client/extensions/ExtensionsListPage.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ExtensionsListPage.d.ts","sourceRoot":"","sources":["../../../src/client/extensions/ExtensionsListPage.tsx"],"names":[],"mappings":"AAwEA,wBAAgB,kBAAkB,4CAqOjC"}
|
|
@@ -31,7 +31,7 @@ function submitCreateTool(prompt) {
|
|
|
31
31
|
});
|
|
32
32
|
}
|
|
33
33
|
function CreateToolInput({ className }) {
|
|
34
|
-
return (_jsxs("div", { className: cn("flex flex-col gap-
|
|
34
|
+
return (_jsxs("div", { className: cn("flex flex-col gap-3", className), children: [_jsx("p", { className: "text-center text-base font-semibold text-foreground", children: "New extension" }), _jsx(PromptComposer, { autoFocus: true, placeholder: "Describe what you'd like to build... e.g. a todo list, API dashboard, calculator", draftScope: "extensions:create", onSubmit: (text) => submitCreateTool(text) })] }));
|
|
35
35
|
}
|
|
36
36
|
export function ExtensionsListPage() {
|
|
37
37
|
const [showCreate, setShowCreate] = useState(false);
|
|
@@ -92,7 +92,7 @@ export function ExtensionsListPage() {
|
|
|
92
92
|
queryClient.invalidateQueries({ queryKey: ["extensions"] });
|
|
93
93
|
}
|
|
94
94
|
};
|
|
95
|
-
return (_jsxs("div", { className: "flex h-full w-full flex-col", children: [_jsxs("header", { className: "flex h-12 items-center justify-between border-b px-4 shrink-0", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Link, { to: "/", className: "inline-flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground hover:bg-accent hover:text-foreground", "aria-label": "Back to app", children: _jsx(IconArrowLeft, { className: "h-4 w-4" }) }), _jsx("h1", { className: "text-sm font-semibold", children: "Extensions" })] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsxs(Popover, { open: showCreate, onOpenChange: setShowCreate, children: [_jsx(PopoverTrigger, { asChild: true, children: _jsxs("button", { type: "button", className: "inline-flex cursor-pointer items-center justify-center gap-1.5 rounded-md bg-primary px-3 py-1.5 text-sm font-medium text-primary-foreground hover:bg-primary/90", children: [_jsx(IconPlus, { className: "h-4 w-4" }), "New Extension"] }) }), _jsxs(PopoverContent, { align: "end", sideOffset: 6, className: "w-[420px] p-3", children: [_jsx("p", { className: "px-1 pb-2 text-sm font-semibold text-foreground", children: "New extension" }), _jsx(PromptComposer, { autoFocus: true, placeholder: "Describe what you'd like to build...", draftScope: "extensions:create-popover", onSubmit: handleCreate })] })] }), _jsx(NotificationsBell, {}), _jsx(AgentToggleButton, {})] })] }), _jsx("div", { className: "flex-1 overflow-auto
|
|
95
|
+
return (_jsxs("div", { className: "flex h-full w-full flex-col", children: [_jsxs("header", { className: "flex h-12 items-center justify-between border-b px-4 shrink-0", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Link, { to: "/", className: "inline-flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground hover:bg-accent hover:text-foreground", "aria-label": "Back to app", children: _jsx(IconArrowLeft, { className: "h-4 w-4" }) }), _jsx("h1", { className: "text-sm font-semibold", children: "Extensions" })] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsxs(Popover, { open: showCreate, onOpenChange: setShowCreate, children: [_jsx(PopoverTrigger, { asChild: true, children: _jsxs("button", { type: "button", className: "inline-flex cursor-pointer items-center justify-center gap-1.5 rounded-md bg-primary px-3 py-1.5 text-sm font-medium text-primary-foreground hover:bg-primary/90", children: [_jsx(IconPlus, { className: "h-4 w-4" }), "New Extension"] }) }), _jsxs(PopoverContent, { align: "end", sideOffset: 6, className: "w-[420px] p-3", children: [_jsx("p", { className: "px-1 pb-2 text-sm font-semibold text-foreground", children: "New extension" }), _jsx(PromptComposer, { autoFocus: true, placeholder: "Describe what you'd like to build...", draftScope: "extensions:create-popover", onSubmit: handleCreate })] })] }), _jsx(NotificationsBell, {}), _jsx(AgentToggleButton, {})] })] }), _jsx("div", { className: "flex-1 overflow-auto px-5 py-8 sm:px-8 sm:py-10", children: isLoading ? (_jsx("div", { className: "grid grid-cols-1 gap-5 sm:grid-cols-2 lg:grid-cols-3", children: Array.from({ length: 6 }).map((_, i) => (_jsxs("div", { className: "rounded-lg border border-border bg-card p-5", children: [_jsx("div", { className: "mb-3 h-10 w-10 rounded-lg bg-muted animate-pulse" }), _jsx("div", { className: "mb-2 h-4 w-2/3 rounded bg-muted animate-pulse" }), _jsx("div", { className: "h-3 w-4/5 rounded bg-muted animate-pulse" })] }, i))) })) : toolList.length === 0 ? (_jsx("div", { className: "flex min-h-[calc(100vh-9rem)] flex-col items-center justify-center px-2 py-12 text-center sm:py-16", children: _jsxs("div", { className: "mx-auto flex w-full max-w-2xl flex-col items-center gap-8", children: [_jsxs("div", { className: "flex flex-col items-center gap-4", children: [_jsx(IconTool, { className: "h-12 w-12 text-muted-foreground/40" }), _jsxs("div", { className: "space-y-2", children: [_jsx("p", { className: "text-base font-semibold text-foreground", children: "No extensions yet" }), _jsx("p", { className: "text-sm text-muted-foreground", children: "Describe what you'd like to build" })] })] }), _jsx(CreateToolInput, { className: "w-full" })] }) })) : (_jsx("div", { className: "grid grid-cols-1 gap-5 sm:grid-cols-2 lg:grid-cols-3", children: toolList.map((extension) => (_jsxs("div", { className: cn("group relative rounded-lg border border-border bg-card", "hover:border-primary/30 hover:shadow-sm"), children: [_jsxs(Link, { to: `/extensions/${extension.id}`, className: "block p-5 pr-12", children: [_jsx("div", { className: "mb-3 flex h-10 w-10 items-center justify-center rounded-lg bg-muted text-muted-foreground group-hover:bg-primary/10 group-hover:text-primary", children: _jsx(IconTool, { className: "h-5 w-5" }) }), _jsx("h3", { className: "mb-1 text-sm font-semibold text-foreground", children: extension.name }), extension.description && (_jsx("p", { className: "line-clamp-2 text-xs text-muted-foreground", children: extension.description }))] }), _jsxs(Popover, { open: confirmDeleteId === extension.id, onOpenChange: (open) => setConfirmDeleteId(open ? extension.id : null), children: [_jsx(PopoverTrigger, { asChild: true, children: _jsx("button", { type: "button", className: "absolute right-3 top-3 inline-flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground opacity-0 hover:bg-accent hover:text-foreground focus:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring group-hover:opacity-100", "aria-label": `Options for ${extension.name}`, children: _jsx(IconDotsVertical, { className: "h-4 w-4" }) }) }), _jsx(PopoverContent, { align: "end", sideOffset: 4, className: "w-64 p-0", children: _jsxs("div", { className: "p-3", children: [_jsxs("p", { className: "text-[12px]", children: ["Delete", " ", _jsx("span", { className: "font-medium", children: extension.name }), "? This removes it everywhere it is shared."] }), _jsxs("div", { className: "mt-3 flex justify-end gap-1", children: [_jsx("button", { type: "button", onClick: () => setConfirmDeleteId(null), className: "rounded-md px-2 py-1 text-[12px] hover:bg-accent", children: "Cancel" }), _jsxs("button", { type: "button", onClick: () => handleDelete(extension), disabled: deletingId === extension.id, className: cn("inline-flex items-center gap-1.5 rounded-md bg-destructive px-2 py-1 text-[12px] text-destructive-foreground hover:bg-destructive/90", deletingId === extension.id && "opacity-60"), children: [_jsx(IconTrash, { className: "h-3.5 w-3.5" }), deletingId === extension.id
|
|
96
96
|
? "Deleting..."
|
|
97
97
|
: "Delete"] })] })] }) })] })] }, extension.id))) })) })] }));
|
|
98
98
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExtensionsListPage.js","sourceRoot":"","sources":["../../../src/client/extensions/ExtensionsListPage.tsx"],"names":[],"mappings":"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","sourcesContent":["import { agentNativePath } from \"../api-path.js\";\nimport { useState, useEffect } from \"react\";\nimport { useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { Link } from \"react-router\";\nimport {\n IconArrowLeft,\n IconDotsVertical,\n IconPlus,\n IconTool,\n IconTrash,\n} from \"@tabler/icons-react\";\nimport { cn } from \"../utils.js\";\nimport { AgentToggleButton } from \"../AgentPanel.js\";\nimport { NotificationsBell } from \"../notifications/NotificationsBell.js\";\nimport { sendToAgentChat } from \"../agent-chat.js\";\nimport { PromptComposer } from \"../composer/PromptComposer.js\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"../components/ui/popover.js\";\nimport {\n TOOLS_ORDER_CHANGE_EVENT,\n applyToolsOrder,\n getToolsOrder,\n} from \"./extension-order.js\";\n\ninterface Extension {\n id: string;\n name: string;\n description?: string;\n icon?: string;\n}\n\nlet lastCreateSubmission: { prompt: string; at: number } | null = null;\n\nfunction submitCreateTool(prompt: string) {\n const trimmed = prompt.trim();\n if (!trimmed) return;\n const now = Date.now();\n if (\n lastCreateSubmission &&\n lastCreateSubmission.prompt === trimmed &&\n now - lastCreateSubmission.at < 2_000\n ) {\n return;\n }\n lastCreateSubmission = { prompt: trimmed, at: now };\n sendToAgentChat({\n message: `Create an extension: ${trimmed}`,\n submit: true,\n openSidebar: true,\n newTab: true,\n });\n}\n\nfunction CreateToolInput({ className }: { className?: string }) {\n return (\n <div className={cn(\"flex flex-col gap-2\", className)}>\n <p className=\"text-sm font-semibold text-foreground\">New extension</p>\n <PromptComposer\n autoFocus\n placeholder=\"Describe what you'd like to build... e.g. a todo list, API dashboard, calculator\"\n draftScope=\"extensions:create\"\n onSubmit={(text) => submitCreateTool(text)}\n />\n </div>\n );\n}\n\nexport function ExtensionsListPage() {\n const [showCreate, setShowCreate] = useState(false);\n const [confirmDeleteId, setConfirmDeleteId] = useState<string | null>(null);\n const [deletingId, setDeletingId] = useState<string | null>(null);\n const queryClient = useQueryClient();\n const [toolOrderState, setToolOrderState] = useState<string[]>(() =>\n typeof window !== \"undefined\" ? getToolsOrder() : [],\n );\n\n useEffect(() => {\n fetch(agentNativePath(\"/_agent-native/application-state/navigation\"), {\n method: \"PUT\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ view: \"extensions\" }),\n }).catch(() => {});\n }, []);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const syncOrder = () => setToolOrderState(getToolsOrder());\n window.addEventListener(TOOLS_ORDER_CHANGE_EVENT, syncOrder);\n window.addEventListener(\"storage\", syncOrder);\n return () => {\n window.removeEventListener(TOOLS_ORDER_CHANGE_EVENT, syncOrder);\n window.removeEventListener(\"storage\", syncOrder);\n };\n }, []);\n\n const { data: extensions, isLoading } = useQuery<Extension[]>({\n queryKey: [\"extensions\"],\n queryFn: async () => {\n const res = await fetch(agentNativePath(\"/_agent-native/extensions\"));\n if (!res.ok) return [];\n return res.json();\n },\n });\n\n const toolList =\n toolOrderState.length > 0\n ? applyToolsOrder(extensions ?? [], toolOrderState)\n : (extensions ?? []);\n\n const handleCreate = (text: string) => {\n submitCreateTool(text);\n setShowCreate(false);\n };\n\n const handleDelete = async (extension: Extension) => {\n setDeletingId(extension.id);\n const previous = queryClient.getQueryData<Extension[]>([\"extensions\"]);\n queryClient.setQueryData<Extension[]>([\"extensions\"], (old) =>\n (old ?? []).filter((item) => item.id !== extension.id),\n );\n try {\n const res = await fetch(\n agentNativePath(`/_agent-native/extensions/${extension.id}`),\n { method: \"DELETE\" },\n );\n if (!res.ok) throw new Error(\"Delete failed\");\n } catch {\n if (previous) queryClient.setQueryData([\"extensions\"], previous);\n } finally {\n setDeletingId(null);\n setConfirmDeleteId(null);\n queryClient.invalidateQueries({ queryKey: [\"extensions\"] });\n }\n };\n\n return (\n <div className=\"flex h-full w-full flex-col\">\n <header className=\"flex h-12 items-center justify-between border-b px-4 shrink-0\">\n <div className=\"flex items-center gap-2\">\n <Link\n to=\"/\"\n className=\"inline-flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground hover:bg-accent hover:text-foreground\"\n aria-label=\"Back to app\"\n >\n <IconArrowLeft className=\"h-4 w-4\" />\n </Link>\n <h1 className=\"text-sm font-semibold\">Extensions</h1>\n </div>\n <div className=\"flex items-center gap-2\">\n <Popover open={showCreate} onOpenChange={setShowCreate}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className=\"inline-flex cursor-pointer items-center justify-center gap-1.5 rounded-md bg-primary px-3 py-1.5 text-sm font-medium text-primary-foreground hover:bg-primary/90\"\n >\n <IconPlus className=\"h-4 w-4\" />\n New Extension\n </button>\n </PopoverTrigger>\n <PopoverContent\n align=\"end\"\n sideOffset={6}\n className=\"w-[420px] p-3\"\n >\n <p className=\"px-1 pb-2 text-sm font-semibold text-foreground\">\n New extension\n </p>\n <PromptComposer\n autoFocus\n placeholder=\"Describe what you'd like to build...\"\n draftScope=\"extensions:create-popover\"\n onSubmit={handleCreate}\n />\n </PopoverContent>\n </Popover>\n <NotificationsBell />\n <AgentToggleButton />\n </div>\n </header>\n\n <div className=\"flex-1 overflow-auto p-6\">\n {isLoading ? (\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {Array.from({ length: 6 }).map((_, i) => (\n <div\n key={i}\n className=\"rounded-lg border border-border bg-card p-5\"\n >\n <div className=\"mb-3 h-10 w-10 rounded-lg bg-muted animate-pulse\" />\n <div className=\"mb-2 h-4 w-2/3 rounded bg-muted animate-pulse\" />\n <div className=\"h-3 w-4/5 rounded bg-muted animate-pulse\" />\n </div>\n ))}\n </div>\n ) : toolList.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center gap-4 py-16 text-center\">\n <IconTool className=\"h-10 w-10 text-muted-foreground/40\" />\n <div>\n <p className=\"text-sm font-medium\">No extensions yet</p>\n <p className=\"text-xs text-muted-foreground mt-1\">\n Describe what you'd like to build\n </p>\n </div>\n <CreateToolInput className=\"w-full max-w-sm\" />\n </div>\n ) : (\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {toolList.map((extension) => (\n <div\n key={extension.id}\n className={cn(\n \"group relative rounded-lg border border-border bg-card\",\n \"hover:border-primary/30 hover:shadow-sm\",\n )}\n >\n <Link\n to={`/extensions/${extension.id}`}\n className=\"block p-5 pr-12\"\n >\n <div className=\"mb-3 flex h-10 w-10 items-center justify-center rounded-lg bg-muted text-muted-foreground group-hover:bg-primary/10 group-hover:text-primary\">\n <IconTool className=\"h-5 w-5\" />\n </div>\n <h3 className=\"mb-1 text-sm font-semibold text-foreground\">\n {extension.name}\n </h3>\n {extension.description && (\n <p className=\"line-clamp-2 text-xs text-muted-foreground\">\n {extension.description}\n </p>\n )}\n </Link>\n <Popover\n open={confirmDeleteId === extension.id}\n onOpenChange={(open) =>\n setConfirmDeleteId(open ? extension.id : null)\n }\n >\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className=\"absolute right-3 top-3 inline-flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground opacity-0 hover:bg-accent hover:text-foreground focus:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring group-hover:opacity-100\"\n aria-label={`Options for ${extension.name}`}\n >\n <IconDotsVertical className=\"h-4 w-4\" />\n </button>\n </PopoverTrigger>\n <PopoverContent\n align=\"end\"\n sideOffset={4}\n className=\"w-64 p-0\"\n >\n <div className=\"p-3\">\n <p className=\"text-[12px]\">\n Delete{\" \"}\n <span className=\"font-medium\">{extension.name}</span>?\n This removes it everywhere it is shared.\n </p>\n <div className=\"mt-3 flex justify-end gap-1\">\n <button\n type=\"button\"\n onClick={() => setConfirmDeleteId(null)}\n className=\"rounded-md px-2 py-1 text-[12px] hover:bg-accent\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={() => handleDelete(extension)}\n disabled={deletingId === extension.id}\n className={cn(\n \"inline-flex items-center gap-1.5 rounded-md bg-destructive px-2 py-1 text-[12px] text-destructive-foreground hover:bg-destructive/90\",\n deletingId === extension.id && \"opacity-60\",\n )}\n >\n <IconTrash className=\"h-3.5 w-3.5\" />\n {deletingId === extension.id\n ? \"Deleting...\"\n : \"Delete\"}\n </button>\n </div>\n </div>\n </PopoverContent>\n </Popover>\n </div>\n ))}\n </div>\n )}\n </div>\n </div>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ExtensionsListPage.js","sourceRoot":"","sources":["../../../src/client/extensions/ExtensionsListPage.tsx"],"names":[],"mappings":"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","sourcesContent":["import { agentNativePath } from \"../api-path.js\";\nimport { useState, useEffect } from \"react\";\nimport { useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { Link } from \"react-router\";\nimport {\n IconArrowLeft,\n IconDotsVertical,\n IconPlus,\n IconTool,\n IconTrash,\n} from \"@tabler/icons-react\";\nimport { cn } from \"../utils.js\";\nimport { AgentToggleButton } from \"../AgentPanel.js\";\nimport { NotificationsBell } from \"../notifications/NotificationsBell.js\";\nimport { sendToAgentChat } from \"../agent-chat.js\";\nimport { PromptComposer } from \"../composer/PromptComposer.js\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"../components/ui/popover.js\";\nimport {\n TOOLS_ORDER_CHANGE_EVENT,\n applyToolsOrder,\n getToolsOrder,\n} from \"./extension-order.js\";\n\ninterface Extension {\n id: string;\n name: string;\n description?: string;\n icon?: string;\n}\n\nlet lastCreateSubmission: { prompt: string; at: number } | null = null;\n\nfunction submitCreateTool(prompt: string) {\n const trimmed = prompt.trim();\n if (!trimmed) return;\n const now = Date.now();\n if (\n lastCreateSubmission &&\n lastCreateSubmission.prompt === trimmed &&\n now - lastCreateSubmission.at < 2_000\n ) {\n return;\n }\n lastCreateSubmission = { prompt: trimmed, at: now };\n sendToAgentChat({\n message: `Create an extension: ${trimmed}`,\n submit: true,\n openSidebar: true,\n newTab: true,\n });\n}\n\nfunction CreateToolInput({ className }: { className?: string }) {\n return (\n <div className={cn(\"flex flex-col gap-3\", className)}>\n <p className=\"text-center text-base font-semibold text-foreground\">\n New extension\n </p>\n <PromptComposer\n autoFocus\n placeholder=\"Describe what you'd like to build... e.g. a todo list, API dashboard, calculator\"\n draftScope=\"extensions:create\"\n onSubmit={(text) => submitCreateTool(text)}\n />\n </div>\n );\n}\n\nexport function ExtensionsListPage() {\n const [showCreate, setShowCreate] = useState(false);\n const [confirmDeleteId, setConfirmDeleteId] = useState<string | null>(null);\n const [deletingId, setDeletingId] = useState<string | null>(null);\n const queryClient = useQueryClient();\n const [toolOrderState, setToolOrderState] = useState<string[]>(() =>\n typeof window !== \"undefined\" ? getToolsOrder() : [],\n );\n\n useEffect(() => {\n fetch(agentNativePath(\"/_agent-native/application-state/navigation\"), {\n method: \"PUT\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ view: \"extensions\" }),\n }).catch(() => {});\n }, []);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const syncOrder = () => setToolOrderState(getToolsOrder());\n window.addEventListener(TOOLS_ORDER_CHANGE_EVENT, syncOrder);\n window.addEventListener(\"storage\", syncOrder);\n return () => {\n window.removeEventListener(TOOLS_ORDER_CHANGE_EVENT, syncOrder);\n window.removeEventListener(\"storage\", syncOrder);\n };\n }, []);\n\n const { data: extensions, isLoading } = useQuery<Extension[]>({\n queryKey: [\"extensions\"],\n queryFn: async () => {\n const res = await fetch(agentNativePath(\"/_agent-native/extensions\"));\n if (!res.ok) return [];\n return res.json();\n },\n });\n\n const toolList =\n toolOrderState.length > 0\n ? applyToolsOrder(extensions ?? [], toolOrderState)\n : (extensions ?? []);\n\n const handleCreate = (text: string) => {\n submitCreateTool(text);\n setShowCreate(false);\n };\n\n const handleDelete = async (extension: Extension) => {\n setDeletingId(extension.id);\n const previous = queryClient.getQueryData<Extension[]>([\"extensions\"]);\n queryClient.setQueryData<Extension[]>([\"extensions\"], (old) =>\n (old ?? []).filter((item) => item.id !== extension.id),\n );\n try {\n const res = await fetch(\n agentNativePath(`/_agent-native/extensions/${extension.id}`),\n { method: \"DELETE\" },\n );\n if (!res.ok) throw new Error(\"Delete failed\");\n } catch {\n if (previous) queryClient.setQueryData([\"extensions\"], previous);\n } finally {\n setDeletingId(null);\n setConfirmDeleteId(null);\n queryClient.invalidateQueries({ queryKey: [\"extensions\"] });\n }\n };\n\n return (\n <div className=\"flex h-full w-full flex-col\">\n <header className=\"flex h-12 items-center justify-between border-b px-4 shrink-0\">\n <div className=\"flex items-center gap-2\">\n <Link\n to=\"/\"\n className=\"inline-flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground hover:bg-accent hover:text-foreground\"\n aria-label=\"Back to app\"\n >\n <IconArrowLeft className=\"h-4 w-4\" />\n </Link>\n <h1 className=\"text-sm font-semibold\">Extensions</h1>\n </div>\n <div className=\"flex items-center gap-2\">\n <Popover open={showCreate} onOpenChange={setShowCreate}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className=\"inline-flex cursor-pointer items-center justify-center gap-1.5 rounded-md bg-primary px-3 py-1.5 text-sm font-medium text-primary-foreground hover:bg-primary/90\"\n >\n <IconPlus className=\"h-4 w-4\" />\n New Extension\n </button>\n </PopoverTrigger>\n <PopoverContent\n align=\"end\"\n sideOffset={6}\n className=\"w-[420px] p-3\"\n >\n <p className=\"px-1 pb-2 text-sm font-semibold text-foreground\">\n New extension\n </p>\n <PromptComposer\n autoFocus\n placeholder=\"Describe what you'd like to build...\"\n draftScope=\"extensions:create-popover\"\n onSubmit={handleCreate}\n />\n </PopoverContent>\n </Popover>\n <NotificationsBell />\n <AgentToggleButton />\n </div>\n </header>\n\n <div className=\"flex-1 overflow-auto px-5 py-8 sm:px-8 sm:py-10\">\n {isLoading ? (\n <div className=\"grid grid-cols-1 gap-5 sm:grid-cols-2 lg:grid-cols-3\">\n {Array.from({ length: 6 }).map((_, i) => (\n <div\n key={i}\n className=\"rounded-lg border border-border bg-card p-5\"\n >\n <div className=\"mb-3 h-10 w-10 rounded-lg bg-muted animate-pulse\" />\n <div className=\"mb-2 h-4 w-2/3 rounded bg-muted animate-pulse\" />\n <div className=\"h-3 w-4/5 rounded bg-muted animate-pulse\" />\n </div>\n ))}\n </div>\n ) : toolList.length === 0 ? (\n <div className=\"flex min-h-[calc(100vh-9rem)] flex-col items-center justify-center px-2 py-12 text-center sm:py-16\">\n <div className=\"mx-auto flex w-full max-w-2xl flex-col items-center gap-8\">\n <div className=\"flex flex-col items-center gap-4\">\n <IconTool className=\"h-12 w-12 text-muted-foreground/40\" />\n <div className=\"space-y-2\">\n <p className=\"text-base font-semibold text-foreground\">\n No extensions yet\n </p>\n <p className=\"text-sm text-muted-foreground\">\n Describe what you'd like to build\n </p>\n </div>\n </div>\n <CreateToolInput className=\"w-full\" />\n </div>\n </div>\n ) : (\n <div className=\"grid grid-cols-1 gap-5 sm:grid-cols-2 lg:grid-cols-3\">\n {toolList.map((extension) => (\n <div\n key={extension.id}\n className={cn(\n \"group relative rounded-lg border border-border bg-card\",\n \"hover:border-primary/30 hover:shadow-sm\",\n )}\n >\n <Link\n to={`/extensions/${extension.id}`}\n className=\"block p-5 pr-12\"\n >\n <div className=\"mb-3 flex h-10 w-10 items-center justify-center rounded-lg bg-muted text-muted-foreground group-hover:bg-primary/10 group-hover:text-primary\">\n <IconTool className=\"h-5 w-5\" />\n </div>\n <h3 className=\"mb-1 text-sm font-semibold text-foreground\">\n {extension.name}\n </h3>\n {extension.description && (\n <p className=\"line-clamp-2 text-xs text-muted-foreground\">\n {extension.description}\n </p>\n )}\n </Link>\n <Popover\n open={confirmDeleteId === extension.id}\n onOpenChange={(open) =>\n setConfirmDeleteId(open ? extension.id : null)\n }\n >\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className=\"absolute right-3 top-3 inline-flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground opacity-0 hover:bg-accent hover:text-foreground focus:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring group-hover:opacity-100\"\n aria-label={`Options for ${extension.name}`}\n >\n <IconDotsVertical className=\"h-4 w-4\" />\n </button>\n </PopoverTrigger>\n <PopoverContent\n align=\"end\"\n sideOffset={4}\n className=\"w-64 p-0\"\n >\n <div className=\"p-3\">\n <p className=\"text-[12px]\">\n Delete{\" \"}\n <span className=\"font-medium\">{extension.name}</span>?\n This removes it everywhere it is shared.\n </p>\n <div className=\"mt-3 flex justify-end gap-1\">\n <button\n type=\"button\"\n onClick={() => setConfirmDeleteId(null)}\n className=\"rounded-md px-2 py-1 text-[12px] hover:bg-accent\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={() => handleDelete(extension)}\n disabled={deletingId === extension.id}\n className={cn(\n \"inline-flex items-center gap-1.5 rounded-md bg-destructive px-2 py-1 text-[12px] text-destructive-foreground hover:bg-destructive/90\",\n deletingId === extension.id && \"opacity-60\",\n )}\n >\n <IconTrash className=\"h-3.5 w-3.5\" />\n {deletingId === extension.id\n ? \"Deleting...\"\n : \"Delete\"}\n </button>\n </div>\n </div>\n </PopoverContent>\n </Popover>\n </div>\n ))}\n </div>\n )}\n </div>\n </div>\n );\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vite-dev-recovery-script.d.ts","sourceRoot":"","sources":["../../src/client/vite-dev-recovery-script.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,wBAAgB,wBAAwB,IAAI,MAAM,CA2LjD;AAED,wBAAgB,iCAAiC,IAAI,OAAO,
|
|
1
|
+
{"version":3,"file":"vite-dev-recovery-script.d.ts","sourceRoot":"","sources":["../../src/client/vite-dev-recovery-script.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,wBAAgB,wBAAwB,IAAI,MAAM,CA2LjD;AAED,wBAAgB,iCAAiC,IAAI,OAAO,CAe3D"}
|
|
@@ -194,6 +194,15 @@ export function getViteDevRecoveryScript() {
|
|
|
194
194
|
})();`;
|
|
195
195
|
}
|
|
196
196
|
export function shouldInlineViteDevRecoveryScript() {
|
|
197
|
-
|
|
197
|
+
const viteEnv = import.meta.env;
|
|
198
|
+
if (typeof process !== "undefined" &&
|
|
199
|
+
process.env?.NODE_ENV === "production") {
|
|
200
|
+
return false;
|
|
201
|
+
}
|
|
202
|
+
if (viteEnv?.PROD === true)
|
|
203
|
+
return false;
|
|
204
|
+
if (viteEnv?.DEV === true)
|
|
205
|
+
return true;
|
|
206
|
+
return true;
|
|
198
207
|
}
|
|
199
208
|
//# sourceMappingURL=vite-dev-recovery-script.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vite-dev-recovery-script.js","sourceRoot":"","sources":["../../src/client/vite-dev-recovery-script.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,UAAU,wBAAwB;IACtC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAyLH,CAAC;AACP,CAAC;AAED,MAAM,UAAU,iCAAiC;IAC/C,OAAO,
|
|
1
|
+
{"version":3,"file":"vite-dev-recovery-script.js","sourceRoot":"","sources":["../../src/client/vite-dev-recovery-script.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,UAAU,wBAAwB;IACtC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAyLH,CAAC;AACP,CAAC;AAED,MAAM,UAAU,iCAAiC;IAC/C,MAAM,OAAO,GACX,MAAM,CAAC,IAGR,CAAC,GAAG,CAAC;IACN,IACE,OAAO,OAAO,KAAK,WAAW;QAC9B,OAAO,CAAC,GAAG,EAAE,QAAQ,KAAK,YAAY,EACtC,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,OAAO,EAAE,IAAI,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IACzC,IAAI,OAAO,EAAE,GAAG,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACvC,OAAO,IAAI,CAAC;AACd,CAAC","sourcesContent":["/**\n * Synchronous dev-only browser recovery for Vite optimized-dependency races.\n *\n * Keep this script dependency-free and non-module-safe: React Router SSR roots\n * inline it before `<Scripts />`, and the Vite plugin injects it at\n * `head-prepend` for HTML that does pass through transformIndexHtml.\n */\nexport function getViteDevRecoveryScript(): string {\n return `\n(function() {\n var RELOAD_KEY = \"__an_optimize_reload\";\n var MAX_RELOADS = 3;\n var RESET_AFTER_MS = 8000;\n\n var reloadTimer = null;\n var overlayShown = false;\n\n // Track recent reloads in sessionStorage. If we reload too many times\n // in a short window, stop and show a manual-refresh message instead of\n // looping forever.\n function readReloadHistory() {\n try {\n var raw = sessionStorage.getItem(RELOAD_KEY);\n if (!raw) return [];\n var arr = JSON.parse(raw);\n var cutoff = Date.now() - 30000;\n return Array.isArray(arr) ? arr.filter(function(t) { return t > cutoff; }) : [];\n } catch (e) { return []; }\n }\n function recordReload() {\n try {\n var history = readReloadHistory();\n history.push(Date.now());\n sessionStorage.setItem(RELOAD_KEY, JSON.stringify(history));\n } catch (e) {}\n }\n // Reset the counter after a stable period (page didn't fail again).\n setTimeout(function() {\n try { sessionStorage.removeItem(RELOAD_KEY); } catch (e) {}\n }, RESET_AFTER_MS);\n\n function showOverlay(title, subtitle) {\n if (overlayShown) return;\n overlayShown = true;\n var mount = function() {\n if (!document.body) { setTimeout(mount, 16); return; }\n var el = document.createElement(\"div\");\n el.id = \"__an-reload-overlay\";\n el.style.cssText = [\n \"position:fixed\",\"inset:0\",\"z-index:2147483647\",\n \"display:flex\",\"align-items:center\",\"justify-content:center\",\n \"background:rgba(0,0,0,0.6)\",\"backdrop-filter:blur(8px)\",\n \"-webkit-backdrop-filter:blur(8px)\",\n \"font-family:-apple-system,BlinkMacSystemFont,system-ui,sans-serif\",\n \"color:#fff\",\"font-size:14px\"\n ].join(\";\");\n el.innerHTML =\n '<div style=\"background:#171717;padding:20px 24px;border-radius:12px;' +\n 'border:1px solid rgba(255,255,255,0.1);max-width:340px;text-align:center;' +\n 'box-shadow:0 20px 60px rgba(0,0,0,0.5)\">' +\n '<div style=\"font-weight:600;margin-bottom:6px\">' + title + '</div>' +\n '<div style=\"font-size:12px;opacity:0.7\">' + subtitle + '</div>' +\n '</div>';\n document.body.appendChild(el);\n };\n mount();\n }\n\n function scheduleReload(reason) {\n if (reloadTimer) return;\n var history = readReloadHistory();\n if (history.length >= MAX_RELOADS) {\n console.warn(\"[agent-native] Dev server keeps re-bundling. Manual refresh needed.\", reason);\n showOverlay(\n \"Dev server out of sync\",\n \"Auto-reload gave up after \" + MAX_RELOADS + \" tries. Refresh the page (\\\\u2318R / Ctrl+R).\"\n );\n return;\n }\n console.log(\"[agent-native] Vite re-bundled deps (\" + reason + \"), reloading\\\\u2026\");\n recordReload();\n // First reload is silent. One refresh almost always fixes it and the\n // overlay flash is more disruptive than the reload itself. Only show\n // the overlay starting on the second attempt, when something is clearly\n // taking longer than expected.\n if (history.length >= 1) {\n showOverlay(\"Updating dev server\\\\u2026\", \"Reloading the page\");\n }\n reloadTimer = setTimeout(function() { window.location.reload(); }, 300);\n }\n\n function looksLikeViteFailureMessage(message) {\n if (!message) return false;\n return message.indexOf(\"Failed to fetch dynamically imported module\") !== -1\n || message.indexOf(\"error loading dynamically imported module\") !== -1\n || message.indexOf(\"Importing a module script failed\") !== -1\n || message.indexOf(\"Outdated Optimize Dep\") !== -1\n || message.indexOf(\"Optimize Deps Processing Error\") !== -1\n || (message.indexOf(\"504\") !== -1 && (\n message.indexOf(\".vite/deps\") !== -1 ||\n message.indexOf(\"/node_modules/.vite/deps/\") !== -1\n ));\n }\n\n function looksLikeViteDep(url) {\n if (!url) return false;\n // Only treat same-origin URLs as Vite deps. Do not reload the page\n // because some third-party CDN script 404'd.\n try {\n var u = new URL(url, window.location.href);\n if (u.origin !== window.location.origin) return false;\n } catch (e) { return false; }\n return url.indexOf(\"/node_modules/.vite/deps/\") !== -1\n || url.indexOf(\"/@fs/\") !== -1\n || url.indexOf(\"/@id/\") !== -1\n || url.indexOf(\"?v=\") !== -1\n || url.indexOf(\"?import\") !== -1\n || /\\\\.(m?js|ts|tsx|jsx)(\\\\?|$)/.test(url);\n }\n\n // 1) <script type=\"module\"> / <link> 504. These fire on the element, not\n // window, so use capture phase to catch resource load errors.\n window.addEventListener(\"error\", function(e) {\n var t = e.target;\n if (!t || t === window) {\n var message = String(e.message || \"\");\n if (looksLikeViteFailureMessage(message)) {\n scheduleReload(\"window error\");\n }\n return;\n }\n var tag = t.tagName;\n if (tag !== \"SCRIPT\" && tag !== \"LINK\") return;\n var url = t.src || t.href || \"\";\n if (looksLikeViteDep(url)) {\n var name = url.split(\"/\").pop();\n scheduleReload(\"script 504: \" + name);\n }\n }, true);\n\n // Vite's documented hook for failed dynamic-import preloads. This mostly\n // targets production chunk skew, but it also fires for some dev optimizer\n // races, so wire it into the same guarded reload path.\n window.addEventListener(\"vite:preloadError\", function(e) {\n var payload = e && e.payload;\n var msg = String((payload && (payload.message || payload)) || \"\");\n if (!msg || looksLikeViteFailureMessage(msg)) {\n if (e.preventDefault) e.preventDefault();\n scheduleReload(\"preload error\");\n }\n });\n\n // 2) Dynamic import failures (React Router code splitting, lazy components).\n window.addEventListener(\"unhandledrejection\", function(e) {\n var msg = String((e.reason && (e.reason.message || e.reason)) || \"\");\n if (looksLikeViteFailureMessage(msg)) {\n scheduleReload(\"dynamic import\");\n }\n });\n\n // Static module-graph fetch failures for child imports don't always surface\n // as element errors or rejections. Chrome exposes the HTTP status via\n // Resource Timing; when available, use it as a final safety net.\n var seenResources = {};\n function checkResourceEntry(entry) {\n var url = entry && entry.name;\n if (!url || seenResources[url]) return;\n seenResources[url] = true;\n if (!looksLikeViteDep(url)) return;\n if (entry.responseStatus === 504) {\n var name = url.split(\"/\").pop();\n scheduleReload(\"resource 504: \" + name);\n }\n }\n function checkExistingResources() {\n try {\n var entries = performance.getEntriesByType(\"resource\") || [];\n for (var i = 0; i < entries.length; i++) checkResourceEntry(entries[i]);\n } catch (e) {}\n }\n if (window.PerformanceObserver) {\n try {\n var observer = new PerformanceObserver(function(list) {\n var entries = list.getEntries();\n for (var i = 0; i < entries.length; i++) checkResourceEntry(entries[i]);\n });\n observer.observe({ type: \"resource\", buffered: true });\n } catch (e) {\n setTimeout(checkExistingResources, 0);\n }\n } else {\n setTimeout(checkExistingResources, 0);\n }\n})();`;\n}\n\nexport function shouldInlineViteDevRecoveryScript(): boolean {\n const viteEnv = (\n import.meta as ImportMeta & {\n env?: { DEV?: boolean; PROD?: boolean };\n }\n ).env;\n if (\n typeof process !== \"undefined\" &&\n process.env?.NODE_ENV === \"production\"\n ) {\n return false;\n }\n if (viteEnv?.PROD === true) return false;\n if (viteEnv?.DEV === true) return true;\n return true;\n}\n"]}
|
|
@@ -28,7 +28,19 @@ configureTracking({
|
|
|
28
28
|
});
|
|
29
29
|
import "./global.css";
|
|
30
30
|
|
|
31
|
-
const
|
|
31
|
+
const THEME_INIT_SCRIPT_SELECTOR = "script[data-agent-native-theme-init]";
|
|
32
|
+
|
|
33
|
+
function getHydrationStableThemeInitScript() {
|
|
34
|
+
if (typeof document !== "undefined") {
|
|
35
|
+
const existing = document.querySelector<HTMLScriptElement>(
|
|
36
|
+
THEME_INIT_SCRIPT_SELECTOR,
|
|
37
|
+
);
|
|
38
|
+
if (existing?.innerHTML) return existing.innerHTML;
|
|
39
|
+
}
|
|
40
|
+
return getThemeInitScript();
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const THEME_INIT_SCRIPT = getHydrationStableThemeInitScript();
|
|
32
44
|
|
|
33
45
|
export function Layout({ children }: { children: React.ReactNode }) {
|
|
34
46
|
return (
|
|
@@ -40,6 +52,7 @@ export function Layout({ children }: { children: React.ReactNode }) {
|
|
|
40
52
|
content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"
|
|
41
53
|
/>
|
|
42
54
|
<script
|
|
55
|
+
data-agent-native-theme-init
|
|
43
56
|
suppressHydrationWarning
|
|
44
57
|
dangerouslySetInnerHTML={{ __html: THEME_INIT_SCRIPT }}
|
|
45
58
|
/>
|
package/dist/vite/client.d.ts
CHANGED
|
@@ -12,6 +12,8 @@ export interface NitroOptions {
|
|
|
12
12
|
export interface ClientConfigOptions {
|
|
13
13
|
/** Port for dev server. Default: 8080 */
|
|
14
14
|
port?: number;
|
|
15
|
+
/** Vite log level. Workspace child apps default to "warn" so only the gateway URL is advertised. */
|
|
16
|
+
logLevel?: UserConfig["logLevel"];
|
|
15
17
|
/** Additional Vite plugins */
|
|
16
18
|
plugins?: any[];
|
|
17
19
|
/** Nitro plugin options (preset, srcDir, etc) */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/vite/client.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAU,UAAU,EAAE,MAAM,MAAM,CAAC;AAgY/C,MAAM,WAAW,YAAY;IAC3B,sGAAsG;IACtG,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,6DAA6D;IAC7D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oEAAoE;IACpE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4CAA4C;IAC5C,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,mBAAmB;IAClC,yCAAyC;IACzC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,8BAA8B;IAC9B,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC;IAChB,iDAAiD;IACjD,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,+BAA+B;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,iDAAiD;IACjD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gCAAgC;IAChC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,kCAAkC;IAClC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,iDAAiD;IACjD,YAAY,CAAC,EAAE,WAAW,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC;IACvD;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;;;;;;;;;;;OAcG;IACH,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB;;;;;;;;OAQG;IACH,WAAW,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjD;AAqMD,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,IAAI,EAAE,MAAM,GAAG,SAAS,GACvB,MAAM,GAAG,SAAS,CAMpB;AAED,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,GAAG,SAAS,GACvB,OAAO,CAWT;AAuID;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,OAAO,GAAE,mBAAwB,GAAG,UAAU,
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/vite/client.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAU,UAAU,EAAE,MAAM,MAAM,CAAC;AAgY/C,MAAM,WAAW,YAAY;IAC3B,sGAAsG;IACtG,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,6DAA6D;IAC7D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oEAAoE;IACpE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4CAA4C;IAC5C,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,mBAAmB;IAClC,yCAAyC;IACzC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oGAAoG;IACpG,QAAQ,CAAC,EAAE,UAAU,CAAC,UAAU,CAAC,CAAC;IAClC,8BAA8B;IAC9B,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC;IAChB,iDAAiD;IACjD,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,+BAA+B;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,iDAAiD;IACjD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gCAAgC;IAChC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,kCAAkC;IAClC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,iDAAiD;IACjD,YAAY,CAAC,EAAE,WAAW,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC;IACvD;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;;;;;;;;;;;OAcG;IACH,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB;;;;;;;;OAQG;IACH,WAAW,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjD;AAqMD,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,IAAI,EAAE,MAAM,GAAG,SAAS,GACvB,MAAM,GAAG,SAAS,CAMpB;AAED,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,GAAG,SAAS,GACvB,OAAO,CAWT;AAuID;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,OAAO,GAAE,mBAAwB,GAAG,UAAU,CAsP1E"}
|
package/dist/vite/client.js
CHANGED
|
@@ -711,6 +711,7 @@ export function defineConfig(options = {}) {
|
|
|
711
711
|
// APP_BASE_PATH lets this app be mounted under a prefix (e.g. "/mail") as
|
|
712
712
|
// part of a unified workspace deploy. Defaults to "/" for standalone apps.
|
|
713
713
|
const appBasePath = process.env.VITE_APP_BASE_PATH || process.env.APP_BASE_PATH || "/";
|
|
714
|
+
const isWorkspaceChild = process.env.AGENT_NATIVE_WORKSPACE === "1";
|
|
714
715
|
const base = appBasePath.endsWith("/") ? appBasePath : `${appBasePath}/`;
|
|
715
716
|
const monorepoCoreAllow = [
|
|
716
717
|
path.resolve(cwd, "../../packages/core"),
|
|
@@ -727,6 +728,7 @@ export function defineConfig(options = {}) {
|
|
|
727
728
|
? [new RegExp(`^${escapeRegex(workspaceCore.packageName)}(/.*)?$`)]
|
|
728
729
|
: [];
|
|
729
730
|
return {
|
|
731
|
+
logLevel: options.logLevel ?? (isWorkspaceChild ? "warn" : undefined),
|
|
730
732
|
envDir,
|
|
731
733
|
base,
|
|
732
734
|
server: {
|
package/dist/vite/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/vite/client.ts"],"names":[],"mappings":"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","sourcesContent":["import path from \"path\";\nimport fs from \"fs\";\nimport { createRequire } from \"module\";\nimport type { Plugin, UserConfig } from \"vite\";\nimport { nitro as nitroVitePlugin } from \"nitro/vite\";\nimport { actionTypesPlugin } from \"./action-types-plugin.js\";\nimport { agentsBundlePlugin } from \"./agents-bundle-plugin.js\";\nimport { findWorkspaceRoot } from \"../scripts/utils.js\";\nimport { getViteDevRecoveryScript } from \"../client/vite-dev-recovery-script.js\";\n\nimport { fileURLToPath } from \"url\";\n\nconst require = createRequire(import.meta.url);\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\n/**\n * Sync discovery for the workspace-core in an enterprise monorepo.\n *\n * Mirrors `getWorkspaceCoreExports` in deploy/workspace-core.ts but stays\n * synchronous so it can run inline in `defineConfig`. Returns the workspace\n * core's package name + absolute directory, or null if no workspace core is\n * declared in the ancestor chain.\n *\n * Walks up from `startDir` looking for a package.json with\n * `agent-native.workspaceCore`. Resolves the declared package name through\n * `<workspaceRoot>/node_modules/<name>` (pnpm symlink, fastest) or by\n * scanning `packages/*` for a matching `name` field (fallback for\n * pre-install scenarios).\n */\nfunction findWorkspaceCoreSync(\n startDir: string,\n): { packageName: string; packageDir: string } | null {\n // 1) Walk up looking for the root package.json that declares workspaceCore.\n let dir = path.resolve(startDir);\n let workspaceRoot: string | null = null;\n let packageName: string | null = null;\n for (let i = 0; i < 20; i++) {\n const pkgPath = path.join(dir, \"package.json\");\n if (fs.existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, \"utf-8\"));\n const declared = pkg?.[\"agent-native\"]?.workspaceCore;\n if (typeof declared === \"string\" && declared.length > 0) {\n workspaceRoot = dir;\n packageName = declared;\n break;\n }\n } catch {\n // Malformed package.json — keep walking up.\n }\n }\n const parent = path.dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n if (!workspaceRoot || !packageName) return null;\n\n // 2a) pnpm/npm symlink under workspaceRoot/node_modules.\n const nm = path.join(workspaceRoot, \"node_modules\", packageName);\n if (fs.existsSync(path.join(nm, \"package.json\"))) {\n return { packageName, packageDir: fs.realpathSync(nm) };\n }\n\n // 2b) Scan packages/* and packages/@scope/* for a matching `name`.\n const packagesDir = path.join(workspaceRoot, \"packages\");\n if (fs.existsSync(packagesDir)) {\n const candidates: string[] = [];\n for (const entry of fs.readdirSync(packagesDir, { withFileTypes: true })) {\n if (!entry.isDirectory()) continue;\n candidates.push(path.join(packagesDir, entry.name));\n if (entry.name.startsWith(\"@\")) {\n const scopeDir = path.join(packagesDir, entry.name);\n for (const sub of fs.readdirSync(scopeDir, { withFileTypes: true })) {\n if (sub.isDirectory()) candidates.push(path.join(scopeDir, sub.name));\n }\n }\n }\n for (const c of candidates) {\n const p = path.join(c, \"package.json\");\n if (!fs.existsSync(p)) continue;\n try {\n const pkg = JSON.parse(fs.readFileSync(p, \"utf-8\"));\n if (pkg?.name === packageName)\n return { packageName, packageDir: fs.realpathSync(c) };\n } catch {\n // ignore malformed package.json\n }\n }\n }\n return null;\n}\n\n/** Escape a string so it can be embedded as a regex literal. */\nfunction escapeRegex(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\n/** Check if a package is installed in the project */\nfunction hasDep(pkg: string, cwd: string): boolean {\n try {\n const pkgJson = JSON.parse(\n fs.readFileSync(path.join(cwd, \"package.json\"), \"utf-8\"),\n );\n return !!(\n pkgJson.dependencies?.[pkg] ||\n pkgJson.devDependencies?.[pkg] ||\n pkgJson.peerDependencies?.[pkg]\n );\n } catch {\n return false;\n }\n}\n\n/**\n * Build the `resolve.dedupe` list dynamically. Reads core's package.json and\n * collects every peerDependency that the consuming app also declares. This\n * ensures Vite resolves them from the app root, not from core's own\n * node_modules — preventing duplicate React context / singleton issues.\n */\nfunction getClientDedupe(cwd: string): string[] {\n // Always dedupe React internals (sub-path exports aren't in peerDeps)\n const always = new Set([\"react\", \"react-dom\", \"react-dom/client\"]);\n\n // Server-only packages that never run in the browser — no point deduping.\n const serverOnly = new Set([\n \"drizzle-kit\",\n \"node-pty\",\n \"postgres\",\n \"ws\",\n \"typescript\",\n \"vite\",\n \"@vitejs/plugin-react-swc\",\n \"tailwindcss\",\n \"@tailwindcss/vite\",\n ]);\n\n try {\n const corePkgPath = path.resolve(__dirname, \"../../package.json\");\n const corePkg = JSON.parse(fs.readFileSync(corePkgPath, \"utf-8\"));\n\n // Scan both peerDependencies and dependencies. Direct deps like\n // @radix-ui/* use React internally — they must resolve against the\n // app's React, not a second copy inside core's node_modules.\n const coreDeps = new Set([\n ...Object.keys(corePkg.peerDependencies ?? {}),\n ...Object.keys(corePkg.dependencies ?? {}),\n ]);\n\n // Read the consuming app's dependencies\n const appPkg = JSON.parse(\n fs.readFileSync(path.join(cwd, \"package.json\"), \"utf-8\"),\n );\n const appDeps = new Set([\n ...Object.keys(appPkg.dependencies ?? {}),\n ...Object.keys(appPkg.devDependencies ?? {}),\n ]);\n\n for (const dep of coreDeps) {\n if (serverOnly.has(dep)) continue;\n // Dedupe if the app also declares it, OR if it's a React-based\n // UI library (Radix, Tanstack) that must share the app's React.\n if (\n appDeps.has(dep) ||\n dep.startsWith(\"@radix-ui/\") ||\n dep.startsWith(\"@tanstack/\")\n ) {\n always.add(dep);\n }\n }\n } catch {\n // Can't read package.json — fall back to known singletons\n }\n\n return [...always];\n}\n\n/**\n * Locate `packages/core/src` if we're inside the framework monorepo.\n * Shared between `getCoreSourceAliases` (which redirects imports to src/)\n * and `getDefaultOptimizeDeps` (which must NOT prebundle from dist/ when\n * the alias is active — otherwise the prebundle is built from a snapshot\n * of dist/ at startup and never picks up new exports).\n */\nfunction findCoreSrcDir(cwd: string): string | null {\n const candidates = [\n path.resolve(cwd, \"../../packages/core\"), // templates/<name>/\n path.resolve(cwd, \"../core\"), // packages/<name>/\n ];\n for (const candidate of candidates) {\n if (fs.existsSync(path.join(candidate, \"src/index.ts\"))) {\n return path.join(candidate, \"src\");\n }\n }\n return null;\n}\n\n/**\n * Every `@agent-native/core` subpath that gets a source alias. Must stay in\n * sync with `getCoreSourceAliases`. Used by `getDefaultOptimizeDeps` to skip\n * prebundling in monorepo mode, and by the consumer config to add them to\n * `optimizeDeps.exclude` so Vite always resolves them through the source\n * alias on every request — never from a stale dist/ snapshot.\n */\nconst CORE_CLIENT_SUBPATHS = [\n \"@agent-native/core\",\n \"@agent-native/core/client\",\n \"@agent-native/core/client/extensions\",\n \"@agent-native/core/client/tools\", // legacy alias\n \"@agent-native/core/client/org\",\n \"@agent-native/core/client/observability\",\n \"@agent-native/core/client/onboarding\",\n \"@agent-native/core/client/sharing\",\n \"@agent-native/core/client/notifications\",\n \"@agent-native/core/client/progress\",\n];\n\nfunction getDefaultOptimizeDeps(cwd: string): string[] {\n const inMonorepo = findCoreSrcDir(cwd) !== null;\n const entries: Array<{ specifier: string; packageName?: string }> = [\n // In monorepo mode the source alias resolves these to src/ on every\n // import, so prebundling from dist/ would just create a stale snapshot.\n // Skip them entirely — `optimizeDeps.exclude` below makes that explicit.\n ...(inMonorepo\n ? []\n : ([\n { specifier: \"@agent-native/core\" },\n {\n specifier: \"@agent-native/core/client\",\n packageName: \"@agent-native/core\",\n },\n {\n specifier: \"@agent-native/core/client/org\",\n packageName: \"@agent-native/core\",\n },\n {\n specifier: \"@agent-native/core/client/extensions\",\n packageName: \"@agent-native/core\",\n },\n {\n // Legacy alias — prior name for @agent-native/core/client/extensions.\n // Keep so deployed templates that haven't been updated still resolve.\n specifier: \"@agent-native/core/client/tools\",\n packageName: \"@agent-native/core\",\n },\n ] as Array<{ specifier: string; packageName?: string }>)),\n { specifier: \"@libsql/client\" },\n { specifier: \"@radix-ui/react-accordion\" },\n { specifier: \"@radix-ui/react-alert-dialog\" },\n { specifier: \"@radix-ui/react-avatar\" },\n { specifier: \"@radix-ui/react-checkbox\" },\n { specifier: \"@radix-ui/react-collapsible\" },\n { specifier: \"@radix-ui/react-context-menu\" },\n { specifier: \"@radix-ui/react-dialog\" },\n { specifier: \"@radix-ui/react-dropdown-menu\" },\n { specifier: \"@radix-ui/react-hover-card\" },\n { specifier: \"@radix-ui/react-label\" },\n { specifier: \"@radix-ui/react-menubar\" },\n { specifier: \"@radix-ui/react-navigation-menu\" },\n { specifier: \"@radix-ui/react-popover\" },\n { specifier: \"@radix-ui/react-progress\" },\n { specifier: \"@radix-ui/react-radio-group\" },\n { specifier: \"@radix-ui/react-scroll-area\" },\n { specifier: \"@radix-ui/react-select\" },\n { specifier: \"@radix-ui/react-separator\" },\n { specifier: \"@radix-ui/react-slider\" },\n { specifier: \"@radix-ui/react-slot\" },\n { specifier: \"@radix-ui/react-switch\" },\n { specifier: \"@radix-ui/react-tabs\" },\n { specifier: \"@radix-ui/react-toast\" },\n { specifier: \"@radix-ui/react-toggle\" },\n { specifier: \"@radix-ui/react-toggle-group\" },\n { specifier: \"@radix-ui/react-tooltip\" },\n { specifier: \"@tanstack/react-query\" },\n { specifier: \"@tabler/icons-react\" },\n { specifier: \"class-variance-authority\" },\n { specifier: \"clsx\" },\n { specifier: \"cmdk\" },\n { specifier: \"drizzle-orm\" },\n { specifier: \"drizzle-orm/pg-core\", packageName: \"drizzle-orm\" },\n { specifier: \"drizzle-orm/sqlite-core\", packageName: \"drizzle-orm\" },\n { specifier: \"h3\" },\n { specifier: \"next-themes\" },\n { specifier: \"react-hook-form\" },\n { specifier: \"sonner\" },\n { specifier: \"tailwind-merge\" },\n { specifier: \"zod\" },\n ];\n\n return entries\n .filter(({ specifier, packageName }) =>\n hasDep(packageName ?? specifier, cwd),\n )\n .map(({ specifier }) => specifier);\n}\n\n/**\n * In monorepo dev mode, resolve @agent-native/core imports to source (src/)\n * instead of dist/ so that Vite HMR picks up changes without rebuilding.\n *\n * Returns Vite array-style aliases with exact matching (regex anchored with $)\n * to prevent `@agent-native/core` from prefix-matching and swallowing\n * sub-path imports like `@agent-native/core/client`.\n */\nfunction getCoreSourceAliases(\n cwd: string,\n): Array<{ find: RegExp; replacement: string }> {\n const coreSrc = findCoreSrcDir(cwd);\n if (!coreSrc) return []; // Not in monorepo — use dist as normal\n\n // Map every @agent-native/core/* export to its src/ equivalent.\n // Each entry uses a regex with $ anchor for exact matching.\n const entries: Record<string, string> = {\n \"@agent-native/core\": path.join(coreSrc, \"index.browser.ts\"),\n \"@agent-native/core/server\": path.join(coreSrc, \"server/index.ts\"),\n \"@agent-native/core/client\": path.join(coreSrc, \"client/index.ts\"),\n \"@agent-native/core/client/extensions\": path.join(\n coreSrc,\n \"client/extensions/index.ts\",\n ),\n // Legacy alias — see exports map note above.\n \"@agent-native/core/client/tools\": path.join(\n coreSrc,\n \"client/extensions/index.ts\",\n ),\n \"@agent-native/core/client/org\": path.join(coreSrc, \"client/org/index.ts\"),\n \"@agent-native/core/client/observability\": path.join(\n coreSrc,\n \"client/observability/index.ts\",\n ),\n \"@agent-native/core/client/onboarding\": path.join(\n coreSrc,\n \"client/onboarding/index.ts\",\n ),\n \"@agent-native/core/client/sharing\": path.join(\n coreSrc,\n \"client/sharing/index.ts\",\n ),\n \"@agent-native/core/client/notifications\": path.join(\n coreSrc,\n \"client/notifications/index.ts\",\n ),\n \"@agent-native/core/client/progress\": path.join(\n coreSrc,\n \"client/progress/index.ts\",\n ),\n \"@agent-native/core/db\": path.join(coreSrc, \"db/index.ts\"),\n \"@agent-native/core/db/schema\": path.join(coreSrc, \"db/schema.ts\"),\n \"@agent-native/core/shared\": path.join(coreSrc, \"shared/index.ts\"),\n \"@agent-native/core/scripts\": path.join(coreSrc, \"scripts/index.ts\"),\n \"@agent-native/core/application-state\": path.join(\n coreSrc,\n \"application-state/index.ts\",\n ),\n \"@agent-native/core/settings\": path.join(coreSrc, \"settings/index.ts\"),\n \"@agent-native/core/credentials\": path.join(\n coreSrc,\n \"credentials/index.ts\",\n ),\n \"@agent-native/core/resources\": path.join(coreSrc, \"resources/index.ts\"),\n \"@agent-native/core/oauth-tokens\": path.join(\n coreSrc,\n \"oauth-tokens/index.ts\",\n ),\n \"@agent-native/core/a2a\": path.join(coreSrc, \"a2a/index.ts\"),\n \"@agent-native/core/router\": path.join(coreSrc, \"router/index.ts\"),\n \"@agent-native/core/terminal\": path.join(\n coreSrc,\n \"client/terminal/index.ts\",\n ),\n \"@agent-native/core/terminal/server\": path.join(\n coreSrc,\n \"terminal/index.ts\",\n ),\n \"@agent-native/core/adapters/cli\": path.join(\n coreSrc,\n \"adapters/cli/index.ts\",\n ),\n \"@agent-native/core/usage\": path.join(coreSrc, \"usage/store.ts\"),\n };\n\n // Escape special regex chars in the key and anchor with $\n return Object.entries(entries).map(([find, replacement]) => ({\n find: new RegExp(`^${find.replace(/[/]/g, \"\\\\/\")}$`),\n replacement,\n }));\n}\n\nexport interface NitroOptions {\n /** Nitro deployment preset (e.g. \"node\", \"vercel\", \"netlify\", \"cloudflare_pages\"). Default: \"node\" */\n preset?: string;\n /** Source directory for server files. Default: \"./server\" */\n srcDir?: string;\n /** Routes directory name (relative to srcDir). Default: \"routes\" */\n routesDir?: string;\n /** Any additional Nitro config overrides */\n [key: string]: unknown;\n}\n\nexport interface ClientConfigOptions {\n /** Port for dev server. Default: 8080 */\n port?: number;\n /** Additional Vite plugins */\n plugins?: any[];\n /** Nitro plugin options (preset, srcDir, etc) */\n nitro?: NitroOptions;\n /** Override resolve aliases */\n aliases?: Record<string, string>;\n /** Override build.outDir. Default: \"dist/spa\" */\n outDir?: string;\n /** Additional fs.allow paths */\n fsAllow?: string[];\n /** Additional fs.deny patterns */\n fsDeny?: string[];\n /** Additional Vite optimizeDeps configuration */\n optimizeDeps?: NonNullable<UserConfig[\"optimizeDeps\"]>;\n /**\n * Whether to auto-inject the Tailwind v4 Vite plugin (`@tailwindcss/vite`).\n * Defaults to true — set to `false` if a template wants to manage Tailwind\n * itself (e.g. the legacy v3 PostCSS pipeline).\n */\n tailwind?: boolean;\n /**\n * Package names to stub in the SSR bundle with an empty proxy object.\n *\n * Use this for dependencies that only run in the browser (canvas / diagram\n * libraries, editors, WebGL) but would otherwise get pulled into the\n * server bundle via SSR's noExternal policy — pushing the CF Pages\n * Functions bundle over the 25 MiB limit.\n *\n * Only add packages that are provably never called during SSR. If the\n * server imports one, it will receive a Proxy that throws on any real\n * use (which is better than bundling a 10 MiB dep the worker never calls).\n *\n * @example\n * ssrStubs: [\"mermaid\", \"@excalidraw/excalidraw\"]\n */\n ssrStubs?: string[];\n /**\n * @deprecated Pass `reactRouter()` directly in the `plugins` array instead.\n * Previously used to auto-load the React Router Vite plugin via require(),\n * but this fails in ESM contexts. Templates should now do:\n * ```ts\n * import { reactRouter } from \"@react-router/dev/vite\";\n * defineConfig({ plugins: [reactRouter()] })\n * ```\n */\n reactRouter?: boolean | Record<string, unknown>;\n}\n\n/**\n * Vite plugin that recovers the page when Vite's dependency optimizer\n * invalidates modules mid-load (the \"504 Outdated Optimize Dep\" error).\n *\n * Without this, the page silently fails: <script type=\"module\"> tags 504,\n * React never mounts, and the user is stuck on a blank screen until they\n * manually refresh. We catch the failure modes and auto-reload, with a\n * visible overlay so the user knows what's happening, and a loop guard\n * so we never thrash forever.\n *\n * CRITICAL: this must be a SYNCHRONOUS (non-module) script injected at\n * `head-prepend`. Module scripts are deferred — the browser starts fetching\n * all module scripts in parallel during HTML parsing, so a module listener\n * registers AFTER sibling modules have already started loading and\n * possibly errored out. A regular <script> blocks parsing and runs\n * synchronously, so the listener is registered before ANY module fetch\n * begins.\n *\n * Catches three failure modes (all before React needs to mount):\n * 1. <script type=\"module\"> / <link> 504 — window \"error\" event, capture phase\n * 2. Dynamic import 504 — \"unhandledrejection\" with \"dynamically imported module\"\n * 3. Child module 504 — resource timing when browser exposes the HTTP status\n */\nfunction autoReloadOnOptimizeDep(): Plugin {\n return {\n name: \"agent-native-auto-reload-optimize-dep\",\n apply: \"serve\",\n transformIndexHtml() {\n return [\n {\n tag: \"script\",\n // NOTE: no `type: \"module\"` — this must be a synchronous script.\n children: getViteDevRecoveryScript(),\n injectTo: \"head-prepend\",\n },\n ];\n },\n };\n}\n\n/**\n * Vite handles outdated optimized-dep requests inside its own transform\n * middleware and ends the HTTP response with `504 Outdated Optimize Dep`.\n * Browser module loaders do not consistently surface those child-module\n * failures to userland JavaScript, so also nudge the Vite HMR client from the\n * server side. This turns the confusing blank-screen state into the same\n * full-page reload Vite would have requested once optimization settled.\n */\nfunction fullReloadOnOptimizeDep504(): Plugin {\n return {\n name: \"agent-native-full-reload-optimize-dep-504\",\n apply: \"serve\",\n configureServer(server) {\n let lastReloadAt = 0;\n server.middlewares.use((req, res, next) => {\n const originalEnd = res.end;\n (res as unknown as { end: (...args: unknown[]) => unknown }).end = (\n ...endArgs: unknown[]\n ) => {\n const statusMessage = String(res.statusMessage || \"\");\n if (\n res.statusCode === 504 &&\n statusMessage === \"Outdated Optimize Dep\"\n ) {\n const now = Date.now();\n if (now - lastReloadAt > 500) {\n lastReloadAt = now;\n server.ws.send({ type: \"full-reload\" });\n server.config.logger.info(\n `[agent-native] Vite optimized deps changed while loading ${\n req.url ?? \"a module\"\n }; reloading the page.`,\n { timestamp: true },\n );\n }\n }\n return (originalEnd as (...args: unknown[]) => unknown).apply(\n res,\n endArgs,\n );\n };\n next();\n });\n },\n };\n}\n\n/**\n * Vite plugin that prevents the built-in base middleware from redirecting\n * \"/\" → \"/app/\" (or whatever the base is). When agent-native apps run with\n * --base /app/ in single-port mode, Vite's baseMiddleware sends a 302 from\n * \"/\" to the base path. This breaks Electron webview and iframe embeds\n * that load the app at the root. Instead, we rewrite \"/\" to the base path\n * internally so the app serves without a visible redirect.\n */\nfunction baseRedirectGuard(): Plugin {\n return {\n name: \"agent-native-base-redirect-guard\",\n apply: \"serve\",\n configureServer(server) {\n // Return a function so the middleware is added AFTER Vite's internal\n // middleware is built — but we insert BEFORE by using the pre-hook\n // approach: configureServer hooks that return nothing run before\n // internal middleware.\n server.middlewares.use((req, res, next) => {\n const base = server.config.base;\n if (base && base !== \"/\" && req.url?.startsWith(base)) {\n const relativeUrl = req.url.slice(base.length - 1);\n try {\n const url = new URL(relativeUrl, \"http://agent-native.local\");\n const publicDir = server.config.publicDir;\n if (typeof publicDir !== \"string\") {\n return next();\n }\n const publicPath = path.normalize(\n path.join(publicDir, decodeURIComponent(url.pathname)),\n );\n if (\n publicPath.startsWith(publicDir + path.sep) &&\n fs.existsSync(publicPath) &&\n fs.statSync(publicPath).isFile()\n ) {\n const contentType = contentTypeForPublicFile(publicPath);\n if (contentType) res.setHeader(\"content-type\", contentType);\n if (req.method === \"HEAD\") {\n res.statusCode = 200;\n res.end();\n return;\n }\n fs.createReadStream(publicPath).pipe(res);\n return;\n }\n } catch {\n // Fall through to Vite/Nitro. Malformed URLs should keep their\n // original path so the normal dev-server error handling applies.\n }\n }\n req.url = stripMountedDevApiPath(req.url, base);\n if (\n req.method === \"HEAD\" &&\n req.url &&\n !isFrameworkDevPath(req.url, base)\n ) {\n req.method = \"GET\";\n }\n if (\n base &&\n base !== \"/\" &&\n (req.url === \"/\" || req.url === \"/index.html\")\n ) {\n // Rewrite to the base path so Vite serves the app directly\n req.url = base;\n }\n next();\n });\n },\n };\n}\n\nfunction contentTypeForPublicFile(filePath: string): string | null {\n switch (path.extname(filePath).toLowerCase()) {\n case \".css\":\n return \"text/css\";\n case \".html\":\n return \"text/html\";\n case \".ico\":\n return \"image/x-icon\";\n case \".json\":\n case \".webmanifest\":\n return \"application/json\";\n case \".js\":\n case \".mjs\":\n return \"text/javascript\";\n case \".png\":\n return \"image/png\";\n case \".svg\":\n return \"image/svg+xml\";\n case \".txt\":\n return \"text/plain\";\n case \".xml\":\n return \"application/xml\";\n default:\n return null;\n }\n}\n\nfunction devPathname(reqUrl: string): string {\n return new URL(reqUrl, \"http://agent-native.local\").pathname;\n}\n\nfunction isApiDevPath(reqUrl: string): boolean {\n const pathname = devPathname(reqUrl);\n return pathname === \"/api\" || pathname.startsWith(\"/api/\");\n}\n\nexport function stripMountedDevApiPath(\n reqUrl: string | undefined,\n base: string | undefined,\n): string | undefined {\n if (!reqUrl || !base || base === \"/\") return reqUrl;\n const normalizedBase = base.endsWith(\"/\") ? base : `${base}/`;\n if (!reqUrl.startsWith(normalizedBase)) return reqUrl;\n const stripped = reqUrl.slice(normalizedBase.length - 1) || \"/\";\n return isApiDevPath(stripped) ? stripped : reqUrl;\n}\n\nexport function isFrameworkDevPath(\n reqUrl: string,\n base: string | undefined,\n): boolean {\n const pathname = devPathname(reqUrl);\n if (pathname === \"/_agent-native\" || pathname.startsWith(\"/_agent-native/\")) {\n return true;\n }\n if (!base || base === \"/\") return false;\n const normalizedBase = base.endsWith(\"/\") ? base.slice(0, -1) : base;\n return (\n pathname === `${normalizedBase}/_agent-native` ||\n pathname.startsWith(`${normalizedBase}/_agent-native/`)\n );\n}\n\n/**\n * Work around a Rolldown bug where Nitro passes service entries as objects\n * ({index: \"path\"}) but Rolldown expects strings. This plugin normalizes\n * rollupOptions.input entries in the SSR environment.\n */\nfunction rolldownInputFix(): Plugin {\n return {\n name: \"agent-native-rolldown-input-fix\",\n configEnvironment(name, config) {\n const input = config.build?.rollupOptions?.input;\n if (!Array.isArray(input)) return;\n // Flatten any object entries to just their string values\n const fixed = input.map((entry: any) => {\n if (typeof entry === \"string\") return entry;\n if (typeof entry === \"object\" && entry !== null) {\n const values = Object.values(entry);\n return values[0] as string;\n }\n return entry;\n });\n config.build!.rollupOptions!.input = fixed;\n },\n };\n}\n\n/**\n * Expose the resolved Vite dev server port as process.env.PORT so that\n * in-process scripts (which use localFetch → http://localhost:${PORT}/api/...)\n * hit the right address even when Vite auto-increments the port.\n */\n/**\n * Replace caller-specified packages with an empty proxy stub during SSR\n * builds. For apps whose heavy browser-only deps would otherwise bloat the\n * edge worker past CF Pages' 25 MiB Functions limit.\n *\n * The template lists the packages in its `defineConfig({ ssrStubs })` call —\n * the framework never hardcodes package names.\n */\nfunction ssrStubPlugin(packages: string[]): Plugin | null {\n if (!packages.length) return null;\n const stubbed = new Set(packages);\n const STUB_ID = \"\\0agent-native-ssr-stub\";\n return {\n name: \"agent-native-ssr-stub-heavy-libs\",\n enforce: \"pre\",\n resolveId(id, _importer, opts) {\n if (!opts?.ssr) return null;\n // Match the bare package name or any subpath\n const pkg = id\n .split(\"/\")\n .slice(0, id.startsWith(\"@\") ? 2 : 1)\n .join(\"/\");\n if (stubbed.has(pkg)) return STUB_ID;\n return null;\n },\n load(id) {\n if (id !== STUB_ID) return null;\n // Proxy that answers any property access with itself — lets dead\n // import/re-export chains parse without blowing up, and still throws\n // if code actually tries to call any of it on the server.\n return (\n \"const handler = { get(_, p) { \" +\n \"if (p === Symbol.toPrimitive) return () => ''; \" +\n \"if (p === 'then') return undefined; \" +\n \"return new Proxy(() => {}, handler); \" +\n \"} };\" +\n \"const stub = new Proxy(() => {}, handler);\" +\n \"export default stub;\"\n );\n },\n };\n}\n\nfunction portExposer(): Plugin {\n return {\n name: \"agent-native-port-exposer\",\n apply: \"serve\",\n configureServer(server) {\n server.httpServer?.once(\"listening\", () => {\n const addr = server.httpServer?.address();\n if (addr && typeof addr === \"object\" && addr.port) {\n process.env.PORT = String(addr.port); // guard:allow-env-mutation — Vite dev server port published once at boot before any request\n }\n });\n },\n };\n}\n\n/**\n * Silence benign `read ECONNRESET` noise from Vite's dev middleware.\n * Fires when a browser closes/reloads/navigates mid-request — the peer has\n * already gone away, there's nothing to fix, and Vite's error middleware\n * spams the terminal with \"Internal server error: read ECONNRESET\". Our H3\n * server layer already swallows this (create-server.ts onError); this plugin\n * does the same for Vite's own connect pipeline.\n */\nfunction silenceConnectionResets(): Plugin {\n const isBenign = (err: unknown) => {\n const e = err as NodeJS.ErrnoException | undefined;\n const code = e?.code || (e?.cause as NodeJS.ErrnoException)?.code;\n return (\n code === \"ECONNRESET\" ||\n code === \"ECONNABORTED\" ||\n code === \"EPIPE\" ||\n e?.message === \"aborted\"\n );\n };\n return {\n name: \"agent-native-silence-connection-resets\",\n apply: \"serve\",\n configureServer(server) {\n // Swallow socket-level resets so Node doesn't surface them as uncaught.\n server.httpServer?.on(\"connection\", (socket) => {\n socket.on(\"error\", (err) => {\n if (!isBenign(err)) throw err;\n });\n });\n // Drop Vite's \"Internal server error: read ECONNRESET\" log lines.\n const origError = server.config.logger.error.bind(server.config.logger);\n server.config.logger.error = (msg, opts) => {\n const text = typeof msg === \"string\" ? msg : String(msg ?? \"\");\n if (\n (opts?.error && isBenign(opts.error)) ||\n /Internal server error:\\s*(read ECONNRESET|aborted|EPIPE)/i.test(text)\n ) {\n return;\n }\n origError(msg, opts);\n };\n },\n };\n}\n\n/**\n * Create the client Vite config with sensible agent-native defaults.\n * Supports two modes:\n * - Legacy SPA mode (default): React SWC plugin, client-only routing\n * - React Router framework mode: SSR-capable with file-based routing\n *\n * Both modes include Nitro for API routes, path aliases, and fs restrictions.\n */\nexport function defineConfig(options: ClientConfigOptions = {}): UserConfig {\n // Check if React Router plugin was passed directly in plugins array\n const hasReactRouterPlugin = options.plugins?.some(\n (p: any) =>\n p?.name === \"react-router\" ||\n (Array.isArray(p) && p.some((pp: any) => pp?.name === \"react-router\")),\n );\n\n let reactTransformPlugin: any;\n\n if (!hasReactRouterPlugin && !options.reactRouter) {\n // Legacy SPA mode — use React SWC plugin (only when React Router is not used)\n try {\n reactTransformPlugin = require(\"@vitejs/plugin-react-swc\");\n if (reactTransformPlugin.default)\n reactTransformPlugin = reactTransformPlugin.default;\n } catch {\n // Will be resolved at runtime by Vite\n }\n }\n\n const cwd = process.cwd();\n\n // Workspace env fallback. If this app is inside a workspace, tell Vite to\n // also look for .env files at the workspace root. Per-app .env still wins\n // (Vite's loadEnv merges in precedence order — app dir is loaded after).\n const workspaceRoot = findWorkspaceRoot(cwd);\n const envDir = workspaceRoot && workspaceRoot !== cwd ? workspaceRoot : cwd;\n\n // Preload workspace-root .env into process.env so Nitro server code sees\n // shared keys during dev (Nitro reads process.env, not vite's envDir).\n if (workspaceRoot && workspaceRoot !== cwd) {\n try {\n const dotenv = require(\"dotenv\");\n dotenv.config({\n path: path.join(workspaceRoot, \".env\"),\n override: false,\n // Suppress the dotenv v17 tip line — this loader fires alongside\n // utils.ts loadEnv() during dev startup and would otherwise emit a\n // duplicate \"[dotenv] injecting env\" message.\n quiet: true,\n });\n } catch {}\n }\n\n // Build the React transform plugin (only for legacy SPA mode)\n const reactPluginInstance = reactTransformPlugin?.();\n\n // Auto-inject the Tailwind v4 Vite plugin if `@tailwindcss/vite` is\n // installed (which it is by default for all agent-native templates).\n // Templates can opt out by setting `options.tailwind = false`.\n let tailwindPluginInstance: any = null;\n if (options.tailwind !== false) {\n try {\n let tailwindPlugin = require(\"@tailwindcss/vite\");\n if (tailwindPlugin.default) tailwindPlugin = tailwindPlugin.default;\n // Tailwind's Vite optimizer uses Lightning CSS internally and runs\n // before Vite's own CSS minifier. Lightning CSS collapses the standard\n // `backdrop-filter` declaration when a `-webkit-` fallback is present,\n // so let Vite/esbuild handle the production CSS pass instead.\n tailwindPluginInstance = tailwindPlugin({ optimize: false });\n } catch {\n // Plugin not installed — silently skip. Old templates may still be on v3.\n }\n }\n\n // APP_BASE_PATH lets this app be mounted under a prefix (e.g. \"/mail\") as\n // part of a unified workspace deploy. Defaults to \"/\" for standalone apps.\n const appBasePath =\n process.env.VITE_APP_BASE_PATH || process.env.APP_BASE_PATH || \"/\";\n const base = appBasePath.endsWith(\"/\") ? appBasePath : `${appBasePath}/`;\n const monorepoCoreAllow = [\n path.resolve(cwd, \"../../packages/core\"),\n path.resolve(cwd, \"../core\"),\n ].filter((candidate) => fs.existsSync(path.join(candidate, \"package.json\")));\n\n // Workspace-core (enterprise monorepo): pull its directory into Vite's\n // file watcher + module graph so edits to its TS sources hot-reload the\n // dev server, and its package name into ssr.noExternal so the dynamic\n // import in framework-request-handler.ts goes through Vite's transform\n // pipeline (TypeScript, SSR HMR, the works).\n const workspaceCore = findWorkspaceCoreSync(cwd);\n const workspaceCoreFsAllow = workspaceCore ? [workspaceCore.packageDir] : [];\n const workspaceCoreNoExternal = workspaceCore\n ? [new RegExp(`^${escapeRegex(workspaceCore.packageName)}(/.*)?$`)]\n : [];\n\n return {\n envDir,\n base,\n server: {\n host: \"::\",\n port: options.port ?? 8080,\n fs: {\n allow: [\n \".\",\n ...monorepoCoreAllow,\n ...workspaceCoreFsAllow,\n ...(options.fsAllow ?? []),\n ],\n deny: [\n \".env\",\n \".env.*\",\n \"*.{crt,pem}\",\n \"**/.git/**\",\n ...(options.fsDeny ?? []),\n ],\n },\n },\n build: {\n outDir: options.outDir ?? \"dist/spa\",\n // Vite 8 defaults CSS minification to Lightning CSS, which collapses a\n // `backdrop-filter` + `-webkit-backdrop-filter` pair down to only the\n // prefixed form. Chrome ignores that, so glass effects disappear in\n // production. Keep esbuild as the CSS minifier and target Safari 18+ so\n // the standard property survives the production pipeline.\n cssMinify: \"esbuild\",\n cssTarget: [\"es2020\", \"safari18\"],\n },\n // Bundle all non-Node.js deps into the production SSR server build.\n // Edge runtimes (CF Workers, Deno) don't have node_modules at runtime.\n // In dev, React Router's Vite Environment runner expects CJS packages\n // like React to stay external; forcing them through the module runner\n // raises `module is not defined`.\n ssr: process.argv.includes(\"build\")\n ? {\n noExternal: /^(?!node:)/,\n // Pick the workspace-core's compiled `dist/` exports in prod —\n // Node-style `default` condition matches what edge runtimes (CF\n // Workers, Deno) can actually load. Without this, Vite's prod\n // build inherits the dev-condition src/ entry and ships unbuilt\n // TypeScript into the worker.\n resolve: {\n conditions: [\"node\", \"module\", \"import\", \"default\"],\n externalConditions: [\"node\", \"module\", \"import\", \"default\"],\n },\n }\n : {\n // Vite already sets `development` in the dev resolve conditions,\n // so the workspace-core template's exports.development → src/\n // entry is picked automatically — Vite handles TS compilation\n // and triggers a server restart when those files change.\n noExternal: [\n /^@agent-native\\/core(\\/.*)?$/,\n // Radix UI primitives are transitive deps of @agent-native/core\n // (used by FeedbackButton, AgentSidebar, ShareDialog, etc.). When\n // a consumer app SSRs a component that imports Radix, Node's\n // externalized resolver can't find @radix-ui/* from the app cwd\n // because pnpm doesn't hoist transitive deps. Bundling them\n // through Vite resolves them via the workspace store.\n /^@radix-ui\\//,\n // scheduling ships tsc-compiled dist files that contain literal\n // `@/` path-alias imports (e.g. `import { Input } from\n // \"@/components/ui/input\"`). In standalone (published) mode Node\n // treats the package as an external CJS dep and can't resolve\n // `@/components`. Adding it to noExternal makes Vite process it\n // through the module pipeline, where the consumer app's `@` →\n // `./app` alias is already registered.\n ...(hasDep(\"@agent-native/scheduling\", cwd)\n ? [/^@agent-native\\/scheduling(\\/.*)?$/]\n : []),\n ...workspaceCoreNoExternal,\n ],\n external: [\n \"react\",\n \"react-dom\",\n \"react-dom/server\",\n \"react-router\",\n \"react-router/dom\",\n \"react-router-dom\",\n ],\n },\n plugins: [\n // Stub packages from `options.ssrStubs` in the SSR bundle so they\n // don't bloat the edge worker. Opt-in per template — the framework\n // hardcodes nothing (e.g. docs sites legitimately import `shiki` on\n // the server, so we can't blanket-stub it here).\n ...(() => {\n const p = ssrStubPlugin(options.ssrStubs ?? []);\n return p ? [p] : [];\n })(),\n ...(options.plugins ?? []),\n actionTypesPlugin(),\n agentsBundlePlugin(),\n autoReloadOnOptimizeDep(),\n fullReloadOnOptimizeDep504(),\n baseRedirectGuard(),\n portExposer(),\n silenceConnectionResets(),\n rolldownInputFix(),\n // Nitro Vite plugin for dev-mode API route serving and HMR.\n // Disabled during build — React Router's build handles production.\n ...(process.argv.includes(\"build\")\n ? []\n : [\n nitroVitePlugin({\n serverDir: \"./server\",\n ...(options.nitro ?? {}),\n } as any),\n ]),\n reactPluginInstance,\n tailwindPluginInstance,\n ].filter(Boolean),\n optimizeDeps: {\n include: [\n ...getDefaultOptimizeDeps(cwd),\n ...(hasDep(\"@agent-native/pinpoint\", cwd)\n ? [\"@agent-native/pinpoint/react\"]\n : []),\n ...(options.optimizeDeps?.include ?? []),\n ],\n // In monorepo mode: explicitly exclude @agent-native/core subpaths so\n // Vite never prebundles them from dist/. The source alias above\n // (`getCoreSourceAliases`) resolves every import to src/ on every\n // request, so HMR picks up new exports immediately. Without exclude,\n // the prebundle is built from dist/ once at startup and silently\n // serves stale code even after the source / dist is updated.\n exclude: [\n ...(findCoreSrcDir(cwd) !== null ? CORE_CLIENT_SUBPATHS : []),\n ...(options.optimizeDeps?.exclude ?? []),\n ],\n },\n resolve: {\n // Dedupe all client-side packages that core shares with the consuming\n // app. In pnpm monorepos, core's devDependencies can install separate\n // copies (linked to different React versions). Without deduping, each\n // copy creates its own React context — QueryClientProvider, RouterProvider,\n // Radix, etc. — causing \"No provider\" crashes at runtime.\n dedupe: getClientDedupe(cwd),\n alias: [\n // In monorepo dev: resolve @agent-native/core to source for HMR.\n // Uses regex with $ anchor for exact matching to prevent\n // @agent-native/core from prefix-matching @agent-native/core/client.\n ...getCoreSourceAliases(cwd),\n // Standard path aliases (prefix matching is fine here)\n { find: \"@\", replacement: path.resolve(cwd, \"./app\") },\n { find: \"@shared\", replacement: path.resolve(cwd, \"./shared\") },\n ...Object.entries(options.aliases ?? {}).map(([find, replacement]) => ({\n find,\n replacement,\n })),\n ],\n },\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/vite/client.ts"],"names":[],"mappings":"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","sourcesContent":["import path from \"path\";\nimport fs from \"fs\";\nimport { createRequire } from \"module\";\nimport type { Plugin, UserConfig } from \"vite\";\nimport { nitro as nitroVitePlugin } from \"nitro/vite\";\nimport { actionTypesPlugin } from \"./action-types-plugin.js\";\nimport { agentsBundlePlugin } from \"./agents-bundle-plugin.js\";\nimport { findWorkspaceRoot } from \"../scripts/utils.js\";\nimport { getViteDevRecoveryScript } from \"../client/vite-dev-recovery-script.js\";\n\nimport { fileURLToPath } from \"url\";\n\nconst require = createRequire(import.meta.url);\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\n/**\n * Sync discovery for the workspace-core in an enterprise monorepo.\n *\n * Mirrors `getWorkspaceCoreExports` in deploy/workspace-core.ts but stays\n * synchronous so it can run inline in `defineConfig`. Returns the workspace\n * core's package name + absolute directory, or null if no workspace core is\n * declared in the ancestor chain.\n *\n * Walks up from `startDir` looking for a package.json with\n * `agent-native.workspaceCore`. Resolves the declared package name through\n * `<workspaceRoot>/node_modules/<name>` (pnpm symlink, fastest) or by\n * scanning `packages/*` for a matching `name` field (fallback for\n * pre-install scenarios).\n */\nfunction findWorkspaceCoreSync(\n startDir: string,\n): { packageName: string; packageDir: string } | null {\n // 1) Walk up looking for the root package.json that declares workspaceCore.\n let dir = path.resolve(startDir);\n let workspaceRoot: string | null = null;\n let packageName: string | null = null;\n for (let i = 0; i < 20; i++) {\n const pkgPath = path.join(dir, \"package.json\");\n if (fs.existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, \"utf-8\"));\n const declared = pkg?.[\"agent-native\"]?.workspaceCore;\n if (typeof declared === \"string\" && declared.length > 0) {\n workspaceRoot = dir;\n packageName = declared;\n break;\n }\n } catch {\n // Malformed package.json — keep walking up.\n }\n }\n const parent = path.dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n if (!workspaceRoot || !packageName) return null;\n\n // 2a) pnpm/npm symlink under workspaceRoot/node_modules.\n const nm = path.join(workspaceRoot, \"node_modules\", packageName);\n if (fs.existsSync(path.join(nm, \"package.json\"))) {\n return { packageName, packageDir: fs.realpathSync(nm) };\n }\n\n // 2b) Scan packages/* and packages/@scope/* for a matching `name`.\n const packagesDir = path.join(workspaceRoot, \"packages\");\n if (fs.existsSync(packagesDir)) {\n const candidates: string[] = [];\n for (const entry of fs.readdirSync(packagesDir, { withFileTypes: true })) {\n if (!entry.isDirectory()) continue;\n candidates.push(path.join(packagesDir, entry.name));\n if (entry.name.startsWith(\"@\")) {\n const scopeDir = path.join(packagesDir, entry.name);\n for (const sub of fs.readdirSync(scopeDir, { withFileTypes: true })) {\n if (sub.isDirectory()) candidates.push(path.join(scopeDir, sub.name));\n }\n }\n }\n for (const c of candidates) {\n const p = path.join(c, \"package.json\");\n if (!fs.existsSync(p)) continue;\n try {\n const pkg = JSON.parse(fs.readFileSync(p, \"utf-8\"));\n if (pkg?.name === packageName)\n return { packageName, packageDir: fs.realpathSync(c) };\n } catch {\n // ignore malformed package.json\n }\n }\n }\n return null;\n}\n\n/** Escape a string so it can be embedded as a regex literal. */\nfunction escapeRegex(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\n/** Check if a package is installed in the project */\nfunction hasDep(pkg: string, cwd: string): boolean {\n try {\n const pkgJson = JSON.parse(\n fs.readFileSync(path.join(cwd, \"package.json\"), \"utf-8\"),\n );\n return !!(\n pkgJson.dependencies?.[pkg] ||\n pkgJson.devDependencies?.[pkg] ||\n pkgJson.peerDependencies?.[pkg]\n );\n } catch {\n return false;\n }\n}\n\n/**\n * Build the `resolve.dedupe` list dynamically. Reads core's package.json and\n * collects every peerDependency that the consuming app also declares. This\n * ensures Vite resolves them from the app root, not from core's own\n * node_modules — preventing duplicate React context / singleton issues.\n */\nfunction getClientDedupe(cwd: string): string[] {\n // Always dedupe React internals (sub-path exports aren't in peerDeps)\n const always = new Set([\"react\", \"react-dom\", \"react-dom/client\"]);\n\n // Server-only packages that never run in the browser — no point deduping.\n const serverOnly = new Set([\n \"drizzle-kit\",\n \"node-pty\",\n \"postgres\",\n \"ws\",\n \"typescript\",\n \"vite\",\n \"@vitejs/plugin-react-swc\",\n \"tailwindcss\",\n \"@tailwindcss/vite\",\n ]);\n\n try {\n const corePkgPath = path.resolve(__dirname, \"../../package.json\");\n const corePkg = JSON.parse(fs.readFileSync(corePkgPath, \"utf-8\"));\n\n // Scan both peerDependencies and dependencies. Direct deps like\n // @radix-ui/* use React internally — they must resolve against the\n // app's React, not a second copy inside core's node_modules.\n const coreDeps = new Set([\n ...Object.keys(corePkg.peerDependencies ?? {}),\n ...Object.keys(corePkg.dependencies ?? {}),\n ]);\n\n // Read the consuming app's dependencies\n const appPkg = JSON.parse(\n fs.readFileSync(path.join(cwd, \"package.json\"), \"utf-8\"),\n );\n const appDeps = new Set([\n ...Object.keys(appPkg.dependencies ?? {}),\n ...Object.keys(appPkg.devDependencies ?? {}),\n ]);\n\n for (const dep of coreDeps) {\n if (serverOnly.has(dep)) continue;\n // Dedupe if the app also declares it, OR if it's a React-based\n // UI library (Radix, Tanstack) that must share the app's React.\n if (\n appDeps.has(dep) ||\n dep.startsWith(\"@radix-ui/\") ||\n dep.startsWith(\"@tanstack/\")\n ) {\n always.add(dep);\n }\n }\n } catch {\n // Can't read package.json — fall back to known singletons\n }\n\n return [...always];\n}\n\n/**\n * Locate `packages/core/src` if we're inside the framework monorepo.\n * Shared between `getCoreSourceAliases` (which redirects imports to src/)\n * and `getDefaultOptimizeDeps` (which must NOT prebundle from dist/ when\n * the alias is active — otherwise the prebundle is built from a snapshot\n * of dist/ at startup and never picks up new exports).\n */\nfunction findCoreSrcDir(cwd: string): string | null {\n const candidates = [\n path.resolve(cwd, \"../../packages/core\"), // templates/<name>/\n path.resolve(cwd, \"../core\"), // packages/<name>/\n ];\n for (const candidate of candidates) {\n if (fs.existsSync(path.join(candidate, \"src/index.ts\"))) {\n return path.join(candidate, \"src\");\n }\n }\n return null;\n}\n\n/**\n * Every `@agent-native/core` subpath that gets a source alias. Must stay in\n * sync with `getCoreSourceAliases`. Used by `getDefaultOptimizeDeps` to skip\n * prebundling in monorepo mode, and by the consumer config to add them to\n * `optimizeDeps.exclude` so Vite always resolves them through the source\n * alias on every request — never from a stale dist/ snapshot.\n */\nconst CORE_CLIENT_SUBPATHS = [\n \"@agent-native/core\",\n \"@agent-native/core/client\",\n \"@agent-native/core/client/extensions\",\n \"@agent-native/core/client/tools\", // legacy alias\n \"@agent-native/core/client/org\",\n \"@agent-native/core/client/observability\",\n \"@agent-native/core/client/onboarding\",\n \"@agent-native/core/client/sharing\",\n \"@agent-native/core/client/notifications\",\n \"@agent-native/core/client/progress\",\n];\n\nfunction getDefaultOptimizeDeps(cwd: string): string[] {\n const inMonorepo = findCoreSrcDir(cwd) !== null;\n const entries: Array<{ specifier: string; packageName?: string }> = [\n // In monorepo mode the source alias resolves these to src/ on every\n // import, so prebundling from dist/ would just create a stale snapshot.\n // Skip them entirely — `optimizeDeps.exclude` below makes that explicit.\n ...(inMonorepo\n ? []\n : ([\n { specifier: \"@agent-native/core\" },\n {\n specifier: \"@agent-native/core/client\",\n packageName: \"@agent-native/core\",\n },\n {\n specifier: \"@agent-native/core/client/org\",\n packageName: \"@agent-native/core\",\n },\n {\n specifier: \"@agent-native/core/client/extensions\",\n packageName: \"@agent-native/core\",\n },\n {\n // Legacy alias — prior name for @agent-native/core/client/extensions.\n // Keep so deployed templates that haven't been updated still resolve.\n specifier: \"@agent-native/core/client/tools\",\n packageName: \"@agent-native/core\",\n },\n ] as Array<{ specifier: string; packageName?: string }>)),\n { specifier: \"@libsql/client\" },\n { specifier: \"@radix-ui/react-accordion\" },\n { specifier: \"@radix-ui/react-alert-dialog\" },\n { specifier: \"@radix-ui/react-avatar\" },\n { specifier: \"@radix-ui/react-checkbox\" },\n { specifier: \"@radix-ui/react-collapsible\" },\n { specifier: \"@radix-ui/react-context-menu\" },\n { specifier: \"@radix-ui/react-dialog\" },\n { specifier: \"@radix-ui/react-dropdown-menu\" },\n { specifier: \"@radix-ui/react-hover-card\" },\n { specifier: \"@radix-ui/react-label\" },\n { specifier: \"@radix-ui/react-menubar\" },\n { specifier: \"@radix-ui/react-navigation-menu\" },\n { specifier: \"@radix-ui/react-popover\" },\n { specifier: \"@radix-ui/react-progress\" },\n { specifier: \"@radix-ui/react-radio-group\" },\n { specifier: \"@radix-ui/react-scroll-area\" },\n { specifier: \"@radix-ui/react-select\" },\n { specifier: \"@radix-ui/react-separator\" },\n { specifier: \"@radix-ui/react-slider\" },\n { specifier: \"@radix-ui/react-slot\" },\n { specifier: \"@radix-ui/react-switch\" },\n { specifier: \"@radix-ui/react-tabs\" },\n { specifier: \"@radix-ui/react-toast\" },\n { specifier: \"@radix-ui/react-toggle\" },\n { specifier: \"@radix-ui/react-toggle-group\" },\n { specifier: \"@radix-ui/react-tooltip\" },\n { specifier: \"@tanstack/react-query\" },\n { specifier: \"@tabler/icons-react\" },\n { specifier: \"class-variance-authority\" },\n { specifier: \"clsx\" },\n { specifier: \"cmdk\" },\n { specifier: \"drizzle-orm\" },\n { specifier: \"drizzle-orm/pg-core\", packageName: \"drizzle-orm\" },\n { specifier: \"drizzle-orm/sqlite-core\", packageName: \"drizzle-orm\" },\n { specifier: \"h3\" },\n { specifier: \"next-themes\" },\n { specifier: \"react-hook-form\" },\n { specifier: \"sonner\" },\n { specifier: \"tailwind-merge\" },\n { specifier: \"zod\" },\n ];\n\n return entries\n .filter(({ specifier, packageName }) =>\n hasDep(packageName ?? specifier, cwd),\n )\n .map(({ specifier }) => specifier);\n}\n\n/**\n * In monorepo dev mode, resolve @agent-native/core imports to source (src/)\n * instead of dist/ so that Vite HMR picks up changes without rebuilding.\n *\n * Returns Vite array-style aliases with exact matching (regex anchored with $)\n * to prevent `@agent-native/core` from prefix-matching and swallowing\n * sub-path imports like `@agent-native/core/client`.\n */\nfunction getCoreSourceAliases(\n cwd: string,\n): Array<{ find: RegExp; replacement: string }> {\n const coreSrc = findCoreSrcDir(cwd);\n if (!coreSrc) return []; // Not in monorepo — use dist as normal\n\n // Map every @agent-native/core/* export to its src/ equivalent.\n // Each entry uses a regex with $ anchor for exact matching.\n const entries: Record<string, string> = {\n \"@agent-native/core\": path.join(coreSrc, \"index.browser.ts\"),\n \"@agent-native/core/server\": path.join(coreSrc, \"server/index.ts\"),\n \"@agent-native/core/client\": path.join(coreSrc, \"client/index.ts\"),\n \"@agent-native/core/client/extensions\": path.join(\n coreSrc,\n \"client/extensions/index.ts\",\n ),\n // Legacy alias — see exports map note above.\n \"@agent-native/core/client/tools\": path.join(\n coreSrc,\n \"client/extensions/index.ts\",\n ),\n \"@agent-native/core/client/org\": path.join(coreSrc, \"client/org/index.ts\"),\n \"@agent-native/core/client/observability\": path.join(\n coreSrc,\n \"client/observability/index.ts\",\n ),\n \"@agent-native/core/client/onboarding\": path.join(\n coreSrc,\n \"client/onboarding/index.ts\",\n ),\n \"@agent-native/core/client/sharing\": path.join(\n coreSrc,\n \"client/sharing/index.ts\",\n ),\n \"@agent-native/core/client/notifications\": path.join(\n coreSrc,\n \"client/notifications/index.ts\",\n ),\n \"@agent-native/core/client/progress\": path.join(\n coreSrc,\n \"client/progress/index.ts\",\n ),\n \"@agent-native/core/db\": path.join(coreSrc, \"db/index.ts\"),\n \"@agent-native/core/db/schema\": path.join(coreSrc, \"db/schema.ts\"),\n \"@agent-native/core/shared\": path.join(coreSrc, \"shared/index.ts\"),\n \"@agent-native/core/scripts\": path.join(coreSrc, \"scripts/index.ts\"),\n \"@agent-native/core/application-state\": path.join(\n coreSrc,\n \"application-state/index.ts\",\n ),\n \"@agent-native/core/settings\": path.join(coreSrc, \"settings/index.ts\"),\n \"@agent-native/core/credentials\": path.join(\n coreSrc,\n \"credentials/index.ts\",\n ),\n \"@agent-native/core/resources\": path.join(coreSrc, \"resources/index.ts\"),\n \"@agent-native/core/oauth-tokens\": path.join(\n coreSrc,\n \"oauth-tokens/index.ts\",\n ),\n \"@agent-native/core/a2a\": path.join(coreSrc, \"a2a/index.ts\"),\n \"@agent-native/core/router\": path.join(coreSrc, \"router/index.ts\"),\n \"@agent-native/core/terminal\": path.join(\n coreSrc,\n \"client/terminal/index.ts\",\n ),\n \"@agent-native/core/terminal/server\": path.join(\n coreSrc,\n \"terminal/index.ts\",\n ),\n \"@agent-native/core/adapters/cli\": path.join(\n coreSrc,\n \"adapters/cli/index.ts\",\n ),\n \"@agent-native/core/usage\": path.join(coreSrc, \"usage/store.ts\"),\n };\n\n // Escape special regex chars in the key and anchor with $\n return Object.entries(entries).map(([find, replacement]) => ({\n find: new RegExp(`^${find.replace(/[/]/g, \"\\\\/\")}$`),\n replacement,\n }));\n}\n\nexport interface NitroOptions {\n /** Nitro deployment preset (e.g. \"node\", \"vercel\", \"netlify\", \"cloudflare_pages\"). Default: \"node\" */\n preset?: string;\n /** Source directory for server files. Default: \"./server\" */\n srcDir?: string;\n /** Routes directory name (relative to srcDir). Default: \"routes\" */\n routesDir?: string;\n /** Any additional Nitro config overrides */\n [key: string]: unknown;\n}\n\nexport interface ClientConfigOptions {\n /** Port for dev server. Default: 8080 */\n port?: number;\n /** Vite log level. Workspace child apps default to \"warn\" so only the gateway URL is advertised. */\n logLevel?: UserConfig[\"logLevel\"];\n /** Additional Vite plugins */\n plugins?: any[];\n /** Nitro plugin options (preset, srcDir, etc) */\n nitro?: NitroOptions;\n /** Override resolve aliases */\n aliases?: Record<string, string>;\n /** Override build.outDir. Default: \"dist/spa\" */\n outDir?: string;\n /** Additional fs.allow paths */\n fsAllow?: string[];\n /** Additional fs.deny patterns */\n fsDeny?: string[];\n /** Additional Vite optimizeDeps configuration */\n optimizeDeps?: NonNullable<UserConfig[\"optimizeDeps\"]>;\n /**\n * Whether to auto-inject the Tailwind v4 Vite plugin (`@tailwindcss/vite`).\n * Defaults to true — set to `false` if a template wants to manage Tailwind\n * itself (e.g. the legacy v3 PostCSS pipeline).\n */\n tailwind?: boolean;\n /**\n * Package names to stub in the SSR bundle with an empty proxy object.\n *\n * Use this for dependencies that only run in the browser (canvas / diagram\n * libraries, editors, WebGL) but would otherwise get pulled into the\n * server bundle via SSR's noExternal policy — pushing the CF Pages\n * Functions bundle over the 25 MiB limit.\n *\n * Only add packages that are provably never called during SSR. If the\n * server imports one, it will receive a Proxy that throws on any real\n * use (which is better than bundling a 10 MiB dep the worker never calls).\n *\n * @example\n * ssrStubs: [\"mermaid\", \"@excalidraw/excalidraw\"]\n */\n ssrStubs?: string[];\n /**\n * @deprecated Pass `reactRouter()` directly in the `plugins` array instead.\n * Previously used to auto-load the React Router Vite plugin via require(),\n * but this fails in ESM contexts. Templates should now do:\n * ```ts\n * import { reactRouter } from \"@react-router/dev/vite\";\n * defineConfig({ plugins: [reactRouter()] })\n * ```\n */\n reactRouter?: boolean | Record<string, unknown>;\n}\n\n/**\n * Vite plugin that recovers the page when Vite's dependency optimizer\n * invalidates modules mid-load (the \"504 Outdated Optimize Dep\" error).\n *\n * Without this, the page silently fails: <script type=\"module\"> tags 504,\n * React never mounts, and the user is stuck on a blank screen until they\n * manually refresh. We catch the failure modes and auto-reload, with a\n * visible overlay so the user knows what's happening, and a loop guard\n * so we never thrash forever.\n *\n * CRITICAL: this must be a SYNCHRONOUS (non-module) script injected at\n * `head-prepend`. Module scripts are deferred — the browser starts fetching\n * all module scripts in parallel during HTML parsing, so a module listener\n * registers AFTER sibling modules have already started loading and\n * possibly errored out. A regular <script> blocks parsing and runs\n * synchronously, so the listener is registered before ANY module fetch\n * begins.\n *\n * Catches three failure modes (all before React needs to mount):\n * 1. <script type=\"module\"> / <link> 504 — window \"error\" event, capture phase\n * 2. Dynamic import 504 — \"unhandledrejection\" with \"dynamically imported module\"\n * 3. Child module 504 — resource timing when browser exposes the HTTP status\n */\nfunction autoReloadOnOptimizeDep(): Plugin {\n return {\n name: \"agent-native-auto-reload-optimize-dep\",\n apply: \"serve\",\n transformIndexHtml() {\n return [\n {\n tag: \"script\",\n // NOTE: no `type: \"module\"` — this must be a synchronous script.\n children: getViteDevRecoveryScript(),\n injectTo: \"head-prepend\",\n },\n ];\n },\n };\n}\n\n/**\n * Vite handles outdated optimized-dep requests inside its own transform\n * middleware and ends the HTTP response with `504 Outdated Optimize Dep`.\n * Browser module loaders do not consistently surface those child-module\n * failures to userland JavaScript, so also nudge the Vite HMR client from the\n * server side. This turns the confusing blank-screen state into the same\n * full-page reload Vite would have requested once optimization settled.\n */\nfunction fullReloadOnOptimizeDep504(): Plugin {\n return {\n name: \"agent-native-full-reload-optimize-dep-504\",\n apply: \"serve\",\n configureServer(server) {\n let lastReloadAt = 0;\n server.middlewares.use((req, res, next) => {\n const originalEnd = res.end;\n (res as unknown as { end: (...args: unknown[]) => unknown }).end = (\n ...endArgs: unknown[]\n ) => {\n const statusMessage = String(res.statusMessage || \"\");\n if (\n res.statusCode === 504 &&\n statusMessage === \"Outdated Optimize Dep\"\n ) {\n const now = Date.now();\n if (now - lastReloadAt > 500) {\n lastReloadAt = now;\n server.ws.send({ type: \"full-reload\" });\n server.config.logger.info(\n `[agent-native] Vite optimized deps changed while loading ${\n req.url ?? \"a module\"\n }; reloading the page.`,\n { timestamp: true },\n );\n }\n }\n return (originalEnd as (...args: unknown[]) => unknown).apply(\n res,\n endArgs,\n );\n };\n next();\n });\n },\n };\n}\n\n/**\n * Vite plugin that prevents the built-in base middleware from redirecting\n * \"/\" → \"/app/\" (or whatever the base is). When agent-native apps run with\n * --base /app/ in single-port mode, Vite's baseMiddleware sends a 302 from\n * \"/\" to the base path. This breaks Electron webview and iframe embeds\n * that load the app at the root. Instead, we rewrite \"/\" to the base path\n * internally so the app serves without a visible redirect.\n */\nfunction baseRedirectGuard(): Plugin {\n return {\n name: \"agent-native-base-redirect-guard\",\n apply: \"serve\",\n configureServer(server) {\n // Return a function so the middleware is added AFTER Vite's internal\n // middleware is built — but we insert BEFORE by using the pre-hook\n // approach: configureServer hooks that return nothing run before\n // internal middleware.\n server.middlewares.use((req, res, next) => {\n const base = server.config.base;\n if (base && base !== \"/\" && req.url?.startsWith(base)) {\n const relativeUrl = req.url.slice(base.length - 1);\n try {\n const url = new URL(relativeUrl, \"http://agent-native.local\");\n const publicDir = server.config.publicDir;\n if (typeof publicDir !== \"string\") {\n return next();\n }\n const publicPath = path.normalize(\n path.join(publicDir, decodeURIComponent(url.pathname)),\n );\n if (\n publicPath.startsWith(publicDir + path.sep) &&\n fs.existsSync(publicPath) &&\n fs.statSync(publicPath).isFile()\n ) {\n const contentType = contentTypeForPublicFile(publicPath);\n if (contentType) res.setHeader(\"content-type\", contentType);\n if (req.method === \"HEAD\") {\n res.statusCode = 200;\n res.end();\n return;\n }\n fs.createReadStream(publicPath).pipe(res);\n return;\n }\n } catch {\n // Fall through to Vite/Nitro. Malformed URLs should keep their\n // original path so the normal dev-server error handling applies.\n }\n }\n req.url = stripMountedDevApiPath(req.url, base);\n if (\n req.method === \"HEAD\" &&\n req.url &&\n !isFrameworkDevPath(req.url, base)\n ) {\n req.method = \"GET\";\n }\n if (\n base &&\n base !== \"/\" &&\n (req.url === \"/\" || req.url === \"/index.html\")\n ) {\n // Rewrite to the base path so Vite serves the app directly\n req.url = base;\n }\n next();\n });\n },\n };\n}\n\nfunction contentTypeForPublicFile(filePath: string): string | null {\n switch (path.extname(filePath).toLowerCase()) {\n case \".css\":\n return \"text/css\";\n case \".html\":\n return \"text/html\";\n case \".ico\":\n return \"image/x-icon\";\n case \".json\":\n case \".webmanifest\":\n return \"application/json\";\n case \".js\":\n case \".mjs\":\n return \"text/javascript\";\n case \".png\":\n return \"image/png\";\n case \".svg\":\n return \"image/svg+xml\";\n case \".txt\":\n return \"text/plain\";\n case \".xml\":\n return \"application/xml\";\n default:\n return null;\n }\n}\n\nfunction devPathname(reqUrl: string): string {\n return new URL(reqUrl, \"http://agent-native.local\").pathname;\n}\n\nfunction isApiDevPath(reqUrl: string): boolean {\n const pathname = devPathname(reqUrl);\n return pathname === \"/api\" || pathname.startsWith(\"/api/\");\n}\n\nexport function stripMountedDevApiPath(\n reqUrl: string | undefined,\n base: string | undefined,\n): string | undefined {\n if (!reqUrl || !base || base === \"/\") return reqUrl;\n const normalizedBase = base.endsWith(\"/\") ? base : `${base}/`;\n if (!reqUrl.startsWith(normalizedBase)) return reqUrl;\n const stripped = reqUrl.slice(normalizedBase.length - 1) || \"/\";\n return isApiDevPath(stripped) ? stripped : reqUrl;\n}\n\nexport function isFrameworkDevPath(\n reqUrl: string,\n base: string | undefined,\n): boolean {\n const pathname = devPathname(reqUrl);\n if (pathname === \"/_agent-native\" || pathname.startsWith(\"/_agent-native/\")) {\n return true;\n }\n if (!base || base === \"/\") return false;\n const normalizedBase = base.endsWith(\"/\") ? base.slice(0, -1) : base;\n return (\n pathname === `${normalizedBase}/_agent-native` ||\n pathname.startsWith(`${normalizedBase}/_agent-native/`)\n );\n}\n\n/**\n * Work around a Rolldown bug where Nitro passes service entries as objects\n * ({index: \"path\"}) but Rolldown expects strings. This plugin normalizes\n * rollupOptions.input entries in the SSR environment.\n */\nfunction rolldownInputFix(): Plugin {\n return {\n name: \"agent-native-rolldown-input-fix\",\n configEnvironment(name, config) {\n const input = config.build?.rollupOptions?.input;\n if (!Array.isArray(input)) return;\n // Flatten any object entries to just their string values\n const fixed = input.map((entry: any) => {\n if (typeof entry === \"string\") return entry;\n if (typeof entry === \"object\" && entry !== null) {\n const values = Object.values(entry);\n return values[0] as string;\n }\n return entry;\n });\n config.build!.rollupOptions!.input = fixed;\n },\n };\n}\n\n/**\n * Expose the resolved Vite dev server port as process.env.PORT so that\n * in-process scripts (which use localFetch → http://localhost:${PORT}/api/...)\n * hit the right address even when Vite auto-increments the port.\n */\n/**\n * Replace caller-specified packages with an empty proxy stub during SSR\n * builds. For apps whose heavy browser-only deps would otherwise bloat the\n * edge worker past CF Pages' 25 MiB Functions limit.\n *\n * The template lists the packages in its `defineConfig({ ssrStubs })` call —\n * the framework never hardcodes package names.\n */\nfunction ssrStubPlugin(packages: string[]): Plugin | null {\n if (!packages.length) return null;\n const stubbed = new Set(packages);\n const STUB_ID = \"\\0agent-native-ssr-stub\";\n return {\n name: \"agent-native-ssr-stub-heavy-libs\",\n enforce: \"pre\",\n resolveId(id, _importer, opts) {\n if (!opts?.ssr) return null;\n // Match the bare package name or any subpath\n const pkg = id\n .split(\"/\")\n .slice(0, id.startsWith(\"@\") ? 2 : 1)\n .join(\"/\");\n if (stubbed.has(pkg)) return STUB_ID;\n return null;\n },\n load(id) {\n if (id !== STUB_ID) return null;\n // Proxy that answers any property access with itself — lets dead\n // import/re-export chains parse without blowing up, and still throws\n // if code actually tries to call any of it on the server.\n return (\n \"const handler = { get(_, p) { \" +\n \"if (p === Symbol.toPrimitive) return () => ''; \" +\n \"if (p === 'then') return undefined; \" +\n \"return new Proxy(() => {}, handler); \" +\n \"} };\" +\n \"const stub = new Proxy(() => {}, handler);\" +\n \"export default stub;\"\n );\n },\n };\n}\n\nfunction portExposer(): Plugin {\n return {\n name: \"agent-native-port-exposer\",\n apply: \"serve\",\n configureServer(server) {\n server.httpServer?.once(\"listening\", () => {\n const addr = server.httpServer?.address();\n if (addr && typeof addr === \"object\" && addr.port) {\n process.env.PORT = String(addr.port); // guard:allow-env-mutation — Vite dev server port published once at boot before any request\n }\n });\n },\n };\n}\n\n/**\n * Silence benign `read ECONNRESET` noise from Vite's dev middleware.\n * Fires when a browser closes/reloads/navigates mid-request — the peer has\n * already gone away, there's nothing to fix, and Vite's error middleware\n * spams the terminal with \"Internal server error: read ECONNRESET\". Our H3\n * server layer already swallows this (create-server.ts onError); this plugin\n * does the same for Vite's own connect pipeline.\n */\nfunction silenceConnectionResets(): Plugin {\n const isBenign = (err: unknown) => {\n const e = err as NodeJS.ErrnoException | undefined;\n const code = e?.code || (e?.cause as NodeJS.ErrnoException)?.code;\n return (\n code === \"ECONNRESET\" ||\n code === \"ECONNABORTED\" ||\n code === \"EPIPE\" ||\n e?.message === \"aborted\"\n );\n };\n return {\n name: \"agent-native-silence-connection-resets\",\n apply: \"serve\",\n configureServer(server) {\n // Swallow socket-level resets so Node doesn't surface them as uncaught.\n server.httpServer?.on(\"connection\", (socket) => {\n socket.on(\"error\", (err) => {\n if (!isBenign(err)) throw err;\n });\n });\n // Drop Vite's \"Internal server error: read ECONNRESET\" log lines.\n const origError = server.config.logger.error.bind(server.config.logger);\n server.config.logger.error = (msg, opts) => {\n const text = typeof msg === \"string\" ? msg : String(msg ?? \"\");\n if (\n (opts?.error && isBenign(opts.error)) ||\n /Internal server error:\\s*(read ECONNRESET|aborted|EPIPE)/i.test(text)\n ) {\n return;\n }\n origError(msg, opts);\n };\n },\n };\n}\n\n/**\n * Create the client Vite config with sensible agent-native defaults.\n * Supports two modes:\n * - Legacy SPA mode (default): React SWC plugin, client-only routing\n * - React Router framework mode: SSR-capable with file-based routing\n *\n * Both modes include Nitro for API routes, path aliases, and fs restrictions.\n */\nexport function defineConfig(options: ClientConfigOptions = {}): UserConfig {\n // Check if React Router plugin was passed directly in plugins array\n const hasReactRouterPlugin = options.plugins?.some(\n (p: any) =>\n p?.name === \"react-router\" ||\n (Array.isArray(p) && p.some((pp: any) => pp?.name === \"react-router\")),\n );\n\n let reactTransformPlugin: any;\n\n if (!hasReactRouterPlugin && !options.reactRouter) {\n // Legacy SPA mode — use React SWC plugin (only when React Router is not used)\n try {\n reactTransformPlugin = require(\"@vitejs/plugin-react-swc\");\n if (reactTransformPlugin.default)\n reactTransformPlugin = reactTransformPlugin.default;\n } catch {\n // Will be resolved at runtime by Vite\n }\n }\n\n const cwd = process.cwd();\n\n // Workspace env fallback. If this app is inside a workspace, tell Vite to\n // also look for .env files at the workspace root. Per-app .env still wins\n // (Vite's loadEnv merges in precedence order — app dir is loaded after).\n const workspaceRoot = findWorkspaceRoot(cwd);\n const envDir = workspaceRoot && workspaceRoot !== cwd ? workspaceRoot : cwd;\n\n // Preload workspace-root .env into process.env so Nitro server code sees\n // shared keys during dev (Nitro reads process.env, not vite's envDir).\n if (workspaceRoot && workspaceRoot !== cwd) {\n try {\n const dotenv = require(\"dotenv\");\n dotenv.config({\n path: path.join(workspaceRoot, \".env\"),\n override: false,\n // Suppress the dotenv v17 tip line — this loader fires alongside\n // utils.ts loadEnv() during dev startup and would otherwise emit a\n // duplicate \"[dotenv] injecting env\" message.\n quiet: true,\n });\n } catch {}\n }\n\n // Build the React transform plugin (only for legacy SPA mode)\n const reactPluginInstance = reactTransformPlugin?.();\n\n // Auto-inject the Tailwind v4 Vite plugin if `@tailwindcss/vite` is\n // installed (which it is by default for all agent-native templates).\n // Templates can opt out by setting `options.tailwind = false`.\n let tailwindPluginInstance: any = null;\n if (options.tailwind !== false) {\n try {\n let tailwindPlugin = require(\"@tailwindcss/vite\");\n if (tailwindPlugin.default) tailwindPlugin = tailwindPlugin.default;\n // Tailwind's Vite optimizer uses Lightning CSS internally and runs\n // before Vite's own CSS minifier. Lightning CSS collapses the standard\n // `backdrop-filter` declaration when a `-webkit-` fallback is present,\n // so let Vite/esbuild handle the production CSS pass instead.\n tailwindPluginInstance = tailwindPlugin({ optimize: false });\n } catch {\n // Plugin not installed — silently skip. Old templates may still be on v3.\n }\n }\n\n // APP_BASE_PATH lets this app be mounted under a prefix (e.g. \"/mail\") as\n // part of a unified workspace deploy. Defaults to \"/\" for standalone apps.\n const appBasePath =\n process.env.VITE_APP_BASE_PATH || process.env.APP_BASE_PATH || \"/\";\n const isWorkspaceChild = process.env.AGENT_NATIVE_WORKSPACE === \"1\";\n const base = appBasePath.endsWith(\"/\") ? appBasePath : `${appBasePath}/`;\n const monorepoCoreAllow = [\n path.resolve(cwd, \"../../packages/core\"),\n path.resolve(cwd, \"../core\"),\n ].filter((candidate) => fs.existsSync(path.join(candidate, \"package.json\")));\n\n // Workspace-core (enterprise monorepo): pull its directory into Vite's\n // file watcher + module graph so edits to its TS sources hot-reload the\n // dev server, and its package name into ssr.noExternal so the dynamic\n // import in framework-request-handler.ts goes through Vite's transform\n // pipeline (TypeScript, SSR HMR, the works).\n const workspaceCore = findWorkspaceCoreSync(cwd);\n const workspaceCoreFsAllow = workspaceCore ? [workspaceCore.packageDir] : [];\n const workspaceCoreNoExternal = workspaceCore\n ? [new RegExp(`^${escapeRegex(workspaceCore.packageName)}(/.*)?$`)]\n : [];\n\n return {\n logLevel: options.logLevel ?? (isWorkspaceChild ? \"warn\" : undefined),\n envDir,\n base,\n server: {\n host: \"::\",\n port: options.port ?? 8080,\n fs: {\n allow: [\n \".\",\n ...monorepoCoreAllow,\n ...workspaceCoreFsAllow,\n ...(options.fsAllow ?? []),\n ],\n deny: [\n \".env\",\n \".env.*\",\n \"*.{crt,pem}\",\n \"**/.git/**\",\n ...(options.fsDeny ?? []),\n ],\n },\n },\n build: {\n outDir: options.outDir ?? \"dist/spa\",\n // Vite 8 defaults CSS minification to Lightning CSS, which collapses a\n // `backdrop-filter` + `-webkit-backdrop-filter` pair down to only the\n // prefixed form. Chrome ignores that, so glass effects disappear in\n // production. Keep esbuild as the CSS minifier and target Safari 18+ so\n // the standard property survives the production pipeline.\n cssMinify: \"esbuild\",\n cssTarget: [\"es2020\", \"safari18\"],\n },\n // Bundle all non-Node.js deps into the production SSR server build.\n // Edge runtimes (CF Workers, Deno) don't have node_modules at runtime.\n // In dev, React Router's Vite Environment runner expects CJS packages\n // like React to stay external; forcing them through the module runner\n // raises `module is not defined`.\n ssr: process.argv.includes(\"build\")\n ? {\n noExternal: /^(?!node:)/,\n // Pick the workspace-core's compiled `dist/` exports in prod —\n // Node-style `default` condition matches what edge runtimes (CF\n // Workers, Deno) can actually load. Without this, Vite's prod\n // build inherits the dev-condition src/ entry and ships unbuilt\n // TypeScript into the worker.\n resolve: {\n conditions: [\"node\", \"module\", \"import\", \"default\"],\n externalConditions: [\"node\", \"module\", \"import\", \"default\"],\n },\n }\n : {\n // Vite already sets `development` in the dev resolve conditions,\n // so the workspace-core template's exports.development → src/\n // entry is picked automatically — Vite handles TS compilation\n // and triggers a server restart when those files change.\n noExternal: [\n /^@agent-native\\/core(\\/.*)?$/,\n // Radix UI primitives are transitive deps of @agent-native/core\n // (used by FeedbackButton, AgentSidebar, ShareDialog, etc.). When\n // a consumer app SSRs a component that imports Radix, Node's\n // externalized resolver can't find @radix-ui/* from the app cwd\n // because pnpm doesn't hoist transitive deps. Bundling them\n // through Vite resolves them via the workspace store.\n /^@radix-ui\\//,\n // scheduling ships tsc-compiled dist files that contain literal\n // `@/` path-alias imports (e.g. `import { Input } from\n // \"@/components/ui/input\"`). In standalone (published) mode Node\n // treats the package as an external CJS dep and can't resolve\n // `@/components`. Adding it to noExternal makes Vite process it\n // through the module pipeline, where the consumer app's `@` →\n // `./app` alias is already registered.\n ...(hasDep(\"@agent-native/scheduling\", cwd)\n ? [/^@agent-native\\/scheduling(\\/.*)?$/]\n : []),\n ...workspaceCoreNoExternal,\n ],\n external: [\n \"react\",\n \"react-dom\",\n \"react-dom/server\",\n \"react-router\",\n \"react-router/dom\",\n \"react-router-dom\",\n ],\n },\n plugins: [\n // Stub packages from `options.ssrStubs` in the SSR bundle so they\n // don't bloat the edge worker. Opt-in per template — the framework\n // hardcodes nothing (e.g. docs sites legitimately import `shiki` on\n // the server, so we can't blanket-stub it here).\n ...(() => {\n const p = ssrStubPlugin(options.ssrStubs ?? []);\n return p ? [p] : [];\n })(),\n ...(options.plugins ?? []),\n actionTypesPlugin(),\n agentsBundlePlugin(),\n autoReloadOnOptimizeDep(),\n fullReloadOnOptimizeDep504(),\n baseRedirectGuard(),\n portExposer(),\n silenceConnectionResets(),\n rolldownInputFix(),\n // Nitro Vite plugin for dev-mode API route serving and HMR.\n // Disabled during build — React Router's build handles production.\n ...(process.argv.includes(\"build\")\n ? []\n : [\n nitroVitePlugin({\n serverDir: \"./server\",\n ...(options.nitro ?? {}),\n } as any),\n ]),\n reactPluginInstance,\n tailwindPluginInstance,\n ].filter(Boolean),\n optimizeDeps: {\n include: [\n ...getDefaultOptimizeDeps(cwd),\n ...(hasDep(\"@agent-native/pinpoint\", cwd)\n ? [\"@agent-native/pinpoint/react\"]\n : []),\n ...(options.optimizeDeps?.include ?? []),\n ],\n // In monorepo mode: explicitly exclude @agent-native/core subpaths so\n // Vite never prebundles them from dist/. The source alias above\n // (`getCoreSourceAliases`) resolves every import to src/ on every\n // request, so HMR picks up new exports immediately. Without exclude,\n // the prebundle is built from dist/ once at startup and silently\n // serves stale code even after the source / dist is updated.\n exclude: [\n ...(findCoreSrcDir(cwd) !== null ? CORE_CLIENT_SUBPATHS : []),\n ...(options.optimizeDeps?.exclude ?? []),\n ],\n },\n resolve: {\n // Dedupe all client-side packages that core shares with the consuming\n // app. In pnpm monorepos, core's devDependencies can install separate\n // copies (linked to different React versions). Without deduping, each\n // copy creates its own React context — QueryClientProvider, RouterProvider,\n // Radix, etc. — causing \"No provider\" crashes at runtime.\n dedupe: getClientDedupe(cwd),\n alias: [\n // In monorepo dev: resolve @agent-native/core to source for HMR.\n // Uses regex with $ anchor for exact matching to prevent\n // @agent-native/core from prefix-matching @agent-native/core/client.\n ...getCoreSourceAliases(cwd),\n // Standard path aliases (prefix matching is fine here)\n { find: \"@\", replacement: path.resolve(cwd, \"./app\") },\n { find: \"@shared\", replacement: path.resolve(cwd, \"./shared\") },\n ...Object.entries(options.aliases ?? {}).map(([find, replacement]) => ({\n find,\n replacement,\n })),\n ],\n },\n };\n}\n"]}
|
package/package.json
CHANGED
|
@@ -28,7 +28,19 @@ configureTracking({
|
|
|
28
28
|
});
|
|
29
29
|
import "./global.css";
|
|
30
30
|
|
|
31
|
-
const
|
|
31
|
+
const THEME_INIT_SCRIPT_SELECTOR = "script[data-agent-native-theme-init]";
|
|
32
|
+
|
|
33
|
+
function getHydrationStableThemeInitScript() {
|
|
34
|
+
if (typeof document !== "undefined") {
|
|
35
|
+
const existing = document.querySelector<HTMLScriptElement>(
|
|
36
|
+
THEME_INIT_SCRIPT_SELECTOR,
|
|
37
|
+
);
|
|
38
|
+
if (existing?.innerHTML) return existing.innerHTML;
|
|
39
|
+
}
|
|
40
|
+
return getThemeInitScript();
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const THEME_INIT_SCRIPT = getHydrationStableThemeInitScript();
|
|
32
44
|
|
|
33
45
|
export function Layout({ children }: { children: React.ReactNode }) {
|
|
34
46
|
return (
|
|
@@ -40,6 +52,7 @@ export function Layout({ children }: { children: React.ReactNode }) {
|
|
|
40
52
|
content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"
|
|
41
53
|
/>
|
|
42
54
|
<script
|
|
55
|
+
data-agent-native-theme-init
|
|
43
56
|
suppressHydrationWarning
|
|
44
57
|
dangerouslySetInnerHTML={{ __html: THEME_INIT_SCRIPT }}
|
|
45
58
|
/>
|