@agent-native/core 0.12.38 → 0.12.40
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.d.ts.map +1 -1
- package/dist/cli/workspace-dev.js +31 -7
- package/dist/cli/workspace-dev.js.map +1 -1
- package/dist/client/agent-chat-adapter.d.ts.map +1 -1
- package/dist/client/agent-chat-adapter.js +19 -0
- package/dist/client/agent-chat-adapter.js.map +1 -1
- package/dist/client/frame.d.ts.map +1 -1
- package/dist/client/frame.js +11 -5
- package/dist/client/frame.js.map +1 -1
- package/dist/deploy/workspace-deploy.js +23 -0
- package/dist/deploy/workspace-deploy.js.map +1 -1
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +66 -3
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/google-oauth.d.ts.map +1 -1
- package/dist/server/google-oauth.js +18 -2
- package/dist/server/google-oauth.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace-dev.d.ts","sourceRoot":"","sources":["../../src/cli/workspace-dev.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,KAAK,EAAE,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAE9D,OAAO,IAAI,MAAM,WAAW,CAAC;AAQ7B,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC;IAC9B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;;;OAIG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,cAAc,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,OAAO,KAAK,CAAC;IAC5B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAC3C,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;CAC5C;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,YAAY,EAAE,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,MAAM,CAAC;IACzB,KAAK,EAAE,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC9C,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;
|
|
1
|
+
{"version":3,"file":"workspace-dev.d.ts","sourceRoot":"","sources":["../../src/cli/workspace-dev.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,KAAK,EAAE,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAE9D,OAAO,IAAI,MAAM,WAAW,CAAC;AAQ7B,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC;IAC9B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;;;OAIG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,cAAc,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,OAAO,KAAK,CAAC;IAC5B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAC3C,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;CAC5C;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,YAAY,EAAE,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,MAAM,CAAC;IACzB,KAAK,EAAE,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC9C,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AA8BD,wBAAgB,4BAA4B,CAC1C,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,GACvC,OAAO,CAET;AAED,wBAAgB,6BAA6B,CAC3C,IAAI,GAAE,MAAM,EAAO,EACnB,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,OAAO,CAMT;AAED,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC,EACrC,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,OAAO,EACd,YAAY,UAAO,GAClB,MAAM,EAAE,CAIV;AA8ND,wBAAgB,eAAe,CAC7B,OAAO,GAAE,mBAAwB,GAChC,kBAAkB,CAqiBpB"}
|
|
@@ -12,6 +12,23 @@ const DEFAULT_GATEWAY_PORT = 8080;
|
|
|
12
12
|
const DEFAULT_APP_PORT_START = 8100;
|
|
13
13
|
const PROXY_READY_RETRY_DELAY_MS = 250;
|
|
14
14
|
const APP_RESTART_MAX_DELAY_MS = 10_000;
|
|
15
|
+
function normalizeOrigin(value) {
|
|
16
|
+
if (!value)
|
|
17
|
+
return undefined;
|
|
18
|
+
try {
|
|
19
|
+
return new URL(value).origin;
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
function workspaceOAuthOrigin(env, gatewayUrl) {
|
|
26
|
+
return (normalizeOrigin(env.VITE_WORKSPACE_OAUTH_ORIGIN) ||
|
|
27
|
+
normalizeOrigin(env.WORKSPACE_OAUTH_ORIGIN) ||
|
|
28
|
+
normalizeOrigin(env.APP_URL) ||
|
|
29
|
+
normalizeOrigin(env.BETTER_AUTH_URL) ||
|
|
30
|
+
normalizeOrigin(gatewayUrl));
|
|
31
|
+
}
|
|
15
32
|
export function isWorkspaceWatcherLimitError(err) {
|
|
16
33
|
return err.code === "ENOSPC" || err.code === "EMFILE";
|
|
17
34
|
}
|
|
@@ -153,12 +170,15 @@ function renderStartingApp(app) {
|
|
|
153
170
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
154
171
|
<meta http-equiv="refresh" content="1" />
|
|
155
172
|
<title>Starting ${escapedName}</title>
|
|
173
|
+
<meta name="color-scheme" content="light dark" />
|
|
156
174
|
<style>
|
|
157
|
-
|
|
175
|
+
:root { --bg: #fafafa; --fg: #171717; --muted: #737373; --bar-bg: #e5e5e5; --bar-fill: #171717; }
|
|
176
|
+
@media (prefers-color-scheme: dark) { :root { --bg: #0a0a0a; --fg: #fafafa; --muted: #a3a3a3; --bar-bg: #262626; --bar-fill: #fafafa; } }
|
|
177
|
+
body { min-height: 100vh; margin: 0; display: grid; place-items: center; font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; background: var(--bg); color: var(--fg); }
|
|
158
178
|
main { width: min(420px, calc(100vw - 48px)); }
|
|
159
|
-
.bar { height: 3px; overflow: hidden; border-radius: 999px; background:
|
|
160
|
-
.bar::before { content: ""; display: block; height: 100%; width: 42%; border-radius: inherit; background:
|
|
161
|
-
p { color:
|
|
179
|
+
.bar { height: 3px; overflow: hidden; border-radius: 999px; background: var(--bar-bg); }
|
|
180
|
+
.bar::before { content: ""; display: block; height: 100%; width: 42%; border-radius: inherit; background: var(--bar-fill); animation: load 1s ease-in-out infinite; }
|
|
181
|
+
p { color: var(--muted); }
|
|
162
182
|
@keyframes load { 0% { transform: translateX(-105%); } 100% { transform: translateX(245%); } }
|
|
163
183
|
</style>
|
|
164
184
|
<script>setTimeout(() => window.location.reload(), 900);</script>
|
|
@@ -195,13 +215,16 @@ function renderIndex(apps) {
|
|
|
195
215
|
<meta charset="utf-8" />
|
|
196
216
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
197
217
|
<title>Agent-Native Workspace</title>
|
|
218
|
+
<meta name="color-scheme" content="light dark" />
|
|
198
219
|
<style>
|
|
199
|
-
|
|
220
|
+
:root { --bg: #fafafa; --fg: #171717; --muted: #737373; --card-bg: #ffffff; --card-border: #d4d4d4; }
|
|
221
|
+
@media (prefers-color-scheme: dark) { :root { --bg: #0a0a0a; --fg: #fafafa; --muted: #a3a3a3; --card-bg: #171717; --card-border: #262626; } }
|
|
222
|
+
body { font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; margin: 0; padding: 32px; background: var(--bg); color: var(--fg); }
|
|
200
223
|
main { max-width: 760px; margin: 0 auto; }
|
|
201
224
|
a { color: inherit; text-decoration: none; }
|
|
202
225
|
.grid { display: grid; gap: 12px; margin-top: 20px; }
|
|
203
|
-
.card { display: flex; justify-content: space-between; border: 1px solid
|
|
204
|
-
.muted { color:
|
|
226
|
+
.card { display: flex; justify-content: space-between; border: 1px solid var(--card-border); border-radius: 8px; padding: 14px 16px; background: var(--card-bg); }
|
|
227
|
+
.muted { color: var(--muted); }
|
|
205
228
|
</style>
|
|
206
229
|
</head>
|
|
207
230
|
<body>
|
|
@@ -345,6 +368,7 @@ export function runWorkspaceDev(options = {}) {
|
|
|
345
368
|
APP_BASE_PATH: basePath,
|
|
346
369
|
VITE_AGENT_NATIVE_WORKSPACE: "1",
|
|
347
370
|
VITE_APP_BASE_PATH: basePath,
|
|
371
|
+
VITE_WORKSPACE_OAUTH_ORIGIN: workspaceOAuthOrigin(env, gatewayUrl),
|
|
348
372
|
VITE_WORKSPACE_GATEWAY_URL: gatewayUrl,
|
|
349
373
|
PORT: String(app.port),
|
|
350
374
|
WORKSPACE_GATEWAY_URL: gatewayUrl,
|
|
@@ -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 { fileURLToPath } from \"node:url\";\nimport * as Sentry from \"@sentry/node\";\nimport { extractOAuthStateAppId } from \"../shared/oauth-state.js\";\n\nexport interface WorkspaceApp {\n id: string;\n name: string;\n dir: string;\n port: number;\n process?: ChildProcess;\n restartTimer?: NodeJS.Timeout;\n restartAttempts?: number;\n installing?: boolean;\n installAttempted?: boolean;\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 readinessProbe?: Promise<void>;\n}\n\nexport interface WorkspaceDevOptions {\n args?: string[];\n env?: NodeJS.ProcessEnv;\n root?: string;\n spawnProcess?: typeof spawn;\n openBrowser?: boolean;\n stdout?: Pick<NodeJS.WriteStream, \"write\">;\n stderr?: Pick<NodeJS.WriteStream, \"write\">;\n}\n\nexport interface WorkspaceDevHandle {\n apps: WorkspaceApp[];\n defaultApp: string;\n gatewayUrl: () => string;\n ready: Promise<{ port: number; url: string }>;\n server: http.Server;\n shutdown: () => void;\n}\n\nconst DEFAULT_GATEWAY_HOST = \"127.0.0.1\";\nconst DEFAULT_GATEWAY_PORT = 8080;\nconst DEFAULT_APP_PORT_START = 8100;\nconst PROXY_READY_RETRY_DELAY_MS = 250;\nconst APP_RESTART_MAX_DELAY_MS = 10_000;\n\nexport function isWorkspaceWatcherLimitError(\n err: Pick<NodeJS.ErrnoException, \"code\">,\n): boolean {\n return err.code === \"ENOSPC\" || err.code === \"EMFILE\";\n}\n\nexport function shouldEagerStartWorkspaceApps(\n args: string[] = [],\n env: NodeJS.ProcessEnv = process.env,\n): boolean {\n return (\n args.includes(\"--eager\") ||\n env.WORKSPACE_EAGER === \"1\" ||\n env.WORKSPACE_EAGER === \"true\"\n );\n}\n\nexport function initialWorkspaceAppIds(\n apps: Array<Pick<WorkspaceApp, \"id\">>,\n defaultApp: string,\n eager: boolean,\n startDefault = true,\n): string[] {\n if (eager) return apps.map((app) => app.id);\n if (!startDefault) return [];\n return apps.some((app) => app.id === defaultApp) ? [defaultApp] : [];\n}\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(appsDir: string, appPortStart: number): WorkspaceApp[] {\n if (!fs.existsSync(appsDir)) return [];\n // existsSync -> readdirSync is a TOCTOU race. Treat ENOENT as \"no apps\n // right now\" and let the polling sync recover.\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(compareApps)\n .map((app, index) => ({ ...app, port: appPortStart + index }));\n}\n\nfunction compareApps(a: Pick<WorkspaceApp, \"id\">, b: Pick<WorkspaceApp, \"id\">) {\n if (a.id === \"dispatch\") return -1;\n if (b.id === \"dispatch\") return 1;\n return a.id.localeCompare(b.id);\n}\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.replace(/\\u279c/g, \"->\"),\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 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 appRestartDelay(attempts: number): number {\n return Math.min(\n 1_000 * 2 ** Math.max(0, attempts - 1),\n APP_RESTART_MAX_DELAY_MS,\n );\n}\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\nfunction firstHeaderValue(\n value: string | string[] | number | undefined,\n): string | undefined {\n if (Array.isArray(value)) return value[0];\n if (value === undefined) return undefined;\n return String(value);\n}\n\nfunction wantsHtml(req: http.IncomingMessage): boolean {\n if (req.method !== \"GET\" && req.method !== \"HEAD\") return false;\n const accept = firstHeaderValue(req.headers.accept);\n if (!accept) return false;\n return accept.includes(\"text/html\");\n}\n\nfunction renderStartingApp(app: WorkspaceApp): string {\n const escapedName = escapeHtml(app.name || app.id);\n const message = app.installing\n ? \"The workspace gateway is installing this app's dependencies before starting it.\"\n : \"The workspace gateway is waking this app's dev server.\";\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 <meta http-equiv=\"refresh\" content=\"1\" />\n <title>Starting ${escapedName}</title>\n <style>\n body { min-height: 100vh; margin: 0; display: grid; place-items: center; font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif; background: #fafafa; color: #171717; }\n main { width: min(420px, calc(100vw - 48px)); }\n .bar { height: 3px; overflow: hidden; border-radius: 999px; background: #e5e5e5; }\n .bar::before { content: \"\"; display: block; height: 100%; width: 42%; border-radius: inherit; background: #171717; animation: load 1s ease-in-out infinite; }\n p { color: #737373; }\n @keyframes load { 0% { transform: translateX(-105%); } 100% { transform: translateX(245%); } }\n </style>\n <script>setTimeout(() => window.location.reload(), 900);</script>\n </head>\n <body>\n <main>\n <div class=\"bar\"></div>\n <h1>Starting ${escapedName}</h1>\n <p>${escapeHtml(message)}</p>\n </main>\n </body>\n</html>`;\n}\n\nfunction escapeHtml(value: string): string {\n return value.replace(/[&<>\"']/g, (char) => {\n switch (char) {\n case \"&\":\n return \"&\";\n case \"<\":\n return \"<\";\n case \">\":\n return \">\";\n case '\"':\n return \""\";\n default:\n return \"'\";\n }\n });\n}\n\nfunction renderIndex(apps: WorkspaceApp[]): 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 when installed.</p>\n <div class=\"grid\">\n ${apps\n .map(\n (app) =>\n `<a class=\"card\" href=\"/${app.id}\"><strong>${escapeHtml(app.name)}</strong><span class=\"muted\">/${escapeHtml(app.id)}</span></a>`,\n )\n .join(\"\")}\n </div>\n </main>\n </body>\n</html>`;\n}\n\nfunction hasLocalBin(dir: string, command: string): boolean {\n const binDir = path.join(dir, \"node_modules\", \".bin\");\n return (\n fs.existsSync(path.join(binDir, command)) ||\n fs.existsSync(path.join(binDir, `${command}.cmd`)) ||\n fs.existsSync(path.join(binDir, `${command}.ps1`))\n );\n}\n\nexport function runWorkspaceDev(\n options: WorkspaceDevOptions = {},\n): WorkspaceDevHandle {\n const args = options.args ?? process.argv.slice(2);\n const env = options.env ?? process.env;\n const root = options.root ?? process.cwd();\n const appsDir = path.join(root, \"apps\");\n const spawnProcess = options.spawnProcess ?? spawn;\n const stdout = options.stdout ?? process.stdout;\n const stderr = options.stderr ?? process.stderr;\n\n fs.mkdirSync(path.join(root, \"data\"), { recursive: true });\n const gatewayHost = env.WORKSPACE_HOST || DEFAULT_GATEWAY_HOST;\n const requestedPort = Number(\n env.WORKSPACE_PORT || env.PORT || DEFAULT_GATEWAY_PORT,\n );\n const appPortStart = Number(\n env.WORKSPACE_APP_PORT_START || DEFAULT_APP_PORT_START,\n );\n const forceVite = env.WORKSPACE_VITE_FORCE === \"1\";\n const eager = shouldEagerStartWorkspaceApps(args, env);\n const proxyReadyTimeoutMs = Number(\n env.WORKSPACE_PROXY_READY_TIMEOUT_MS ?? 30_000,\n );\n let gatewayUrl = `http://${gatewayHost}:${requestedPort}`;\n\n const apps = discoverApps(appsDir, appPortStart);\n if (apps.length === 0) {\n throw new Error(\"[workspace] No apps found under ./apps\");\n }\n\n const appById = new Map(apps.map((app) => [app.id, app]));\n const explicitDefaultApp =\n env.WORKSPACE_DEFAULT_APP && appById.has(env.WORKSPACE_DEFAULT_APP)\n ? env.WORKSPACE_DEFAULT_APP\n : null;\n const hasDispatch = appById.has(\"dispatch\");\n const defaultApp =\n explicitDefaultApp ?? (hasDispatch ? \"dispatch\" : apps[0].id);\n const redirectRootToDefault = Boolean(explicitDefaultApp || hasDispatch);\n\n let syncTimer: NodeJS.Timeout | undefined;\n let shuttingDown = false;\n let workspaceStarted = false;\n\n let readyResolve: (value: { port: number; url: string }) => void;\n const ready = new Promise<{ port: number; url: string }>((resolve) => {\n readyResolve = resolve;\n });\n\n function workspaceAppsJson(): string {\n return JSON.stringify(\n apps.map((workspaceApp) => ({\n id: workspaceApp.id,\n name: workspaceApp.name,\n path: `/${workspaceApp.id}`,\n })),\n );\n }\n\n function syncApps(): void {\n const discovered = discoverApps(appsDir, appPortStart);\n for (const app of discovered) {\n const existing = appById.get(app.id);\n if (existing) {\n existing.name = app.name;\n existing.dir = app.dir;\n continue;\n }\n const usedPorts = new Set(apps.map((existingApp) => existingApp.port));\n let port = appPortStart;\n while (usedPorts.has(port)) port++;\n const next = { ...app, port };\n apps.push(next);\n apps.sort(compareApps);\n appById.set(next.id, next);\n stdout.write(`[workspace] Detected new app: /${next.id}\\n`);\n }\n }\n\n function scheduleSync(): void {\n if (syncTimer) clearTimeout(syncTimer);\n syncTimer = setTimeout(syncApps, 400);\n }\n\n function appForRequest(req: http.IncomingMessage): WorkspaceApp | null {\n const params = new URL(req.url || \"/\", \"http://workspace.local\")\n .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\n function startApp(app: WorkspaceApp): void {\n if (app.process && !app.process.killed) return;\n if (app.restartTimer) {\n clearTimeout(app.restartTimer);\n app.restartTimer = undefined;\n }\n\n const basePath = `/${app.id}`;\n const shouldInstall =\n !app.installAttempted && !hasLocalBin(app.dir, \"vite\");\n const childArgs = shouldInstall\n ? [\"--dir\", root, \"install\", \"--no-frozen-lockfile\", \"--prefer-offline\"]\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 if (shouldInstall) {\n stdout.write(\n `[workspace] Installing dependencies before starting /${app.id}\\n`,\n );\n }\n\n const child = spawnProcess(\"pnpm\", childArgs, {\n cwd: root,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n env: {\n ...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 VITE_WORKSPACE_GATEWAY_URL: gatewayUrl,\n PORT: String(app.port),\n WORKSPACE_GATEWAY_URL: gatewayUrl,\n },\n });\n app.process = child;\n app.installing = shouldInstall;\n\n const prefix = `[${app.id}]`;\n const stableTimer = setTimeout(() => {\n app.restartAttempts = 0;\n }, 5_000);\n stableTimer.unref();\n\n child.stdout?.on(\"data\", (chunk) => {\n pipeAppOutput(prefix, chunk, (value) => stdout.write(value));\n });\n child.stderr?.on(\"data\", (chunk) => {\n pipeAppOutput(prefix, chunk, (value) => stderr.write(value));\n });\n child.on(\"exit\", (code) => {\n clearTimeout(stableTimer);\n const wasInstalling = app.installing;\n app.process = undefined;\n app.installing = false;\n app.ready = false;\n app.readinessProbe = undefined;\n if (code === 0 || shuttingDown) {\n if (wasInstalling && code === 0 && !shuttingDown) {\n app.installAttempted = true;\n startApp(app);\n }\n return;\n }\n if (wasInstalling) app.installAttempted = false;\n app.restartAttempts = (app.restartAttempts ?? 0) + 1;\n const delay = appRestartDelay(app.restartAttempts);\n stderr.write(\n `${prefix} exited with code ${code}; retrying in ${Math.round(\n delay / 1000,\n )}s\\n`,\n );\n app.restartTimer = setTimeout(() => {\n app.restartTimer = undefined;\n startApp(app);\n }, delay);\n app.restartTimer.unref();\n });\n }\n\n function forwardedProto(req: http.IncomingMessage): string {\n return (\n firstHeaderValue(req.headers[\"x-forwarded-proto\"]) ||\n ((req.socket as { encrypted?: boolean }).encrypted ? \"https\" : \"http\")\n );\n }\n\n function forwardedHost(req: http.IncomingMessage): string {\n return (\n firstHeaderValue(req.headers[\"x-forwarded-host\"]) ||\n firstHeaderValue(req.headers.host) ||\n new URL(gatewayUrl).host\n );\n }\n\n function proxyHeaders(\n req: http.IncomingMessage,\n targetHost: string,\n ): http.OutgoingHttpHeaders {\n return {\n ...req.headers,\n \"x-forwarded-host\": forwardedHost(req),\n \"x-forwarded-proto\": forwardedProto(req),\n host: targetHost,\n };\n }\n\n async 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\n function ensureReadinessProbe(app: WorkspaceApp): void {\n if (app.ready || app.readinessProbe) return;\n app.readinessProbe = waitForPort(app.port, Date.now() + proxyReadyTimeoutMs)\n .then((ready) => {\n if (ready) app.ready = true;\n })\n .finally(() => {\n app.readinessProbe = undefined;\n });\n }\n\n function proxyHttp(\n app: WorkspaceApp,\n req: http.IncomingMessage,\n res: http.ServerResponse,\n ): void {\n const cold = !app.process || app.process.killed;\n startApp(app);\n\n if (!app.ready && wantsHtml(req)) {\n ensureReadinessProbe(app);\n res.writeHead(200, { \"content-type\": \"text/html; charset=utf-8\" });\n if (req.method === \"HEAD\") {\n res.end();\n return;\n }\n res.end(renderStartingApp(app));\n return;\n }\n\n const dispatch = () => {\n const headers = proxyHeaders(req, `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\n // it's listening. Skip the probe so steady-state requests stay zero-latency.\n if (app.ready && !cold) {\n dispatch();\n return;\n }\n\n // Cold path: hold non-HTML requests open while the child server boots.\n // Node keeps the request body paused until pipe() attaches.\n void waitForPort(app.port, Date.now() + proxyReadyTimeoutMs).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\n function proxyUpgrade(\n app: WorkspaceApp,\n req: http.IncomingMessage,\n socket: Duplex,\n head: Buffer,\n ): void {\n startApp(app);\n void waitForPort(app.port, Date.now() + proxyReadyTimeoutMs).then(\n (ready) => {\n if (!ready) {\n socket.destroy();\n return;\n }\n app.ready = true;\n const target = net.connect(app.port, \"127.0.0.1\", () => {\n const headers = Object.entries(\n proxyHeaders(req, `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 );\n }\n\n function handleWatcherError(err: NodeJS.ErrnoException): void {\n if (isWorkspaceWatcherLimitError(err)) {\n stderr.write(\n `[workspace] Recursive file watcher hit the system limit (${err.code}). ` +\n `New apps will still be detected via polling every ~2s. ` +\n (err.code === \"ENOSPC\"\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). `\n : `Try closing other dev servers or raising your open-file limit. `) +\n `On macOS/Windows this usually ` +\n `means too many other watchers are running.\\n`,\n );\n return;\n }\n if (err.code === \"ENOENT\") {\n return;\n }\n stderr.write(\n `[workspace] Recursive file watcher failed (${err.code ?? \"unknown\"}): ${err.message}. ` +\n `Falling back to polling.\\n`,\n );\n Sentry.captureException(err, {\n tags: { handled: \"dev-watch-unknown\" },\n level: \"warning\",\n });\n }\n\n function startWorkspaceProcesses(): void {\n if (workspaceStarted) return;\n workspaceStarted = true;\n for (const id of initialWorkspaceAppIds(\n apps,\n defaultApp,\n eager,\n redirectRootToDefault,\n )) {\n const app = appById.get(id);\n if (app) startApp(app);\n }\n try {\n const watcher = fs.watch(appsDir, { recursive: true }, scheduleSync);\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\n function openBrowser(url: string): void {\n if (options.openBrowser === false || 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 openArgs =\n process.platform === \"win32\" ? [\"/c\", \"start\", \"\", url] : [url];\n const child = spawnProcess(command, openArgs, {\n stdio: \"ignore\",\n detached: true,\n });\n child.unref();\n }\n\n const server = http.createServer((req, res) => {\n const parsedUrl = new URL(req.url || \"/\", \"http://workspace.local\");\n const pathname = parsedUrl.pathname;\n\n if (pathname === \"/\" || pathname === \"/index.html\") {\n syncApps();\n const currentDefaultApp =\n explicitDefaultApp && appById.has(explicitDefaultApp)\n ? explicitDefaultApp\n : appById.has(\"dispatch\")\n ? \"dispatch\"\n : defaultApp;\n const shouldRedirectRoot =\n Boolean(explicitDefaultApp && appById.has(explicitDefaultApp)) ||\n appById.has(\"dispatch\");\n if (shouldRedirectRoot) {\n res.writeHead(302, {\n location: `/${currentDefaultApp}${parsedUrl.search}`,\n });\n res.end();\n return;\n }\n res.writeHead(200, { \"content-type\": \"text/html; charset=utf-8\" });\n res.end(renderIndex(apps));\n return;\n }\n\n if (pathname === \"/_workspace/apps\") {\n syncApps();\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 running: Boolean(app.process && !app.process.killed),\n })),\n ),\n );\n return;\n }\n\n let app = appForRequest(req);\n if (!app) {\n syncApps();\n app = appForRequest(req);\n }\n if (!app) {\n res.writeHead(404, { \"content-type\": \"text/html; charset=utf-8\" });\n res.end(renderIndex(apps));\n return;\n }\n proxyHttp(app, req, res);\n });\n\n server.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\n function 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 stderr.write(`[workspace] Could not start gateway: ${err.message}\\n`);\n throw err;\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 stdout.write(\n `[workspace] Default: ${redirectRootToDefault ? `${gatewayUrl}/${defaultApp}` : gatewayUrl}\\n`,\n );\n stdout.write(`[workspace] Gateway: ${gatewayUrl}\\n`);\n stdout.write(`[workspace] Mode: ${eager ? \"eager\" : \"lazy\"}\\n`);\n for (const app of apps) {\n stdout.write(\n `[workspace] ${app.id}: /${app.id} -> 127.0.0.1:${app.port}\\n`,\n );\n }\n startWorkspaceProcesses();\n openBrowser(\n redirectRootToDefault ? `${gatewayUrl}/${defaultApp}` : gatewayUrl,\n );\n readyResolve({ port: actualPort, url: gatewayUrl });\n });\n }\n\n function 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 if (syncTimer) clearTimeout(syncTimer);\n process.off(\"SIGINT\", handleSigint);\n process.off(\"SIGTERM\", handleSigterm);\n }\n\n const handleSigint = () => shutdown();\n const handleSigterm = () => shutdown();\n process.once(\"SIGINT\", handleSigint);\n process.once(\"SIGTERM\", handleSigterm);\n\n listen(requestedPort);\n\n return {\n apps,\n defaultApp,\n gatewayUrl: () => gatewayUrl,\n ready,\n server,\n shutdown,\n };\n}\n\nfunction isDirectRun(): boolean {\n const entry = process.argv[1];\n if (!entry) return false;\n try {\n return path.resolve(entry) === fileURLToPath(import.meta.url);\n } catch {\n return false;\n }\n}\n\nif (isDirectRun()) {\n try {\n runWorkspaceDev({ args: process.argv.slice(2) });\n } catch (err) {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n}\n"]}
|
|
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 { fileURLToPath } from \"node:url\";\nimport * as Sentry from \"@sentry/node\";\nimport { extractOAuthStateAppId } from \"../shared/oauth-state.js\";\n\nexport interface WorkspaceApp {\n id: string;\n name: string;\n dir: string;\n port: number;\n process?: ChildProcess;\n restartTimer?: NodeJS.Timeout;\n restartAttempts?: number;\n installing?: boolean;\n installAttempted?: boolean;\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 readinessProbe?: Promise<void>;\n}\n\nexport interface WorkspaceDevOptions {\n args?: string[];\n env?: NodeJS.ProcessEnv;\n root?: string;\n spawnProcess?: typeof spawn;\n openBrowser?: boolean;\n stdout?: Pick<NodeJS.WriteStream, \"write\">;\n stderr?: Pick<NodeJS.WriteStream, \"write\">;\n}\n\nexport interface WorkspaceDevHandle {\n apps: WorkspaceApp[];\n defaultApp: string;\n gatewayUrl: () => string;\n ready: Promise<{ port: number; url: string }>;\n server: http.Server;\n shutdown: () => void;\n}\n\nconst DEFAULT_GATEWAY_HOST = \"127.0.0.1\";\nconst DEFAULT_GATEWAY_PORT = 8080;\nconst DEFAULT_APP_PORT_START = 8100;\nconst PROXY_READY_RETRY_DELAY_MS = 250;\nconst APP_RESTART_MAX_DELAY_MS = 10_000;\n\nfunction normalizeOrigin(value: string | undefined): string | undefined {\n if (!value) return undefined;\n try {\n return new URL(value).origin;\n } catch {\n return undefined;\n }\n}\n\nfunction workspaceOAuthOrigin(\n env: NodeJS.ProcessEnv,\n gatewayUrl: string,\n): string | undefined {\n return (\n normalizeOrigin(env.VITE_WORKSPACE_OAUTH_ORIGIN) ||\n normalizeOrigin(env.WORKSPACE_OAUTH_ORIGIN) ||\n normalizeOrigin(env.APP_URL) ||\n normalizeOrigin(env.BETTER_AUTH_URL) ||\n normalizeOrigin(gatewayUrl)\n );\n}\n\nexport function isWorkspaceWatcherLimitError(\n err: Pick<NodeJS.ErrnoException, \"code\">,\n): boolean {\n return err.code === \"ENOSPC\" || err.code === \"EMFILE\";\n}\n\nexport function shouldEagerStartWorkspaceApps(\n args: string[] = [],\n env: NodeJS.ProcessEnv = process.env,\n): boolean {\n return (\n args.includes(\"--eager\") ||\n env.WORKSPACE_EAGER === \"1\" ||\n env.WORKSPACE_EAGER === \"true\"\n );\n}\n\nexport function initialWorkspaceAppIds(\n apps: Array<Pick<WorkspaceApp, \"id\">>,\n defaultApp: string,\n eager: boolean,\n startDefault = true,\n): string[] {\n if (eager) return apps.map((app) => app.id);\n if (!startDefault) return [];\n return apps.some((app) => app.id === defaultApp) ? [defaultApp] : [];\n}\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(appsDir: string, appPortStart: number): WorkspaceApp[] {\n if (!fs.existsSync(appsDir)) return [];\n // existsSync -> readdirSync is a TOCTOU race. Treat ENOENT as \"no apps\n // right now\" and let the polling sync recover.\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(compareApps)\n .map((app, index) => ({ ...app, port: appPortStart + index }));\n}\n\nfunction compareApps(a: Pick<WorkspaceApp, \"id\">, b: Pick<WorkspaceApp, \"id\">) {\n if (a.id === \"dispatch\") return -1;\n if (b.id === \"dispatch\") return 1;\n return a.id.localeCompare(b.id);\n}\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.replace(/\\u279c/g, \"->\"),\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 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 appRestartDelay(attempts: number): number {\n return Math.min(\n 1_000 * 2 ** Math.max(0, attempts - 1),\n APP_RESTART_MAX_DELAY_MS,\n );\n}\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\nfunction firstHeaderValue(\n value: string | string[] | number | undefined,\n): string | undefined {\n if (Array.isArray(value)) return value[0];\n if (value === undefined) return undefined;\n return String(value);\n}\n\nfunction wantsHtml(req: http.IncomingMessage): boolean {\n if (req.method !== \"GET\" && req.method !== \"HEAD\") return false;\n const accept = firstHeaderValue(req.headers.accept);\n if (!accept) return false;\n return accept.includes(\"text/html\");\n}\n\nfunction renderStartingApp(app: WorkspaceApp): string {\n const escapedName = escapeHtml(app.name || app.id);\n const message = app.installing\n ? \"The workspace gateway is installing this app's dependencies before starting it.\"\n : \"The workspace gateway is waking this app's dev server.\";\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 <meta http-equiv=\"refresh\" content=\"1\" />\n <title>Starting ${escapedName}</title>\n <meta name=\"color-scheme\" content=\"light dark\" />\n <style>\n :root { --bg: #fafafa; --fg: #171717; --muted: #737373; --bar-bg: #e5e5e5; --bar-fill: #171717; }\n @media (prefers-color-scheme: dark) { :root { --bg: #0a0a0a; --fg: #fafafa; --muted: #a3a3a3; --bar-bg: #262626; --bar-fill: #fafafa; } }\n body { min-height: 100vh; margin: 0; display: grid; place-items: center; font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif; background: var(--bg); color: var(--fg); }\n main { width: min(420px, calc(100vw - 48px)); }\n .bar { height: 3px; overflow: hidden; border-radius: 999px; background: var(--bar-bg); }\n .bar::before { content: \"\"; display: block; height: 100%; width: 42%; border-radius: inherit; background: var(--bar-fill); animation: load 1s ease-in-out infinite; }\n p { color: var(--muted); }\n @keyframes load { 0% { transform: translateX(-105%); } 100% { transform: translateX(245%); } }\n </style>\n <script>setTimeout(() => window.location.reload(), 900);</script>\n </head>\n <body>\n <main>\n <div class=\"bar\"></div>\n <h1>Starting ${escapedName}</h1>\n <p>${escapeHtml(message)}</p>\n </main>\n </body>\n</html>`;\n}\n\nfunction escapeHtml(value: string): string {\n return value.replace(/[&<>\"']/g, (char) => {\n switch (char) {\n case \"&\":\n return \"&\";\n case \"<\":\n return \"<\";\n case \">\":\n return \">\";\n case '\"':\n return \""\";\n default:\n return \"'\";\n }\n });\n}\n\nfunction renderIndex(apps: WorkspaceApp[]): 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 <meta name=\"color-scheme\" content=\"light dark\" />\n <style>\n :root { --bg: #fafafa; --fg: #171717; --muted: #737373; --card-bg: #ffffff; --card-border: #d4d4d4; }\n @media (prefers-color-scheme: dark) { :root { --bg: #0a0a0a; --fg: #fafafa; --muted: #a3a3a3; --card-bg: #171717; --card-border: #262626; } }\n body { font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif; margin: 0; padding: 32px; background: var(--bg); color: var(--fg); }\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 var(--card-border); border-radius: 8px; padding: 14px 16px; background: var(--card-bg); }\n .muted { color: var(--muted); }\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 when installed.</p>\n <div class=\"grid\">\n ${apps\n .map(\n (app) =>\n `<a class=\"card\" href=\"/${app.id}\"><strong>${escapeHtml(app.name)}</strong><span class=\"muted\">/${escapeHtml(app.id)}</span></a>`,\n )\n .join(\"\")}\n </div>\n </main>\n </body>\n</html>`;\n}\n\nfunction hasLocalBin(dir: string, command: string): boolean {\n const binDir = path.join(dir, \"node_modules\", \".bin\");\n return (\n fs.existsSync(path.join(binDir, command)) ||\n fs.existsSync(path.join(binDir, `${command}.cmd`)) ||\n fs.existsSync(path.join(binDir, `${command}.ps1`))\n );\n}\n\nexport function runWorkspaceDev(\n options: WorkspaceDevOptions = {},\n): WorkspaceDevHandle {\n const args = options.args ?? process.argv.slice(2);\n const env = options.env ?? process.env;\n const root = options.root ?? process.cwd();\n const appsDir = path.join(root, \"apps\");\n const spawnProcess = options.spawnProcess ?? spawn;\n const stdout = options.stdout ?? process.stdout;\n const stderr = options.stderr ?? process.stderr;\n\n fs.mkdirSync(path.join(root, \"data\"), { recursive: true });\n const gatewayHost = env.WORKSPACE_HOST || DEFAULT_GATEWAY_HOST;\n const requestedPort = Number(\n env.WORKSPACE_PORT || env.PORT || DEFAULT_GATEWAY_PORT,\n );\n const appPortStart = Number(\n env.WORKSPACE_APP_PORT_START || DEFAULT_APP_PORT_START,\n );\n const forceVite = env.WORKSPACE_VITE_FORCE === \"1\";\n const eager = shouldEagerStartWorkspaceApps(args, env);\n const proxyReadyTimeoutMs = Number(\n env.WORKSPACE_PROXY_READY_TIMEOUT_MS ?? 30_000,\n );\n let gatewayUrl = `http://${gatewayHost}:${requestedPort}`;\n\n const apps = discoverApps(appsDir, appPortStart);\n if (apps.length === 0) {\n throw new Error(\"[workspace] No apps found under ./apps\");\n }\n\n const appById = new Map(apps.map((app) => [app.id, app]));\n const explicitDefaultApp =\n env.WORKSPACE_DEFAULT_APP && appById.has(env.WORKSPACE_DEFAULT_APP)\n ? env.WORKSPACE_DEFAULT_APP\n : null;\n const hasDispatch = appById.has(\"dispatch\");\n const defaultApp =\n explicitDefaultApp ?? (hasDispatch ? \"dispatch\" : apps[0].id);\n const redirectRootToDefault = Boolean(explicitDefaultApp || hasDispatch);\n\n let syncTimer: NodeJS.Timeout | undefined;\n let shuttingDown = false;\n let workspaceStarted = false;\n\n let readyResolve: (value: { port: number; url: string }) => void;\n const ready = new Promise<{ port: number; url: string }>((resolve) => {\n readyResolve = resolve;\n });\n\n function workspaceAppsJson(): string {\n return JSON.stringify(\n apps.map((workspaceApp) => ({\n id: workspaceApp.id,\n name: workspaceApp.name,\n path: `/${workspaceApp.id}`,\n })),\n );\n }\n\n function syncApps(): void {\n const discovered = discoverApps(appsDir, appPortStart);\n for (const app of discovered) {\n const existing = appById.get(app.id);\n if (existing) {\n existing.name = app.name;\n existing.dir = app.dir;\n continue;\n }\n const usedPorts = new Set(apps.map((existingApp) => existingApp.port));\n let port = appPortStart;\n while (usedPorts.has(port)) port++;\n const next = { ...app, port };\n apps.push(next);\n apps.sort(compareApps);\n appById.set(next.id, next);\n stdout.write(`[workspace] Detected new app: /${next.id}\\n`);\n }\n }\n\n function scheduleSync(): void {\n if (syncTimer) clearTimeout(syncTimer);\n syncTimer = setTimeout(syncApps, 400);\n }\n\n function appForRequest(req: http.IncomingMessage): WorkspaceApp | null {\n const params = new URL(req.url || \"/\", \"http://workspace.local\")\n .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\n function startApp(app: WorkspaceApp): void {\n if (app.process && !app.process.killed) return;\n if (app.restartTimer) {\n clearTimeout(app.restartTimer);\n app.restartTimer = undefined;\n }\n\n const basePath = `/${app.id}`;\n const shouldInstall =\n !app.installAttempted && !hasLocalBin(app.dir, \"vite\");\n const childArgs = shouldInstall\n ? [\"--dir\", root, \"install\", \"--no-frozen-lockfile\", \"--prefer-offline\"]\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 if (shouldInstall) {\n stdout.write(\n `[workspace] Installing dependencies before starting /${app.id}\\n`,\n );\n }\n\n const child = spawnProcess(\"pnpm\", childArgs, {\n cwd: root,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n env: {\n ...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 VITE_WORKSPACE_OAUTH_ORIGIN: workspaceOAuthOrigin(env, gatewayUrl),\n VITE_WORKSPACE_GATEWAY_URL: gatewayUrl,\n PORT: String(app.port),\n WORKSPACE_GATEWAY_URL: gatewayUrl,\n },\n });\n app.process = child;\n app.installing = shouldInstall;\n\n const prefix = `[${app.id}]`;\n const stableTimer = setTimeout(() => {\n app.restartAttempts = 0;\n }, 5_000);\n stableTimer.unref();\n\n child.stdout?.on(\"data\", (chunk) => {\n pipeAppOutput(prefix, chunk, (value) => stdout.write(value));\n });\n child.stderr?.on(\"data\", (chunk) => {\n pipeAppOutput(prefix, chunk, (value) => stderr.write(value));\n });\n child.on(\"exit\", (code) => {\n clearTimeout(stableTimer);\n const wasInstalling = app.installing;\n app.process = undefined;\n app.installing = false;\n app.ready = false;\n app.readinessProbe = undefined;\n if (code === 0 || shuttingDown) {\n if (wasInstalling && code === 0 && !shuttingDown) {\n app.installAttempted = true;\n startApp(app);\n }\n return;\n }\n if (wasInstalling) app.installAttempted = false;\n app.restartAttempts = (app.restartAttempts ?? 0) + 1;\n const delay = appRestartDelay(app.restartAttempts);\n stderr.write(\n `${prefix} exited with code ${code}; retrying in ${Math.round(\n delay / 1000,\n )}s\\n`,\n );\n app.restartTimer = setTimeout(() => {\n app.restartTimer = undefined;\n startApp(app);\n }, delay);\n app.restartTimer.unref();\n });\n }\n\n function forwardedProto(req: http.IncomingMessage): string {\n return (\n firstHeaderValue(req.headers[\"x-forwarded-proto\"]) ||\n ((req.socket as { encrypted?: boolean }).encrypted ? \"https\" : \"http\")\n );\n }\n\n function forwardedHost(req: http.IncomingMessage): string {\n return (\n firstHeaderValue(req.headers[\"x-forwarded-host\"]) ||\n firstHeaderValue(req.headers.host) ||\n new URL(gatewayUrl).host\n );\n }\n\n function proxyHeaders(\n req: http.IncomingMessage,\n targetHost: string,\n ): http.OutgoingHttpHeaders {\n return {\n ...req.headers,\n \"x-forwarded-host\": forwardedHost(req),\n \"x-forwarded-proto\": forwardedProto(req),\n host: targetHost,\n };\n }\n\n async 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\n function ensureReadinessProbe(app: WorkspaceApp): void {\n if (app.ready || app.readinessProbe) return;\n app.readinessProbe = waitForPort(app.port, Date.now() + proxyReadyTimeoutMs)\n .then((ready) => {\n if (ready) app.ready = true;\n })\n .finally(() => {\n app.readinessProbe = undefined;\n });\n }\n\n function proxyHttp(\n app: WorkspaceApp,\n req: http.IncomingMessage,\n res: http.ServerResponse,\n ): void {\n const cold = !app.process || app.process.killed;\n startApp(app);\n\n if (!app.ready && wantsHtml(req)) {\n ensureReadinessProbe(app);\n res.writeHead(200, { \"content-type\": \"text/html; charset=utf-8\" });\n if (req.method === \"HEAD\") {\n res.end();\n return;\n }\n res.end(renderStartingApp(app));\n return;\n }\n\n const dispatch = () => {\n const headers = proxyHeaders(req, `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\n // it's listening. Skip the probe so steady-state requests stay zero-latency.\n if (app.ready && !cold) {\n dispatch();\n return;\n }\n\n // Cold path: hold non-HTML requests open while the child server boots.\n // Node keeps the request body paused until pipe() attaches.\n void waitForPort(app.port, Date.now() + proxyReadyTimeoutMs).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\n function proxyUpgrade(\n app: WorkspaceApp,\n req: http.IncomingMessage,\n socket: Duplex,\n head: Buffer,\n ): void {\n startApp(app);\n void waitForPort(app.port, Date.now() + proxyReadyTimeoutMs).then(\n (ready) => {\n if (!ready) {\n socket.destroy();\n return;\n }\n app.ready = true;\n const target = net.connect(app.port, \"127.0.0.1\", () => {\n const headers = Object.entries(\n proxyHeaders(req, `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 );\n }\n\n function handleWatcherError(err: NodeJS.ErrnoException): void {\n if (isWorkspaceWatcherLimitError(err)) {\n stderr.write(\n `[workspace] Recursive file watcher hit the system limit (${err.code}). ` +\n `New apps will still be detected via polling every ~2s. ` +\n (err.code === \"ENOSPC\"\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). `\n : `Try closing other dev servers or raising your open-file limit. `) +\n `On macOS/Windows this usually ` +\n `means too many other watchers are running.\\n`,\n );\n return;\n }\n if (err.code === \"ENOENT\") {\n return;\n }\n stderr.write(\n `[workspace] Recursive file watcher failed (${err.code ?? \"unknown\"}): ${err.message}. ` +\n `Falling back to polling.\\n`,\n );\n Sentry.captureException(err, {\n tags: { handled: \"dev-watch-unknown\" },\n level: \"warning\",\n });\n }\n\n function startWorkspaceProcesses(): void {\n if (workspaceStarted) return;\n workspaceStarted = true;\n for (const id of initialWorkspaceAppIds(\n apps,\n defaultApp,\n eager,\n redirectRootToDefault,\n )) {\n const app = appById.get(id);\n if (app) startApp(app);\n }\n try {\n const watcher = fs.watch(appsDir, { recursive: true }, scheduleSync);\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\n function openBrowser(url: string): void {\n if (options.openBrowser === false || 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 openArgs =\n process.platform === \"win32\" ? [\"/c\", \"start\", \"\", url] : [url];\n const child = spawnProcess(command, openArgs, {\n stdio: \"ignore\",\n detached: true,\n });\n child.unref();\n }\n\n const server = http.createServer((req, res) => {\n const parsedUrl = new URL(req.url || \"/\", \"http://workspace.local\");\n const pathname = parsedUrl.pathname;\n\n if (pathname === \"/\" || pathname === \"/index.html\") {\n syncApps();\n const currentDefaultApp =\n explicitDefaultApp && appById.has(explicitDefaultApp)\n ? explicitDefaultApp\n : appById.has(\"dispatch\")\n ? \"dispatch\"\n : defaultApp;\n const shouldRedirectRoot =\n Boolean(explicitDefaultApp && appById.has(explicitDefaultApp)) ||\n appById.has(\"dispatch\");\n if (shouldRedirectRoot) {\n res.writeHead(302, {\n location: `/${currentDefaultApp}${parsedUrl.search}`,\n });\n res.end();\n return;\n }\n res.writeHead(200, { \"content-type\": \"text/html; charset=utf-8\" });\n res.end(renderIndex(apps));\n return;\n }\n\n if (pathname === \"/_workspace/apps\") {\n syncApps();\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 running: Boolean(app.process && !app.process.killed),\n })),\n ),\n );\n return;\n }\n\n let app = appForRequest(req);\n if (!app) {\n syncApps();\n app = appForRequest(req);\n }\n if (!app) {\n res.writeHead(404, { \"content-type\": \"text/html; charset=utf-8\" });\n res.end(renderIndex(apps));\n return;\n }\n proxyHttp(app, req, res);\n });\n\n server.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\n function 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 stderr.write(`[workspace] Could not start gateway: ${err.message}\\n`);\n throw err;\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 stdout.write(\n `[workspace] Default: ${redirectRootToDefault ? `${gatewayUrl}/${defaultApp}` : gatewayUrl}\\n`,\n );\n stdout.write(`[workspace] Gateway: ${gatewayUrl}\\n`);\n stdout.write(`[workspace] Mode: ${eager ? \"eager\" : \"lazy\"}\\n`);\n for (const app of apps) {\n stdout.write(\n `[workspace] ${app.id}: /${app.id} -> 127.0.0.1:${app.port}\\n`,\n );\n }\n startWorkspaceProcesses();\n openBrowser(\n redirectRootToDefault ? `${gatewayUrl}/${defaultApp}` : gatewayUrl,\n );\n readyResolve({ port: actualPort, url: gatewayUrl });\n });\n }\n\n function 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 if (syncTimer) clearTimeout(syncTimer);\n process.off(\"SIGINT\", handleSigint);\n process.off(\"SIGTERM\", handleSigterm);\n }\n\n const handleSigint = () => shutdown();\n const handleSigterm = () => shutdown();\n process.once(\"SIGINT\", handleSigint);\n process.once(\"SIGTERM\", handleSigterm);\n\n listen(requestedPort);\n\n return {\n apps,\n defaultApp,\n gatewayUrl: () => gatewayUrl,\n ready,\n server,\n shutdown,\n };\n}\n\nfunction isDirectRun(): boolean {\n const entry = process.argv[1];\n if (!entry) return false;\n try {\n return path.resolve(entry) === fileURLToPath(import.meta.url);\n } catch {\n return false;\n }\n}\n\nif (isDirectRun()) {\n try {\n runWorkspaceDev({ args: process.argv.slice(2) });\n } catch (err) {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-chat-adapter.d.ts","sourceRoot":"","sources":["../../src/client/agent-chat-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAsB,MAAM,qBAAqB,CAAC;AAehF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AA0jBrE;;;;GAIG;AACH;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,CAAC,EAAE;IAC/C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,CAAC;IAC3C,SAAS,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,CAAC;IAC5C,SAAS,CAAC,EAAE;QAAE,OAAO,EAAE,eAAe,GAAG,SAAS,CAAA;KAAE,CAAC;IACrD,WAAW,CAAC,EAAE;QAAE,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAAA;KAAE,CAAC;CACzD,GAAG,gBAAgB,
|
|
1
|
+
{"version":3,"file":"agent-chat-adapter.d.ts","sourceRoot":"","sources":["../../src/client/agent-chat-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAsB,MAAM,qBAAqB,CAAC;AAehF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AA0jBrE;;;;GAIG;AACH;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,CAAC,EAAE;IAC/C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,CAAC;IAC3C,SAAS,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,CAAC;IAC5C,SAAS,CAAC,EAAE;QAAE,OAAO,EAAE,eAAe,GAAG,SAAS,CAAA;KAAE,CAAC;IACrD,WAAW,CAAC,EAAE;QAAE,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAAA;KAAE,CAAC;CACzD,GAAG,gBAAgB,CAo5BnB"}
|
|
@@ -644,6 +644,25 @@ export function createAgentChatAdapter(options) {
|
|
|
644
644
|
catch {
|
|
645
645
|
// Non-browser or Intl unavailable — tool calls will fall back to UTC.
|
|
646
646
|
}
|
|
647
|
+
// Surface hint — the server uses this to gate code-editing dev tools
|
|
648
|
+
// when the chat is running in a plain browser tab on localhost. Editing
|
|
649
|
+
// source files there would trigger HMR/page reloads and kill the chat
|
|
650
|
+
// session, so the agent must redirect users to Desktop / Claude Code /
|
|
651
|
+
// Codex / Builder.io instead of attempting code work.
|
|
652
|
+
try {
|
|
653
|
+
const ua = typeof navigator !== "undefined" ? navigator.userAgent || "" : "";
|
|
654
|
+
const inIframe = typeof window !== "undefined" && window.parent !== window;
|
|
655
|
+
const surface = /AgentNativeDesktop/i.test(ua)
|
|
656
|
+
? "desktop"
|
|
657
|
+
: inIframe
|
|
658
|
+
? "frame"
|
|
659
|
+
: "browser";
|
|
660
|
+
headers["x-agent-native-surface"] = surface;
|
|
661
|
+
}
|
|
662
|
+
catch {
|
|
663
|
+
// Non-browser environment — leave the header off and let the server
|
|
664
|
+
// fall back to its own UA/host detection.
|
|
665
|
+
}
|
|
647
666
|
const reconnectCurrentRun = async function* () {
|
|
648
667
|
if (!runId)
|
|
649
668
|
return false;
|