@agent-native/core 0.12.37 → 0.12.38

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.
@@ -1 +1 @@
1
- {"version":3,"file":"ConnectBuilderCard.d.ts","sourceRoot":"","sources":["../../src/client/ConnectBuilderCard.tsx"],"names":[],"mappings":"AAUA,MAAM,WAAW,uBAAuB;IACtC,UAAU,EAAE,OAAO,CAAC;IACpB;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB;6EACyE;IACzE,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AASD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,UAAU,EAAE,iBAAiB,EAC7B,cAAc,EAAE,qBAA4B,EAC5C,UAAU,EAAE,iBAAiB,EAC7B,OAAO,EAAE,cAAc,EACvB,MAAW,GACZ,EAAE,uBAAuB,2CAsSzB"}
1
+ {"version":3,"file":"ConnectBuilderCard.d.ts","sourceRoot":"","sources":["../../src/client/ConnectBuilderCard.tsx"],"names":[],"mappings":"AAoBA,MAAM,WAAW,uBAAuB;IACtC,UAAU,EAAE,OAAO,CAAC;IACpB;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB;6EACyE;IACzE,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AASD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,UAAU,EAAE,iBAAiB,EAC7B,cAAc,EAAE,qBAA4B,EAC5C,UAAU,EAAE,iBAAiB,EAC7B,OAAO,EAAE,cAAc,EACvB,MAAW,GACZ,EAAE,uBAAuB,2CA+SzB"}
@@ -6,7 +6,15 @@ import { useBuilderConnectFlow } from "./settings/useBuilderStatus.js";
6
6
  import { BuilderBMark } from "./builder-mark.js";
7
7
  import { cn } from "./utils.js";
8
8
  import { agentNativePath } from "./api-path.js";
9
- const DESKTOP_DOWNLOAD_URL = "https://agent-native.com/download";
9
+ const DESKTOP_DOWNLOAD_URL = "https://www.agent-native.com/download";
10
+ function isLocalBrowserOutsideDesktop() {
11
+ if (typeof window === "undefined" || typeof navigator === "undefined") {
12
+ return false;
13
+ }
14
+ const hostname = window.location.hostname;
15
+ const local = hostname === "localhost" || hostname === "127.0.0.1" || hostname === "::1";
16
+ return local && !/AgentNativeDesktop/i.test(navigator.userAgent || "");
17
+ }
10
18
  /**
11
19
  * Rich inline card rendered for the `connect-builder` tool call. Shows a
12
20
  * prominent Connect button that opens the Builder CLI auth flow and polls
@@ -37,9 +45,11 @@ export function ConnectBuilderCard({ configured: initialConfigured, builderEnabl
37
45
  const [sending, setSending] = useState(false);
38
46
  const [runResult, setRunResult] = useState(null);
39
47
  const [sendErr, setSendErr] = useState(null);
48
+ const [localBrowser, setLocalBrowser] = useState(false);
40
49
  const mountedRef = useRef(true);
41
50
  useEffect(() => {
42
51
  mountedRef.current = true;
52
+ setLocalBrowser(isLocalBrowserOutsideDesktop());
43
53
  return () => {
44
54
  mountedRef.current = false;
45
55
  };
@@ -107,6 +117,9 @@ export function ConnectBuilderCard({ configured: initialConfigured, builderEnabl
107
117
  const showWaitlist = !builderEnabled && hasPrompt;
108
118
  // Title + subtitle depend on which mode we're in. We compute them up front
109
119
  // so the render tree below stays flat.
120
+ const connectedCapabilityText = builderEnabled
121
+ ? "LLM access, browser automation, and cloud code changes are ready to use."
122
+ : "LLM access and browser automation are ready to use. Builder Cloud Agents for code changes are not enabled for this workspace yet.";
110
123
  let title;
111
124
  let subtitle;
112
125
  if (runResult) {
@@ -116,8 +129,12 @@ export function ConnectBuilderCard({ configured: initialConfigured, builderEnabl
116
129
  else if (showWaitlist) {
117
130
  title = waitlistJoined
118
131
  ? "You're on the waitlist"
119
- : "Cloud code changes unavailable";
120
- subtitle = waitlistJoined ? (_jsx(_Fragment, { children: "We'll let you know when Builder branch creation is available. You can still use Desktop or a local clone for code changes." })) : (_jsx(_Fragment, { children: "This workspace can't create Builder branches yet. Use Desktop or a local clone for code changes now, or join the waitlist for cloud branches." }));
132
+ : "Builder Cloud Agents unavailable";
133
+ subtitle = waitlistJoined ? (_jsxs(_Fragment, { children: ["We'll let you know when Builder Cloud Agents are available for this workspace.", " ", localBrowser
134
+ ? "Since this project is already running locally, open it in the desktop app for local coding tools or keep editing from your clone."
135
+ : "You can still clone the project locally and use the desktop app for code changes."] })) : (_jsxs(_Fragment, { children: ["You don't have access to Builder Cloud Agents for this workspace yet.", " ", localBrowser
136
+ ? "Since this project is already running locally, open it in the desktop app for local coding tools or keep editing from your clone."
137
+ : "You can still clone the project locally and use the desktop app for code changes."] }));
121
138
  }
122
139
  else if (canSend) {
123
140
  title = "Send this to Builder";
@@ -125,12 +142,12 @@ export function ConnectBuilderCard({ configured: initialConfigured, builderEnabl
125
142
  }
126
143
  else if (configured) {
127
144
  title = "Builder.io connected";
128
- subtitle = flow.envManaged ? (_jsx(_Fragment, { children: "Managed by this deployment \u2014 every user of this app uses the same Builder identity. LLM access, browser automation, and more are ready to use." })) : orgName ? (_jsxs(_Fragment, { children: ["Connected to", " ", _jsx("span", { className: "font-medium text-foreground", children: orgName }), ". LLM access, browser automation, and more are ready to use."] })) : (_jsx(_Fragment, { children: "LLM access, browser automation, and more are ready to use." }));
145
+ subtitle = flow.envManaged ? (_jsxs(_Fragment, { children: ["Managed by this deployment \u2014 every user of this app uses the same Builder identity. ", connectedCapabilityText] })) : orgName ? (_jsxs(_Fragment, { children: ["Connected to", " ", _jsx("span", { className: "font-medium text-foreground", children: orgName }), ".", " ", connectedCapabilityText] })) : (_jsx(_Fragment, { children: connectedCapabilityText }));
129
146
  }
130
147
  else {
131
148
  title = "Connect Builder.io";
132
- subtitle = (_jsx(_Fragment, { children: "One click to spin up a cloud code sandbox \u2014 Builder writes the changes for you, no local setup needed." }));
149
+ subtitle = (_jsx(_Fragment, { children: "Connect Builder for managed LLM access, browser automation, and cloud code changes when they are enabled for this workspace." }));
133
150
  }
134
- return (_jsx("div", { className: cn("my-2 rounded-lg border border-border overflow-hidden"), children: _jsxs("div", { className: "flex items-start gap-3 px-4 py-3.5 bg-gradient-to-br from-teal-500/5 via-transparent to-transparent", children: [_jsx("div", { className: cn("flex h-9 w-9 shrink-0 items-center justify-center rounded-lg", "bg-foreground text-background"), children: runResult ? (_jsx(IconLoader2, { className: "h-5 w-5 animate-spin" })) : (_jsx(BuilderBMark, { className: "h-5 w-5" })) }), _jsxs("div", { className: "flex-1 min-w-0", children: [_jsx("div", { className: "flex items-center gap-2 flex-wrap", children: _jsx("span", { className: "text-sm font-semibold text-foreground", children: title }) }), _jsx("div", { className: "mt-0.5 text-xs text-muted-foreground leading-relaxed", children: subtitle }), showWaitlist && (_jsxs("a", { href: DESKTOP_DOWNLOAD_URL, target: "_blank", rel: "noopener noreferrer", className: "mt-2 inline-flex items-center gap-1 text-[11px] font-medium text-muted-foreground no-underline hover:text-foreground", children: ["Download Desktop", _jsx(IconExternalLink, { className: "h-3 w-3" })] })), err && _jsx("div", { className: "mt-2 text-xs text-destructive", children: err }), _jsx("div", { className: "mt-3", children: runResult ? (_jsxs("a", { href: runResult.url, target: "_blank", rel: "noopener noreferrer", className: cn("inline-flex items-center gap-1.5 rounded-md px-3 py-1.5 text-xs font-medium transition-colors", "bg-foreground text-background hover:bg-foreground/90"), children: ["Open branch in Builder", _jsx(IconExternalLink, { className: "h-3.5 w-3.5" })] })) : canSend ? (_jsx("button", { type: "button", onClick: handleSend, disabled: sending, className: cn("inline-flex items-center gap-1.5 rounded-md px-3 py-1.5 text-xs font-medium transition-colors", "bg-foreground text-background hover:bg-foreground/90", sending && "opacity-70 cursor-wait"), children: sending ? (_jsxs(_Fragment, { children: [_jsx(IconLoader2, { className: "h-3.5 w-3.5 animate-spin" }), "Sending to Builder\u2026"] })) : (_jsx(_Fragment, { children: "Send to Builder" })) })) : showWaitlist && !waitlistJoined ? (_jsx("button", { type: "button", onClick: handleJoinWaitlist, disabled: joiningWaitlist, className: cn("inline-flex items-center gap-1.5 rounded-md px-3 py-1.5 text-xs font-medium transition-colors", "bg-foreground text-background hover:bg-foreground/90", joiningWaitlist && "opacity-70 cursor-wait"), children: joiningWaitlist ? (_jsxs(_Fragment, { children: [_jsx(IconLoader2, { className: "h-3.5 w-3.5 animate-spin" }), "Joining\u2026"] })) : (_jsx(_Fragment, { children: "Join the waitlist" })) })) : !configured ? (_jsx("button", { type: "button", onClick: flow.start, disabled: connecting, className: cn("inline-flex items-center gap-1.5 rounded-md px-3 py-1.5 text-xs font-medium transition-colors", "bg-foreground text-background hover:bg-foreground/90", connecting && "opacity-70 cursor-wait"), children: connecting ? (_jsxs(_Fragment, { children: [_jsx(IconLoader2, { className: "h-3.5 w-3.5 animate-spin" }), "Waiting for Builder\u2026"] })) : (_jsxs(_Fragment, { children: ["Connect Builder", _jsx(IconExternalLink, { className: "h-3.5 w-3.5" })] })) })) : null })] })] }) }));
151
+ return (_jsx("div", { className: cn("my-2 rounded-lg border border-border overflow-hidden"), children: _jsxs("div", { className: "flex items-start gap-3 px-4 py-3.5 bg-gradient-to-br from-teal-500/5 via-transparent to-transparent", children: [_jsx("div", { className: cn("flex h-9 w-9 shrink-0 items-center justify-center rounded-lg", "bg-foreground text-background"), children: runResult ? (_jsx(IconLoader2, { className: "h-5 w-5 animate-spin" })) : (_jsx(BuilderBMark, { className: "h-5 w-5" })) }), _jsxs("div", { className: "flex-1 min-w-0", children: [_jsx("div", { className: "flex items-center gap-2 flex-wrap", children: _jsx("span", { className: "text-sm font-semibold text-foreground", children: title }) }), _jsx("div", { className: "mt-0.5 text-xs text-muted-foreground leading-relaxed", children: subtitle }), showWaitlist && (_jsxs("a", { href: DESKTOP_DOWNLOAD_URL, target: "_blank", rel: "noopener noreferrer", className: "mt-2 inline-flex items-center gap-1 text-[11px] font-medium text-muted-foreground no-underline hover:text-foreground", children: ["Download desktop app", _jsx(IconExternalLink, { className: "h-3 w-3" })] })), err && _jsx("div", { className: "mt-2 text-xs text-destructive", children: err }), _jsx("div", { className: "mt-3", children: runResult ? (_jsxs("a", { href: runResult.url, target: "_blank", rel: "noopener noreferrer", className: cn("inline-flex items-center gap-1.5 rounded-md px-3 py-1.5 text-xs font-medium transition-colors", "bg-foreground text-background hover:bg-foreground/90"), children: ["Open branch in Builder", _jsx(IconExternalLink, { className: "h-3.5 w-3.5" })] })) : canSend ? (_jsx("button", { type: "button", onClick: handleSend, disabled: sending, className: cn("inline-flex items-center gap-1.5 rounded-md px-3 py-1.5 text-xs font-medium transition-colors", "bg-foreground text-background hover:bg-foreground/90", sending && "opacity-70 cursor-wait"), children: sending ? (_jsxs(_Fragment, { children: [_jsx(IconLoader2, { className: "h-3.5 w-3.5 animate-spin" }), "Sending to Builder\u2026"] })) : (_jsx(_Fragment, { children: "Send to Builder" })) })) : showWaitlist && !waitlistJoined ? (_jsx("button", { type: "button", onClick: handleJoinWaitlist, disabled: joiningWaitlist, className: cn("inline-flex items-center gap-1.5 rounded-md px-3 py-1.5 text-xs font-medium transition-colors", "bg-foreground text-background hover:bg-foreground/90", joiningWaitlist && "opacity-70 cursor-wait"), children: joiningWaitlist ? (_jsxs(_Fragment, { children: [_jsx(IconLoader2, { className: "h-3.5 w-3.5 animate-spin" }), "Joining\u2026"] })) : (_jsx(_Fragment, { children: "Join the waitlist" })) })) : !configured ? (_jsx("button", { type: "button", onClick: flow.start, disabled: connecting, className: cn("inline-flex items-center gap-1.5 rounded-md px-3 py-1.5 text-xs font-medium transition-colors", "bg-foreground text-background hover:bg-foreground/90", connecting && "opacity-70 cursor-wait"), children: connecting ? (_jsxs(_Fragment, { children: [_jsx(IconLoader2, { className: "h-3.5 w-3.5 animate-spin" }), "Waiting for Builder\u2026"] })) : (_jsxs(_Fragment, { children: ["Connect Builder", _jsx(IconExternalLink, { className: "h-3.5 w-3.5" })] })) })) : null })] })] }) }));
135
152
  }
136
153
  //# sourceMappingURL=ConnectBuilderCard.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ConnectBuilderCard.js","sourceRoot":"","sources":["../../src/client/ConnectBuilderCard.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { IconExternalLink, IconLoader2 } from \"@tabler/icons-react\";\nimport { getCallbackOrigin } from \"./frame.js\";\nimport { useBuilderConnectFlow } from \"./settings/useBuilderStatus.js\";\nimport { BuilderBMark } from \"./builder-mark.js\";\nimport { cn } from \"./utils.js\";\nimport { agentNativePath } from \"./api-path.js\";\n\nconst DESKTOP_DOWNLOAD_URL = \"https://agent-native.com/download\";\n\nexport interface ConnectBuilderCardProps {\n configured: boolean;\n /**\n * True when the server has a Builder branch project configured for this\n * request. When false, the card shows a waitlist CTA instead of a Send\n * button — the /builder/run endpoint would 403 anyway.\n */\n builderEnabled?: boolean;\n connectUrl: string;\n orgName?: string | null;\n /** The user's feature/change request, forwarded to Builder's cloud agent\n * when they click Send. Empty for generic \"connect Builder\" prompts. */\n prompt?: string;\n}\n\ninterface BuilderRunResult {\n branchName: string;\n projectId: string;\n url: string;\n status: string;\n}\n\n/**\n * Rich inline card rendered for the `connect-builder` tool call. Shows a\n * prominent Connect button that opens the Builder CLI auth flow and polls\n * /_agent-native/builder/status until credentials land.\n */\nexport function ConnectBuilderCard({\n configured: initialConfigured,\n builderEnabled: initialBuilderEnabled = true,\n connectUrl: initialConnectUrl,\n orgName: initialOrgName,\n prompt = \"\",\n}: ConnectBuilderCardProps) {\n // The connect-poll state machine is shared — the tool-call result is\n // frozen at render time, so the hook's mount-time fetch + focus refresh\n // is what catches a flow the user completed in another tab.\n const flow = useBuilderConnectFlow({ popupUrl: initialConnectUrl });\n // Only use the server-rendered props until the hook's first status\n // fetch returns. After that, the hook is authoritative — including for\n // the disconnect case (where `flow.configured` flips back to `false`\n // even though `initialConfigured` was `true` at render time).\n const configured = flow.hasFetchedStatus\n ? flow.configured\n : initialConfigured;\n const builderEnabled = flow.hasFetchedStatus\n ? flow.builderEnabled\n : initialBuilderEnabled;\n const orgName = flow.hasFetchedStatus\n ? flow.orgName\n : (initialOrgName ?? null);\n const connecting = flow.connecting;\n\n const [waitlistJoined, setWaitlistJoined] = useState(false);\n const [joiningWaitlist, setJoiningWaitlist] = useState(false);\n const [waitlistErr, setWaitlistErr] = useState<string | null>(null);\n\n const [sending, setSending] = useState(false);\n const [runResult, setRunResult] = useState<BuilderRunResult | null>(null);\n const [sendErr, setSendErr] = useState<string | null>(null);\n const mountedRef = useRef(true);\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n };\n }, []);\n\n const handleSend = useCallback(async () => {\n if (!prompt.trim()) return;\n setSending(true);\n setSendErr(null);\n try {\n const origin = getCallbackOrigin() || window.location.origin;\n const res = await fetch(\n new URL(agentNativePath(\"/_agent-native/builder/run\"), origin).href,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ prompt }),\n },\n );\n const data = await res.json().catch(() => ({}));\n if (!res.ok) {\n throw new Error(\n typeof data?.error === \"string\"\n ? data.error\n : `Request failed (${res.status})`,\n );\n }\n if (!mountedRef.current) return;\n setRunResult(data as BuilderRunResult);\n setSending(false);\n } catch (e) {\n if (!mountedRef.current) return;\n setSendErr(e instanceof Error ? e.message : \"Send failed\");\n setSending(false);\n }\n }, [prompt]);\n\n const handleJoinWaitlist = useCallback(async () => {\n setJoiningWaitlist(true);\n setWaitlistErr(null);\n try {\n const origin = getCallbackOrigin() || window.location.origin;\n const res = await fetch(\n new URL(\n agentNativePath(\"/_agent-native/builder/branch-waitlist\"),\n origin,\n ).href,\n { method: \"POST\" },\n );\n if (!res.ok) {\n const data = await res.json().catch(() => ({}));\n throw new Error(\n typeof data?.error === \"string\"\n ? data.error\n : `Request failed (${res.status})`,\n );\n }\n if (!mountedRef.current) return;\n setWaitlistJoined(true);\n setJoiningWaitlist(false);\n } catch (e) {\n if (!mountedRef.current) return;\n setWaitlistErr(e instanceof Error ? e.message : \"Couldn't join waitlist\");\n setJoiningWaitlist(false);\n }\n }, []);\n\n // Combine connect-flow errors, send errors, and waitlist errors.\n const err = sendErr ?? waitlistErr ?? flow.error;\n\n const hasPrompt = prompt.trim().length > 0;\n const canSend = configured && builderEnabled && hasPrompt;\n // Branch creation is gated by a server-side project id, which may come\n // from deployment config or org-scoped secrets.\n const showWaitlist = !builderEnabled && hasPrompt;\n\n // Title + subtitle depend on which mode we're in. We compute them up front\n // so the render tree below stays flat.\n let title: string;\n let subtitle: React.ReactNode;\n if (runResult) {\n title = \"Builder is working on it\";\n subtitle = (\n <>\n Working on branch{\" \"}\n <span className=\"font-mono text-foreground\">\n {runResult.branchName}\n </span>\n . Click through to watch progress in the Visual Editor.\n </>\n );\n } else if (showWaitlist) {\n title = waitlistJoined\n ? \"You're on the waitlist\"\n : \"Cloud code changes unavailable\";\n subtitle = waitlistJoined ? (\n <>\n We'll let you know when Builder branch creation is available. You can\n still use Desktop or a local clone for code changes.\n </>\n ) : (\n <>\n This workspace can't create Builder branches yet. Use Desktop or a local\n clone for code changes now, or join the waitlist for cloud branches.\n </>\n );\n } else if (canSend) {\n title = \"Send this to Builder\";\n subtitle = (\n <>\n Builder's cloud coding agent will make this code change on a fresh\n branch.\n </>\n );\n } else if (configured) {\n title = \"Builder.io connected\";\n subtitle = flow.envManaged ? (\n <>\n Managed by this deployment — every user of this app uses the same\n Builder identity. LLM access, browser automation, and more are ready to\n use.\n </>\n ) : orgName ? (\n <>\n Connected to{\" \"}\n <span className=\"font-medium text-foreground\">{orgName}</span>. LLM\n access, browser automation, and more are ready to use.\n </>\n ) : (\n <>LLM access, browser automation, and more are ready to use.</>\n );\n } else {\n title = \"Connect Builder.io\";\n subtitle = (\n <>\n One click to spin up a cloud code sandbox — Builder writes the changes\n for you, no local setup needed.\n </>\n );\n }\n\n return (\n <div className={cn(\"my-2 rounded-lg border border-border overflow-hidden\")}>\n <div className=\"flex items-start gap-3 px-4 py-3.5 bg-gradient-to-br from-teal-500/5 via-transparent to-transparent\">\n <div\n className={cn(\n \"flex h-9 w-9 shrink-0 items-center justify-center rounded-lg\",\n \"bg-foreground text-background\",\n )}\n >\n {runResult ? (\n <IconLoader2 className=\"h-5 w-5 animate-spin\" />\n ) : (\n <BuilderBMark className=\"h-5 w-5\" />\n )}\n </div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2 flex-wrap\">\n <span className=\"text-sm font-semibold text-foreground\">\n {title}\n </span>\n </div>\n <div className=\"mt-0.5 text-xs text-muted-foreground leading-relaxed\">\n {subtitle}\n </div>\n\n {showWaitlist && (\n <a\n href={DESKTOP_DOWNLOAD_URL}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"mt-2 inline-flex items-center gap-1 text-[11px] font-medium text-muted-foreground no-underline hover:text-foreground\"\n >\n Download Desktop\n <IconExternalLink className=\"h-3 w-3\" />\n </a>\n )}\n\n {err && <div className=\"mt-2 text-xs text-destructive\">{err}</div>}\n\n <div className=\"mt-3\">\n {runResult ? (\n <a\n href={runResult.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={cn(\n \"inline-flex items-center gap-1.5 rounded-md px-3 py-1.5 text-xs font-medium transition-colors\",\n \"bg-foreground text-background hover:bg-foreground/90\",\n )}\n >\n Open branch in Builder\n <IconExternalLink className=\"h-3.5 w-3.5\" />\n </a>\n ) : canSend ? (\n <button\n type=\"button\"\n onClick={handleSend}\n disabled={sending}\n className={cn(\n \"inline-flex items-center gap-1.5 rounded-md px-3 py-1.5 text-xs font-medium transition-colors\",\n \"bg-foreground text-background hover:bg-foreground/90\",\n sending && \"opacity-70 cursor-wait\",\n )}\n >\n {sending ? (\n <>\n <IconLoader2 className=\"h-3.5 w-3.5 animate-spin\" />\n Sending to Builder…\n </>\n ) : (\n <>Send to Builder</>\n )}\n </button>\n ) : showWaitlist && !waitlistJoined ? (\n <button\n type=\"button\"\n onClick={handleJoinWaitlist}\n disabled={joiningWaitlist}\n className={cn(\n \"inline-flex items-center gap-1.5 rounded-md px-3 py-1.5 text-xs font-medium transition-colors\",\n \"bg-foreground text-background hover:bg-foreground/90\",\n joiningWaitlist && \"opacity-70 cursor-wait\",\n )}\n >\n {joiningWaitlist ? (\n <>\n <IconLoader2 className=\"h-3.5 w-3.5 animate-spin\" />\n Joining…\n </>\n ) : (\n <>Join the waitlist</>\n )}\n </button>\n ) : !configured ? (\n <button\n type=\"button\"\n onClick={flow.start}\n disabled={connecting}\n className={cn(\n \"inline-flex items-center gap-1.5 rounded-md px-3 py-1.5 text-xs font-medium transition-colors\",\n \"bg-foreground text-background hover:bg-foreground/90\",\n connecting && \"opacity-70 cursor-wait\",\n )}\n >\n {connecting ? (\n <>\n <IconLoader2 className=\"h-3.5 w-3.5 animate-spin\" />\n Waiting for Builder…\n </>\n ) : (\n <>\n Connect Builder\n <IconExternalLink className=\"h-3.5 w-3.5\" />\n </>\n )}\n </button>\n ) : null}\n </div>\n </div>\n </div>\n </div>\n );\n}\n"]}
1
+ {"version":3,"file":"ConnectBuilderCard.js","sourceRoot":"","sources":["../../src/client/ConnectBuilderCard.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { IconExternalLink, IconLoader2 } from \"@tabler/icons-react\";\nimport { getCallbackOrigin } from \"./frame.js\";\nimport { useBuilderConnectFlow } from \"./settings/useBuilderStatus.js\";\nimport { BuilderBMark } from \"./builder-mark.js\";\nimport { cn } from \"./utils.js\";\nimport { agentNativePath } from \"./api-path.js\";\n\nconst DESKTOP_DOWNLOAD_URL = \"https://www.agent-native.com/download\";\n\nfunction isLocalBrowserOutsideDesktop() {\n if (typeof window === \"undefined\" || typeof navigator === \"undefined\") {\n return false;\n }\n const hostname = window.location.hostname;\n const local =\n hostname === \"localhost\" || hostname === \"127.0.0.1\" || hostname === \"::1\";\n return local && !/AgentNativeDesktop/i.test(navigator.userAgent || \"\");\n}\n\nexport interface ConnectBuilderCardProps {\n configured: boolean;\n /**\n * True when the server has a Builder branch project configured for this\n * request. When false, the card shows a waitlist CTA instead of a Send\n * button — the /builder/run endpoint would 403 anyway.\n */\n builderEnabled?: boolean;\n connectUrl: string;\n orgName?: string | null;\n /** The user's feature/change request, forwarded to Builder's cloud agent\n * when they click Send. Empty for generic \"connect Builder\" prompts. */\n prompt?: string;\n}\n\ninterface BuilderRunResult {\n branchName: string;\n projectId: string;\n url: string;\n status: string;\n}\n\n/**\n * Rich inline card rendered for the `connect-builder` tool call. Shows a\n * prominent Connect button that opens the Builder CLI auth flow and polls\n * /_agent-native/builder/status until credentials land.\n */\nexport function ConnectBuilderCard({\n configured: initialConfigured,\n builderEnabled: initialBuilderEnabled = true,\n connectUrl: initialConnectUrl,\n orgName: initialOrgName,\n prompt = \"\",\n}: ConnectBuilderCardProps) {\n // The connect-poll state machine is shared — the tool-call result is\n // frozen at render time, so the hook's mount-time fetch + focus refresh\n // is what catches a flow the user completed in another tab.\n const flow = useBuilderConnectFlow({ popupUrl: initialConnectUrl });\n // Only use the server-rendered props until the hook's first status\n // fetch returns. After that, the hook is authoritative — including for\n // the disconnect case (where `flow.configured` flips back to `false`\n // even though `initialConfigured` was `true` at render time).\n const configured = flow.hasFetchedStatus\n ? flow.configured\n : initialConfigured;\n const builderEnabled = flow.hasFetchedStatus\n ? flow.builderEnabled\n : initialBuilderEnabled;\n const orgName = flow.hasFetchedStatus\n ? flow.orgName\n : (initialOrgName ?? null);\n const connecting = flow.connecting;\n\n const [waitlistJoined, setWaitlistJoined] = useState(false);\n const [joiningWaitlist, setJoiningWaitlist] = useState(false);\n const [waitlistErr, setWaitlistErr] = useState<string | null>(null);\n\n const [sending, setSending] = useState(false);\n const [runResult, setRunResult] = useState<BuilderRunResult | null>(null);\n const [sendErr, setSendErr] = useState<string | null>(null);\n const [localBrowser, setLocalBrowser] = useState(false);\n const mountedRef = useRef(true);\n\n useEffect(() => {\n mountedRef.current = true;\n setLocalBrowser(isLocalBrowserOutsideDesktop());\n return () => {\n mountedRef.current = false;\n };\n }, []);\n\n const handleSend = useCallback(async () => {\n if (!prompt.trim()) return;\n setSending(true);\n setSendErr(null);\n try {\n const origin = getCallbackOrigin() || window.location.origin;\n const res = await fetch(\n new URL(agentNativePath(\"/_agent-native/builder/run\"), origin).href,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ prompt }),\n },\n );\n const data = await res.json().catch(() => ({}));\n if (!res.ok) {\n throw new Error(\n typeof data?.error === \"string\"\n ? data.error\n : `Request failed (${res.status})`,\n );\n }\n if (!mountedRef.current) return;\n setRunResult(data as BuilderRunResult);\n setSending(false);\n } catch (e) {\n if (!mountedRef.current) return;\n setSendErr(e instanceof Error ? e.message : \"Send failed\");\n setSending(false);\n }\n }, [prompt]);\n\n const handleJoinWaitlist = useCallback(async () => {\n setJoiningWaitlist(true);\n setWaitlistErr(null);\n try {\n const origin = getCallbackOrigin() || window.location.origin;\n const res = await fetch(\n new URL(\n agentNativePath(\"/_agent-native/builder/branch-waitlist\"),\n origin,\n ).href,\n { method: \"POST\" },\n );\n if (!res.ok) {\n const data = await res.json().catch(() => ({}));\n throw new Error(\n typeof data?.error === \"string\"\n ? data.error\n : `Request failed (${res.status})`,\n );\n }\n if (!mountedRef.current) return;\n setWaitlistJoined(true);\n setJoiningWaitlist(false);\n } catch (e) {\n if (!mountedRef.current) return;\n setWaitlistErr(e instanceof Error ? e.message : \"Couldn't join waitlist\");\n setJoiningWaitlist(false);\n }\n }, []);\n\n // Combine connect-flow errors, send errors, and waitlist errors.\n const err = sendErr ?? waitlistErr ?? flow.error;\n\n const hasPrompt = prompt.trim().length > 0;\n const canSend = configured && builderEnabled && hasPrompt;\n // Branch creation is gated by a server-side project id, which may come\n // from deployment config or org-scoped secrets.\n const showWaitlist = !builderEnabled && hasPrompt;\n\n // Title + subtitle depend on which mode we're in. We compute them up front\n // so the render tree below stays flat.\n const connectedCapabilityText = builderEnabled\n ? \"LLM access, browser automation, and cloud code changes are ready to use.\"\n : \"LLM access and browser automation are ready to use. Builder Cloud Agents for code changes are not enabled for this workspace yet.\";\n let title: string;\n let subtitle: React.ReactNode;\n if (runResult) {\n title = \"Builder is working on it\";\n subtitle = (\n <>\n Working on branch{\" \"}\n <span className=\"font-mono text-foreground\">\n {runResult.branchName}\n </span>\n . Click through to watch progress in the Visual Editor.\n </>\n );\n } else if (showWaitlist) {\n title = waitlistJoined\n ? \"You're on the waitlist\"\n : \"Builder Cloud Agents unavailable\";\n subtitle = waitlistJoined ? (\n <>\n We'll let you know when Builder Cloud Agents are available for this\n workspace.{\" \"}\n {localBrowser\n ? \"Since this project is already running locally, open it in the desktop app for local coding tools or keep editing from your clone.\"\n : \"You can still clone the project locally and use the desktop app for code changes.\"}\n </>\n ) : (\n <>\n You don't have access to Builder Cloud Agents for this workspace yet.{\" \"}\n {localBrowser\n ? \"Since this project is already running locally, open it in the desktop app for local coding tools or keep editing from your clone.\"\n : \"You can still clone the project locally and use the desktop app for code changes.\"}\n </>\n );\n } else if (canSend) {\n title = \"Send this to Builder\";\n subtitle = (\n <>\n Builder's cloud coding agent will make this code change on a fresh\n branch.\n </>\n );\n } else if (configured) {\n title = \"Builder.io connected\";\n subtitle = flow.envManaged ? (\n <>\n Managed by this deployment — every user of this app uses the same\n Builder identity. {connectedCapabilityText}\n </>\n ) : orgName ? (\n <>\n Connected to{\" \"}\n <span className=\"font-medium text-foreground\">{orgName}</span>.{\" \"}\n {connectedCapabilityText}\n </>\n ) : (\n <>{connectedCapabilityText}</>\n );\n } else {\n title = \"Connect Builder.io\";\n subtitle = (\n <>\n Connect Builder for managed LLM access, browser automation, and cloud\n code changes when they are enabled for this workspace.\n </>\n );\n }\n\n return (\n <div className={cn(\"my-2 rounded-lg border border-border overflow-hidden\")}>\n <div className=\"flex items-start gap-3 px-4 py-3.5 bg-gradient-to-br from-teal-500/5 via-transparent to-transparent\">\n <div\n className={cn(\n \"flex h-9 w-9 shrink-0 items-center justify-center rounded-lg\",\n \"bg-foreground text-background\",\n )}\n >\n {runResult ? (\n <IconLoader2 className=\"h-5 w-5 animate-spin\" />\n ) : (\n <BuilderBMark className=\"h-5 w-5\" />\n )}\n </div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2 flex-wrap\">\n <span className=\"text-sm font-semibold text-foreground\">\n {title}\n </span>\n </div>\n <div className=\"mt-0.5 text-xs text-muted-foreground leading-relaxed\">\n {subtitle}\n </div>\n\n {showWaitlist && (\n <a\n href={DESKTOP_DOWNLOAD_URL}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"mt-2 inline-flex items-center gap-1 text-[11px] font-medium text-muted-foreground no-underline hover:text-foreground\"\n >\n Download desktop app\n <IconExternalLink className=\"h-3 w-3\" />\n </a>\n )}\n\n {err && <div className=\"mt-2 text-xs text-destructive\">{err}</div>}\n\n <div className=\"mt-3\">\n {runResult ? (\n <a\n href={runResult.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={cn(\n \"inline-flex items-center gap-1.5 rounded-md px-3 py-1.5 text-xs font-medium transition-colors\",\n \"bg-foreground text-background hover:bg-foreground/90\",\n )}\n >\n Open branch in Builder\n <IconExternalLink className=\"h-3.5 w-3.5\" />\n </a>\n ) : canSend ? (\n <button\n type=\"button\"\n onClick={handleSend}\n disabled={sending}\n className={cn(\n \"inline-flex items-center gap-1.5 rounded-md px-3 py-1.5 text-xs font-medium transition-colors\",\n \"bg-foreground text-background hover:bg-foreground/90\",\n sending && \"opacity-70 cursor-wait\",\n )}\n >\n {sending ? (\n <>\n <IconLoader2 className=\"h-3.5 w-3.5 animate-spin\" />\n Sending to Builder…\n </>\n ) : (\n <>Send to Builder</>\n )}\n </button>\n ) : showWaitlist && !waitlistJoined ? (\n <button\n type=\"button\"\n onClick={handleJoinWaitlist}\n disabled={joiningWaitlist}\n className={cn(\n \"inline-flex items-center gap-1.5 rounded-md px-3 py-1.5 text-xs font-medium transition-colors\",\n \"bg-foreground text-background hover:bg-foreground/90\",\n joiningWaitlist && \"opacity-70 cursor-wait\",\n )}\n >\n {joiningWaitlist ? (\n <>\n <IconLoader2 className=\"h-3.5 w-3.5 animate-spin\" />\n Joining…\n </>\n ) : (\n <>Join the waitlist</>\n )}\n </button>\n ) : !configured ? (\n <button\n type=\"button\"\n onClick={flow.start}\n disabled={connecting}\n className={cn(\n \"inline-flex items-center gap-1.5 rounded-md px-3 py-1.5 text-xs font-medium transition-colors\",\n \"bg-foreground text-background hover:bg-foreground/90\",\n connecting && \"opacity-70 cursor-wait\",\n )}\n >\n {connecting ? (\n <>\n <IconLoader2 className=\"h-3.5 w-3.5 animate-spin\" />\n Waiting for Builder…\n </>\n ) : (\n <>\n Connect Builder\n <IconExternalLink className=\"h-3.5 w-3.5\" />\n </>\n )}\n </button>\n ) : null}\n </div>\n </div>\n </div>\n </div>\n );\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"CodeRequiredDialog.d.ts","sourceRoot":"","sources":["../../../src/client/components/CodeRequiredDialog.tsx"],"names":[],"mappings":"AAWA,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,8DAA8D;IAC9D,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAqBD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,IAAI,EACJ,OAAO,EACP,YAAY,GACb,EAAE,uBAAuB,OAmNzB"}
1
+ {"version":3,"file":"CodeRequiredDialog.d.ts","sourceRoot":"","sources":["../../../src/client/components/CodeRequiredDialog.tsx"],"names":[],"mappings":"AAaA,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,8DAA8D;IAC9D,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAuBD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,IAAI,EACJ,OAAO,EACP,YAAY,GACb,EAAE,uBAAuB,OA6OzB"}
@@ -3,8 +3,10 @@ import { useEffect, useCallback, useState } from "react";
3
3
  import { createPortal } from "react-dom";
4
4
  import { IconPackageExport, IconCode, IconExternalLink, IconX, IconLoader2, } from "@tabler/icons-react";
5
5
  import { agentNativePath } from "../api-path.js";
6
+ const DESKTOP_DOWNLOAD_URL = "https://www.agent-native.com/download";
6
7
  function useBuilderConnected() {
7
8
  const [connected, setConnected] = useState(false);
9
+ const [cloudAgentsAvailable, setCloudAgentsAvailable] = useState(false);
8
10
  const [connectUrl, setConnectUrl] = useState(null);
9
11
  useEffect(() => {
10
12
  fetch(agentNativePath("/_agent-native/builder/status"))
@@ -12,12 +14,13 @@ function useBuilderConnected() {
12
14
  .then((data) => {
13
15
  if (data) {
14
16
  setConnected(!!data.configured);
17
+ setCloudAgentsAvailable(!!data.builderEnabled);
15
18
  setConnectUrl(data.connectUrl || null);
16
19
  }
17
20
  })
18
21
  .catch(() => { });
19
22
  }, []);
20
- return { connected, connectUrl };
23
+ return { connected, cloudAgentsAvailable, connectUrl };
21
24
  }
22
25
  /**
23
26
  * Modal shown when a user tries to use a code-requiring feature where local
@@ -26,7 +29,7 @@ function useBuilderConnected() {
26
29
  * Uses inline styles (no Radix/Tailwind dependency).
27
30
  */
28
31
  export function CodeRequiredDialog({ open, onClose, featureLabel, }) {
29
- const { connected: builderConnected, connectUrl } = useBuilderConnected();
32
+ const { connected: builderConnected, cloudAgentsAvailable, connectUrl, } = useBuilderConnected();
30
33
  const [submitting, setSubmitting] = useState(false);
31
34
  const [branchUrl, setBranchUrl] = useState(null);
32
35
  const [error, setError] = useState(null);
@@ -83,12 +86,16 @@ export function CodeRequiredDialog({ open, onClose, featureLabel, }) {
83
86
  return null;
84
87
  return createPortal(_jsx("div", { style: s.backdrop, onClick: onClose, children: _jsxs("div", { style: s.dialog, onClick: (e) => e.stopPropagation(), role: "dialog", "aria-modal": "true", children: [_jsxs("div", { style: s.header, children: [_jsx("div", { style: s.iconWrap, children: _jsx(IconPackageExport, { size: 20 }) }), _jsxs("div", { children: [_jsx("h2", { style: s.title, children: "Code changes required" }), _jsx("p", { style: s.subtitle, children: featureLabel
85
88
  ? `"${featureLabel}" creates or modifies source code, which needs Desktop or Builder from this surface.`
86
- : "This action creates or modifies source code, which needs Desktop or Builder from this surface." })] })] }), _jsxs("div", { style: s.options, children: [_jsxs("a", { href: "https://agent-native.com/download", target: "_blank", rel: "noreferrer", style: { ...s.optionCard, ...s.optionLink }, onMouseEnter: (e) => Object.assign(e.currentTarget.style, s.optionCardHover), onMouseLeave: (e) => Object.assign(e.currentTarget.style, { borderColor: "#e5e7eb" }), children: [_jsx("div", { style: s.optionIcon, children: _jsx(IconCode, { size: 24 }) }), _jsxs("div", { style: s.optionText, children: [_jsx("span", { style: s.optionTitle, children: "Use Agent Native Desktop" }), _jsx("span", { style: s.optionDesc, children: "Open the project in the desktop app to enable source edits, Workspace files, and CLI access." })] })] }), builderConnected ? (_jsxs("button", { style: {
89
+ : "This action creates or modifies source code, which needs Desktop or Builder from this surface." })] })] }), _jsxs("div", { style: s.options, children: [_jsxs("a", { href: DESKTOP_DOWNLOAD_URL, target: "_blank", rel: "noreferrer", style: { ...s.optionCard, ...s.optionLink }, onMouseEnter: (e) => Object.assign(e.currentTarget.style, s.optionCardHover), onMouseLeave: (e) => Object.assign(e.currentTarget.style, { borderColor: "#e5e7eb" }), children: [_jsx("div", { style: s.optionIcon, children: _jsx(IconCode, { size: 24 }) }), _jsxs("div", { style: s.optionText, children: [_jsx("span", { style: s.optionTitle, children: "Use Agent Native Desktop" }), _jsx("span", { style: s.optionDesc, children: "Open the project in the desktop app to enable source edits, Workspace files, and CLI access." })] })] }), builderConnected && cloudAgentsAvailable ? (_jsxs("button", { style: {
87
90
  ...s.optionCard,
88
91
  ...(submitting
89
92
  ? { opacity: 0.7, pointerEvents: "none" }
90
93
  : {}),
91
- }, onMouseEnter: (e) => Object.assign(e.currentTarget.style, s.optionCardHover), onMouseLeave: (e) => Object.assign(e.currentTarget.style, { borderColor: "#e5e7eb" }), onClick: handleBuilderAgent, children: [_jsx("div", { style: s.optionIcon, children: submitting ? (_jsx(IconLoader2, { size: 24, style: { animation: "spin 1s linear infinite" } })) : (_jsx(IconExternalLink, { size: 24 })) }), _jsxs("div", { style: s.optionText, children: [_jsx("span", { style: s.optionTitle, children: "Use Builder.io Agent" }), _jsx("span", { style: s.optionDesc, children: "Let our cloud agent make the changes for you. You'll get a link to preview and deploy." })] })] })) : (_jsxs("a", { href: builderHref, target: "_blank", rel: "noreferrer", style: { ...s.optionCard, ...s.optionLink }, onMouseEnter: (e) => Object.assign(e.currentTarget.style, s.optionCardHover), onMouseLeave: (e) => Object.assign(e.currentTarget.style, {
94
+ }, onMouseEnter: (e) => Object.assign(e.currentTarget.style, s.optionCardHover), onMouseLeave: (e) => Object.assign(e.currentTarget.style, { borderColor: "#e5e7eb" }), onClick: handleBuilderAgent, children: [_jsx("div", { style: s.optionIcon, children: submitting ? (_jsx(IconLoader2, { size: 24, style: { animation: "spin 1s linear infinite" } })) : (_jsx(IconExternalLink, { size: 24 })) }), _jsxs("div", { style: s.optionText, children: [_jsx("span", { style: s.optionTitle, children: "Use Builder.io Agent" }), _jsx("span", { style: s.optionDesc, children: "Let our cloud agent make the changes for you. You'll get a link to preview and deploy." })] })] })) : builderConnected ? (_jsxs("div", { style: {
95
+ ...s.optionCard,
96
+ cursor: "default",
97
+ opacity: 0.85,
98
+ }, children: [_jsx("div", { style: s.optionIcon, children: _jsx(IconExternalLink, { size: 24 }) }), _jsxs("div", { style: s.optionText, children: [_jsx("span", { style: s.optionTitle, children: "Builder Cloud Agents unavailable" }), _jsx("span", { style: s.optionDesc, children: "You don't have access yet. Use the desktop app or your local clone for this code change." })] }), _jsx("span", { style: s.badge, children: "Unavailable" })] })) : (_jsxs("a", { href: builderHref, target: "_blank", rel: "noreferrer", style: { ...s.optionCard, ...s.optionLink }, onMouseEnter: (e) => Object.assign(e.currentTarget.style, s.optionCardHover), onMouseLeave: (e) => Object.assign(e.currentTarget.style, {
92
99
  borderColor: "#e5e7eb",
93
100
  }), children: [_jsx("div", { style: s.optionIcon, children: _jsx(IconExternalLink, { size: 24 }) }), _jsxs("div", { style: s.optionText, children: [_jsx("span", { style: s.optionTitle, children: "Connect Builder.io" }), _jsx("span", { style: s.optionDesc, children: "Connect Builder to enable cloud-based code changes from this app." })] }), !connectUrl && _jsx("span", { style: s.badge, children: "Setup required" })] }))] }), branchUrl && (_jsxs("div", { style: s.result, children: [_jsx("span", { style: { fontSize: 13, fontWeight: 600 }, children: "Branch created" }), _jsx("a", { href: branchUrl, target: "_blank", rel: "noopener noreferrer", style: s.resultLink, children: branchUrl })] })), error && (_jsx("p", { style: { color: "#ef4444", fontSize: 12, marginTop: 12 }, children: error })), _jsx("button", { style: s.closeButton, onClick: onClose, "aria-label": "Close", children: _jsx(IconX, { size: 16 }) })] }) }), document.body);
94
101
  }
@@ -1 +1 @@
1
- {"version":3,"file":"CodeRequiredDialog.js","sourceRoot":"","sources":["../../../src/client/components/CodeRequiredDialog.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useEffect, useCallback, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport {\n IconPackageExport,\n IconCode,\n IconExternalLink,\n IconX,\n IconLoader2,\n} from \"@tabler/icons-react\";\nimport { agentNativePath } from \"../api-path.js\";\n\nexport interface CodeRequiredDialogProps {\n open: boolean;\n onClose: () => void;\n /** Label describing the feature that requires code changes */\n featureLabel?: string;\n}\n\nfunction useBuilderConnected() {\n const [connected, setConnected] = useState(false);\n const [connectUrl, setConnectUrl] = useState<string | null>(null);\n\n useEffect(() => {\n fetch(agentNativePath(\"/_agent-native/builder/status\"))\n .then((r) => (r.ok ? r.json() : null))\n .then((data) => {\n if (data) {\n setConnected(!!data.configured);\n setConnectUrl(data.connectUrl || null);\n }\n })\n .catch(() => {});\n }, []);\n\n return { connected, connectUrl };\n}\n\n/**\n * Modal shown when a user tries to use a code-requiring feature where local\n * source access is unavailable. Offers two paths: Agent Native Desktop or the\n * Builder.io agent.\n * Uses inline styles (no Radix/Tailwind dependency).\n */\nexport function CodeRequiredDialog({\n open,\n onClose,\n featureLabel,\n}: CodeRequiredDialogProps) {\n const { connected: builderConnected, connectUrl } = useBuilderConnected();\n const [submitting, setSubmitting] = useState(false);\n const [branchUrl, setBranchUrl] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n const builderHref =\n connectUrl || agentNativePath(\"/_agent-native/builder/connect\");\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (e.key === \"Escape\") onClose();\n },\n [onClose],\n );\n\n useEffect(() => {\n if (open) {\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => document.removeEventListener(\"keydown\", handleKeyDown);\n }\n }, [open, handleKeyDown]);\n\n useEffect(() => {\n if (open) {\n setSubmitting(false);\n setBranchUrl(null);\n setError(null);\n }\n }, [open]);\n\n const handleBuilderAgent = async () => {\n if (!builderConnected) {\n // Open settings tab\n window.dispatchEvent(new Event(\"agent-panel:open-settings\"));\n onClose();\n return;\n }\n\n setSubmitting(true);\n setError(null);\n try {\n const res = await fetch(\n agentNativePath(\"/_agent-native/builder/agents-run\"),\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n userMessage:\n featureLabel || \"Make the requested code changes to this app\",\n }),\n },\n );\n if (!res.ok) {\n const body = await res.json().catch(() => ({}));\n throw new Error(body?.error || `Failed (${res.status})`);\n }\n const data = await res.json();\n setBranchUrl(data.url || null);\n } catch (err: any) {\n setError(err?.message || \"Failed to create branch\");\n } finally {\n setSubmitting(false);\n }\n };\n\n if (!open || typeof document === \"undefined\") return null;\n\n return createPortal(\n <div style={s.backdrop} onClick={onClose}>\n <div\n style={s.dialog}\n onClick={(e) => e.stopPropagation()}\n role=\"dialog\"\n aria-modal=\"true\"\n >\n {/* Header */}\n <div style={s.header}>\n <div style={s.iconWrap}>\n <IconPackageExport size={20} />\n </div>\n <div>\n <h2 style={s.title}>Code changes required</h2>\n <p style={s.subtitle}>\n {featureLabel\n ? `\"${featureLabel}\" creates or modifies source code, which needs Desktop or Builder from this surface.`\n : \"This action creates or modifies source code, which needs Desktop or Builder from this surface.\"}\n </p>\n </div>\n </div>\n\n {/* Options */}\n <div style={s.options}>\n <a\n href=\"https://agent-native.com/download\"\n target=\"_blank\"\n rel=\"noreferrer\"\n style={{ ...s.optionCard, ...s.optionLink }}\n onMouseEnter={(e) =>\n Object.assign(e.currentTarget.style, s.optionCardHover)\n }\n onMouseLeave={(e) =>\n Object.assign(e.currentTarget.style, { borderColor: \"#e5e7eb\" })\n }\n >\n <div style={s.optionIcon}>\n <IconCode size={24} />\n </div>\n <div style={s.optionText}>\n <span style={s.optionTitle}>Use Agent Native Desktop</span>\n <span style={s.optionDesc}>\n Open the project in the desktop app to enable source edits,\n Workspace files, and CLI access.\n </span>\n </div>\n </a>\n\n {builderConnected ? (\n <button\n style={{\n ...s.optionCard,\n ...(submitting\n ? { opacity: 0.7, pointerEvents: \"none\" as const }\n : {}),\n }}\n onMouseEnter={(e) =>\n Object.assign(e.currentTarget.style, s.optionCardHover)\n }\n onMouseLeave={(e) =>\n Object.assign(e.currentTarget.style, { borderColor: \"#e5e7eb\" })\n }\n onClick={handleBuilderAgent}\n >\n <div style={s.optionIcon}>\n {submitting ? (\n <IconLoader2\n size={24}\n style={{ animation: \"spin 1s linear infinite\" }}\n />\n ) : (\n <IconExternalLink size={24} />\n )}\n </div>\n <div style={s.optionText}>\n <span style={s.optionTitle}>Use Builder.io Agent</span>\n <span style={s.optionDesc}>\n Let our cloud agent make the changes for you. You'll get a\n link to preview and deploy.\n </span>\n </div>\n </button>\n ) : (\n <a\n href={builderHref}\n target=\"_blank\"\n rel=\"noreferrer\"\n style={{ ...s.optionCard, ...s.optionLink }}\n onMouseEnter={(e) =>\n Object.assign(e.currentTarget.style, s.optionCardHover)\n }\n onMouseLeave={(e) =>\n Object.assign(e.currentTarget.style, {\n borderColor: \"#e5e7eb\",\n })\n }\n >\n <div style={s.optionIcon}>\n <IconExternalLink size={24} />\n </div>\n <div style={s.optionText}>\n <span style={s.optionTitle}>Connect Builder.io</span>\n <span style={s.optionDesc}>\n Connect Builder to enable cloud-based code changes from this\n app.\n </span>\n </div>\n {!connectUrl && <span style={s.badge}>Setup required</span>}\n </a>\n )}\n </div>\n\n {/* Branch result */}\n {branchUrl && (\n <div style={s.result}>\n <span style={{ fontSize: 13, fontWeight: 600 }}>\n Branch created\n </span>\n <a\n href={branchUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={s.resultLink}\n >\n {branchUrl}\n </a>\n </div>\n )}\n\n {error && (\n <p style={{ color: \"#ef4444\", fontSize: 12, marginTop: 12 }}>\n {error}\n </p>\n )}\n\n {/* Close */}\n <button style={s.closeButton} onClick={onClose} aria-label=\"Close\">\n <IconX size={16} />\n </button>\n </div>\n </div>,\n document.body,\n );\n}\n\nconst s: Record<string, React.CSSProperties> = {\n backdrop: {\n position: \"fixed\",\n inset: 0,\n background: \"rgba(0, 0, 0, 0.5)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n zIndex: 99999,\n padding: \"16px\",\n },\n dialog: {\n position: \"relative\",\n background: \"#fff\",\n borderRadius: \"12px\",\n maxWidth: \"460px\",\n width: \"100%\",\n padding: \"24px\",\n boxShadow:\n \"0 20px 25px -5px rgba(0,0,0,.1), 0 8px 10px -6px rgba(0,0,0,.1)\",\n fontFamily:\n '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n color: \"#111827\",\n },\n header: {\n display: \"flex\",\n gap: \"14px\",\n alignItems: \"flex-start\",\n marginBottom: \"20px\",\n },\n iconWrap: {\n flexShrink: 0,\n width: \"40px\",\n height: \"40px\",\n borderRadius: \"10px\",\n background: \"#f3f4f6\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n color: \"#6b7280\",\n },\n title: {\n margin: 0,\n fontSize: \"16px\",\n fontWeight: 600,\n lineHeight: \"1.4\",\n },\n subtitle: {\n margin: \"4px 0 0\",\n fontSize: \"13px\",\n color: \"#6b7280\",\n lineHeight: \"1.5\",\n },\n options: {\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"10px\",\n },\n optionCard: {\n position: \"relative\",\n display: \"flex\",\n alignItems: \"flex-start\",\n gap: \"14px\",\n padding: \"14px\",\n border: \"1px solid #e5e7eb\",\n borderRadius: \"10px\",\n background: \"transparent\",\n cursor: \"pointer\",\n textAlign: \"left\",\n width: \"100%\",\n fontSize: \"inherit\",\n fontFamily: \"inherit\",\n color: \"inherit\",\n },\n optionCardHover: {\n borderColor: \"#a5b4fc\",\n },\n optionLink: {\n textDecoration: \"none\",\n boxSizing: \"border-box\",\n },\n optionIcon: {\n flexShrink: 0,\n color: \"#6366f1\",\n marginTop: \"2px\",\n },\n optionText: {\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"2px\",\n },\n optionTitle: {\n fontSize: \"14px\",\n fontWeight: 600,\n },\n optionDesc: {\n fontSize: \"12px\",\n color: \"#6b7280\",\n lineHeight: \"1.5\",\n },\n code: {\n background: \"#f3f4f6\",\n padding: \"1px 5px\",\n borderRadius: \"4px\",\n fontSize: \"11px\",\n fontFamily: \"monospace\",\n },\n badge: {\n position: \"absolute\",\n top: \"10px\",\n right: \"10px\",\n fontSize: \"10px\",\n fontWeight: 600,\n color: \"#6366f1\",\n background: \"#eef2ff\",\n padding: \"2px 8px\",\n borderRadius: \"99px\",\n textTransform: \"uppercase\",\n letterSpacing: \"0.5px\",\n },\n closeButton: {\n position: \"absolute\",\n top: \"12px\",\n right: \"12px\",\n background: \"transparent\",\n border: \"none\",\n cursor: \"pointer\",\n padding: \"6px\",\n borderRadius: \"6px\",\n color: \"#9ca3af\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n result: {\n marginTop: \"16px\",\n padding: \"12px\",\n borderRadius: \"8px\",\n border: \"1px solid #22c55e40\",\n background: \"#f0fdf4\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"4px\",\n },\n resultLink: {\n fontSize: \"12px\",\n color: \"#6366f1\",\n textDecoration: \"none\",\n wordBreak: \"break-all\",\n },\n};\n"]}
1
+ {"version":3,"file":"CodeRequiredDialog.js","sourceRoot":"","sources":["../../../src/client/components/CodeRequiredDialog.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useEffect, useCallback, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport {\n IconPackageExport,\n IconCode,\n IconExternalLink,\n IconX,\n IconLoader2,\n} from \"@tabler/icons-react\";\nimport { agentNativePath } from \"../api-path.js\";\n\nconst DESKTOP_DOWNLOAD_URL = \"https://www.agent-native.com/download\";\n\nexport interface CodeRequiredDialogProps {\n open: boolean;\n onClose: () => void;\n /** Label describing the feature that requires code changes */\n featureLabel?: string;\n}\n\nfunction useBuilderConnected() {\n const [connected, setConnected] = useState(false);\n const [cloudAgentsAvailable, setCloudAgentsAvailable] = useState(false);\n const [connectUrl, setConnectUrl] = useState<string | null>(null);\n\n useEffect(() => {\n fetch(agentNativePath(\"/_agent-native/builder/status\"))\n .then((r) => (r.ok ? r.json() : null))\n .then((data) => {\n if (data) {\n setConnected(!!data.configured);\n setCloudAgentsAvailable(!!data.builderEnabled);\n setConnectUrl(data.connectUrl || null);\n }\n })\n .catch(() => {});\n }, []);\n\n return { connected, cloudAgentsAvailable, connectUrl };\n}\n\n/**\n * Modal shown when a user tries to use a code-requiring feature where local\n * source access is unavailable. Offers two paths: Agent Native Desktop or the\n * Builder.io agent.\n * Uses inline styles (no Radix/Tailwind dependency).\n */\nexport function CodeRequiredDialog({\n open,\n onClose,\n featureLabel,\n}: CodeRequiredDialogProps) {\n const {\n connected: builderConnected,\n cloudAgentsAvailable,\n connectUrl,\n } = useBuilderConnected();\n const [submitting, setSubmitting] = useState(false);\n const [branchUrl, setBranchUrl] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n const builderHref =\n connectUrl || agentNativePath(\"/_agent-native/builder/connect\");\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (e.key === \"Escape\") onClose();\n },\n [onClose],\n );\n\n useEffect(() => {\n if (open) {\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => document.removeEventListener(\"keydown\", handleKeyDown);\n }\n }, [open, handleKeyDown]);\n\n useEffect(() => {\n if (open) {\n setSubmitting(false);\n setBranchUrl(null);\n setError(null);\n }\n }, [open]);\n\n const handleBuilderAgent = async () => {\n if (!builderConnected) {\n // Open settings tab\n window.dispatchEvent(new Event(\"agent-panel:open-settings\"));\n onClose();\n return;\n }\n\n setSubmitting(true);\n setError(null);\n try {\n const res = await fetch(\n agentNativePath(\"/_agent-native/builder/agents-run\"),\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n userMessage:\n featureLabel || \"Make the requested code changes to this app\",\n }),\n },\n );\n if (!res.ok) {\n const body = await res.json().catch(() => ({}));\n throw new Error(body?.error || `Failed (${res.status})`);\n }\n const data = await res.json();\n setBranchUrl(data.url || null);\n } catch (err: any) {\n setError(err?.message || \"Failed to create branch\");\n } finally {\n setSubmitting(false);\n }\n };\n\n if (!open || typeof document === \"undefined\") return null;\n\n return createPortal(\n <div style={s.backdrop} onClick={onClose}>\n <div\n style={s.dialog}\n onClick={(e) => e.stopPropagation()}\n role=\"dialog\"\n aria-modal=\"true\"\n >\n {/* Header */}\n <div style={s.header}>\n <div style={s.iconWrap}>\n <IconPackageExport size={20} />\n </div>\n <div>\n <h2 style={s.title}>Code changes required</h2>\n <p style={s.subtitle}>\n {featureLabel\n ? `\"${featureLabel}\" creates or modifies source code, which needs Desktop or Builder from this surface.`\n : \"This action creates or modifies source code, which needs Desktop or Builder from this surface.\"}\n </p>\n </div>\n </div>\n\n {/* Options */}\n <div style={s.options}>\n <a\n href={DESKTOP_DOWNLOAD_URL}\n target=\"_blank\"\n rel=\"noreferrer\"\n style={{ ...s.optionCard, ...s.optionLink }}\n onMouseEnter={(e) =>\n Object.assign(e.currentTarget.style, s.optionCardHover)\n }\n onMouseLeave={(e) =>\n Object.assign(e.currentTarget.style, { borderColor: \"#e5e7eb\" })\n }\n >\n <div style={s.optionIcon}>\n <IconCode size={24} />\n </div>\n <div style={s.optionText}>\n <span style={s.optionTitle}>Use Agent Native Desktop</span>\n <span style={s.optionDesc}>\n Open the project in the desktop app to enable source edits,\n Workspace files, and CLI access.\n </span>\n </div>\n </a>\n\n {builderConnected && cloudAgentsAvailable ? (\n <button\n style={{\n ...s.optionCard,\n ...(submitting\n ? { opacity: 0.7, pointerEvents: \"none\" as const }\n : {}),\n }}\n onMouseEnter={(e) =>\n Object.assign(e.currentTarget.style, s.optionCardHover)\n }\n onMouseLeave={(e) =>\n Object.assign(e.currentTarget.style, { borderColor: \"#e5e7eb\" })\n }\n onClick={handleBuilderAgent}\n >\n <div style={s.optionIcon}>\n {submitting ? (\n <IconLoader2\n size={24}\n style={{ animation: \"spin 1s linear infinite\" }}\n />\n ) : (\n <IconExternalLink size={24} />\n )}\n </div>\n <div style={s.optionText}>\n <span style={s.optionTitle}>Use Builder.io Agent</span>\n <span style={s.optionDesc}>\n Let our cloud agent make the changes for you. You'll get a\n link to preview and deploy.\n </span>\n </div>\n </button>\n ) : builderConnected ? (\n <div\n style={{\n ...s.optionCard,\n cursor: \"default\",\n opacity: 0.85,\n }}\n >\n <div style={s.optionIcon}>\n <IconExternalLink size={24} />\n </div>\n <div style={s.optionText}>\n <span style={s.optionTitle}>\n Builder Cloud Agents unavailable\n </span>\n <span style={s.optionDesc}>\n You don't have access yet. Use the desktop app or your local\n clone for this code change.\n </span>\n </div>\n <span style={s.badge}>Unavailable</span>\n </div>\n ) : (\n <a\n href={builderHref}\n target=\"_blank\"\n rel=\"noreferrer\"\n style={{ ...s.optionCard, ...s.optionLink }}\n onMouseEnter={(e) =>\n Object.assign(e.currentTarget.style, s.optionCardHover)\n }\n onMouseLeave={(e) =>\n Object.assign(e.currentTarget.style, {\n borderColor: \"#e5e7eb\",\n })\n }\n >\n <div style={s.optionIcon}>\n <IconExternalLink size={24} />\n </div>\n <div style={s.optionText}>\n <span style={s.optionTitle}>Connect Builder.io</span>\n <span style={s.optionDesc}>\n Connect Builder to enable cloud-based code changes from this\n app.\n </span>\n </div>\n {!connectUrl && <span style={s.badge}>Setup required</span>}\n </a>\n )}\n </div>\n\n {/* Branch result */}\n {branchUrl && (\n <div style={s.result}>\n <span style={{ fontSize: 13, fontWeight: 600 }}>\n Branch created\n </span>\n <a\n href={branchUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={s.resultLink}\n >\n {branchUrl}\n </a>\n </div>\n )}\n\n {error && (\n <p style={{ color: \"#ef4444\", fontSize: 12, marginTop: 12 }}>\n {error}\n </p>\n )}\n\n {/* Close */}\n <button style={s.closeButton} onClick={onClose} aria-label=\"Close\">\n <IconX size={16} />\n </button>\n </div>\n </div>,\n document.body,\n );\n}\n\nconst s: Record<string, React.CSSProperties> = {\n backdrop: {\n position: \"fixed\",\n inset: 0,\n background: \"rgba(0, 0, 0, 0.5)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n zIndex: 99999,\n padding: \"16px\",\n },\n dialog: {\n position: \"relative\",\n background: \"#fff\",\n borderRadius: \"12px\",\n maxWidth: \"460px\",\n width: \"100%\",\n padding: \"24px\",\n boxShadow:\n \"0 20px 25px -5px rgba(0,0,0,.1), 0 8px 10px -6px rgba(0,0,0,.1)\",\n fontFamily:\n '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n color: \"#111827\",\n },\n header: {\n display: \"flex\",\n gap: \"14px\",\n alignItems: \"flex-start\",\n marginBottom: \"20px\",\n },\n iconWrap: {\n flexShrink: 0,\n width: \"40px\",\n height: \"40px\",\n borderRadius: \"10px\",\n background: \"#f3f4f6\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n color: \"#6b7280\",\n },\n title: {\n margin: 0,\n fontSize: \"16px\",\n fontWeight: 600,\n lineHeight: \"1.4\",\n },\n subtitle: {\n margin: \"4px 0 0\",\n fontSize: \"13px\",\n color: \"#6b7280\",\n lineHeight: \"1.5\",\n },\n options: {\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"10px\",\n },\n optionCard: {\n position: \"relative\",\n display: \"flex\",\n alignItems: \"flex-start\",\n gap: \"14px\",\n padding: \"14px\",\n border: \"1px solid #e5e7eb\",\n borderRadius: \"10px\",\n background: \"transparent\",\n cursor: \"pointer\",\n textAlign: \"left\",\n width: \"100%\",\n fontSize: \"inherit\",\n fontFamily: \"inherit\",\n color: \"inherit\",\n },\n optionCardHover: {\n borderColor: \"#a5b4fc\",\n },\n optionLink: {\n textDecoration: \"none\",\n boxSizing: \"border-box\",\n },\n optionIcon: {\n flexShrink: 0,\n color: \"#6366f1\",\n marginTop: \"2px\",\n },\n optionText: {\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"2px\",\n },\n optionTitle: {\n fontSize: \"14px\",\n fontWeight: 600,\n },\n optionDesc: {\n fontSize: \"12px\",\n color: \"#6b7280\",\n lineHeight: \"1.5\",\n },\n code: {\n background: \"#f3f4f6\",\n padding: \"1px 5px\",\n borderRadius: \"4px\",\n fontSize: \"11px\",\n fontFamily: \"monospace\",\n },\n badge: {\n position: \"absolute\",\n top: \"10px\",\n right: \"10px\",\n fontSize: \"10px\",\n fontWeight: 600,\n color: \"#6366f1\",\n background: \"#eef2ff\",\n padding: \"2px 8px\",\n borderRadius: \"99px\",\n textTransform: \"uppercase\",\n letterSpacing: \"0.5px\",\n },\n closeButton: {\n position: \"absolute\",\n top: \"12px\",\n right: \"12px\",\n background: \"transparent\",\n border: \"none\",\n cursor: \"pointer\",\n padding: \"6px\",\n borderRadius: \"6px\",\n color: \"#9ca3af\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n result: {\n marginTop: \"16px\",\n padding: \"12px\",\n borderRadius: \"8px\",\n border: \"1px solid #22c55e40\",\n background: \"#f0fdf4\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"4px\",\n },\n resultLink: {\n fontSize: \"12px\",\n color: \"#6366f1\",\n textDecoration: \"none\",\n wordBreak: \"break-all\",\n },\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"BackgroundAgentSection.d.ts","sourceRoot":"","sources":["../../../src/client/settings/BackgroundAgentSection.tsx"],"names":[],"mappings":"AAkBA,wBAAgB,sBAAsB,4CA0HrC"}
1
+ {"version":3,"file":"BackgroundAgentSection.d.ts","sourceRoot":"","sources":["../../../src/client/settings/BackgroundAgentSection.tsx"],"names":[],"mappings":"AAkBA,wBAAgB,sBAAsB,4CAkJrC"}
@@ -7,6 +7,7 @@ import { useBuilderStatus } from "./useBuilderStatus.js";
7
7
  export function BackgroundAgentSection() {
8
8
  const { status: builder } = useBuilderStatus();
9
9
  const connected = builder?.configured ?? false;
10
+ const cloudAgentsAvailable = !!builder?.builderEnabled;
10
11
  const [projectUrl, setProjectUrl] = useState("");
11
12
  const [running, setRunning] = useState(false);
12
13
  const [result, setResult] = useState(null);
@@ -39,7 +40,7 @@ export function BackgroundAgentSection() {
39
40
  setRunning(false);
40
41
  }
41
42
  };
42
- return (_jsx(SettingsSection, { icon: _jsx(IconGitBranch, { size: 14 }), title: "Background Agent", subtitle: "Make code changes from production mode. Builder creates a branch, the agent makes changes, and you get a preview URL.", connected: connected, children: !connected ? (_jsxs("div", { className: "space-y-2", children: [_jsx("p", { className: "text-[10px] text-muted-foreground", children: "Connect Builder to enable code changes from production. The agent will create branches and provide preview URLs." }), builder?.connectUrl && (_jsxs("a", { href: builder.connectUrl, className: "inline-flex items-center gap-1 rounded bg-accent px-2 py-1 text-[10px] font-medium text-foreground hover:bg-accent/80", children: ["Connect Builder", _jsx(IconExternalLink, { size: 10 })] }))] })) : (_jsxs("div", { className: "space-y-2.5", children: [_jsxs("div", { className: "flex items-center gap-1.5 text-[10px] text-green-500", children: [_jsx(IconCheck, { size: 10 }), "Builder connected", builder?.orgName && (_jsxs("span", { className: "text-muted-foreground", children: ["(", builder.orgName, ")"] }))] }), _jsxs("div", { children: [_jsx("label", { className: "text-[10px] font-medium text-foreground block mb-1", children: "Builder Project URL or ID" }), _jsxs("div", { className: "flex gap-1.5", children: [_jsx("input", { type: "text", value: projectUrl, onChange: (e) => setProjectUrl(e.target.value), onKeyDown: (e) => {
43
+ return (_jsx(SettingsSection, { icon: _jsx(IconGitBranch, { size: 14 }), title: "Background Agent", subtitle: "Make code changes from production mode. Builder creates a branch, the agent makes changes, and you get a preview URL.", connected: connected, children: !connected ? (_jsxs("div", { className: "space-y-2", children: [_jsx("p", { className: "text-[10px] text-muted-foreground", children: "Connect Builder to enable code changes from production. The agent will create branches and provide preview URLs." }), builder?.connectUrl && (_jsxs("a", { href: builder.connectUrl, className: "inline-flex items-center gap-1 rounded bg-accent px-2 py-1 text-[10px] font-medium text-foreground hover:bg-accent/80", children: ["Connect Builder", _jsx(IconExternalLink, { size: 10 })] }))] })) : !cloudAgentsAvailable ? (_jsxs("div", { className: "space-y-2", children: [_jsxs("div", { className: "flex items-center gap-1.5 text-[10px] text-muted-foreground", children: [_jsx(IconCheck, { size: 10 }), "Builder connected", builder?.orgName && (_jsxs("span", { className: "text-muted-foreground", children: ["(", builder.orgName, ")"] }))] }), _jsx("p", { className: "text-[10px] text-muted-foreground", children: "You don't have access to Builder Cloud Agents for this workspace yet. Use the desktop app or your local clone for code changes." }), _jsxs("a", { href: "https://www.agent-native.com/download", target: "_blank", rel: "noopener noreferrer", className: "inline-flex items-center gap-1 rounded bg-accent px-2 py-1 text-[10px] font-medium text-foreground hover:bg-accent/80", children: ["Download desktop app", _jsx(IconExternalLink, { size: 10 })] })] })) : (_jsxs("div", { className: "space-y-2.5", children: [_jsxs("div", { className: "flex items-center gap-1.5 text-[10px] text-green-500", children: [_jsx(IconCheck, { size: 10 }), "Builder connected", builder?.orgName && (_jsxs("span", { className: "text-muted-foreground", children: ["(", builder.orgName, ")"] }))] }), _jsxs("div", { children: [_jsx("label", { className: "text-[10px] font-medium text-foreground block mb-1", children: "Builder Project URL or ID" }), _jsxs("div", { className: "flex gap-1.5", children: [_jsx("input", { type: "text", value: projectUrl, onChange: (e) => setProjectUrl(e.target.value), onKeyDown: (e) => {
43
44
  if (e.key === "Enter")
44
45
  handleCreateBranch();
45
46
  }, placeholder: "https://builder.io/app/projects/...", className: "flex-1 rounded border border-border bg-background px-2 py-1 text-[11px] text-foreground outline-none placeholder:text-muted-foreground/50 focus:ring-1 focus:ring-accent" }), _jsx("button", { onClick: handleCreateBranch, disabled: !projectUrl.trim() || running, className: "rounded bg-accent px-2 py-1 text-[10px] font-medium text-foreground hover:bg-accent/80 disabled:opacity-40", children: running ? (_jsx(IconLoader2, { size: 10, className: "animate-spin" })) : ("Create branch") })] })] }), result && (_jsxs("div", { className: "rounded-md border border-green-800/40 bg-green-900/10 px-2.5 py-2", children: [_jsx("div", { className: "text-[10px] font-medium text-green-400 mb-1", children: "Branch created" }), _jsxs("a", { href: result.url, target: "_blank", rel: "noopener noreferrer", className: "flex items-center gap-1 text-[10px] text-foreground hover:underline", children: [result.url, _jsx(IconExternalLink, { size: 10 })] })] })), error && _jsx("p", { className: "text-[10px] text-red-400", children: error })] })) }));
@@ -1 +1 @@
1
- {"version":3,"file":"BackgroundAgentSection.js","sourceRoot":"","sources":["../../../src/client/settings/BackgroundAgentSection.tsx"],"names":[],"mappings":"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","sourcesContent":["import { agentNativePath } from \"../api-path.js\";\nimport { useState } from \"react\";\nimport {\n IconGitBranch,\n IconCheck,\n IconExternalLink,\n IconLoader2,\n} from \"@tabler/icons-react\";\nimport { SettingsSection } from \"./SettingsSection.js\";\nimport { useBuilderStatus } from \"./useBuilderStatus.js\";\n\ninterface AgentsRunResult {\n branchName: string | null;\n projectId: string;\n url: string;\n status: string;\n}\n\nexport function BackgroundAgentSection() {\n const { status: builder } = useBuilderStatus();\n const connected = builder?.configured ?? false;\n\n const [projectUrl, setProjectUrl] = useState(\"\");\n const [running, setRunning] = useState(false);\n const [result, setResult] = useState<AgentsRunResult | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n const handleCreateBranch = async () => {\n if (!projectUrl.trim()) return;\n setRunning(true);\n setError(null);\n setResult(null);\n try {\n const res = await fetch(\n agentNativePath(\"/_agent-native/builder/agents-run\"),\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n userMessage: \"Set up this project for development\",\n projectUrl: projectUrl.trim(),\n }),\n },\n );\n if (!res.ok) {\n const body = await res.json().catch(() => ({}));\n throw new Error(body?.error || `Failed (${res.status})`);\n }\n setResult(await res.json());\n } catch (err: any) {\n setError(err?.message || \"Failed to create branch\");\n } finally {\n setRunning(false);\n }\n };\n\n return (\n <SettingsSection\n icon={<IconGitBranch size={14} />}\n title=\"Background Agent\"\n subtitle=\"Make code changes from production mode. Builder creates a branch, the agent makes changes, and you get a preview URL.\"\n connected={connected}\n >\n {!connected ? (\n <div className=\"space-y-2\">\n <p className=\"text-[10px] text-muted-foreground\">\n Connect Builder to enable code changes from production. The agent\n will create branches and provide preview URLs.\n </p>\n {builder?.connectUrl && (\n <a\n href={builder.connectUrl}\n className=\"inline-flex items-center gap-1 rounded bg-accent px-2 py-1 text-[10px] font-medium text-foreground hover:bg-accent/80\"\n >\n Connect Builder\n <IconExternalLink size={10} />\n </a>\n )}\n </div>\n ) : (\n <div className=\"space-y-2.5\">\n <div className=\"flex items-center gap-1.5 text-[10px] text-green-500\">\n <IconCheck size={10} />\n Builder connected\n {builder?.orgName && (\n <span className=\"text-muted-foreground\">({builder.orgName})</span>\n )}\n </div>\n\n <div>\n <label className=\"text-[10px] font-medium text-foreground block mb-1\">\n Builder Project URL or ID\n </label>\n <div className=\"flex gap-1.5\">\n <input\n type=\"text\"\n value={projectUrl}\n onChange={(e) => setProjectUrl(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") handleCreateBranch();\n }}\n placeholder=\"https://builder.io/app/projects/...\"\n className=\"flex-1 rounded border border-border bg-background px-2 py-1 text-[11px] text-foreground outline-none placeholder:text-muted-foreground/50 focus:ring-1 focus:ring-accent\"\n />\n <button\n onClick={handleCreateBranch}\n disabled={!projectUrl.trim() || running}\n className=\"rounded bg-accent px-2 py-1 text-[10px] font-medium text-foreground hover:bg-accent/80 disabled:opacity-40\"\n >\n {running ? (\n <IconLoader2 size={10} className=\"animate-spin\" />\n ) : (\n \"Create branch\"\n )}\n </button>\n </div>\n </div>\n\n {result && (\n <div className=\"rounded-md border border-green-800/40 bg-green-900/10 px-2.5 py-2\">\n <div className=\"text-[10px] font-medium text-green-400 mb-1\">\n Branch created\n </div>\n <a\n href={result.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"flex items-center gap-1 text-[10px] text-foreground hover:underline\"\n >\n {result.url}\n <IconExternalLink size={10} />\n </a>\n </div>\n )}\n\n {error && <p className=\"text-[10px] text-red-400\">{error}</p>}\n </div>\n )}\n </SettingsSection>\n );\n}\n"]}
1
+ {"version":3,"file":"BackgroundAgentSection.js","sourceRoot":"","sources":["../../../src/client/settings/BackgroundAgentSection.tsx"],"names":[],"mappings":"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","sourcesContent":["import { agentNativePath } from \"../api-path.js\";\nimport { useState } from \"react\";\nimport {\n IconGitBranch,\n IconCheck,\n IconExternalLink,\n IconLoader2,\n} from \"@tabler/icons-react\";\nimport { SettingsSection } from \"./SettingsSection.js\";\nimport { useBuilderStatus } from \"./useBuilderStatus.js\";\n\ninterface AgentsRunResult {\n branchName: string | null;\n projectId: string;\n url: string;\n status: string;\n}\n\nexport function BackgroundAgentSection() {\n const { status: builder } = useBuilderStatus();\n const connected = builder?.configured ?? false;\n const cloudAgentsAvailable = !!builder?.builderEnabled;\n\n const [projectUrl, setProjectUrl] = useState(\"\");\n const [running, setRunning] = useState(false);\n const [result, setResult] = useState<AgentsRunResult | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n const handleCreateBranch = async () => {\n if (!projectUrl.trim()) return;\n setRunning(true);\n setError(null);\n setResult(null);\n try {\n const res = await fetch(\n agentNativePath(\"/_agent-native/builder/agents-run\"),\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n userMessage: \"Set up this project for development\",\n projectUrl: projectUrl.trim(),\n }),\n },\n );\n if (!res.ok) {\n const body = await res.json().catch(() => ({}));\n throw new Error(body?.error || `Failed (${res.status})`);\n }\n setResult(await res.json());\n } catch (err: any) {\n setError(err?.message || \"Failed to create branch\");\n } finally {\n setRunning(false);\n }\n };\n\n return (\n <SettingsSection\n icon={<IconGitBranch size={14} />}\n title=\"Background Agent\"\n subtitle=\"Make code changes from production mode. Builder creates a branch, the agent makes changes, and you get a preview URL.\"\n connected={connected}\n >\n {!connected ? (\n <div className=\"space-y-2\">\n <p className=\"text-[10px] text-muted-foreground\">\n Connect Builder to enable code changes from production. The agent\n will create branches and provide preview URLs.\n </p>\n {builder?.connectUrl && (\n <a\n href={builder.connectUrl}\n className=\"inline-flex items-center gap-1 rounded bg-accent px-2 py-1 text-[10px] font-medium text-foreground hover:bg-accent/80\"\n >\n Connect Builder\n <IconExternalLink size={10} />\n </a>\n )}\n </div>\n ) : !cloudAgentsAvailable ? (\n <div className=\"space-y-2\">\n <div className=\"flex items-center gap-1.5 text-[10px] text-muted-foreground\">\n <IconCheck size={10} />\n Builder connected\n {builder?.orgName && (\n <span className=\"text-muted-foreground\">({builder.orgName})</span>\n )}\n </div>\n <p className=\"text-[10px] text-muted-foreground\">\n You don't have access to Builder Cloud Agents for this workspace\n yet. Use the desktop app or your local clone for code changes.\n </p>\n <a\n href=\"https://www.agent-native.com/download\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex items-center gap-1 rounded bg-accent px-2 py-1 text-[10px] font-medium text-foreground hover:bg-accent/80\"\n >\n Download desktop app\n <IconExternalLink size={10} />\n </a>\n </div>\n ) : (\n <div className=\"space-y-2.5\">\n <div className=\"flex items-center gap-1.5 text-[10px] text-green-500\">\n <IconCheck size={10} />\n Builder connected\n {builder?.orgName && (\n <span className=\"text-muted-foreground\">({builder.orgName})</span>\n )}\n </div>\n\n <div>\n <label className=\"text-[10px] font-medium text-foreground block mb-1\">\n Builder Project URL or ID\n </label>\n <div className=\"flex gap-1.5\">\n <input\n type=\"text\"\n value={projectUrl}\n onChange={(e) => setProjectUrl(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") handleCreateBranch();\n }}\n placeholder=\"https://builder.io/app/projects/...\"\n className=\"flex-1 rounded border border-border bg-background px-2 py-1 text-[11px] text-foreground outline-none placeholder:text-muted-foreground/50 focus:ring-1 focus:ring-accent\"\n />\n <button\n onClick={handleCreateBranch}\n disabled={!projectUrl.trim() || running}\n className=\"rounded bg-accent px-2 py-1 text-[10px] font-medium text-foreground hover:bg-accent/80 disabled:opacity-40\"\n >\n {running ? (\n <IconLoader2 size={10} className=\"animate-spin\" />\n ) : (\n \"Create branch\"\n )}\n </button>\n </div>\n </div>\n\n {result && (\n <div className=\"rounded-md border border-green-800/40 bg-green-900/10 px-2.5 py-2\">\n <div className=\"text-[10px] font-medium text-green-400 mb-1\">\n Branch created\n </div>\n <a\n href={result.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"flex items-center gap-1 text-[10px] text-foreground hover:underline\"\n >\n {result.url}\n <IconExternalLink size={10} />\n </a>\n </div>\n )}\n\n {error && <p className=\"text-[10px] text-red-400\">{error}</p>}\n </div>\n )}\n </SettingsSection>\n );\n}\n"]}
@@ -64,7 +64,7 @@ const llmStep = {
64
64
  id: "builder",
65
65
  kind: "builder-cli-auth",
66
66
  label: "Connect Builder",
67
- description: "Connect the Builder space where this app should run. This unlocks managed LLM credits, browser automation, cloud code changes, and file uploads.",
67
+ description: "Connect the Builder space where this app should run. This unlocks managed LLM credits, browser automation, and file uploads. Cloud code changes appear when Builder Cloud Agents are enabled for the workspace.",
68
68
  primary: true,
69
69
  payload: {
70
70
  scope: "llm",
@@ -1 +1 @@
1
- {"version":3,"file":"default-steps.js","sourceRoot":"","sources":["../../src/onboarding/default-steps.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Default framework-level onboarding steps.\n *\n * Registered when `createOnboardingPlugin()` mounts (auto-mount or explicit).\n * Templates can override any step by registering another step with the same\n * `id` after these have been registered.\n */\n\nimport { registerOnboardingStep } from \"./registry.js\";\nimport type { OnboardingStep } from \"./types.js\";\nimport {\n PROVIDER_ENV_META,\n PROVIDER_ENV_VARS,\n} from \"../agent/engine/provider-env-vars.js\";\nimport {\n detectEngineFromUserSecrets,\n isAgentEngineSettingConfigured,\n} from \"../agent/engine/registry.js\";\nimport { getSetting } from \"../settings/store.js\";\n\ntype LlmKeyMethod = {\n provider: keyof typeof PROVIDER_ENV_META;\n id: string;\n label: string;\n description: string;\n primary?: boolean;\n};\n\nconst LLM_KEY_METHODS: LlmKeyMethod[] = [\n {\n provider: \"anthropic\",\n id: \"anthropic-key\",\n label: \"Anthropic\",\n description: \"Claude models with your own Anthropic key.\",\n },\n {\n provider: \"openai\",\n id: \"openai-key\",\n label: \"OpenAI\",\n description: \"GPT models with your own OpenAI key.\",\n },\n {\n provider: \"google\",\n id: \"google-key\",\n label: \"Google Gemini\",\n description: \"Gemini models with your own Google AI key.\",\n },\n {\n provider: \"openrouter\",\n id: \"openrouter-key\",\n label: \"OpenRouter\",\n description: \"OpenRouter models with your own OpenRouter key.\",\n },\n {\n provider: \"groq\",\n id: \"groq-key\",\n label: \"Groq\",\n description: \"Groq-hosted models with your own Groq key.\",\n },\n {\n provider: \"mistral\",\n id: \"mistral-key\",\n label: \"Mistral\",\n description: \"Mistral models with your own Mistral key.\",\n },\n {\n provider: \"cohere\",\n id: \"cohere-key\",\n label: \"Cohere\",\n description: \"Cohere models with your own Cohere key.\",\n },\n];\n\nconst llmStep: OnboardingStep = {\n id: \"llm\",\n order: 10,\n required: true,\n title: \"Connect an AI engine\",\n description: \"Use Builder's managed gateway, or bring your own provider key.\",\n methods: [\n {\n id: \"builder\",\n kind: \"builder-cli-auth\",\n label: \"Connect Builder\",\n description:\n \"Connect the Builder space where this app should run. This unlocks managed LLM credits, browser automation, cloud code changes, and file uploads.\",\n primary: true,\n payload: {\n scope: \"llm\",\n },\n },\n ...LLM_KEY_METHODS.map(({ provider, id, label, description, primary }) => {\n const meta = PROVIDER_ENV_META[provider];\n return {\n id,\n kind: \"form\" as const,\n label,\n description,\n ...(primary ? { primary: true } : {}),\n payload: {\n writeScope: \"workspace\" as const,\n fields: [\n {\n key: meta.envVar,\n label: meta.envVar,\n placeholder: meta.placeholder,\n secret: true,\n },\n ],\n },\n };\n }),\n ],\n isComplete: async () => {\n try {\n const { resolveHasBuilderPrivateKey } =\n await import(\"../server/credential-provider.js\");\n if (await resolveHasBuilderPrivateKey()) return true;\n } catch {\n if (process.env.BUILDER_PRIVATE_KEY) return true;\n }\n try {\n if (await detectEngineFromUserSecrets()) return true;\n } catch {\n // Fall through to legacy/env detection.\n }\n if (PROVIDER_ENV_VARS.some((k) => !!process.env[k])) return true;\n try {\n return isAgentEngineSettingConfigured(await getSetting(\"agent-engine\"));\n } catch {\n return false;\n }\n },\n};\n\n/** Step 2 — where application data lives. The default DB is non-blocking. */\nconst databaseStep: OnboardingStep = {\n id: \"database\",\n order: 20,\n required: false,\n title: \"Database\",\n description:\n \"Agent-native stores app data in SQL. Set DATABASE_URL when you want to point this app at a specific database.\",\n methods: [\n {\n id: \"database-url\",\n kind: \"form\",\n label: \"Set DATABASE_URL\",\n description: \"Paste the SQL connection string this app should use.\",\n payload: {\n writeScope: \"workspace\",\n fields: [\n {\n key: \"DATABASE_URL\",\n label: \"DATABASE_URL\",\n placeholder: \"postgres://..., libsql://..., file:./data/app.db\",\n },\n {\n key: \"DATABASE_AUTH_TOKEN\",\n label: \"DATABASE_AUTH_TOKEN (if needed)\",\n placeholder: \"Token for providers such as Turso/libSQL\",\n secret: true,\n },\n ],\n },\n },\n ],\n // The default local database means this step is always satisfied.\n isComplete: () => true,\n};\n\n/** Step 3 — how users sign in. Built-in account auth is non-blocking. */\nconst authStep: OnboardingStep = {\n id: \"auth\",\n order: 30,\n required: false,\n title: \"Authentication\",\n description:\n \"Built-in email/password accounts work by default. Add OAuth or access tokens only if you want another sign-in path.\",\n methods: [\n {\n id: \"google-oauth\",\n kind: \"form\",\n label: \"Google OAuth\",\n description: \"Add Google as an optional sign-in provider.\",\n payload: {\n writeScope: \"workspace\",\n fields: [\n { key: \"GOOGLE_CLIENT_ID\", label: \"GOOGLE_CLIENT_ID\" },\n {\n key: \"GOOGLE_CLIENT_SECRET\",\n label: \"GOOGLE_CLIENT_SECRET\",\n secret: true,\n },\n ],\n },\n },\n {\n id: \"github-oauth\",\n kind: \"form\",\n label: \"GitHub OAuth\",\n description: \"Add GitHub as an optional sign-in provider.\",\n payload: {\n writeScope: \"workspace\",\n fields: [\n { key: \"GITHUB_CLIENT_ID\", label: \"GITHUB_CLIENT_ID\" },\n {\n key: \"GITHUB_CLIENT_SECRET\",\n label: \"GITHUB_CLIENT_SECRET\",\n secret: true,\n },\n ],\n },\n },\n {\n id: \"access-token\",\n kind: \"form\",\n label: \"Shared access token\",\n description: \"Use a simple token gate for private deployments.\",\n payload: {\n writeScope: \"workspace\",\n fields: [\n {\n key: \"ACCESS_TOKEN\",\n label: \"ACCESS_TOKEN\",\n placeholder: \"Paste a strong shared token\",\n secret: true,\n },\n ],\n },\n },\n ],\n isComplete: () => true,\n};\n\n/** Step 4 — transactional email (password resets, invitations). Optional. */\nconst emailStep: OnboardingStep = {\n id: \"email\",\n order: 40,\n required: false,\n title: \"Email delivery\",\n description:\n \"Optional for local work. Before deploying with password resets, invitations, or share notifications, connect an email provider.\",\n methods: [\n {\n id: \"resend\",\n kind: \"form\",\n label: \"Resend\",\n description: \"Use Resend for transactional email.\",\n payload: {\n writeScope: \"workspace\",\n fields: [\n {\n key: \"RESEND_API_KEY\",\n label: \"RESEND_API_KEY\",\n placeholder: \"re_...\",\n secret: true,\n },\n {\n key: \"EMAIL_FROM\",\n label: \"EMAIL_FROM (from address)\",\n placeholder: \"Agent Native <noreply@yourdomain.com>\",\n },\n {\n key: \"APP_NAME\",\n label: \"APP_NAME (shown in invite emails)\",\n placeholder: \"Acme Forms\",\n },\n ],\n },\n },\n {\n id: \"sendgrid\",\n kind: \"form\",\n label: \"SendGrid\",\n description: \"Use SendGrid for transactional email.\",\n payload: {\n writeScope: \"workspace\",\n fields: [\n {\n key: \"SENDGRID_API_KEY\",\n label: \"SENDGRID_API_KEY\",\n placeholder: \"SG....\",\n secret: true,\n },\n {\n key: \"EMAIL_FROM\",\n label: \"EMAIL_FROM (from address)\",\n placeholder: \"Agent Native <noreply@yourdomain.com>\",\n },\n ],\n },\n },\n ],\n isComplete: () => {\n if (process.env.RESEND_API_KEY) return true;\n // SendGrid rejects Resend's sandbox sender, so EMAIL_FROM must also be\n // set — otherwise sendEmail() throws at runtime even though the API key\n // is configured.\n if (process.env.SENDGRID_API_KEY) return !!process.env.EMAIL_FROM;\n return false;\n },\n};\n\nlet registered = false;\n\n/** Idempotent. Safe to call from every plugin-mount call. */\nexport function registerDefaultOnboardingSteps(): void {\n if (registered) return;\n registered = true;\n registerOnboardingStep(llmStep);\n registerOnboardingStep(databaseStep);\n registerOnboardingStep(authStep);\n registerOnboardingStep(emailStep);\n}\n"]}
1
+ {"version":3,"file":"default-steps.js","sourceRoot":"","sources":["../../src/onboarding/default-steps.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAEvD,OAAO,EACL,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EACL,2BAA2B,EAC3B,8BAA8B,GAC/B,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAUlD,MAAM,eAAe,GAAmB;IACtC;QACE,QAAQ,EAAE,WAAW;QACrB,EAAE,EAAE,eAAe;QACnB,KAAK,EAAE,WAAW;QAClB,WAAW,EAAE,4CAA4C;KAC1D;IACD;QACE,QAAQ,EAAE,QAAQ;QAClB,EAAE,EAAE,YAAY;QAChB,KAAK,EAAE,QAAQ;QACf,WAAW,EAAE,sCAAsC;KACpD;IACD;QACE,QAAQ,EAAE,QAAQ;QAClB,EAAE,EAAE,YAAY;QAChB,KAAK,EAAE,eAAe;QACtB,WAAW,EAAE,4CAA4C;KAC1D;IACD;QACE,QAAQ,EAAE,YAAY;QACtB,EAAE,EAAE,gBAAgB;QACpB,KAAK,EAAE,YAAY;QACnB,WAAW,EAAE,iDAAiD;KAC/D;IACD;QACE,QAAQ,EAAE,MAAM;QAChB,EAAE,EAAE,UAAU;QACd,KAAK,EAAE,MAAM;QACb,WAAW,EAAE,4CAA4C;KAC1D;IACD;QACE,QAAQ,EAAE,SAAS;QACnB,EAAE,EAAE,aAAa;QACjB,KAAK,EAAE,SAAS;QAChB,WAAW,EAAE,2CAA2C;KACzD;IACD;QACE,QAAQ,EAAE,QAAQ;QAClB,EAAE,EAAE,YAAY;QAChB,KAAK,EAAE,QAAQ;QACf,WAAW,EAAE,yCAAyC;KACvD;CACF,CAAC;AAEF,MAAM,OAAO,GAAmB;IAC9B,EAAE,EAAE,KAAK;IACT,KAAK,EAAE,EAAE;IACT,QAAQ,EAAE,IAAI;IACd,KAAK,EAAE,sBAAsB;IAC7B,WAAW,EAAE,gEAAgE;IAC7E,OAAO,EAAE;QACP;YACE,EAAE,EAAE,SAAS;YACb,IAAI,EAAE,kBAAkB;YACxB,KAAK,EAAE,iBAAiB;YACxB,WAAW,EACT,iNAAiN;YACnN,OAAO,EAAE,IAAI;YACb,OAAO,EAAE;gBACP,KAAK,EAAE,KAAK;aACb;SACF;QACD,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,EAAE;YACvE,MAAM,IAAI,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;YACzC,OAAO;gBACL,EAAE;gBACF,IAAI,EAAE,MAAe;gBACrB,KAAK;gBACL,WAAW;gBACX,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACrC,OAAO,EAAE;oBACP,UAAU,EAAE,WAAoB;oBAChC,MAAM,EAAE;wBACN;4BACE,GAAG,EAAE,IAAI,CAAC,MAAM;4BAChB,KAAK,EAAE,IAAI,CAAC,MAAM;4BAClB,WAAW,EAAE,IAAI,CAAC,WAAW;4BAC7B,MAAM,EAAE,IAAI;yBACb;qBACF;iBACF;aACF,CAAC;QACJ,CAAC,CAAC;KACH;IACD,UAAU,EAAE,KAAK,IAAI,EAAE;QACrB,IAAI,CAAC;YACH,MAAM,EAAE,2BAA2B,EAAE,GACnC,MAAM,MAAM,CAAC,kCAAkC,CAAC,CAAC;YACnD,IAAI,MAAM,2BAA2B,EAAE;gBAAE,OAAO,IAAI,CAAC;QACvD,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB;gBAAE,OAAO,IAAI,CAAC;QACnD,CAAC;QACD,IAAI,CAAC;YACH,IAAI,MAAM,2BAA2B,EAAE;gBAAE,OAAO,IAAI,CAAC;QACvD,CAAC;QAAC,MAAM,CAAC;YACP,wCAAwC;QAC1C,CAAC;QACD,IAAI,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QACjE,IAAI,CAAC;YACH,OAAO,8BAA8B,CAAC,MAAM,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC;QAC1E,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;CACF,CAAC;AAEF,6EAA6E;AAC7E,MAAM,YAAY,GAAmB;IACnC,EAAE,EAAE,UAAU;IACd,KAAK,EAAE,EAAE;IACT,QAAQ,EAAE,KAAK;IACf,KAAK,EAAE,UAAU;IACjB,WAAW,EACT,+GAA+G;IACjH,OAAO,EAAE;QACP;YACE,EAAE,EAAE,cAAc;YAClB,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,kBAAkB;YACzB,WAAW,EAAE,sDAAsD;YACnE,OAAO,EAAE;gBACP,UAAU,EAAE,WAAW;gBACvB,MAAM,EAAE;oBACN;wBACE,GAAG,EAAE,cAAc;wBACnB,KAAK,EAAE,cAAc;wBACrB,WAAW,EAAE,kDAAkD;qBAChE;oBACD;wBACE,GAAG,EAAE,qBAAqB;wBAC1B,KAAK,EAAE,iCAAiC;wBACxC,WAAW,EAAE,0CAA0C;wBACvD,MAAM,EAAE,IAAI;qBACb;iBACF;aACF;SACF;KACF;IACD,kEAAkE;IAClE,UAAU,EAAE,GAAG,EAAE,CAAC,IAAI;CACvB,CAAC;AAEF,yEAAyE;AACzE,MAAM,QAAQ,GAAmB;IAC/B,EAAE,EAAE,MAAM;IACV,KAAK,EAAE,EAAE;IACT,QAAQ,EAAE,KAAK;IACf,KAAK,EAAE,gBAAgB;IACvB,WAAW,EACT,qHAAqH;IACvH,OAAO,EAAE;QACP;YACE,EAAE,EAAE,cAAc;YAClB,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,cAAc;YACrB,WAAW,EAAE,6CAA6C;YAC1D,OAAO,EAAE;gBACP,UAAU,EAAE,WAAW;gBACvB,MAAM,EAAE;oBACN,EAAE,GAAG,EAAE,kBAAkB,EAAE,KAAK,EAAE,kBAAkB,EAAE;oBACtD;wBACE,GAAG,EAAE,sBAAsB;wBAC3B,KAAK,EAAE,sBAAsB;wBAC7B,MAAM,EAAE,IAAI;qBACb;iBACF;aACF;SACF;QACD;YACE,EAAE,EAAE,cAAc;YAClB,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,cAAc;YACrB,WAAW,EAAE,6CAA6C;YAC1D,OAAO,EAAE;gBACP,UAAU,EAAE,WAAW;gBACvB,MAAM,EAAE;oBACN,EAAE,GAAG,EAAE,kBAAkB,EAAE,KAAK,EAAE,kBAAkB,EAAE;oBACtD;wBACE,GAAG,EAAE,sBAAsB;wBAC3B,KAAK,EAAE,sBAAsB;wBAC7B,MAAM,EAAE,IAAI;qBACb;iBACF;aACF;SACF;QACD;YACE,EAAE,EAAE,cAAc;YAClB,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,qBAAqB;YAC5B,WAAW,EAAE,kDAAkD;YAC/D,OAAO,EAAE;gBACP,UAAU,EAAE,WAAW;gBACvB,MAAM,EAAE;oBACN;wBACE,GAAG,EAAE,cAAc;wBACnB,KAAK,EAAE,cAAc;wBACrB,WAAW,EAAE,6BAA6B;wBAC1C,MAAM,EAAE,IAAI;qBACb;iBACF;aACF;SACF;KACF;IACD,UAAU,EAAE,GAAG,EAAE,CAAC,IAAI;CACvB,CAAC;AAEF,6EAA6E;AAC7E,MAAM,SAAS,GAAmB;IAChC,EAAE,EAAE,OAAO;IACX,KAAK,EAAE,EAAE;IACT,QAAQ,EAAE,KAAK;IACf,KAAK,EAAE,gBAAgB;IACvB,WAAW,EACT,iIAAiI;IACnI,OAAO,EAAE;QACP;YACE,EAAE,EAAE,QAAQ;YACZ,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,QAAQ;YACf,WAAW,EAAE,qCAAqC;YAClD,OAAO,EAAE;gBACP,UAAU,EAAE,WAAW;gBACvB,MAAM,EAAE;oBACN;wBACE,GAAG,EAAE,gBAAgB;wBACrB,KAAK,EAAE,gBAAgB;wBACvB,WAAW,EAAE,QAAQ;wBACrB,MAAM,EAAE,IAAI;qBACb;oBACD;wBACE,GAAG,EAAE,YAAY;wBACjB,KAAK,EAAE,2BAA2B;wBAClC,WAAW,EAAE,uCAAuC;qBACrD;oBACD;wBACE,GAAG,EAAE,UAAU;wBACf,KAAK,EAAE,mCAAmC;wBAC1C,WAAW,EAAE,YAAY;qBAC1B;iBACF;aACF;SACF;QACD;YACE,EAAE,EAAE,UAAU;YACd,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,UAAU;YACjB,WAAW,EAAE,uCAAuC;YACpD,OAAO,EAAE;gBACP,UAAU,EAAE,WAAW;gBACvB,MAAM,EAAE;oBACN;wBACE,GAAG,EAAE,kBAAkB;wBACvB,KAAK,EAAE,kBAAkB;wBACzB,WAAW,EAAE,QAAQ;wBACrB,MAAM,EAAE,IAAI;qBACb;oBACD;wBACE,GAAG,EAAE,YAAY;wBACjB,KAAK,EAAE,2BAA2B;wBAClC,WAAW,EAAE,uCAAuC;qBACrD;iBACF;aACF;SACF;KACF;IACD,UAAU,EAAE,GAAG,EAAE;QACf,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc;YAAE,OAAO,IAAI,CAAC;QAC5C,uEAAuE;QACvE,wEAAwE;QACxE,iBAAiB;QACjB,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB;YAAE,OAAO,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;QAClE,OAAO,KAAK,CAAC;IACf,CAAC;CACF,CAAC;AAEF,IAAI,UAAU,GAAG,KAAK,CAAC;AAEvB,6DAA6D;AAC7D,MAAM,UAAU,8BAA8B;IAC5C,IAAI,UAAU;QAAE,OAAO;IACvB,UAAU,GAAG,IAAI,CAAC;IAClB,sBAAsB,CAAC,OAAO,CAAC,CAAC;IAChC,sBAAsB,CAAC,YAAY,CAAC,CAAC;IACrC,sBAAsB,CAAC,QAAQ,CAAC,CAAC;IACjC,sBAAsB,CAAC,SAAS,CAAC,CAAC;AACpC,CAAC","sourcesContent":["/**\n * Default framework-level onboarding steps.\n *\n * Registered when `createOnboardingPlugin()` mounts (auto-mount or explicit).\n * Templates can override any step by registering another step with the same\n * `id` after these have been registered.\n */\n\nimport { registerOnboardingStep } from \"./registry.js\";\nimport type { OnboardingStep } from \"./types.js\";\nimport {\n PROVIDER_ENV_META,\n PROVIDER_ENV_VARS,\n} from \"../agent/engine/provider-env-vars.js\";\nimport {\n detectEngineFromUserSecrets,\n isAgentEngineSettingConfigured,\n} from \"../agent/engine/registry.js\";\nimport { getSetting } from \"../settings/store.js\";\n\ntype LlmKeyMethod = {\n provider: keyof typeof PROVIDER_ENV_META;\n id: string;\n label: string;\n description: string;\n primary?: boolean;\n};\n\nconst LLM_KEY_METHODS: LlmKeyMethod[] = [\n {\n provider: \"anthropic\",\n id: \"anthropic-key\",\n label: \"Anthropic\",\n description: \"Claude models with your own Anthropic key.\",\n },\n {\n provider: \"openai\",\n id: \"openai-key\",\n label: \"OpenAI\",\n description: \"GPT models with your own OpenAI key.\",\n },\n {\n provider: \"google\",\n id: \"google-key\",\n label: \"Google Gemini\",\n description: \"Gemini models with your own Google AI key.\",\n },\n {\n provider: \"openrouter\",\n id: \"openrouter-key\",\n label: \"OpenRouter\",\n description: \"OpenRouter models with your own OpenRouter key.\",\n },\n {\n provider: \"groq\",\n id: \"groq-key\",\n label: \"Groq\",\n description: \"Groq-hosted models with your own Groq key.\",\n },\n {\n provider: \"mistral\",\n id: \"mistral-key\",\n label: \"Mistral\",\n description: \"Mistral models with your own Mistral key.\",\n },\n {\n provider: \"cohere\",\n id: \"cohere-key\",\n label: \"Cohere\",\n description: \"Cohere models with your own Cohere key.\",\n },\n];\n\nconst llmStep: OnboardingStep = {\n id: \"llm\",\n order: 10,\n required: true,\n title: \"Connect an AI engine\",\n description: \"Use Builder's managed gateway, or bring your own provider key.\",\n methods: [\n {\n id: \"builder\",\n kind: \"builder-cli-auth\",\n label: \"Connect Builder\",\n description:\n \"Connect the Builder space where this app should run. This unlocks managed LLM credits, browser automation, and file uploads. Cloud code changes appear when Builder Cloud Agents are enabled for the workspace.\",\n primary: true,\n payload: {\n scope: \"llm\",\n },\n },\n ...LLM_KEY_METHODS.map(({ provider, id, label, description, primary }) => {\n const meta = PROVIDER_ENV_META[provider];\n return {\n id,\n kind: \"form\" as const,\n label,\n description,\n ...(primary ? { primary: true } : {}),\n payload: {\n writeScope: \"workspace\" as const,\n fields: [\n {\n key: meta.envVar,\n label: meta.envVar,\n placeholder: meta.placeholder,\n secret: true,\n },\n ],\n },\n };\n }),\n ],\n isComplete: async () => {\n try {\n const { resolveHasBuilderPrivateKey } =\n await import(\"../server/credential-provider.js\");\n if (await resolveHasBuilderPrivateKey()) return true;\n } catch {\n if (process.env.BUILDER_PRIVATE_KEY) return true;\n }\n try {\n if (await detectEngineFromUserSecrets()) return true;\n } catch {\n // Fall through to legacy/env detection.\n }\n if (PROVIDER_ENV_VARS.some((k) => !!process.env[k])) return true;\n try {\n return isAgentEngineSettingConfigured(await getSetting(\"agent-engine\"));\n } catch {\n return false;\n }\n },\n};\n\n/** Step 2 — where application data lives. The default DB is non-blocking. */\nconst databaseStep: OnboardingStep = {\n id: \"database\",\n order: 20,\n required: false,\n title: \"Database\",\n description:\n \"Agent-native stores app data in SQL. Set DATABASE_URL when you want to point this app at a specific database.\",\n methods: [\n {\n id: \"database-url\",\n kind: \"form\",\n label: \"Set DATABASE_URL\",\n description: \"Paste the SQL connection string this app should use.\",\n payload: {\n writeScope: \"workspace\",\n fields: [\n {\n key: \"DATABASE_URL\",\n label: \"DATABASE_URL\",\n placeholder: \"postgres://..., libsql://..., file:./data/app.db\",\n },\n {\n key: \"DATABASE_AUTH_TOKEN\",\n label: \"DATABASE_AUTH_TOKEN (if needed)\",\n placeholder: \"Token for providers such as Turso/libSQL\",\n secret: true,\n },\n ],\n },\n },\n ],\n // The default local database means this step is always satisfied.\n isComplete: () => true,\n};\n\n/** Step 3 — how users sign in. Built-in account auth is non-blocking. */\nconst authStep: OnboardingStep = {\n id: \"auth\",\n order: 30,\n required: false,\n title: \"Authentication\",\n description:\n \"Built-in email/password accounts work by default. Add OAuth or access tokens only if you want another sign-in path.\",\n methods: [\n {\n id: \"google-oauth\",\n kind: \"form\",\n label: \"Google OAuth\",\n description: \"Add Google as an optional sign-in provider.\",\n payload: {\n writeScope: \"workspace\",\n fields: [\n { key: \"GOOGLE_CLIENT_ID\", label: \"GOOGLE_CLIENT_ID\" },\n {\n key: \"GOOGLE_CLIENT_SECRET\",\n label: \"GOOGLE_CLIENT_SECRET\",\n secret: true,\n },\n ],\n },\n },\n {\n id: \"github-oauth\",\n kind: \"form\",\n label: \"GitHub OAuth\",\n description: \"Add GitHub as an optional sign-in provider.\",\n payload: {\n writeScope: \"workspace\",\n fields: [\n { key: \"GITHUB_CLIENT_ID\", label: \"GITHUB_CLIENT_ID\" },\n {\n key: \"GITHUB_CLIENT_SECRET\",\n label: \"GITHUB_CLIENT_SECRET\",\n secret: true,\n },\n ],\n },\n },\n {\n id: \"access-token\",\n kind: \"form\",\n label: \"Shared access token\",\n description: \"Use a simple token gate for private deployments.\",\n payload: {\n writeScope: \"workspace\",\n fields: [\n {\n key: \"ACCESS_TOKEN\",\n label: \"ACCESS_TOKEN\",\n placeholder: \"Paste a strong shared token\",\n secret: true,\n },\n ],\n },\n },\n ],\n isComplete: () => true,\n};\n\n/** Step 4 — transactional email (password resets, invitations). Optional. */\nconst emailStep: OnboardingStep = {\n id: \"email\",\n order: 40,\n required: false,\n title: \"Email delivery\",\n description:\n \"Optional for local work. Before deploying with password resets, invitations, or share notifications, connect an email provider.\",\n methods: [\n {\n id: \"resend\",\n kind: \"form\",\n label: \"Resend\",\n description: \"Use Resend for transactional email.\",\n payload: {\n writeScope: \"workspace\",\n fields: [\n {\n key: \"RESEND_API_KEY\",\n label: \"RESEND_API_KEY\",\n placeholder: \"re_...\",\n secret: true,\n },\n {\n key: \"EMAIL_FROM\",\n label: \"EMAIL_FROM (from address)\",\n placeholder: \"Agent Native <noreply@yourdomain.com>\",\n },\n {\n key: \"APP_NAME\",\n label: \"APP_NAME (shown in invite emails)\",\n placeholder: \"Acme Forms\",\n },\n ],\n },\n },\n {\n id: \"sendgrid\",\n kind: \"form\",\n label: \"SendGrid\",\n description: \"Use SendGrid for transactional email.\",\n payload: {\n writeScope: \"workspace\",\n fields: [\n {\n key: \"SENDGRID_API_KEY\",\n label: \"SENDGRID_API_KEY\",\n placeholder: \"SG....\",\n secret: true,\n },\n {\n key: \"EMAIL_FROM\",\n label: \"EMAIL_FROM (from address)\",\n placeholder: \"Agent Native <noreply@yourdomain.com>\",\n },\n ],\n },\n },\n ],\n isComplete: () => {\n if (process.env.RESEND_API_KEY) return true;\n // SendGrid rejects Resend's sandbox sender, so EMAIL_FROM must also be\n // set — otherwise sendEmail() throws at runtime even though the API key\n // is configured.\n if (process.env.SENDGRID_API_KEY) return !!process.env.EMAIL_FROM;\n return false;\n },\n};\n\nlet registered = false;\n\n/** Idempotent. Safe to call from every plugin-mount call. */\nexport function registerDefaultOnboardingSteps(): void {\n if (registered) return;\n registered = true;\n registerOnboardingStep(llmStep);\n registerOnboardingStep(databaseStep);\n registerOnboardingStep(authStep);\n registerOnboardingStep(emailStep);\n}\n"]}