@agent-native/core 0.13.0 → 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent/production-agent.d.ts +23 -1
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +82 -1
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/agent/run-store.d.ts.map +1 -1
- package/dist/agent/run-store.js +8 -2
- package/dist/agent/run-store.js.map +1 -1
- package/dist/agent/types.d.ts +1 -1
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js.map +1 -1
- package/dist/cli/templates-meta.js +10 -10
- package/dist/cli/templates-meta.js.map +1 -1
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +1 -1
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/ConnectBuilderCard.d.ts.map +1 -1
- package/dist/client/ConnectBuilderCard.js +24 -0
- package/dist/client/ConnectBuilderCard.js.map +1 -1
- package/dist/client/analytics.d.ts.map +1 -1
- package/dist/client/analytics.js +10 -1
- package/dist/client/analytics.js.map +1 -1
- package/dist/client/components/AgentPresenceChip.d.ts +1 -1
- package/dist/client/components/AgentPresenceChip.js +1 -1
- package/dist/client/components/AgentPresenceChip.js.map +1 -1
- package/dist/client/components/CodeRequiredDialog.js +4 -4
- package/dist/client/components/CodeRequiredDialog.js.map +1 -1
- package/dist/client/components/PresenceBar.js +1 -1
- package/dist/client/components/PresenceBar.js.map +1 -1
- package/dist/client/composer/VoiceButton.js +3 -3
- package/dist/client/composer/VoiceButton.js.map +1 -1
- package/dist/client/extensions/ExtensionsSidebarSection.js +1 -1
- package/dist/client/extensions/ExtensionsSidebarSection.js.map +1 -1
- package/dist/client/onboarding/OnboardingPanel.js +1 -1
- package/dist/client/onboarding/OnboardingPanel.js.map +1 -1
- package/dist/client/settings/SecretsSection.js +3 -3
- package/dist/client/settings/SecretsSection.js.map +1 -1
- package/dist/client/use-db-sync.d.ts.map +1 -1
- package/dist/client/use-db-sync.js +3 -1
- package/dist/client/use-db-sync.js.map +1 -1
- package/dist/collab/agent-identity.js +1 -1
- package/dist/collab/agent-identity.js.map +1 -1
- package/dist/collab/client.js +1 -1
- package/dist/collab/client.js.map +1 -1
- package/dist/db/client.d.ts.map +1 -1
- package/dist/db/client.js +9 -0
- package/dist/db/client.js.map +1 -1
- package/dist/db/create-get-db.d.ts.map +1 -1
- package/dist/db/create-get-db.js +7 -0
- package/dist/db/create-get-db.js.map +1 -1
- package/dist/extensions/actions.js +1 -1
- package/dist/extensions/actions.js.map +1 -1
- package/dist/extensions/fetch-tool.d.ts.map +1 -1
- package/dist/extensions/fetch-tool.js +46 -5
- package/dist/extensions/fetch-tool.js.map +1 -1
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +73 -7
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/agent-discovery.d.ts +21 -0
- package/dist/server/agent-discovery.d.ts.map +1 -1
- package/dist/server/agent-discovery.js +18 -3
- package/dist/server/agent-discovery.js.map +1 -1
- package/dist/server/auth.d.ts +27 -0
- package/dist/server/auth.d.ts.map +1 -1
- package/dist/server/auth.js +71 -12
- package/dist/server/auth.js.map +1 -1
- package/dist/server/better-auth-instance.js +13 -0
- package/dist/server/better-auth-instance.js.map +1 -1
- package/dist/server/google-auth-mode.d.ts +20 -0
- package/dist/server/google-auth-mode.d.ts.map +1 -0
- package/dist/server/google-auth-mode.js +20 -0
- package/dist/server/google-auth-mode.js.map +1 -0
- package/dist/server/google-auth-plugin.d.ts +7 -0
- package/dist/server/google-auth-plugin.d.ts.map +1 -1
- package/dist/server/google-auth-plugin.js +47 -5
- package/dist/server/google-auth-plugin.js.map +1 -1
- package/dist/server/index.d.ts +1 -0
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js.map +1 -1
- package/dist/server/oauth-public-origin.d.ts +2 -0
- package/dist/server/oauth-public-origin.d.ts.map +1 -0
- package/dist/server/oauth-public-origin.js +28 -0
- package/dist/server/oauth-public-origin.js.map +1 -0
- package/dist/server/onboarding-html.d.ts +7 -0
- package/dist/server/onboarding-html.d.ts.map +1 -1
- package/dist/server/onboarding-html.js +46 -3
- package/dist/server/onboarding-html.js.map +1 -1
- package/dist/server/sentry.d.ts.map +1 -1
- package/dist/server/sentry.js +41 -0
- package/dist/server/sentry.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
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,
|
|
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,2CAuUzB"}
|
|
@@ -47,6 +47,14 @@ export function ConnectBuilderCard({ configured: initialConfigured, builderEnabl
|
|
|
47
47
|
const [sendErr, setSendErr] = useState(null);
|
|
48
48
|
const [localBrowser, setLocalBrowser] = useState(false);
|
|
49
49
|
const mountedRef = useRef(true);
|
|
50
|
+
// Tracks whether the user clicked "Connect Builder" *this session*. When
|
|
51
|
+
// the connect-then-poll round-trip lands `configured=true`, we use this
|
|
52
|
+
// flag to decide whether to retry the user's pending prompt automatically
|
|
53
|
+
// — the alternative is making them click "Send to Builder" a second time
|
|
54
|
+
// even though the agent had already captured their original ask. We do
|
|
55
|
+
// NOT auto-send when the card mounts already-connected (e.g. user
|
|
56
|
+
// revisits an old thread) — only when the connect just succeeded.
|
|
57
|
+
const wasConnectingRef = useRef(false);
|
|
50
58
|
useEffect(() => {
|
|
51
59
|
mountedRef.current = true;
|
|
52
60
|
setLocalBrowser(isLocalBrowserOutsideDesktop());
|
|
@@ -112,6 +120,22 @@ export function ConnectBuilderCard({ configured: initialConfigured, builderEnabl
|
|
|
112
120
|
const err = sendErr ?? waitlistErr ?? flow.error;
|
|
113
121
|
const hasPrompt = prompt.trim().length > 0;
|
|
114
122
|
const canSend = configured && builderEnabled && hasPrompt;
|
|
123
|
+
// Auto-send the user's pending prompt the moment connecting finishes
|
|
124
|
+
// successfully. Without this, the connect popup closing leaves the user
|
|
125
|
+
// staring at a "Send to Builder" button — feels like they have to
|
|
126
|
+
// re-submit even though the prompt is right there in the card.
|
|
127
|
+
useEffect(() => {
|
|
128
|
+
if (flow.connecting) {
|
|
129
|
+
wasConnectingRef.current = true;
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
if (!wasConnectingRef.current)
|
|
133
|
+
return;
|
|
134
|
+
if (canSend && !sending && !runResult && !sendErr) {
|
|
135
|
+
wasConnectingRef.current = false;
|
|
136
|
+
void handleSend();
|
|
137
|
+
}
|
|
138
|
+
}, [flow.connecting, canSend, sending, runResult, sendErr, handleSend]);
|
|
115
139
|
// Branch creation is gated by a server-side project id, which may come
|
|
116
140
|
// from deployment config or org-scoped secrets.
|
|
117
141
|
const showWaitlist = !builderEnabled && hasPrompt;
|
|
@@ -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://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 coming soon\";\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
|
+
{"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 // Tracks whether the user clicked \"Connect Builder\" *this session*. When\n // the connect-then-poll round-trip lands `configured=true`, we use this\n // flag to decide whether to retry the user's pending prompt automatically\n // — the alternative is making them click \"Send to Builder\" a second time\n // even though the agent had already captured their original ask. We do\n // NOT auto-send when the card mounts already-connected (e.g. user\n // revisits an old thread) — only when the connect just succeeded.\n const wasConnectingRef = useRef(false);\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\n // Auto-send the user's pending prompt the moment connecting finishes\n // successfully. Without this, the connect popup closing leaves the user\n // staring at a \"Send to Builder\" button — feels like they have to\n // re-submit even though the prompt is right there in the card.\n useEffect(() => {\n if (flow.connecting) {\n wasConnectingRef.current = true;\n return;\n }\n if (!wasConnectingRef.current) return;\n if (canSend && !sending && !runResult && !sendErr) {\n wasConnectingRef.current = false;\n void handleSend();\n }\n }, [flow.connecting, canSend, sending, runResult, sendErr, handleSend]);\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 coming soon\";\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":"analytics.d.ts","sourceRoot":"","sources":["../../src/client/analytics.ts"],"names":[],"mappings":"AAGA,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC;QAChC,uBAAuB,CAAC,EAAE;YACxB,SAAS,CAAC,EAAE,MAAM,CAAC;YACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;SAC5B,CAAC;KACH;CACF;AAED,KAAK,eAAe,GAAG,CACrB,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAChC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAO7B,KAAK,UAAU,GAAG;IAChB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;
|
|
1
|
+
{"version":3,"file":"analytics.d.ts","sourceRoot":"","sources":["../../src/client/analytics.ts"],"names":[],"mappings":"AAGA,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC;QAChC,uBAAuB,CAAC,EAAE;YACxB,SAAS,CAAC,EAAE,MAAM,CAAC;YACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;SAC5B,CAAC;KACH;CACF;AAED,KAAK,eAAe,GAAG,CACrB,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAChC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAO7B,KAAK,UAAU,GAAG;IAChB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAiLF;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,UAAU,GAAG,IAAI,EACvB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GACpB,IAAI,CAYN;AAED,MAAM,WAAW,oBAAoB;IACnC,6DAA6D;IAC7D,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IAC1C;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACpD;AAED;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,OAAO,EACd,OAAO,GAAE,oBAAyB,GACjC,MAAM,GAAG,SAAS,CAyBpB;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,OAAO,EACd,OAAO,GAAE,oBAAyB,GACjC,MAAM,GAAG,SAAS,CAEpB;AAeD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE;IACzC,eAAe,CAAC,EAAE,eAAe,CAAC;CACnC,GAAG,IAAI,CASP;AAiJD,wBAAgB,UAAU,CACxB,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,IAAI,CASN;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAE1D"}
|
package/dist/client/analytics.js
CHANGED
|
@@ -70,7 +70,16 @@ function scrubUrl(url) {
|
|
|
70
70
|
}
|
|
71
71
|
}
|
|
72
72
|
function shouldDropBrowserSentryNoise(event) {
|
|
73
|
-
const
|
|
73
|
+
const exceptionValues = event.exception?.values ?? [];
|
|
74
|
+
// AgentAutoContinueSignal is a control-flow sentinel thrown to bubble
|
|
75
|
+
// out of the SSE stream parser when the agent run needs to be
|
|
76
|
+
// auto-continued. It's caught by the chat adapter and is never a real
|
|
77
|
+
// error. Drop it unconditionally — capturing it as a Sentry exception
|
|
78
|
+
// pollutes the issue list with sentinels that have no actionable stack.
|
|
79
|
+
if (exceptionValues.some((value) => value.type === "AgentAutoContinueSignal")) {
|
|
80
|
+
return true;
|
|
81
|
+
}
|
|
82
|
+
const exceptionText = exceptionValues
|
|
74
83
|
.map((value) => `${value.type ?? ""} ${value.value ?? ""}`)
|
|
75
84
|
.join(" ")
|
|
76
85
|
.toLowerCase();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analytics.js","sourceRoot":"","sources":["../../src/client/analytics.ts"],"names":[],"mappings":"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","sourcesContent":["import * as amplitude from \"@amplitude/analytics-browser\";\nimport * as Sentry from \"@sentry/browser\";\n\ndeclare global {\n interface Window {\n gtag?: (...args: any[]) => void;\n __AGENT_NATIVE_CONFIG__?: {\n sentryDsn?: string;\n sentryEnvironment?: string;\n };\n }\n}\n\ntype GetDefaultProps = (\n name: string,\n properties: Record<string, unknown>,\n) => Record<string, unknown>;\n\ntype PageviewTrackingState = {\n installed: boolean;\n lastPageviewKey: string | null;\n};\n\ntype SentryUser = {\n id?: string;\n email?: string;\n username?: string;\n};\n\nlet _getDefaultProps: GetDefaultProps | null = null;\nlet _amplitudeInitialized = false;\nlet _sentryInitialized = false;\n// Buffer for setSentryUser calls made before Sentry has initialized.\n// `undefined` means \"no pending update\"; `null` means \"pending clear\".\nlet _pendingSentryUser: SentryUser | null | undefined = undefined;\nlet _pendingSentryOrgId: string | null | undefined = undefined;\n\nconst AGENT_NATIVE_ANALYTICS_DEFAULT_ENDPOINT =\n \"https://analytics.agent-native.com/track\";\nconst PAGEVIEW_TRACKING_STATE_KEY = Symbol.for(\n \"agent-native.client.pageviewTracking\",\n);\n\nfunction isLocalAnalyticsHostname(hostname: string | undefined): boolean {\n const h = (hostname || \"\").toLowerCase();\n return (\n h === \"localhost\" ||\n h === \"127.0.0.1\" ||\n h === \"::1\" ||\n h === \"[::1]\" ||\n h.endsWith(\".localhost\") ||\n h.endsWith(\".local\")\n );\n}\n\nfunction ensureAmplitude(): boolean {\n if (_amplitudeInitialized) return true;\n const key = (import.meta.env as Record<string, string | undefined>)\n ?.VITE_AMPLITUDE_API_KEY;\n if (!key) return false;\n amplitude.init(key, { autocapture: true });\n _amplitudeInitialized = true;\n return true;\n}\n\n/**\n * Query parameters that may carry sensitive values in the URL bar. Browser\n * Sentry collects `event.request.url` automatically; without scrubbing,\n * share tokens, password params (F-07), email-confirm tokens, etc. land in\n * Sentry events and become a recon vector for anyone with project access.\n */\nconst SENSITIVE_QUERY_PARAMS = new Set([\n \"password\",\n \"p\",\n \"token\",\n \"state\",\n \"code\",\n \"share\",\n \"share_token\",\n]);\n\nfunction scrubUrl(url: string | undefined): string | undefined {\n if (!url || typeof url !== \"string\") return url;\n try {\n // Parse using a base origin so relative URLs still work.\n const u = new URL(url, \"http://placeholder.local\");\n let mutated = false;\n for (const key of Array.from(u.searchParams.keys())) {\n if (SENSITIVE_QUERY_PARAMS.has(key.toLowerCase())) {\n u.searchParams.set(key, \"<redacted>\");\n mutated = true;\n }\n }\n if (!mutated) return url;\n // If the original URL was relative, return only the path/query/fragment.\n if (u.origin === \"http://placeholder.local\") {\n return `${u.pathname}${u.search}${u.hash}`;\n }\n return u.toString();\n } catch {\n return url;\n }\n}\n\nfunction shouldDropBrowserSentryNoise(event: Sentry.Event): boolean {\n const exceptionText = (event.exception?.values ?? [])\n .map((value) => `${value.type ?? \"\"} ${value.value ?? \"\"}`)\n .join(\" \")\n .toLowerCase();\n const requestUrl = event.request?.url?.toLowerCase() ?? \"\";\n const breadcrumbText = (event.breadcrumbs ?? [])\n .map((crumb) => {\n const data = crumb.data as Record<string, unknown> | undefined;\n return [\n crumb.category,\n crumb.message,\n typeof data?.url === \"string\" ? data.url : \"\",\n ].join(\" \");\n })\n .join(\" \")\n .toLowerCase();\n const combined = `${exceptionText} ${requestUrl} ${breadcrumbText}`;\n return (\n combined.includes(\"api2.amplitude.com\") &&\n (combined.includes(\"failed to fetch\") ||\n combined.includes(\"networkerror\") ||\n combined.includes(\"load failed\"))\n );\n}\n\nfunction getClientSentryDsn(): string | undefined {\n const env = (import.meta.env as Record<string, string | undefined>) ?? {};\n return (\n env.VITE_SENTRY_CLIENT_DSN ||\n env.VITE_SENTRY_DSN ||\n window.__AGENT_NATIVE_CONFIG__?.sentryDsn\n );\n}\n\nfunction ensureSentry(): void {\n if (_sentryInitialized) return;\n const dsn = getClientSentryDsn();\n if (!dsn) return;\n Sentry.init({\n dsn,\n environment:\n window.__AGENT_NATIVE_CONFIG__?.sentryEnvironment ||\n (import.meta.env as Record<string, string | undefined>)?.MODE ||\n \"production\",\n beforeSend(event) {\n if (shouldDropBrowserSentryNoise(event)) {\n return null;\n }\n // Strip sensitive query params from the request URL. React Router\n // history can include share tokens, ?signin=1, password reset codes,\n // public-share password params (audit F-07), etc.\n if (event.request?.url) {\n event.request.url = scrubUrl(event.request.url);\n }\n // Clean the same params from breadcrumb URLs (Sentry captures\n // history.pushState breadcrumbs by default).\n if (Array.isArray(event.breadcrumbs)) {\n for (const crumb of event.breadcrumbs) {\n if (crumb && typeof crumb === \"object\" && \"data\" in crumb) {\n const data = crumb.data as Record<string, unknown> | undefined;\n if (data && typeof data.url === \"string\") {\n data.url = scrubUrl(data.url);\n }\n if (data && typeof data.from === \"string\") {\n data.from = scrubUrl(data.from);\n }\n if (data && typeof data.to === \"string\") {\n data.to = scrubUrl(data.to);\n }\n }\n }\n }\n return event;\n },\n });\n Sentry.setTag(\"runtime\", \"browser\");\n _sentryInitialized = true;\n // Flush any user/tag that was set before init.\n if (_pendingSentryUser !== undefined) {\n Sentry.setUser(_pendingSentryUser);\n _pendingSentryUser = undefined;\n }\n if (_pendingSentryOrgId !== undefined) {\n Sentry.setTag(\"orgId\", _pendingSentryOrgId);\n _pendingSentryOrgId = undefined;\n }\n}\n\n/**\n * Attach the current user to Sentry events from the browser. Pass `null` to\n * clear (e.g. on logout). If Sentry isn't initialized yet, the value is\n * buffered and applied once `ensureSentry()` runs.\n *\n * Pass `orgId` to also tag events with the active organization ID — useful\n * for filtering Sentry by tenant.\n */\nexport function setSentryUser(\n user: SentryUser | null,\n orgId?: string | null,\n): void {\n if (_sentryInitialized) {\n Sentry.setUser(user);\n if (orgId !== undefined) {\n Sentry.setTag(\"orgId\", orgId ?? null);\n }\n return;\n }\n _pendingSentryUser = user;\n if (orgId !== undefined) {\n _pendingSentryOrgId = orgId ?? null;\n }\n}\n\nexport interface ClientCaptureContext {\n /** Searchable Sentry tags (low-cardinality strings only). */\n tags?: Record<string, string | undefined>;\n /**\n * High-cardinality / structured payload — not searchable but visible in\n * the Sentry event detail (file sizes, request URLs, response body\n * tails, etc.).\n */\n extra?: Record<string, unknown>;\n /**\n * Grouped contexts shown as separate cards in the Sentry event UI.\n */\n contexts?: Record<string, Record<string, unknown>>;\n}\n\n/**\n * Capture an exception to Sentry from browser code without forcing the\n * caller to depend on `@sentry/browser` directly.\n *\n * Templates can route a thrown Error through here on a known failure path\n * (chunk-upload 500, thumbnail upload, etc.) to attach searchable tags and\n * structured extra context. No-ops gracefully when Sentry isn't\n * initialized — never throws back into the caller, so a Sentry hiccup\n * can't mask the original error.\n */\nexport function captureClientException(\n error: unknown,\n context: ClientCaptureContext = {},\n): string | undefined {\n if (typeof window === \"undefined\") return undefined;\n try {\n ensureSentry();\n return Sentry.withScope((scope) => {\n if (context.tags) {\n for (const [k, v] of Object.entries(context.tags)) {\n if (typeof v === \"string\") scope.setTag(k, v);\n }\n }\n if (context.extra) {\n for (const [k, v] of Object.entries(context.extra)) {\n if (v !== undefined) scope.setExtra(k, v);\n }\n }\n if (context.contexts) {\n for (const [k, v] of Object.entries(context.contexts)) {\n scope.setContext(k, v);\n }\n }\n return Sentry.captureException(error);\n });\n } catch {\n return undefined;\n }\n}\n\n/**\n * Public browser-side error capture utility, mirroring `trackEvent()`:\n * templates can call `captureError(err, { tags, extra, contexts })` without\n * depending on Sentry directly. Sentry receives the event when a browser DSN\n * is configured; otherwise this is a quiet no-op.\n */\nexport function captureError(\n error: unknown,\n context: ClientCaptureContext = {},\n): string | undefined {\n return captureClientException(error, context);\n}\n\nfunction getPageviewTrackingState(): PageviewTrackingState {\n const g = globalThis as typeof globalThis & {\n [PAGEVIEW_TRACKING_STATE_KEY]?: PageviewTrackingState;\n };\n if (!g[PAGEVIEW_TRACKING_STATE_KEY]) {\n g[PAGEVIEW_TRACKING_STATE_KEY] = {\n installed: false,\n lastPageviewKey: null,\n };\n }\n return g[PAGEVIEW_TRACKING_STATE_KEY];\n}\n\nexport function configureTracking(options: {\n getDefaultProps?: GetDefaultProps;\n}): void {\n if (options.getDefaultProps) {\n _getDefaultProps = options.getDefaultProps;\n }\n if (typeof window !== \"undefined\") {\n ensureSentry();\n ensureAmplitude();\n installPageviewTracking();\n }\n}\n\nfunction inferTemplateName(properties: Record<string, unknown>): string | null {\n const envTemplate =\n (import.meta.env as Record<string, string | undefined>)\n ?.VITE_AGENT_NATIVE_TEMPLATE ||\n (import.meta.env as Record<string, string | undefined>)?.VITE_APP_TEMPLATE;\n if (envTemplate) return envTemplate;\n\n const app = typeof properties.app === \"string\" ? properties.app.trim() : \"\";\n if (!app || app === \"localhost\") return null;\n if (app.startsWith(\"agent-native-\")) {\n return app.slice(\"agent-native-\".length);\n }\n return app;\n}\n\nfunction resolveProps(\n name: string,\n params?: Record<string, unknown>,\n): Record<string, unknown> {\n if (typeof window === \"undefined\") return { ...params };\n const base: Record<string, unknown> = {\n url: window.location.origin + window.location.pathname,\n app: window.location.hostname.split(\".\")[0] || \"localhost\",\n ...params,\n };\n const props = _getDefaultProps ? _getDefaultProps(name, base) : base;\n if (props.template === undefined) {\n const template = inferTemplateName(props);\n if (template) {\n return { ...props, template };\n }\n }\n return props;\n}\n\nfunction pageviewKey(): string {\n return window.location.href;\n}\n\nfunction pageviewProperties(reason: string): Record<string, unknown> {\n const properties: Record<string, unknown> = {\n url: scrubUrl(window.location.href),\n path: window.location.pathname,\n hostname: window.location.hostname,\n navigation_type: reason,\n };\n if (window.location.search) {\n properties.search = scrubUrl(window.location.search);\n }\n if (typeof document !== \"undefined\") {\n if (document.referrer) {\n properties.referrer = scrubUrl(document.referrer);\n }\n if (document.title) {\n properties.title = document.title;\n }\n }\n return properties;\n}\n\nfunction emitPageview(reason: string): void {\n if (isLocalAnalyticsHostname(window.location.hostname)) return;\n const state = getPageviewTrackingState();\n const key = pageviewKey();\n if (state.lastPageviewKey === key) return;\n state.lastPageviewKey = key;\n trackEvent(\"pageview\", pageviewProperties(reason));\n}\n\nfunction schedulePageview(reason: string): void {\n const run = () => emitPageview(reason);\n if (typeof queueMicrotask === \"function\") {\n queueMicrotask(run);\n return;\n }\n window.setTimeout(run, 0);\n}\n\nfunction installPageviewTracking(): void {\n const state = getPageviewTrackingState();\n if (state.installed) return;\n state.installed = true;\n\n schedulePageview(\"load\");\n\n const originalPushState = window.history.pushState;\n const originalReplaceState = window.history.replaceState;\n\n window.history.pushState = function pushState(...args) {\n const result = originalPushState.apply(this, args);\n schedulePageview(\"pushState\");\n return result;\n };\n\n window.history.replaceState = function replaceState(...args) {\n const result = originalReplaceState.apply(this, args);\n schedulePageview(\"replaceState\");\n return result;\n };\n\n window.addEventListener(\"popstate\", () => schedulePageview(\"popstate\"));\n}\n\nfunction sendAgentNativeAnalytics(\n name: string,\n properties: Record<string, unknown>,\n): void {\n if (isLocalAnalyticsHostname(window.location.hostname)) return;\n\n const publicKey = (import.meta.env as Record<string, string | undefined>)\n ?.VITE_AGENT_NATIVE_ANALYTICS_PUBLIC_KEY;\n if (!publicKey) return;\n\n const endpoint =\n (import.meta.env as Record<string, string | undefined>)\n ?.VITE_AGENT_NATIVE_ANALYTICS_ENDPOINT ||\n AGENT_NATIVE_ANALYTICS_DEFAULT_ENDPOINT;\n const userId =\n typeof properties.userId === \"string\" ? properties.userId : undefined;\n const body = JSON.stringify({\n publicKey,\n event: name,\n properties,\n userId,\n timestamp: new Date().toISOString(),\n });\n\n try {\n if (navigator.sendBeacon) {\n const sent = navigator.sendBeacon(endpoint, body);\n if (sent) return;\n }\n fetch(endpoint, {\n method: \"POST\",\n body,\n keepalive: true,\n headers: { \"Content-Type\": \"text/plain;charset=UTF-8\" },\n }).catch(() => {});\n } catch {\n // best-effort\n }\n}\n\nexport function trackEvent(\n name: string,\n params?: Record<string, unknown>,\n): void {\n if (typeof window === \"undefined\") return;\n ensureSentry();\n const props = resolveProps(name, params);\n window.gtag?.(\"event\", name.replace(/\\s+/g, \"_\"), props);\n if (ensureAmplitude()) {\n amplitude.track(name, props);\n }\n sendAgentNativeAnalytics(name, props);\n}\n\nexport function trackSessionStatus(signedIn: boolean): void {\n trackEvent(\"session status\", { signed_in: signedIn });\n}\n"]}
|
|
1
|
+
{"version":3,"file":"analytics.js","sourceRoot":"","sources":["../../src/client/analytics.ts"],"names":[],"mappings":"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","sourcesContent":["import * as amplitude from \"@amplitude/analytics-browser\";\nimport * as Sentry from \"@sentry/browser\";\n\ndeclare global {\n interface Window {\n gtag?: (...args: any[]) => void;\n __AGENT_NATIVE_CONFIG__?: {\n sentryDsn?: string;\n sentryEnvironment?: string;\n };\n }\n}\n\ntype GetDefaultProps = (\n name: string,\n properties: Record<string, unknown>,\n) => Record<string, unknown>;\n\ntype PageviewTrackingState = {\n installed: boolean;\n lastPageviewKey: string | null;\n};\n\ntype SentryUser = {\n id?: string;\n email?: string;\n username?: string;\n};\n\nlet _getDefaultProps: GetDefaultProps | null = null;\nlet _amplitudeInitialized = false;\nlet _sentryInitialized = false;\n// Buffer for setSentryUser calls made before Sentry has initialized.\n// `undefined` means \"no pending update\"; `null` means \"pending clear\".\nlet _pendingSentryUser: SentryUser | null | undefined = undefined;\nlet _pendingSentryOrgId: string | null | undefined = undefined;\n\nconst AGENT_NATIVE_ANALYTICS_DEFAULT_ENDPOINT =\n \"https://analytics.agent-native.com/track\";\nconst PAGEVIEW_TRACKING_STATE_KEY = Symbol.for(\n \"agent-native.client.pageviewTracking\",\n);\n\nfunction isLocalAnalyticsHostname(hostname: string | undefined): boolean {\n const h = (hostname || \"\").toLowerCase();\n return (\n h === \"localhost\" ||\n h === \"127.0.0.1\" ||\n h === \"::1\" ||\n h === \"[::1]\" ||\n h.endsWith(\".localhost\") ||\n h.endsWith(\".local\")\n );\n}\n\nfunction ensureAmplitude(): boolean {\n if (_amplitudeInitialized) return true;\n const key = (import.meta.env as Record<string, string | undefined>)\n ?.VITE_AMPLITUDE_API_KEY;\n if (!key) return false;\n amplitude.init(key, { autocapture: true });\n _amplitudeInitialized = true;\n return true;\n}\n\n/**\n * Query parameters that may carry sensitive values in the URL bar. Browser\n * Sentry collects `event.request.url` automatically; without scrubbing,\n * share tokens, password params (F-07), email-confirm tokens, etc. land in\n * Sentry events and become a recon vector for anyone with project access.\n */\nconst SENSITIVE_QUERY_PARAMS = new Set([\n \"password\",\n \"p\",\n \"token\",\n \"state\",\n \"code\",\n \"share\",\n \"share_token\",\n]);\n\nfunction scrubUrl(url: string | undefined): string | undefined {\n if (!url || typeof url !== \"string\") return url;\n try {\n // Parse using a base origin so relative URLs still work.\n const u = new URL(url, \"http://placeholder.local\");\n let mutated = false;\n for (const key of Array.from(u.searchParams.keys())) {\n if (SENSITIVE_QUERY_PARAMS.has(key.toLowerCase())) {\n u.searchParams.set(key, \"<redacted>\");\n mutated = true;\n }\n }\n if (!mutated) return url;\n // If the original URL was relative, return only the path/query/fragment.\n if (u.origin === \"http://placeholder.local\") {\n return `${u.pathname}${u.search}${u.hash}`;\n }\n return u.toString();\n } catch {\n return url;\n }\n}\n\nfunction shouldDropBrowserSentryNoise(event: Sentry.Event): boolean {\n const exceptionValues = event.exception?.values ?? [];\n // AgentAutoContinueSignal is a control-flow sentinel thrown to bubble\n // out of the SSE stream parser when the agent run needs to be\n // auto-continued. It's caught by the chat adapter and is never a real\n // error. Drop it unconditionally — capturing it as a Sentry exception\n // pollutes the issue list with sentinels that have no actionable stack.\n if (\n exceptionValues.some((value) => value.type === \"AgentAutoContinueSignal\")\n ) {\n return true;\n }\n const exceptionText = exceptionValues\n .map((value) => `${value.type ?? \"\"} ${value.value ?? \"\"}`)\n .join(\" \")\n .toLowerCase();\n const requestUrl = event.request?.url?.toLowerCase() ?? \"\";\n const breadcrumbText = (event.breadcrumbs ?? [])\n .map((crumb) => {\n const data = crumb.data as Record<string, unknown> | undefined;\n return [\n crumb.category,\n crumb.message,\n typeof data?.url === \"string\" ? data.url : \"\",\n ].join(\" \");\n })\n .join(\" \")\n .toLowerCase();\n const combined = `${exceptionText} ${requestUrl} ${breadcrumbText}`;\n return (\n combined.includes(\"api2.amplitude.com\") &&\n (combined.includes(\"failed to fetch\") ||\n combined.includes(\"networkerror\") ||\n combined.includes(\"load failed\"))\n );\n}\n\nfunction getClientSentryDsn(): string | undefined {\n const env = (import.meta.env as Record<string, string | undefined>) ?? {};\n return (\n env.VITE_SENTRY_CLIENT_DSN ||\n env.VITE_SENTRY_DSN ||\n window.__AGENT_NATIVE_CONFIG__?.sentryDsn\n );\n}\n\nfunction ensureSentry(): void {\n if (_sentryInitialized) return;\n const dsn = getClientSentryDsn();\n if (!dsn) return;\n Sentry.init({\n dsn,\n environment:\n window.__AGENT_NATIVE_CONFIG__?.sentryEnvironment ||\n (import.meta.env as Record<string, string | undefined>)?.MODE ||\n \"production\",\n beforeSend(event) {\n if (shouldDropBrowserSentryNoise(event)) {\n return null;\n }\n // Strip sensitive query params from the request URL. React Router\n // history can include share tokens, ?signin=1, password reset codes,\n // public-share password params (audit F-07), etc.\n if (event.request?.url) {\n event.request.url = scrubUrl(event.request.url);\n }\n // Clean the same params from breadcrumb URLs (Sentry captures\n // history.pushState breadcrumbs by default).\n if (Array.isArray(event.breadcrumbs)) {\n for (const crumb of event.breadcrumbs) {\n if (crumb && typeof crumb === \"object\" && \"data\" in crumb) {\n const data = crumb.data as Record<string, unknown> | undefined;\n if (data && typeof data.url === \"string\") {\n data.url = scrubUrl(data.url);\n }\n if (data && typeof data.from === \"string\") {\n data.from = scrubUrl(data.from);\n }\n if (data && typeof data.to === \"string\") {\n data.to = scrubUrl(data.to);\n }\n }\n }\n }\n return event;\n },\n });\n Sentry.setTag(\"runtime\", \"browser\");\n _sentryInitialized = true;\n // Flush any user/tag that was set before init.\n if (_pendingSentryUser !== undefined) {\n Sentry.setUser(_pendingSentryUser);\n _pendingSentryUser = undefined;\n }\n if (_pendingSentryOrgId !== undefined) {\n Sentry.setTag(\"orgId\", _pendingSentryOrgId);\n _pendingSentryOrgId = undefined;\n }\n}\n\n/**\n * Attach the current user to Sentry events from the browser. Pass `null` to\n * clear (e.g. on logout). If Sentry isn't initialized yet, the value is\n * buffered and applied once `ensureSentry()` runs.\n *\n * Pass `orgId` to also tag events with the active organization ID — useful\n * for filtering Sentry by tenant.\n */\nexport function setSentryUser(\n user: SentryUser | null,\n orgId?: string | null,\n): void {\n if (_sentryInitialized) {\n Sentry.setUser(user);\n if (orgId !== undefined) {\n Sentry.setTag(\"orgId\", orgId ?? null);\n }\n return;\n }\n _pendingSentryUser = user;\n if (orgId !== undefined) {\n _pendingSentryOrgId = orgId ?? null;\n }\n}\n\nexport interface ClientCaptureContext {\n /** Searchable Sentry tags (low-cardinality strings only). */\n tags?: Record<string, string | undefined>;\n /**\n * High-cardinality / structured payload — not searchable but visible in\n * the Sentry event detail (file sizes, request URLs, response body\n * tails, etc.).\n */\n extra?: Record<string, unknown>;\n /**\n * Grouped contexts shown as separate cards in the Sentry event UI.\n */\n contexts?: Record<string, Record<string, unknown>>;\n}\n\n/**\n * Capture an exception to Sentry from browser code without forcing the\n * caller to depend on `@sentry/browser` directly.\n *\n * Templates can route a thrown Error through here on a known failure path\n * (chunk-upload 500, thumbnail upload, etc.) to attach searchable tags and\n * structured extra context. No-ops gracefully when Sentry isn't\n * initialized — never throws back into the caller, so a Sentry hiccup\n * can't mask the original error.\n */\nexport function captureClientException(\n error: unknown,\n context: ClientCaptureContext = {},\n): string | undefined {\n if (typeof window === \"undefined\") return undefined;\n try {\n ensureSentry();\n return Sentry.withScope((scope) => {\n if (context.tags) {\n for (const [k, v] of Object.entries(context.tags)) {\n if (typeof v === \"string\") scope.setTag(k, v);\n }\n }\n if (context.extra) {\n for (const [k, v] of Object.entries(context.extra)) {\n if (v !== undefined) scope.setExtra(k, v);\n }\n }\n if (context.contexts) {\n for (const [k, v] of Object.entries(context.contexts)) {\n scope.setContext(k, v);\n }\n }\n return Sentry.captureException(error);\n });\n } catch {\n return undefined;\n }\n}\n\n/**\n * Public browser-side error capture utility, mirroring `trackEvent()`:\n * templates can call `captureError(err, { tags, extra, contexts })` without\n * depending on Sentry directly. Sentry receives the event when a browser DSN\n * is configured; otherwise this is a quiet no-op.\n */\nexport function captureError(\n error: unknown,\n context: ClientCaptureContext = {},\n): string | undefined {\n return captureClientException(error, context);\n}\n\nfunction getPageviewTrackingState(): PageviewTrackingState {\n const g = globalThis as typeof globalThis & {\n [PAGEVIEW_TRACKING_STATE_KEY]?: PageviewTrackingState;\n };\n if (!g[PAGEVIEW_TRACKING_STATE_KEY]) {\n g[PAGEVIEW_TRACKING_STATE_KEY] = {\n installed: false,\n lastPageviewKey: null,\n };\n }\n return g[PAGEVIEW_TRACKING_STATE_KEY];\n}\n\nexport function configureTracking(options: {\n getDefaultProps?: GetDefaultProps;\n}): void {\n if (options.getDefaultProps) {\n _getDefaultProps = options.getDefaultProps;\n }\n if (typeof window !== \"undefined\") {\n ensureSentry();\n ensureAmplitude();\n installPageviewTracking();\n }\n}\n\nfunction inferTemplateName(properties: Record<string, unknown>): string | null {\n const envTemplate =\n (import.meta.env as Record<string, string | undefined>)\n ?.VITE_AGENT_NATIVE_TEMPLATE ||\n (import.meta.env as Record<string, string | undefined>)?.VITE_APP_TEMPLATE;\n if (envTemplate) return envTemplate;\n\n const app = typeof properties.app === \"string\" ? properties.app.trim() : \"\";\n if (!app || app === \"localhost\") return null;\n if (app.startsWith(\"agent-native-\")) {\n return app.slice(\"agent-native-\".length);\n }\n return app;\n}\n\nfunction resolveProps(\n name: string,\n params?: Record<string, unknown>,\n): Record<string, unknown> {\n if (typeof window === \"undefined\") return { ...params };\n const base: Record<string, unknown> = {\n url: window.location.origin + window.location.pathname,\n app: window.location.hostname.split(\".\")[0] || \"localhost\",\n ...params,\n };\n const props = _getDefaultProps ? _getDefaultProps(name, base) : base;\n if (props.template === undefined) {\n const template = inferTemplateName(props);\n if (template) {\n return { ...props, template };\n }\n }\n return props;\n}\n\nfunction pageviewKey(): string {\n return window.location.href;\n}\n\nfunction pageviewProperties(reason: string): Record<string, unknown> {\n const properties: Record<string, unknown> = {\n url: scrubUrl(window.location.href),\n path: window.location.pathname,\n hostname: window.location.hostname,\n navigation_type: reason,\n };\n if (window.location.search) {\n properties.search = scrubUrl(window.location.search);\n }\n if (typeof document !== \"undefined\") {\n if (document.referrer) {\n properties.referrer = scrubUrl(document.referrer);\n }\n if (document.title) {\n properties.title = document.title;\n }\n }\n return properties;\n}\n\nfunction emitPageview(reason: string): void {\n if (isLocalAnalyticsHostname(window.location.hostname)) return;\n const state = getPageviewTrackingState();\n const key = pageviewKey();\n if (state.lastPageviewKey === key) return;\n state.lastPageviewKey = key;\n trackEvent(\"pageview\", pageviewProperties(reason));\n}\n\nfunction schedulePageview(reason: string): void {\n const run = () => emitPageview(reason);\n if (typeof queueMicrotask === \"function\") {\n queueMicrotask(run);\n return;\n }\n window.setTimeout(run, 0);\n}\n\nfunction installPageviewTracking(): void {\n const state = getPageviewTrackingState();\n if (state.installed) return;\n state.installed = true;\n\n schedulePageview(\"load\");\n\n const originalPushState = window.history.pushState;\n const originalReplaceState = window.history.replaceState;\n\n window.history.pushState = function pushState(...args) {\n const result = originalPushState.apply(this, args);\n schedulePageview(\"pushState\");\n return result;\n };\n\n window.history.replaceState = function replaceState(...args) {\n const result = originalReplaceState.apply(this, args);\n schedulePageview(\"replaceState\");\n return result;\n };\n\n window.addEventListener(\"popstate\", () => schedulePageview(\"popstate\"));\n}\n\nfunction sendAgentNativeAnalytics(\n name: string,\n properties: Record<string, unknown>,\n): void {\n if (isLocalAnalyticsHostname(window.location.hostname)) return;\n\n const publicKey = (import.meta.env as Record<string, string | undefined>)\n ?.VITE_AGENT_NATIVE_ANALYTICS_PUBLIC_KEY;\n if (!publicKey) return;\n\n const endpoint =\n (import.meta.env as Record<string, string | undefined>)\n ?.VITE_AGENT_NATIVE_ANALYTICS_ENDPOINT ||\n AGENT_NATIVE_ANALYTICS_DEFAULT_ENDPOINT;\n const userId =\n typeof properties.userId === \"string\" ? properties.userId : undefined;\n const body = JSON.stringify({\n publicKey,\n event: name,\n properties,\n userId,\n timestamp: new Date().toISOString(),\n });\n\n try {\n if (navigator.sendBeacon) {\n const sent = navigator.sendBeacon(endpoint, body);\n if (sent) return;\n }\n fetch(endpoint, {\n method: \"POST\",\n body,\n keepalive: true,\n headers: { \"Content-Type\": \"text/plain;charset=UTF-8\" },\n }).catch(() => {});\n } catch {\n // best-effort\n }\n}\n\nexport function trackEvent(\n name: string,\n params?: Record<string, unknown>,\n): void {\n if (typeof window === \"undefined\") return;\n ensureSentry();\n const props = resolveProps(name, params);\n window.gtag?.(\"event\", name.replace(/\\s+/g, \"_\"), props);\n if (ensureAmplitude()) {\n amplitude.track(name, props);\n }\n sendAgentNativeAnalytics(name, props);\n}\n\nexport function trackSessionStatus(signedIn: boolean): void {\n trackEvent(\"session status\", { signed_in: signedIn });\n}\n"]}
|
|
@@ -14,7 +14,7 @@ function injectStyles() {
|
|
|
14
14
|
document.head.appendChild(style);
|
|
15
15
|
styleInjected = true;
|
|
16
16
|
}
|
|
17
|
-
export function AgentPresenceChip({ active, label = "AI editing", color = "#
|
|
17
|
+
export function AgentPresenceChip({ active, label = "AI editing", color = "#00B5FF", className, }) {
|
|
18
18
|
if (!active)
|
|
19
19
|
return null;
|
|
20
20
|
injectStyles();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AgentPresenceChip.js","sourceRoot":"","sources":["../../../src/client/components/AgentPresenceChip.tsx"],"names":[],"mappings":";AAWA,MAAM,cAAc,GAAG;;;;;CAKtB,CAAC;AAEF,IAAI,aAAa,GAAG,KAAK,CAAC;AAE1B,SAAS,YAAY;IACnB,IAAI,aAAa,IAAI,OAAO,QAAQ,KAAK,WAAW;QAAE,OAAO;IAC7D,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAC9C,KAAK,CAAC,WAAW,GAAG,cAAc,CAAC;IACnC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IACjC,aAAa,GAAG,IAAI,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,EAChC,MAAM,EACN,KAAK,GAAG,YAAY,EACpB,KAAK,GAAG,SAAS,EACjB,SAAS,GACc;IACvB,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAEzB,YAAY,EAAE,CAAC;IAEf,OAAO,CACL,gBACE,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE;YACL,OAAO,EAAE,aAAa;YACtB,UAAU,EAAE,QAAQ;YACpB,GAAG,EAAE,CAAC;YACN,MAAM,EAAE,EAAE;YACV,OAAO,EAAE,OAAO;YAChB,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,GAAG,KAAK,IAAI;YAC7B,KAAK;YACL,QAAQ,EAAE,EAAE;YACZ,UAAU,EAAE,GAAG;YACf,UAAU,EAAE,QAAQ;SACrB,aAED,eACE,KAAK,EAAE;oBACL,KAAK,EAAE,CAAC;oBACR,MAAM,EAAE,CAAC;oBACT,YAAY,EAAE,KAAK;oBACnB,eAAe,EAAE,KAAK;oBACtB,SAAS,EAAE,0BAA0B;oBACrC,UAAU,EAAE,CAAC;iBACd,GACD,EACD,KAAK,IACD,CACR,CAAC;AACJ,CAAC","sourcesContent":["export interface AgentPresenceChipProps {\n /** Whether the agent is actively editing this element. */\n active: boolean;\n /** Label text. Default: \"AI editing\" */\n label?: string;\n /** Color. Default: \"#
|
|
1
|
+
{"version":3,"file":"AgentPresenceChip.js","sourceRoot":"","sources":["../../../src/client/components/AgentPresenceChip.tsx"],"names":[],"mappings":";AAWA,MAAM,cAAc,GAAG;;;;;CAKtB,CAAC;AAEF,IAAI,aAAa,GAAG,KAAK,CAAC;AAE1B,SAAS,YAAY;IACnB,IAAI,aAAa,IAAI,OAAO,QAAQ,KAAK,WAAW;QAAE,OAAO;IAC7D,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAC9C,KAAK,CAAC,WAAW,GAAG,cAAc,CAAC;IACnC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IACjC,aAAa,GAAG,IAAI,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,EAChC,MAAM,EACN,KAAK,GAAG,YAAY,EACpB,KAAK,GAAG,SAAS,EACjB,SAAS,GACc;IACvB,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAEzB,YAAY,EAAE,CAAC;IAEf,OAAO,CACL,gBACE,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE;YACL,OAAO,EAAE,aAAa;YACtB,UAAU,EAAE,QAAQ;YACpB,GAAG,EAAE,CAAC;YACN,MAAM,EAAE,EAAE;YACV,OAAO,EAAE,OAAO;YAChB,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,GAAG,KAAK,IAAI;YAC7B,KAAK;YACL,QAAQ,EAAE,EAAE;YACZ,UAAU,EAAE,GAAG;YACf,UAAU,EAAE,QAAQ;SACrB,aAED,eACE,KAAK,EAAE;oBACL,KAAK,EAAE,CAAC;oBACR,MAAM,EAAE,CAAC;oBACT,YAAY,EAAE,KAAK;oBACnB,eAAe,EAAE,KAAK;oBACtB,SAAS,EAAE,0BAA0B;oBACrC,UAAU,EAAE,CAAC;iBACd,GACD,EACD,KAAK,IACD,CACR,CAAC;AACJ,CAAC","sourcesContent":["export interface AgentPresenceChipProps {\n /** Whether the agent is actively editing this element. */\n active: boolean;\n /** Label text. Default: \"AI editing\" */\n label?: string;\n /** Color. Default: \"#00B5FF\" */\n color?: string;\n /** Additional CSS classes. */\n className?: string;\n}\n\nconst pulseKeyframes = `\n@keyframes _anChipPulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.6; }\n}\n`;\n\nlet styleInjected = false;\n\nfunction injectStyles() {\n if (styleInjected || typeof document === \"undefined\") return;\n const style = document.createElement(\"style\");\n style.textContent = pulseKeyframes;\n document.head.appendChild(style);\n styleInjected = true;\n}\n\nexport function AgentPresenceChip({\n active,\n label = \"AI editing\",\n color = \"#00B5FF\",\n className,\n}: AgentPresenceChipProps) {\n if (!active) return null;\n\n injectStyles();\n\n return (\n <span\n className={className}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 4,\n height: 20,\n padding: \"0 8px\",\n borderRadius: 9999,\n backgroundColor: `${color}20`,\n color,\n fontSize: 11,\n fontWeight: 600,\n whiteSpace: \"nowrap\",\n }}\n >\n <span\n style={{\n width: 6,\n height: 6,\n borderRadius: \"50%\",\n backgroundColor: color,\n animation: \"_anChipPulse 2s infinite\",\n flexShrink: 0,\n }}\n />\n {label}\n </span>\n );\n}\n"]}
|
|
@@ -180,7 +180,7 @@ const s = {
|
|
|
180
180
|
},
|
|
181
181
|
optionIcon: {
|
|
182
182
|
flexShrink: 0,
|
|
183
|
-
color: "#
|
|
183
|
+
color: "#00B5FF",
|
|
184
184
|
marginTop: "2px",
|
|
185
185
|
},
|
|
186
186
|
optionText: {
|
|
@@ -210,8 +210,8 @@ const s = {
|
|
|
210
210
|
right: "10px",
|
|
211
211
|
fontSize: "10px",
|
|
212
212
|
fontWeight: 600,
|
|
213
|
-
color: "#
|
|
214
|
-
background: "#
|
|
213
|
+
color: "#00B5FF",
|
|
214
|
+
background: "#e0f2fe",
|
|
215
215
|
padding: "2px 8px",
|
|
216
216
|
borderRadius: "99px",
|
|
217
217
|
textTransform: "uppercase",
|
|
@@ -243,7 +243,7 @@ const s = {
|
|
|
243
243
|
},
|
|
244
244
|
resultLink: {
|
|
245
245
|
fontSize: "12px",
|
|
246
|
-
color: "#
|
|
246
|
+
color: "#00B5FF",
|
|
247
247
|
textDecoration: "none",
|
|
248
248
|
wordBreak: "break-all",
|
|
249
249
|
},
|
|
@@ -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\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 coming soon\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}>Coming soon</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
|
+
{"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 coming soon\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}>Coming soon</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: \"#00B5FF\",\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: \"#00B5FF\",\n background: \"#e0f2fe\",\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: \"#00B5FF\",\n textDecoration: \"none\",\n wordBreak: \"break-all\",\n },\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PresenceBar.js","sourceRoot":"","sources":["../../../src/client/components/PresenceBar.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useMemo } from \"react\";\nimport {\n type CollabUser,\n dedupeCollabUsersByEmail,\n emailToColor,\n emailToName,\n} from \"../../collab/client.js\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"./ui/tooltip.js\";\n\nexport interface PresenceBarProps {\n /** Active collaborators on this document. */\n activeUsers: CollabUser[];\n /** Whether the agent has a durable presence entry. */\n agentPresent?: boolean;\n /** Whether the agent is actively making edits right now. */\n agentActive?: boolean;\n /** Current user's email (to exclude from the list). */\n currentUserEmail?: string;\n /** Max visible avatars before \"+N\" overflow. Default: 5 */\n maxVisible?: number;\n /** Additional CSS classes. */\n className?: string;\n}\n\nconst AVATAR_SIZE = 28;\nconst OVERLAP = -8;\nconst BORDER_WIDTH = 2;\nconst FONT_SIZE = 12;\nconst AGENT_COLOR = \"#a78bfa\";\n\nconst baseAvatarStyle: React.CSSProperties = {\n width: AVATAR_SIZE,\n height: AVATAR_SIZE,\n borderRadius: \"50%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: FONT_SIZE,\n fontWeight: 700,\n color: \"#fff\",\n border: `${BORDER_WIDTH}px solid #fff`,\n flexShrink: 0,\n position: \"relative\",\n cursor: \"default\",\n boxSizing: \"border-box\",\n};\n\nconst containerStyle: React.CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n flexDirection: \"row\",\n};\n\nconst pulseKeyframes = `\n@keyframes _anPresencePulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.6; }\n}\n`;\n\nlet styleInjected = false;\n\nfunction injectStyles() {\n if (styleInjected || typeof document === \"undefined\") return;\n const style = document.createElement(\"style\");\n style.textContent = pulseKeyframes;\n document.head.appendChild(style);\n styleInjected = true;\n}\n\nfunction UserAvatar({ user, isFirst }: { user: CollabUser; isFirst: boolean }) {\n const color = user.color || emailToColor(user.email);\n const name = user.name || emailToName(user.email);\n const initial = name.charAt(0).toUpperCase();\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <div\n style={{\n ...baseAvatarStyle,\n backgroundColor: color,\n marginLeft: isFirst ? 0 : OVERLAP,\n }}\n aria-label={`${name} (${user.email})`}\n tabIndex={0}\n >\n {initial}\n </div>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">{user.email}</TooltipContent>\n </Tooltip>\n );\n}\n\nfunction AgentAvatar({ active }: { active: boolean }) {\n injectStyles();\n\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 4,\n }}\n >\n <div\n style={{\n ...baseAvatarStyle,\n backgroundColor: AGENT_COLOR,\n marginLeft: 0,\n animation: active ? \"_anPresencePulse 2s infinite\" : undefined,\n }}\n title={active ? \"AI is editing\" : \"AI agent\"}\n >\n A\n </div>\n {active && <AgentEditingChip />}\n </div>\n );\n}\n\nfunction AgentEditingChip() {\n return (\n <span\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 4,\n height: 20,\n padding: \"0 8px\",\n borderRadius: 9999,\n backgroundColor: `${AGENT_COLOR}20`,\n color: AGENT_COLOR,\n fontSize: 11,\n fontWeight: 600,\n whiteSpace: \"nowrap\",\n }}\n >\n <span\n style={{\n width: 6,\n height: 6,\n borderRadius: \"50%\",\n backgroundColor: AGENT_COLOR,\n animation: \"_anPresencePulse 2s infinite\",\n flexShrink: 0,\n }}\n />\n AI editing\n </span>\n );\n}\n\nfunction OverflowBadge({\n count,\n isFirst,\n}: {\n count: number;\n isFirst: boolean;\n}) {\n return (\n <div\n style={{\n ...baseAvatarStyle,\n backgroundColor: \"rgba(255,255,255,0.1)\",\n color: \"rgba(255,255,255,0.5)\",\n marginLeft: isFirst ? 0 : OVERLAP,\n fontSize: 10,\n }}\n title={`${count} more collaborator${count === 1 ? \"\" : \"s\"}`}\n >\n +{count}\n </div>\n );\n}\n\nexport function PresenceBar({\n activeUsers,\n agentPresent,\n agentActive,\n currentUserEmail,\n maxVisible = 5,\n className,\n}: PresenceBarProps) {\n const { humanUsers, showAgent } = useMemo(() => {\n const currentEmail = currentUserEmail?.trim().toLowerCase();\n const uniqueUsers = dedupeCollabUsersByEmail(activeUsers);\n const humans = uniqueUsers.filter((u) => {\n const email = u.email.trim().toLowerCase();\n return email !== currentEmail && email !== \"agent@system\";\n });\n const hasAgentUser = uniqueUsers.some(\n (u) => u.email.trim().toLowerCase() === \"agent@system\",\n );\n return {\n humanUsers: humans,\n showAgent: agentPresent || agentActive || hasAgentUser,\n };\n }, [activeUsers, currentUserEmail, agentPresent, agentActive]);\n\n const visibleUsers = humanUsers.slice(0, maxVisible);\n const overflowCount = humanUsers.length - visibleUsers.length;\n\n if (!showAgent && humanUsers.length === 0) return null;\n\n return (\n <TooltipProvider delayDuration={150}>\n <div style={containerStyle} className={className}>\n {showAgent && <AgentAvatar active={!!agentActive} />}\n {visibleUsers.length > 0 && (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n marginLeft: showAgent ? 6 : 0,\n }}\n >\n {visibleUsers.map((u, i) => (\n <UserAvatar key={u.email} user={u} isFirst={i === 0} />\n ))}\n {overflowCount > 0 && (\n <OverflowBadge count={overflowCount} isFirst={false} />\n )}\n </div>\n )}\n </div>\n </TooltipProvider>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"PresenceBar.js","sourceRoot":"","sources":["../../../src/client/components/PresenceBar.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useMemo } from \"react\";\nimport {\n type CollabUser,\n dedupeCollabUsersByEmail,\n emailToColor,\n emailToName,\n} from \"../../collab/client.js\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"./ui/tooltip.js\";\n\nexport interface PresenceBarProps {\n /** Active collaborators on this document. */\n activeUsers: CollabUser[];\n /** Whether the agent has a durable presence entry. */\n agentPresent?: boolean;\n /** Whether the agent is actively making edits right now. */\n agentActive?: boolean;\n /** Current user's email (to exclude from the list). */\n currentUserEmail?: string;\n /** Max visible avatars before \"+N\" overflow. Default: 5 */\n maxVisible?: number;\n /** Additional CSS classes. */\n className?: string;\n}\n\nconst AVATAR_SIZE = 28;\nconst OVERLAP = -8;\nconst BORDER_WIDTH = 2;\nconst FONT_SIZE = 12;\nconst AGENT_COLOR = \"#00B5FF\";\n\nconst baseAvatarStyle: React.CSSProperties = {\n width: AVATAR_SIZE,\n height: AVATAR_SIZE,\n borderRadius: \"50%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: FONT_SIZE,\n fontWeight: 700,\n color: \"#fff\",\n border: `${BORDER_WIDTH}px solid #fff`,\n flexShrink: 0,\n position: \"relative\",\n cursor: \"default\",\n boxSizing: \"border-box\",\n};\n\nconst containerStyle: React.CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n flexDirection: \"row\",\n};\n\nconst pulseKeyframes = `\n@keyframes _anPresencePulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.6; }\n}\n`;\n\nlet styleInjected = false;\n\nfunction injectStyles() {\n if (styleInjected || typeof document === \"undefined\") return;\n const style = document.createElement(\"style\");\n style.textContent = pulseKeyframes;\n document.head.appendChild(style);\n styleInjected = true;\n}\n\nfunction UserAvatar({ user, isFirst }: { user: CollabUser; isFirst: boolean }) {\n const color = user.color || emailToColor(user.email);\n const name = user.name || emailToName(user.email);\n const initial = name.charAt(0).toUpperCase();\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <div\n style={{\n ...baseAvatarStyle,\n backgroundColor: color,\n marginLeft: isFirst ? 0 : OVERLAP,\n }}\n aria-label={`${name} (${user.email})`}\n tabIndex={0}\n >\n {initial}\n </div>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">{user.email}</TooltipContent>\n </Tooltip>\n );\n}\n\nfunction AgentAvatar({ active }: { active: boolean }) {\n injectStyles();\n\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 4,\n }}\n >\n <div\n style={{\n ...baseAvatarStyle,\n backgroundColor: AGENT_COLOR,\n marginLeft: 0,\n animation: active ? \"_anPresencePulse 2s infinite\" : undefined,\n }}\n title={active ? \"AI is editing\" : \"AI agent\"}\n >\n A\n </div>\n {active && <AgentEditingChip />}\n </div>\n );\n}\n\nfunction AgentEditingChip() {\n return (\n <span\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 4,\n height: 20,\n padding: \"0 8px\",\n borderRadius: 9999,\n backgroundColor: `${AGENT_COLOR}20`,\n color: AGENT_COLOR,\n fontSize: 11,\n fontWeight: 600,\n whiteSpace: \"nowrap\",\n }}\n >\n <span\n style={{\n width: 6,\n height: 6,\n borderRadius: \"50%\",\n backgroundColor: AGENT_COLOR,\n animation: \"_anPresencePulse 2s infinite\",\n flexShrink: 0,\n }}\n />\n AI editing\n </span>\n );\n}\n\nfunction OverflowBadge({\n count,\n isFirst,\n}: {\n count: number;\n isFirst: boolean;\n}) {\n return (\n <div\n style={{\n ...baseAvatarStyle,\n backgroundColor: \"rgba(255,255,255,0.1)\",\n color: \"rgba(255,255,255,0.5)\",\n marginLeft: isFirst ? 0 : OVERLAP,\n fontSize: 10,\n }}\n title={`${count} more collaborator${count === 1 ? \"\" : \"s\"}`}\n >\n +{count}\n </div>\n );\n}\n\nexport function PresenceBar({\n activeUsers,\n agentPresent,\n agentActive,\n currentUserEmail,\n maxVisible = 5,\n className,\n}: PresenceBarProps) {\n const { humanUsers, showAgent } = useMemo(() => {\n const currentEmail = currentUserEmail?.trim().toLowerCase();\n const uniqueUsers = dedupeCollabUsersByEmail(activeUsers);\n const humans = uniqueUsers.filter((u) => {\n const email = u.email.trim().toLowerCase();\n return email !== currentEmail && email !== \"agent@system\";\n });\n const hasAgentUser = uniqueUsers.some(\n (u) => u.email.trim().toLowerCase() === \"agent@system\",\n );\n return {\n humanUsers: humans,\n showAgent: agentPresent || agentActive || hasAgentUser,\n };\n }, [activeUsers, currentUserEmail, agentPresent, agentActive]);\n\n const visibleUsers = humanUsers.slice(0, maxVisible);\n const overflowCount = humanUsers.length - visibleUsers.length;\n\n if (!showAgent && humanUsers.length === 0) return null;\n\n return (\n <TooltipProvider delayDuration={150}>\n <div style={containerStyle} className={className}>\n {showAgent && <AgentAvatar active={!!agentActive} />}\n {visibleUsers.length > 0 && (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n marginLeft: showAgent ? 6 : 0,\n }}\n >\n {visibleUsers.map((u, i) => (\n <UserAvatar key={u.email} user={u} isFirst={i === 0} />\n ))}\n {overflowCount > 0 && (\n <OverflowBadge count={overflowCount} isFirst={false} />\n )}\n </div>\n )}\n </div>\n </TooltipProvider>\n );\n}\n"]}
|
|
@@ -19,7 +19,7 @@ export function VoiceButton({ voice, isMac, disabled }) {
|
|
|
19
19
|
void start();
|
|
20
20
|
};
|
|
21
21
|
return (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { type: "button", onClick: onClick, disabled: disabled || transcribing, "aria-label": label, "aria-pressed": recording, className: `shrink-0 flex h-7 w-7 items-center justify-center rounded-md disabled:opacity-30 disabled:cursor-not-allowed ${recording
|
|
22
|
-
? "text-[#
|
|
22
|
+
? "text-[#00B5FF] bg-[#00B5FF]/10 hover:bg-[#00B5FF]/20"
|
|
23
23
|
: "text-muted-foreground hover:text-foreground hover:bg-accent/50"}`, children: transcribing ? (_jsx(IconLoader2, { className: "h-4 w-4 animate-spin" })) : recording ? (_jsx(IconPlayerStopFilled, { className: "h-3.5 w-3.5" })) : (_jsx(IconMicrophone, { className: "h-4 w-4" })) }) }), _jsx(TooltipContent, { children: label })] }));
|
|
24
24
|
}
|
|
25
25
|
export function VoiceRecordingOverlay({ voice }) {
|
|
@@ -33,7 +33,7 @@ export function VoiceRecordingOverlay({ voice }) {
|
|
|
33
33
|
}
|
|
34
34
|
if (state !== "recording" && state !== "starting" && state !== "transcribing")
|
|
35
35
|
return null;
|
|
36
|
-
return (_jsxs("div", { className: "flex items-center gap-2 mx-2 mt-2 mb-1 h-[2rem] rounded-md border border-[#
|
|
36
|
+
return (_jsxs("div", { className: "flex items-center gap-2 mx-2 mt-2 mb-1 h-[2rem] rounded-md border border-[#00B5FF]/40 bg-[#00B5FF]/10 px-2", "aria-live": "polite", children: [_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { type: "button", onClick: cancel, className: "shrink-0 flex h-5 w-5 items-center justify-center rounded text-muted-foreground hover:text-foreground hover:bg-accent/40", "aria-label": "Cancel recording", children: _jsx(IconX, { className: "h-3 w-3" }) }) }), _jsx(TooltipContent, { children: "Cancel (Esc)" })] }), _jsx("div", { className: "flex-1 flex items-center gap-[2px] min-w-0 h-4", children: state === "transcribing" ? (_jsx("span", { className: "text-[11px] text-muted-foreground", children: "Transcribing\u2026" })) : (_jsx(AmplitudeBars, { amplitude: amplitude })) }), _jsx("span", { className: "shrink-0 text-[11px] font-medium tabular-nums text-muted-foreground", children: state === "transcribing" ? (_jsx(IconLoader2, { className: "h-3 w-3 animate-spin" })) : (formatDuration(durationMs)) })] }));
|
|
37
37
|
}
|
|
38
38
|
const BAR_COUNT = 24;
|
|
39
39
|
function AmplitudeBars({ amplitude }) {
|
|
@@ -43,7 +43,7 @@ function AmplitudeBars({ amplitude }) {
|
|
|
43
43
|
for (let i = 0; i < BAR_COUNT; i++) {
|
|
44
44
|
const centerDistance = Math.abs(i - (BAR_COUNT - 1) / 2) / ((BAR_COUNT - 1) / 2);
|
|
45
45
|
const heightPct = Math.max(0.1, amplitude * (1 - centerDistance * 0.6)) * 100;
|
|
46
|
-
bars.push(_jsx("span", { className: "flex-1 rounded-full bg-[#
|
|
46
|
+
bars.push(_jsx("span", { className: "flex-1 rounded-full bg-[#00B5FF]", style: { height: `${heightPct}%`, minHeight: 2 } }, i));
|
|
47
47
|
}
|
|
48
48
|
return _jsx(_Fragment, { children: bars });
|
|
49
49
|
}
|