@agent-native/core 0.12.40 → 0.13.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/run-manager.d.ts +5 -1
- package/dist/agent/run-manager.d.ts.map +1 -1
- package/dist/agent/run-manager.js +48 -2
- package/dist/agent/run-manager.js.map +1 -1
- package/dist/agent/run-store.d.ts +8 -0
- package/dist/agent/run-store.d.ts.map +1 -1
- package/dist/agent/run-store.js +36 -5
- package/dist/agent/run-store.js.map +1 -1
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +42 -3
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/ConnectBuilderCard.js +1 -1
- package/dist/client/ConnectBuilderCard.js.map +1 -1
- package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
- package/dist/client/MultiTabAssistantChat.js +27 -16
- package/dist/client/MultiTabAssistantChat.js.map +1 -1
- package/dist/client/RunStuckBanner.d.ts +35 -0
- package/dist/client/RunStuckBanner.d.ts.map +1 -0
- package/dist/client/RunStuckBanner.js +66 -0
- package/dist/client/RunStuckBanner.js.map +1 -0
- package/dist/client/components/CodeRequiredDialog.js +1 -1
- package/dist/client/components/CodeRequiredDialog.js.map +1 -1
- package/dist/client/composer/ComposerPlusMenu.d.ts +3 -3
- package/dist/client/composer/ComposerPlusMenu.js +3 -3
- package/dist/client/composer/ComposerPlusMenu.js.map +1 -1
- package/dist/client/composer/TiptapComposer.js +1 -1
- package/dist/client/composer/TiptapComposer.js.map +1 -1
- package/dist/client/extensions/ExtensionsSidebarSection.js +1 -1
- package/dist/client/extensions/ExtensionsSidebarSection.js.map +1 -1
- package/dist/client/index.d.ts +2 -0
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +2 -0
- package/dist/client/index.js.map +1 -1
- package/dist/client/resources/ResourcesPanel.js +2 -2
- package/dist/client/resources/ResourcesPanel.js.map +1 -1
- package/dist/client/use-chat-threads.d.ts +7 -0
- package/dist/client/use-chat-threads.d.ts.map +1 -1
- package/dist/client/use-chat-threads.js +91 -43
- package/dist/client/use-chat-threads.js.map +1 -1
- package/dist/client/use-run-stuck-detection.d.ts +47 -0
- package/dist/client/use-run-stuck-detection.d.ts.map +1 -0
- package/dist/client/use-run-stuck-detection.js +102 -0
- package/dist/client/use-run-stuck-detection.js.map +1 -0
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +2 -0
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/package.json +1 -1
|
@@ -129,7 +129,7 @@ export function ConnectBuilderCard({ configured: initialConfigured, builderEnabl
|
|
|
129
129
|
else if (showWaitlist) {
|
|
130
130
|
title = waitlistJoined
|
|
131
131
|
? "You're on the waitlist"
|
|
132
|
-
: "Builder Cloud Agents
|
|
132
|
+
: "Builder Cloud Agents coming soon";
|
|
133
133
|
subtitle = waitlistJoined ? (_jsxs(_Fragment, { children: ["We'll let you know when Builder Cloud Agents are available for this workspace.", " ", localBrowser
|
|
134
134
|
? "Since this project is already running locally, open it in the desktop app for local coding tools or keep editing from your clone."
|
|
135
135
|
: "You can still clone the project locally and use the desktop app for code changes."] })) : (_jsxs(_Fragment, { children: ["You don't have access to Builder Cloud Agents for this workspace yet.", " ", localBrowser
|
|
@@ -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 unavailable\";\n subtitle = waitlistJoined ? (\n <>\n We'll let you know when Builder Cloud Agents are available for this\n workspace.{\" \"}\n {localBrowser\n ? \"Since this project is already running locally, open it in the desktop app for local coding tools or keep editing from your clone.\"\n : \"You can still clone the project locally and use the desktop app for code changes.\"}\n </>\n ) : (\n <>\n You don't have access to Builder Cloud Agents for this workspace yet.{\" \"}\n {localBrowser\n ? \"Since this project is already running locally, open it in the desktop app for local coding tools or keep editing from your clone.\"\n : \"You can still clone the project locally and use the desktop app for code changes.\"}\n </>\n );\n } else if (canSend) {\n title = \"Send this to Builder\";\n subtitle = (\n <>\n Builder's cloud coding agent will make this code change on a fresh\n branch.\n </>\n );\n } else if (configured) {\n title = \"Builder.io connected\";\n subtitle = flow.envManaged ? (\n <>\n Managed by this deployment — every user of this app uses the same\n Builder identity. {connectedCapabilityText}\n </>\n ) : orgName ? (\n <>\n Connected to{\" \"}\n <span className=\"font-medium text-foreground\">{orgName}</span>.{\" \"}\n {connectedCapabilityText}\n </>\n ) : (\n <>{connectedCapabilityText}</>\n );\n } else {\n title = \"Connect Builder.io\";\n subtitle = (\n <>\n Connect Builder for managed LLM access, browser automation, and cloud\n code changes when they are enabled for this workspace.\n </>\n );\n }\n\n return (\n <div className={cn(\"my-2 rounded-lg border border-border overflow-hidden\")}>\n <div className=\"flex items-start gap-3 px-4 py-3.5 bg-gradient-to-br from-teal-500/5 via-transparent to-transparent\">\n <div\n className={cn(\n \"flex h-9 w-9 shrink-0 items-center justify-center rounded-lg\",\n \"bg-foreground text-background\",\n )}\n >\n {runResult ? (\n <IconLoader2 className=\"h-5 w-5 animate-spin\" />\n ) : (\n <BuilderBMark className=\"h-5 w-5\" />\n )}\n </div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2 flex-wrap\">\n <span className=\"text-sm font-semibold text-foreground\">\n {title}\n </span>\n </div>\n <div className=\"mt-0.5 text-xs text-muted-foreground leading-relaxed\">\n {subtitle}\n </div>\n\n {showWaitlist && (\n <a\n href={DESKTOP_DOWNLOAD_URL}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"mt-2 inline-flex items-center gap-1 text-[11px] font-medium text-muted-foreground no-underline hover:text-foreground\"\n >\n Download desktop app\n <IconExternalLink className=\"h-3 w-3\" />\n </a>\n )}\n\n {err && <div className=\"mt-2 text-xs text-destructive\">{err}</div>}\n\n <div className=\"mt-3\">\n {runResult ? (\n <a\n href={runResult.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={cn(\n \"inline-flex items-center gap-1.5 rounded-md px-3 py-1.5 text-xs font-medium transition-colors\",\n \"bg-foreground text-background hover:bg-foreground/90\",\n )}\n >\n Open branch in Builder\n <IconExternalLink className=\"h-3.5 w-3.5\" />\n </a>\n ) : canSend ? (\n <button\n type=\"button\"\n onClick={handleSend}\n disabled={sending}\n className={cn(\n \"inline-flex items-center gap-1.5 rounded-md px-3 py-1.5 text-xs font-medium transition-colors\",\n \"bg-foreground text-background hover:bg-foreground/90\",\n sending && \"opacity-70 cursor-wait\",\n )}\n >\n {sending ? (\n <>\n <IconLoader2 className=\"h-3.5 w-3.5 animate-spin\" />\n Sending to Builder…\n </>\n ) : (\n <>Send to Builder</>\n )}\n </button>\n ) : showWaitlist && !waitlistJoined ? (\n <button\n type=\"button\"\n onClick={handleJoinWaitlist}\n disabled={joiningWaitlist}\n className={cn(\n \"inline-flex items-center gap-1.5 rounded-md px-3 py-1.5 text-xs font-medium transition-colors\",\n \"bg-foreground text-background hover:bg-foreground/90\",\n joiningWaitlist && \"opacity-70 cursor-wait\",\n )}\n >\n {joiningWaitlist ? (\n <>\n <IconLoader2 className=\"h-3.5 w-3.5 animate-spin\" />\n Joining…\n </>\n ) : (\n <>Join the waitlist</>\n )}\n </button>\n ) : !configured ? (\n <button\n type=\"button\"\n onClick={flow.start}\n disabled={connecting}\n className={cn(\n \"inline-flex items-center gap-1.5 rounded-md px-3 py-1.5 text-xs font-medium transition-colors\",\n \"bg-foreground text-background hover:bg-foreground/90\",\n connecting && \"opacity-70 cursor-wait\",\n )}\n >\n {connecting ? (\n <>\n <IconLoader2 className=\"h-3.5 w-3.5 animate-spin\" />\n Waiting for Builder…\n </>\n ) : (\n <>\n Connect Builder\n <IconExternalLink className=\"h-3.5 w-3.5\" />\n </>\n )}\n </button>\n ) : null}\n </div>\n </div>\n </div>\n </div>\n );\n}\n"]}
|
|
1
|
+
{"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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MultiTabAssistantChat.d.ts","sourceRoot":"","sources":["../../src/client/MultiTabAssistantChat.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmD,MAAM,OAAO,CAAC;AAExE,OAAO,EAEL,KAAK,kBAAkB,EAExB,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"MultiTabAssistantChat.d.ts","sourceRoot":"","sources":["../../src/client/MultiTabAssistantChat.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmD,MAAM,OAAO,CAAC;AAExE,OAAO,EAEL,KAAK,kBAAkB,EAExB,MAAM,oBAAoB,CAAC;AAmV5B,UAAU,OAAO;IACf,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,CAAC;IACzC,uDAAuD;IACvD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qEAAqE;IACrE,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,gCAAgC;IAC/C,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,+BAA+B;IAC/B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,6EAA6E;IAC7E,QAAQ,EAAE,MAAM,CAAC;CAClB;AAID,MAAM,MAAM,0BAA0B,GAAG,IAAI,CAC3C,kBAAkB,EAClB,OAAO,GAAG,UAAU,CACrB,GAAG;IACF,sCAAsC;IACtC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,iDAAiD;IACjD,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,gCAAgC,KAAK,KAAK,CAAC,SAAS,CAAC;IAC5E,2DAA2D;IAC3D,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,gCAAgC,KAAK,KAAK,CAAC,SAAS,CAAC;IAC7E,sGAAsG;IACtG,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,yFAAyF;IACzF,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,wBAAgB,qBAAqB,CAAC,EACpC,UAAiB,EACjB,YAAY,EACZ,aAAa,EACb,aAAqB,EACrB,MAAqD,EACrD,UAAU,EACV,GAAG,KAAK,EACT,EAAE,0BAA0B,2CAorC5B"}
|
|
@@ -7,6 +7,7 @@ import { cn } from "./utils.js";
|
|
|
7
7
|
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, } from "./components/ui/tooltip.js";
|
|
8
8
|
import { useChatThreads } from "./use-chat-threads.js";
|
|
9
9
|
import { agentNativePath } from "./api-path.js";
|
|
10
|
+
import { RunStuckBanner } from "./RunStuckBanner.js";
|
|
10
11
|
import { DEFAULT_MODEL } from "../agent/default-model.js";
|
|
11
12
|
import { getReasoningEffortOptionsForModel, isReasoningEffort, } from "../shared/reasoning-effort.js";
|
|
12
13
|
const MODEL_SELECTION_STORAGE_KEY = "agent-native:chat-models:selection";
|
|
@@ -176,7 +177,7 @@ function HelpPopover({ onClose }) {
|
|
|
176
177
|
return (_jsxs(_Fragment, { children: [_jsx("div", { className: "fixed inset-0 z-40", onClick: onClose }), _jsxs("div", { className: "absolute right-2 top-0 z-50 w-72 rounded-lg border border-border bg-popover shadow-lg", children: [_jsxs("div", { className: "flex items-center justify-between px-3 py-2 border-b border-border", children: [_jsx("span", { className: "text-xs font-medium text-foreground", children: "Available Commands" }), _jsx("button", { onClick: onClose, "aria-label": "Close help", className: "flex h-5 w-5 items-center justify-center rounded text-muted-foreground hover:text-foreground", children: _jsx(IconX, { size: 12 }) })] }), _jsx("div", { className: "py-1", children: commands.map((cmd) => (_jsxs("div", { className: "px-3 py-1.5", children: [_jsx("div", { className: "text-xs font-medium text-foreground", children: cmd.name }), _jsx("div", { className: "text-[11px] text-muted-foreground", children: cmd.description })] }, cmd.name))) })] })] }));
|
|
177
178
|
}
|
|
178
179
|
export function MultiTabAssistantChat({ showTabBar = true, renderHeader, renderOverlay, contentHidden = false, apiUrl = agentNativePath("/_agent-native/agent-chat"), storageKey, ...props }) {
|
|
179
|
-
const { threads, activeThreadId, isLoading, createThread, switchThread, deleteThread, forkThread, saveThreadData, generateTitle, searchThreads, refreshThreads, } = useChatThreads(apiUrl, storageKey);
|
|
180
|
+
const { threads, activeThreadId, isLoading, createThread, switchThread, deleteThread, forkThread, saveThreadData, generateTitle, searchThreads, refreshThreads, isNewThread, } = useChatThreads(apiUrl, storageKey);
|
|
180
181
|
// Namespace all localStorage keys by storageKey when provided (for per-app isolation in frame)
|
|
181
182
|
const keyPrefix = storageKey ? `:${storageKey}` : "";
|
|
182
183
|
const modelSelectionKey = `${MODEL_SELECTION_STORAGE_KEY}${keyPrefix}`;
|
|
@@ -478,12 +479,15 @@ export function MultiTabAssistantChat({ showTabBar = true, renderHeader, renderO
|
|
|
478
479
|
setOpenTabIds((prev) => prev.includes(activeThreadId) ? prev : [...prev, activeThreadId]);
|
|
479
480
|
}
|
|
480
481
|
}, [activeThreadId]);
|
|
481
|
-
// Ensure at least one tab is always open — auto-create if sidebar is empty
|
|
482
|
+
// Ensure at least one tab is always open — auto-create if sidebar is empty.
|
|
483
|
+
// Skipped when an active thread already exists (e.g. the hook generated an
|
|
484
|
+
// optimistic id for a brand-new session); the activeThreadId effect above
|
|
485
|
+
// adds it to openTabIds without spinning up a duplicate thread.
|
|
482
486
|
const autoCreatingRef = useRef(false);
|
|
483
487
|
useEffect(() => {
|
|
484
488
|
if (isLoading || autoCreatingRef.current)
|
|
485
489
|
return;
|
|
486
|
-
if (openTabIds.length === 0) {
|
|
490
|
+
if (openTabIds.length === 0 && !activeThreadId) {
|
|
487
491
|
autoCreatingRef.current = true;
|
|
488
492
|
createThread().then((id) => {
|
|
489
493
|
autoCreatingRef.current = false;
|
|
@@ -493,7 +497,7 @@ export function MultiTabAssistantChat({ showTabBar = true, renderHeader, renderO
|
|
|
493
497
|
}
|
|
494
498
|
});
|
|
495
499
|
}
|
|
496
|
-
}, [isLoading, openTabIds, createThread]);
|
|
500
|
+
}, [isLoading, openTabIds, activeThreadId, createThread]);
|
|
497
501
|
// Focus the composer when switching tabs
|
|
498
502
|
useEffect(() => {
|
|
499
503
|
if (!activeThreadId)
|
|
@@ -956,7 +960,11 @@ export function MultiTabAssistantChat({ showTabBar = true, renderHeader, renderO
|
|
|
956
960
|
toggleHistory: () => setShowHistory((v) => !v),
|
|
957
961
|
tabCount: openTabIds.length,
|
|
958
962
|
};
|
|
959
|
-
|
|
963
|
+
// No full-shell skeleton: the hook seeds an optimistic activeThreadId
|
|
964
|
+
// synchronously so the chat shell + composer can paint on first render.
|
|
965
|
+
// Per-thread restore (existing chats with history) shows its own message-area
|
|
966
|
+
// skeleton inside AssistantChat — header and composer stay visible.
|
|
967
|
+
if (isLoading && !activeThreadId) {
|
|
960
968
|
return (_jsx(ChatSkeleton, { header: renderHeader?.(headerProps), headerOnly: contentHidden }));
|
|
961
969
|
}
|
|
962
970
|
return (_jsxs("div", { className: "flex flex-1 flex-col h-full min-h-0 overflow-x-hidden", children: [_jsx("style", { dangerouslySetInnerHTML: {
|
|
@@ -1017,18 +1025,21 @@ export function MultiTabAssistantChat({ showTabBar = true, renderHeader, renderO
|
|
|
1017
1025
|
.filter((tabId) => tabId === activeThreadId || mountedTabsRef.current.has(tabId))
|
|
1018
1026
|
.map((tabId) => {
|
|
1019
1027
|
const modelSelection = resolveThreadModelSelection(tabId);
|
|
1020
|
-
return (
|
|
1028
|
+
return (_jsxs("div", { className: "flex-1 min-h-0 flex-col", style: {
|
|
1021
1029
|
display: contentHidden || tabId !== activeThreadId ? "none" : "flex",
|
|
1022
|
-
}, children: _jsx(
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
}
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1030
|
+
}, children: [_jsx(RunStuckBanner, { threadId: tabId, apiUrl: apiUrl, onRetry: () => {
|
|
1031
|
+
const handle = chatRefs.current.get(tabId);
|
|
1032
|
+
handle?.sendMessage("Continue from where you left off and finish my last request. Do not repeat completed work.");
|
|
1033
|
+
} }), _jsx(AssistantChat, { ...props, ref: (handle) => {
|
|
1034
|
+
if (handle) {
|
|
1035
|
+
chatRefs.current.set(tabId, handle);
|
|
1036
|
+
}
|
|
1037
|
+
else {
|
|
1038
|
+
chatRefs.current.delete(tabId);
|
|
1039
|
+
}
|
|
1040
|
+
}, threadId: tabId, tabId: tabId, apiUrl: apiUrl, isNewThread: newThreadIds.current.has(tabId) || isNewThread(tabId), onMessageCountChange: (count) => setMessageCounts((prev) => prev[tabId] === count
|
|
1041
|
+
? prev
|
|
1042
|
+
: { ...prev, [tabId]: count }), onSaveThread: handleSaveThread, onGenerateTitle: handleGenerateTitle, onSlashCommand: handleSlashCommand, selectedModel: modelSelection?.model, selectedEngine: modelSelection?.engine, selectedEffort: modelSelection?.effort ?? "auto", defaultModel: defaultModel, availableModels: availableModels, onModelChange: handleModelChange, onEffortChange: handleEffortChange, onForkChat: () => handleForkChat(tabId) })] }, tabId));
|
|
1032
1043
|
})] })] }));
|
|
1033
1044
|
}
|
|
1034
1045
|
//# sourceMappingURL=MultiTabAssistantChat.js.map
|