@agent-native/core 0.12.18 → 0.12.20
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/agent/default-model.d.ts +1 -20
- package/dist/agent/default-model.d.ts.map +1 -1
- package/dist/agent/default-model.js +1 -20
- package/dist/agent/default-model.js.map +1 -1
- package/dist/agent/engine/ai-sdk-engine.d.ts +2 -1
- package/dist/agent/engine/ai-sdk-engine.d.ts.map +1 -1
- package/dist/agent/engine/ai-sdk-engine.js +13 -38
- package/dist/agent/engine/ai-sdk-engine.js.map +1 -1
- package/dist/agent/engine/anthropic-engine.d.ts +1 -1
- package/dist/agent/engine/anthropic-engine.d.ts.map +1 -1
- package/dist/agent/engine/anthropic-engine.js +3 -11
- package/dist/agent/engine/anthropic-engine.js.map +1 -1
- package/dist/agent/engine/builder-engine.d.ts +2 -2
- package/dist/agent/engine/builder-engine.d.ts.map +1 -1
- package/dist/agent/engine/builder-engine.js +3 -21
- package/dist/agent/engine/builder-engine.js.map +1 -1
- package/dist/agent/model-config.d.ts +99 -0
- package/dist/agent/model-config.d.ts.map +1 -0
- package/dist/agent/model-config.js +112 -0
- package/dist/agent/model-config.js.map +1 -0
- package/dist/agent/production-agent.d.ts +1 -1
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +13 -1
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/cli/create.d.ts +4 -1
- package/dist/cli/create.d.ts.map +1 -1
- package/dist/cli/create.js +19 -4
- package/dist/cli/create.js.map +1 -1
- package/dist/cli/index.js +1 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/workspace-dev.d.ts +3 -0
- package/dist/cli/workspace-dev.d.ts.map +1 -1
- package/dist/cli/workspace-dev.js +67 -27
- package/dist/cli/workspace-dev.js.map +1 -1
- package/dist/client/AgentPanel.d.ts +4 -0
- package/dist/client/AgentPanel.d.ts.map +1 -1
- package/dist/client/AgentPanel.js +34 -4
- package/dist/client/AgentPanel.js.map +1 -1
- package/dist/client/AssistantChat.d.ts +4 -0
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +10 -2
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/agent-chat-adapter.d.ts.map +1 -1
- package/dist/client/agent-chat-adapter.js +50 -8
- package/dist/client/agent-chat-adapter.js.map +1 -1
- package/dist/client/analytics.d.ts +4 -0
- package/dist/client/analytics.d.ts.map +1 -1
- package/dist/client/analytics.js +11 -2
- package/dist/client/analytics.js.map +1 -1
- package/dist/client/components/CodeRequiredDialog.d.ts.map +1 -1
- package/dist/client/components/CodeRequiredDialog.js +10 -9
- package/dist/client/components/CodeRequiredDialog.js.map +1 -1
- package/dist/client/composer/TiptapComposer.d.ts +5 -1
- package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
- package/dist/client/composer/TiptapComposer.js +19 -6
- package/dist/client/composer/TiptapComposer.js.map +1 -1
- package/dist/client/composer/pasted-text.d.ts.map +1 -1
- package/dist/client/composer/pasted-text.js +1 -1
- package/dist/client/composer/pasted-text.js.map +1 -1
- package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
- package/dist/client/resources/ResourcesPanel.js +5 -40
- package/dist/client/resources/ResourcesPanel.js.map +1 -1
- package/dist/client/settings/AutomationsSection.d.ts.map +1 -1
- package/dist/client/settings/AutomationsSection.js +3 -30
- package/dist/client/settings/AutomationsSection.js.map +1 -1
- package/dist/client/terminal/AgentTerminal.d.ts.map +1 -1
- package/dist/client/terminal/AgentTerminal.js +44 -14
- package/dist/client/terminal/AgentTerminal.js.map +1 -1
- package/dist/client/use-chat-models.d.ts.map +1 -1
- package/dist/client/use-chat-models.js +41 -3
- package/dist/client/use-chat-models.js.map +1 -1
- package/dist/deploy/build.d.ts.map +1 -1
- package/dist/deploy/build.js +61 -6
- package/dist/deploy/build.js.map +1 -1
- package/dist/deploy/workspace-deploy.d.ts +1 -1
- package/dist/deploy/workspace-deploy.d.ts.map +1 -1
- package/dist/deploy/workspace-deploy.js +158 -7
- package/dist/deploy/workspace-deploy.js.map +1 -1
- package/dist/integrations/plugin.d.ts.map +1 -1
- package/dist/integrations/plugin.js +1 -2
- package/dist/integrations/plugin.js.map +1 -1
- package/dist/integrations/types.d.ts +1 -1
- package/dist/integrations/types.d.ts.map +1 -1
- package/dist/integrations/types.js.map +1 -1
- package/dist/integrations/webhook-handler.d.ts +2 -2
- package/dist/integrations/webhook-handler.d.ts.map +1 -1
- package/dist/integrations/webhook-handler.js.map +1 -1
- package/dist/scripts/agent-engines/manage-agent-engine.js +1 -1
- package/dist/scripts/agent-engines/manage-agent-engine.js.map +1 -1
- package/dist/scripts/agent-engines/set-agent-engine.js +1 -1
- package/dist/scripts/agent-engines/set-agent-engine.js.map +1 -1
- package/dist/server/agent-chat-plugin.d.ts +1 -1
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +11 -7
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/auth.d.ts +1 -0
- package/dist/server/auth.d.ts.map +1 -1
- package/dist/server/auth.js +49 -9
- package/dist/server/auth.js.map +1 -1
- package/dist/server/core-routes-plugin.d.ts.map +1 -1
- package/dist/server/core-routes-plugin.js +4 -2
- package/dist/server/core-routes-plugin.js.map +1 -1
- package/dist/server/google-oauth.d.ts.map +1 -1
- package/dist/server/google-oauth.js +3 -9
- package/dist/server/google-oauth.js.map +1 -1
- package/dist/server/sentry-config.d.ts +5 -0
- package/dist/server/sentry-config.d.ts.map +1 -0
- package/dist/server/sentry-config.js +43 -0
- package/dist/server/sentry-config.js.map +1 -0
- package/dist/server/sentry-plugin.d.ts +1 -1
- package/dist/server/sentry-plugin.js +2 -2
- package/dist/server/sentry-plugin.js.map +1 -1
- package/dist/server/sentry.d.ts +4 -4
- package/dist/server/sentry.d.ts.map +1 -1
- package/dist/server/sentry.js +13 -13
- package/dist/server/sentry.js.map +1 -1
- package/dist/server/ssr-handler.d.ts.map +1 -1
- package/dist/server/ssr-handler.js +12 -2
- package/dist/server/ssr-handler.js.map +1 -1
- package/dist/templates/workspace-root/_gitignore +1 -0
- package/dist/usage/store.d.ts.map +1 -1
- package/dist/usage/store.js +5 -5
- package/dist/usage/store.js.map +1 -1
- package/docs/content/deployment.md +23 -3
- package/docs/content/multi-app-workspace.md +8 -2
- package/docs/content/observability.md +8 -8
- package/package.json +1 -1
- package/src/templates/workspace-root/_gitignore +1 -0
|
@@ -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 /**\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\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 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 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>The workspace gateway is waking this app's dev server.</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\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 child = spawnProcess(\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 ...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 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 app.process = undefined;\n app.ready = false;\n if (code === 0 || shuttingDown) return;\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 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 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 (err.code === \"ENOSPC\") {\n stderr.write(\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 );\n Sentry.captureException(err, {\n tags: { handled: \"dev-watch-enospc\" },\n level: \"warning\",\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 if (req.url === \"/\" || req.url === \"/index.html\") {\n if (redirectRootToDefault) {\n res.writeHead(302, { location: `/${defaultApp}` });\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 (req.url === \"/_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}\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 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 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 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 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"]}
|
|
@@ -33,6 +33,10 @@ export interface AgentPanelCodeAccess {
|
|
|
33
33
|
unavailableCtaLabel?: string;
|
|
34
34
|
/** Optional CTA URL for the unavailable state. */
|
|
35
35
|
unavailableCtaHref?: string;
|
|
36
|
+
/** Optional secondary CTA label, usually for Builder cloud code changes. */
|
|
37
|
+
unavailableSecondaryCtaLabel?: string;
|
|
38
|
+
/** Optional secondary CTA URL, usually the Builder connect URL. */
|
|
39
|
+
unavailableSecondaryCtaHref?: string;
|
|
36
40
|
/** Disabled composer placeholder while code access is unavailable. */
|
|
37
41
|
unavailableComposerPlaceholder?: string;
|
|
38
42
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AgentPanel.d.ts","sourceRoot":"","sources":["../../src/client/AgentPanel.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KASN,MAAM,OAAO,CAAC;AAwCf,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AA6J7D,MAAM,WAAW,oBAAoB;IACnC,mGAAmG;IACnG,OAAO,EAAE,OAAO,CAAC;IACjB,qDAAqD;IACrD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,yDAAyD;IACzD,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,oDAAoD;IACpD,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,kDAAkD;IAClD,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,sEAAsE;IACtE,8BAA8B,CAAC,EAAE,MAAM,CAAC;CACzC;
|
|
1
|
+
{"version":3,"file":"AgentPanel.d.ts","sourceRoot":"","sources":["../../src/client/AgentPanel.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KASN,MAAM,OAAO,CAAC;AAwCf,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AA6J7D,MAAM,WAAW,oBAAoB;IACnC,mGAAmG;IACnG,OAAO,EAAE,OAAO,CAAC;IACjB,qDAAqD;IACrD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,yDAAyD;IACzD,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,oDAAoD;IACpD,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,kDAAkD;IAClD,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,4EAA4E;IAC5E,4BAA4B,CAAC,EAAE,MAAM,CAAC;IACtC,mEAAmE;IACnE,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,sEAAsE;IACtE,8BAA8B,CAAC,EAAE,MAAM,CAAC;CACzC;AAuBD,MAAM,WAAW,eAAgB,SAAQ,IAAI,CAC3C,kBAAkB,EAClB,eAAe,CAChB;IACC,oCAAoC;IACpC,WAAW,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IAC7B,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6GAA6G;IAC7G,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,iFAAiF;IACjF,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,6HAA6H;IAC7H,kBAAkB,CAAC,EAAE,MAAM,IAAI,CAAC;IAChC,iGAAiG;IACjG,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yFAAyF;IACzF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gFAAgF;IAChF,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC7B,yEAAyE;IACzE,UAAU,CAAC,EAAE,oBAAoB,CAAC;CACnC;AAq2CD,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,2CAShD;AAID,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,gDAAgD;IAChD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gDAAgD;IAChD,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB;yDACqD;IACrD,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,uEAAuE;IACvE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC5B,sDAAsD;IACtD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,oEAAoE;IACpE,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,EAC3B,QAAQ,EACR,cAAsC,EACtC,WAAW,EACX,mBAAmB,EACnB,YAAY,EACZ,QAAkB,EAClB,WAAmB,EACnB,aAAqB,GACtB,EAAE,iBAAiB,2CAqVnB;AAED;;;GAGG;AACH,wBAAgB,cAAc,SAgB7B;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,SAAS,EAAE,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,2CAuBtE"}
|
|
@@ -125,13 +125,33 @@ const IS_DEV = import.meta.env?.DEV === true;
|
|
|
125
125
|
function IconTooltip({ content, children, }) {
|
|
126
126
|
return (_jsx(TooltipPrimitive.Provider, { delayDuration: 250, children: _jsxs(TooltipPrimitive.Root, { children: [_jsx(TooltipPrimitive.Trigger, { asChild: true, children: children }), _jsx(TooltipPrimitive.Portal, { children: _jsxs(TooltipPrimitive.Content, { side: "bottom", sideOffset: 8, className: "z-[230] overflow-hidden rounded-md border border-border bg-popover px-2 py-1 text-[11px] text-foreground shadow-md", children: [normalizeTooltipText(content), _jsx(TooltipPrimitive.Arrow, { className: "fill-popover" })] }) })] }) }));
|
|
127
127
|
}
|
|
128
|
+
function useBuilderConnectUrl() {
|
|
129
|
+
const [connectUrl, setConnectUrl] = useState(null);
|
|
130
|
+
useEffect(() => {
|
|
131
|
+
let cancelled = false;
|
|
132
|
+
fetch(agentNativePath("/_agent-native/builder/status"))
|
|
133
|
+
.then((res) => (res.ok ? res.json() : null))
|
|
134
|
+
.then((data) => {
|
|
135
|
+
if (!cancelled && data?.connectUrl) {
|
|
136
|
+
setConnectUrl(data.connectUrl);
|
|
137
|
+
}
|
|
138
|
+
})
|
|
139
|
+
.catch(() => { });
|
|
140
|
+
return () => {
|
|
141
|
+
cancelled = true;
|
|
142
|
+
};
|
|
143
|
+
}, []);
|
|
144
|
+
return connectUrl;
|
|
145
|
+
}
|
|
128
146
|
function useClientOnly() {
|
|
129
147
|
const [mounted, setMounted] = useState(false);
|
|
130
148
|
useEffect(() => setMounted(true), []);
|
|
131
149
|
return mounted;
|
|
132
150
|
}
|
|
133
|
-
function CodeAccessUnavailablePanel({ title, description, ctaLabel, ctaHref, compact = false, }) {
|
|
134
|
-
|
|
151
|
+
function CodeAccessUnavailablePanel({ title, description, ctaLabel, ctaHref, secondaryCtaLabel = "Use Builder", secondaryCtaHref, compact = false, }) {
|
|
152
|
+
const builderConnectUrl = useBuilderConnectUrl();
|
|
153
|
+
const builderHref = secondaryCtaHref ?? builderConnectUrl ?? "https://builder.io";
|
|
154
|
+
return (_jsxs("div", { className: cn("rounded-lg border border-border bg-muted/35 text-center", compact ? "mx-3 mt-2 px-3 py-2.5" : "max-w-[300px] px-4 py-4"), children: [_jsx("div", { className: cn("mx-auto flex items-center justify-center rounded-full bg-background text-muted-foreground", compact ? "mb-2 h-8 w-8" : "mb-3 h-10 w-10"), children: _jsx(IconTerminal2, { className: compact ? "h-4 w-4" : "h-5 w-5" }) }), _jsx("p", { className: "text-sm font-medium text-foreground", children: title }), _jsx("p", { className: cn("mt-1 text-muted-foreground", compact ? "text-[11px] leading-snug" : "text-xs leading-relaxed"), children: description }), _jsxs("div", { className: "mt-3 flex flex-wrap items-center justify-center gap-2", children: [ctaHref ? (_jsxs("a", { href: ctaHref, target: "_blank", rel: "noreferrer", className: "inline-flex items-center gap-1.5 rounded-md bg-foreground px-3 py-1.5 text-xs font-medium text-background hover:opacity-90", children: [ctaLabel, _jsx(IconExternalLink, { className: "h-3 w-3" })] })) : null, _jsxs("a", { href: builderHref, target: "_blank", rel: "noreferrer", className: "inline-flex items-center gap-1.5 rounded-md border border-border bg-background px-3 py-1.5 text-xs font-medium text-foreground hover:bg-accent", children: [secondaryCtaLabel, _jsx(IconExternalLink, { className: "h-3 w-3" })] })] })] }));
|
|
135
155
|
}
|
|
136
156
|
function AgentPanelInner({ defaultMode = "chat", className, apiUrl, emptyStateText, suggestions, showHeader = true, onCollapse, isFullscreen, onToggleFullscreen, devAppUrl, storageKey, chatNotice, codeAccess, }) {
|
|
137
157
|
const mounted = useClientOnly();
|
|
@@ -280,10 +300,20 @@ function AgentPanelInner({ defaultMode = "chat", className, apiUrl, emptyStateTe
|
|
|
280
300
|
"Source-code changes, workspace files, and CLI access are available in the Agent Native Desktop app.";
|
|
281
301
|
const codeUnavailableCtaLabel = codeAccess?.unavailableCtaLabel ?? "Download Desktop";
|
|
282
302
|
const codeUnavailableCtaHref = codeAccess?.unavailableCtaHref ?? "https://agent-native.com/download";
|
|
303
|
+
const codeUnavailableSecondaryCtaLabel = codeAccess?.unavailableSecondaryCtaLabel ?? "Use Builder";
|
|
304
|
+
const codeUnavailableSecondaryCtaHref = codeAccess?.unavailableSecondaryCtaHref;
|
|
283
305
|
const codeUnavailableComposerPlaceholder = codeAccess?.unavailableComposerPlaceholder ??
|
|
284
306
|
"Open Desktop to edit code or run commands.";
|
|
285
307
|
const canUseCodeTools = isDevMode && codeAccessEnabled;
|
|
308
|
+
const planModeDisabled = isDevMode && !codeAccessEnabled;
|
|
309
|
+
const effectiveExecMode = planModeDisabled ? "build" : execMode;
|
|
310
|
+
const planModeDisabledReason = "Plan mode uses the local code agent. Open Agent Native Desktop to use Plan mode.";
|
|
286
311
|
const showCliMode = isDevMode || !codeAccessEnabled;
|
|
312
|
+
const handleExecModeChange = useCallback((next) => {
|
|
313
|
+
if (planModeDisabled && next === "plan")
|
|
314
|
+
return;
|
|
315
|
+
switchExecMode(next);
|
|
316
|
+
}, [planModeDisabled, switchExecMode]);
|
|
287
317
|
// Notify frame when dev mode changes — use both a local CustomEvent (for
|
|
288
318
|
// when AgentPanel is rendered directly in the frame) AND postMessage (for
|
|
289
319
|
// when AgentPanel is inside the iframe and needs to cross the boundary).
|
|
@@ -437,7 +467,7 @@ function AgentPanelInner({ defaultMode = "chat", className, apiUrl, emptyStateTe
|
|
|
437
467
|
`[data-agent-fullscreen='true'] .agent-composer-area{` +
|
|
438
468
|
`max-width:${FULLSCREEN_CONTENT_MAX_PX}px;` +
|
|
439
469
|
`margin-left:auto;margin-right:auto;width:100%;}`,
|
|
440
|
-
} }), SHOW_ONBOARDING && mounted && canUseCodeTools && (_jsx(Suspense, { fallback: null, children: _jsx(OnboardingPanel, {}) })), _jsx("div", { className: cn("flex flex-col min-h-0", mode === "chat" ? "flex-1" : "shrink-0"), children: mounted && (_jsx(MultiTabAssistantChat, { apiUrl: apiUrl, showHeader: false, renderHeader: showHeader ? renderChatHeader : undefined, renderOverlay: undefined, contentHidden: mode !== "chat", emptyStateText: codeAccessEnabled ? emptyStateText : codeUnavailableTitle, suggestions: codeAccessEnabled ? suggestions : undefined, onSwitchToCli: () => switchMode("cli"), execMode:
|
|
470
|
+
} }), SHOW_ONBOARDING && mounted && canUseCodeTools && (_jsx(Suspense, { fallback: null, children: _jsx(OnboardingPanel, {}) })), _jsx("div", { className: cn("flex flex-col min-h-0", mode === "chat" ? "flex-1" : "shrink-0"), children: mounted && (_jsx(MultiTabAssistantChat, { apiUrl: apiUrl, showHeader: false, renderHeader: showHeader ? renderChatHeader : undefined, renderOverlay: undefined, contentHidden: mode !== "chat", emptyStateText: codeAccessEnabled ? emptyStateText : codeUnavailableTitle, suggestions: codeAccessEnabled ? suggestions : undefined, onSwitchToCli: () => switchMode("cli"), execMode: isDevMode ? effectiveExecMode : undefined, onExecModeChange: isDevMode ? handleExecModeChange : undefined, planModeDisabled: planModeDisabled, planModeDisabledReason: planModeDisabledReason, storageKey: storageKey, composerSlot: codeAccessEnabled ? undefined : (_jsx(CodeAccessUnavailablePanel, { title: codeUnavailableTitle, description: codeUnavailableDescription, ctaLabel: codeUnavailableCtaLabel, ctaHref: codeUnavailableCtaHref, secondaryCtaLabel: codeUnavailableSecondaryCtaLabel, secondaryCtaHref: codeUnavailableSecondaryCtaHref, compact: true })), composerDisabled: !codeAccessEnabled, composerDisabledPlaceholder: codeUnavailableComposerPlaceholder })) }), canUseCodeTools
|
|
441
471
|
? mode === "cli" &&
|
|
442
472
|
cliTabs.map((id) => (_jsx("div", { className: "min-h-0 relative flex-1", style: {
|
|
443
473
|
display: id === activeCliTab ? undefined : "none",
|
|
@@ -446,7 +476,7 @@ function AgentPanelInner({ defaultMode = "chat", className, apiUrl, emptyStateTe
|
|
|
446
476
|
? "CLI requires dev mode"
|
|
447
477
|
: codeUnavailableTitle, description: codeAccessEnabled
|
|
448
478
|
? "Run this app locally with pnpm dev or use Builder.io to access the CLI terminal."
|
|
449
|
-
: codeUnavailableDescription, ctaLabel: codeUnavailableCtaLabel, ctaHref: codeAccessEnabled ? undefined : codeUnavailableCtaHref }) })), mode === "resources" && (_jsx("div", { className: "flex-1 min-h-0", children: codeAccessEnabled ? (_jsx(Suspense, { fallback: _jsx("div", { className: "flex h-full flex-col min-h-0", children: _jsx("div", { className: "flex shrink-0 items-center justify-between border-b border-border px-2 py-1.5", children: _jsxs("div", { className: "flex items-center gap-1", children: [_jsx("div", { className: "h-5 w-16 rounded bg-muted animate-pulse" }), _jsx("div", { className: "h-5 w-14 rounded bg-muted animate-pulse" })] }) }) }), children: _jsx(ResourcesPanel, {}) })) : (_jsx("div", { className: "flex h-full items-center justify-center px-6", children: _jsx(CodeAccessUnavailablePanel, { title: "Open Desktop to use Workspace", description: codeUnavailableDescription, ctaLabel: codeUnavailableCtaLabel, ctaHref: codeUnavailableCtaHref }) })) })), mode === "settings" && (_jsx("div", { className: "flex flex-col flex-1 min-h-0", children: _jsx(Suspense, { fallback: _jsxs("div", { className: "p-3 space-y-2", children: [_jsx("div", { className: "h-10 w-full rounded-lg bg-muted animate-pulse" }), _jsx("div", { className: "h-10 w-full rounded-lg bg-muted animate-pulse" }), _jsx("div", { className: "h-10 w-full rounded-lg bg-muted animate-pulse" })] }), children: _jsx(SettingsPanel, { isDevMode: isDevMode, onToggleDevMode: () => setDevMode(!isDevMode), showDevToggle: showDevToggle, devAppUrl: devAppUrl }) }) }))] }));
|
|
479
|
+
: codeUnavailableDescription, ctaLabel: codeUnavailableCtaLabel, ctaHref: codeAccessEnabled ? undefined : codeUnavailableCtaHref, secondaryCtaLabel: codeUnavailableSecondaryCtaLabel, secondaryCtaHref: codeUnavailableSecondaryCtaHref }) })), mode === "resources" && (_jsx("div", { className: "flex-1 min-h-0", children: codeAccessEnabled ? (_jsx(Suspense, { fallback: _jsx("div", { className: "flex h-full flex-col min-h-0", children: _jsx("div", { className: "flex shrink-0 items-center justify-between border-b border-border px-2 py-1.5", children: _jsxs("div", { className: "flex items-center gap-1", children: [_jsx("div", { className: "h-5 w-16 rounded bg-muted animate-pulse" }), _jsx("div", { className: "h-5 w-14 rounded bg-muted animate-pulse" })] }) }) }), children: _jsx(ResourcesPanel, {}) })) : (_jsx("div", { className: "flex h-full items-center justify-center px-6", children: _jsx(CodeAccessUnavailablePanel, { title: "Open Desktop to use Workspace", description: codeUnavailableDescription, ctaLabel: codeUnavailableCtaLabel, ctaHref: codeUnavailableCtaHref, secondaryCtaLabel: codeUnavailableSecondaryCtaLabel, secondaryCtaHref: codeUnavailableSecondaryCtaHref }) })) })), mode === "settings" && (_jsx("div", { className: "flex flex-col flex-1 min-h-0", children: _jsx(Suspense, { fallback: _jsxs("div", { className: "p-3 space-y-2", children: [_jsx("div", { className: "h-10 w-full rounded-lg bg-muted animate-pulse" }), _jsx("div", { className: "h-10 w-full rounded-lg bg-muted animate-pulse" }), _jsx("div", { className: "h-10 w-full rounded-lg bg-muted animate-pulse" })] }), children: _jsx(SettingsPanel, { isDevMode: isDevMode, onToggleDevMode: () => setDevMode(!isDevMode), showDevToggle: showDevToggle, devAppUrl: devAppUrl }) }) }))] }));
|
|
450
480
|
}
|
|
451
481
|
// ─── Resize handle ──────────────────────────────────────────────────────────
|
|
452
482
|
const SIDEBAR_STORAGE_KEY = "agent-native-sidebar-width";
|