@agent-native/core 0.58.5 → 0.59.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/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +4 -51
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
- package/dist/client/MultiTabAssistantChat.js +84 -88
- package/dist/client/MultiTabAssistantChat.js.map +1 -1
- package/dist/client/agent-chat.d.ts +28 -0
- package/dist/client/agent-chat.d.ts.map +1 -1
- package/dist/client/agent-chat.js +84 -3
- package/dist/client/agent-chat.js.map +1 -1
- package/dist/client/chat/run-recovery.d.ts +2 -1
- package/dist/client/chat/run-recovery.d.ts.map +1 -1
- package/dist/client/chat/run-recovery.js +4 -2
- package/dist/client/chat/run-recovery.js.map +1 -1
- package/dist/client/index.d.ts +3 -1
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +3 -1
- package/dist/client/index.js.map +1 -1
- package/dist/client/terminal/AgentTerminal.d.ts.map +1 -1
- package/dist/client/terminal/AgentTerminal.js +6 -7
- package/dist/client/terminal/AgentTerminal.js.map +1 -1
- package/dist/client/use-agent-engine-configured.d.ts +16 -0
- package/dist/client/use-agent-engine-configured.d.ts.map +1 -0
- package/dist/client/use-agent-engine-configured.js +60 -0
- package/dist/client/use-agent-engine-configured.js.map +1 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AgentTerminal.js","sourceRoot":"","sources":["../../../src/client/terminal/AgentTerminal.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * AgentTerminal — Embeddable CLI terminal component\n *\n * Renders an xterm.js terminal connected to a PTY WebSocket server.\n * When running inside a frame, renders nothing (the frame manages the terminal).\n *\n * Usage:\n * import { AgentTerminal } from \"@agent-native/core/terminal\";\n * <AgentTerminal className=\"w-full h-[400px]\" />\n */\n\nimport { useRef, useEffect, useState, type CSSProperties } from \"react\";\nimport { agentNativePath } from \"../api-path.js\";\nimport { getFrameOrigin, isTrustedFrameMessage } from \"../frame.js\";\n\nexport interface AgentTerminalProps {\n /** CLI command to run. Default: 'builder' */\n command?: string;\n /** Additional CLI flags */\n flags?: string;\n /** Custom WebSocket URL (overrides auto-discovery) */\n wsUrl?: string;\n /** Hide when running inside frame. Default: true */\n hideInFrame?: boolean;\n /** Terminal theme overrides */\n theme?: Record<string, string>;\n /** Font size. Default: 12 */\n fontSize?: number;\n /** CSS class for the container */\n className?: string;\n /** Inline styles for the container */\n style?: CSSProperties;\n /** Callback when connection state changes */\n onConnectionChange?: (connected: boolean) => void;\n /** Callback when agent running state changes */\n onAgentRunningChange?: (running: boolean) => void;\n}\n\n// Inject xterm CSS once\nlet cssInjected = false;\nfunction injectXtermCss() {\n if (cssInjected || typeof document === \"undefined\") return;\n cssInjected = true;\n const style = document.createElement(\"style\");\n style.textContent = `\n .xterm { position: relative; user-select: none; }\n .xterm.focus, .xterm:focus { outline: none; }\n .xterm .xterm-helpers { position: absolute; top: 0; z-index: 5; }\n .xterm .xterm-helper-textarea {\n padding: 0; border: 0; margin: 0;\n position: absolute; opacity: 0; left: -9999em; top: 0;\n width: 0; height: 0; z-index: -5;\n white-space: nowrap; overflow: hidden; resize: none;\n }\n .xterm .composition-view { display: none; position: absolute; white-space: nowrap; z-index: 1; }\n .xterm .composition-view.active { display: block; }\n .xterm .xterm-viewport {\n background-color: #000; overflow-y: scroll;\n cursor: default; position: absolute; right: 0; left: 0; top: 0; bottom: 0;\n }\n .xterm .xterm-screen { position: relative; }\n .xterm .xterm-screen canvas { position: absolute; left: 0; top: 0; }\n .xterm .xterm-scroll-area { visibility: hidden; }\n .xterm-char-measure-element {\n display: inline-block; visibility: hidden; position: absolute; top: 0; left: -9999em;\n line-height: normal;\n }\n .xterm.enable-mouse-events { cursor: default; }\n .xterm.xterm-cursor-pointer, .xterm .xterm-cursor-pointer { cursor: pointer; }\n .xterm.column-select.focus { cursor: crosshair; }\n .xterm .xterm-accessibility:not(.debug),\n .xterm .xterm-message { position: absolute; left: 0; top: 0; bottom: 0; right: 0; z-index: 10; color: transparent; pointer-events: none; }\n .xterm .xterm-accessibility-tree:not(.debug) *::selection { color: transparent; }\n .xterm .xterm-accessibility-tree { user-select: text; white-space: pre; }\n .xterm .live-region { position: absolute; left: -9999px; width: 1px; height: 1px; overflow: hidden; }\n .xterm .xterm-dim { opacity: 0.5; }\n .xterm .xterm-underline-1 { text-decoration: underline; }\n .xterm .xterm-underline-2 { text-decoration: double underline; }\n .xterm .xterm-underline-3 { text-decoration: wavy underline; }\n .xterm .xterm-underline-4 { text-decoration: dotted underline; }\n .xterm .xterm-underline-5 { text-decoration: dashed underline; }\n .xterm .xterm-overline { text-decoration: overline; }\n .xterm .xterm-strikethrough { text-decoration: line-through; }\n .xterm .xterm-screen .xterm-decoration-container .xterm-decoration { z-index: 6; position: absolute; }\n .xterm .xterm-screen .xterm-decoration-container .xterm-decoration.xterm-decoration-top-layer { z-index: 7; }\n .xterm .xterm-decoration-overview-ruler { z-index: 8; position: absolute; top: 0; right: 0; pointer-events: none; }\n .xterm .xterm-decoration-top { z-index: 2; position: relative; }\n `;\n document.head.appendChild(style);\n}\n\nconst DEFAULT_THEME = {\n background: \"#111\",\n foreground: \"#e0e0e0\",\n cursor: \"#58a6ff\",\n selectionBackground: \"#264f78\",\n black: \"#484f58\",\n red: \"#ff7b72\",\n green: \"#3fb950\",\n yellow: \"#d29922\",\n blue: \"#58a6ff\",\n magenta: \"#bc8cff\",\n cyan: \"#39d353\",\n white: \"#b1bac4\",\n};\n\ninterface TerminalInfo {\n available: boolean;\n wsPort?: number;\n command?: string;\n error?: string;\n}\n\nexport function formatWebSocketHostname(hostname: string) {\n return hostname.includes(\":\") && !hostname.startsWith(\"[\")\n ? `[${hostname}]`\n : hostname;\n}\n\nexport function AgentTerminal({\n command,\n flags,\n wsUrl: wsUrlProp,\n hideInFrame = true,\n theme,\n fontSize = 12,\n className,\n style,\n onConnectionChange,\n onAgentRunningChange,\n}: AgentTerminalProps) {\n const termRef = useRef<HTMLDivElement>(null);\n const [connected, setConnected] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [inFrame, setInFrame] = useState(false);\n\n // Check frame state after mount (postMessage is async)\n useEffect(() => {\n if (!hideInFrame) return;\n // Check immediately and also after a short delay for the postMessage to arrive\n const check = () => {\n if (getFrameOrigin()) setInFrame(true);\n };\n check();\n const timer = setTimeout(check, 500);\n return () => clearTimeout(timer);\n }, [hideInFrame]);\n\n // Notify parent of connection changes\n useEffect(() => {\n onConnectionChange?.(connected);\n }, [connected, onConnectionChange]);\n\n // Main terminal setup\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n if (hideInFrame && inFrame) return;\n\n const containerRaw = termRef.current;\n if (!containerRaw) return;\n // Non-null assertion: null branch exited above; closures lose the narrowing.\n const container: HTMLDivElement = containerRaw;\n\n let disposed = false;\n let ws: WebSocket | null = null;\n let cleanupMessageHandler: (() => void) | null = null;\n\n async function init() {\n // Dynamic imports for SSR safety\n const [{ Terminal }, { FitAddon }, { WebLinksAddon }] = await Promise.all(\n [\n import(\"@xterm/xterm\"),\n import(\"@xterm/addon-fit\"),\n import(\"@xterm/addon-web-links\"),\n ],\n );\n\n if (disposed || !container) return;\n\n injectXtermCss();\n\n const term = new Terminal({\n cursorBlink: true,\n fontSize,\n fontFamily: \"'SF Mono', 'Fira Code', 'Cascadia Code', Menlo, monospace\",\n theme: { ...DEFAULT_THEME, ...theme },\n });\n\n const fitAddon = new FitAddon();\n const webLinksAddon = new WebLinksAddon((_event, uri) => {\n window.open(uri, \"_blank\", \"noopener\");\n });\n\n term.loadAddon(fitAddon);\n term.loadAddon(webLinksAddon);\n term.open(container);\n\n let fitPending = false;\n function fitAndResize() {\n if (fitPending) return;\n fitPending = true;\n requestAnimationFrame(() => {\n fitPending = false;\n if (\n disposed ||\n !container.isConnected ||\n container.clientWidth <= 0 ||\n container.clientHeight <= 0\n ) {\n return;\n }\n try {\n fitAddon.fit();\n sendResize();\n } catch {}\n });\n }\n\n fitAndResize();\n const initialFitTimers = [\n setTimeout(fitAndResize, 50),\n setTimeout(fitAndResize, 250),\n ];\n\n const handleVisibilityOrFocus = () => fitAndResize();\n window.addEventListener(\"focus\", handleVisibilityOrFocus);\n document.addEventListener(\"visibilitychange\", handleVisibilityOrFocus);\n\n // Resize observer for auto-fitting\n const resizeObserver = new ResizeObserver(() => {\n fitAndResize();\n });\n resizeObserver.observe(container);\n\n let terminalDisposed = false;\n function disposeTerminal() {\n if (terminalDisposed) return;\n terminalDisposed = true;\n initialFitTimers.forEach(clearTimeout);\n window.removeEventListener(\"focus\", handleVisibilityOrFocus);\n document.removeEventListener(\n \"visibilitychange\",\n handleVisibilityOrFocus,\n );\n resizeObserver.disconnect();\n term.dispose();\n }\n\n // Discover WebSocket URL\n let wsUrl = wsUrlProp;\n let resolvedCommand = command;\n if (!wsUrl) {\n try {\n const res = await fetch(\n agentNativePath(\"/_agent-native/agent-terminal-info\"),\n );\n const info: TerminalInfo = await res.json();\n if (!info.available) {\n setError(info.error || \"Agent terminal not available\");\n disposeTerminal();\n return;\n }\n const protocol = location.protocol === \"https:\" ? \"wss:\" : \"ws:\";\n const host = formatWebSocketHostname(location.hostname);\n wsUrl = `${protocol}//${host}:${info.wsPort}/ws`;\n if (!resolvedCommand && info.command) {\n resolvedCommand = info.command;\n }\n } catch (err) {\n setError(\"Failed to discover terminal server\");\n disposeTerminal();\n return;\n }\n }\n\n // Build WebSocket URL with query params\n const qs = new URLSearchParams();\n if (resolvedCommand) qs.set(\"command\", resolvedCommand);\n if (flags) qs.set(\"flags\", flags);\n const qsStr = qs.toString();\n const fullWsUrl = qsStr ? `${wsUrl}?${qsStr}` : wsUrl;\n\n term.write(\n `\\x1b[2m[terminal] Starting ${resolvedCommand || \"CLI\"}...\\x1b[0m\\r\\n`,\n );\n\n // Connect WebSocket\n let agentRunning = false;\n let idleTimer: ReturnType<typeof setTimeout> | null = null;\n let connectionId = 0;\n\n function sendResize() {\n if (ws && ws.readyState === WebSocket.OPEN && term) {\n ws.send(\n JSON.stringify({\n type: \"resize\",\n cols: term.cols,\n rows: term.rows,\n }),\n );\n }\n }\n\n function notifyAgentRunning(running: boolean) {\n onAgentRunningChange?.(running);\n window.dispatchEvent(\n new CustomEvent(\"agentNative.chatRunning\", {\n detail: { isRunning: running },\n }),\n );\n }\n\n function connect(url: string) {\n const thisId = ++connectionId;\n\n if (ws) {\n ws.close();\n ws = null;\n }\n\n const socket = new WebSocket(url);\n socket.binaryType = \"arraybuffer\";\n ws = socket;\n\n socket.onopen = () => {\n setConnected(true);\n setError(null);\n socket.send(\n JSON.stringify({\n type: \"resize\",\n cols: term.cols,\n rows: term.rows,\n }),\n );\n };\n\n socket.onmessage = (event) => {\n const data =\n event.data instanceof ArrayBuffer\n ? new TextDecoder().decode(event.data)\n : event.data;\n\n // Check for setup-status JSON messages\n try {\n const msg = JSON.parse(data);\n if (msg.type === \"setup-status\") {\n if (msg.status === \"not-found\" || msg.status === \"failed\") {\n setError(msg.message);\n // Bump connectionId to suppress reconnect on close\n connectionId++;\n }\n return;\n }\n } catch {\n // Not JSON — regular terminal output\n }\n\n setError(null);\n term.write(data);\n\n // Idle detection — prompt or cursor visible means agent stopped\n if (data.includes(\"❯\") || data.includes(\"\\x1b[?25h\")) {\n if (idleTimer) clearTimeout(idleTimer);\n idleTimer = setTimeout(() => {\n if (agentRunning) {\n agentRunning = false;\n notifyAgentRunning(false);\n }\n }, 600);\n } else if (agentRunning) {\n if (idleTimer) clearTimeout(idleTimer);\n }\n };\n\n socket.onclose = () => {\n setConnected(false);\n if (connectionId === thisId && !disposed) {\n term.write(\n \"\\r\\n\\x1b[31m[terminal] Connection closed. Reconnecting in 3s...\\x1b[0m\\r\\n\",\n );\n setTimeout(() => {\n if (connectionId === thisId && !disposed) {\n connect(url);\n }\n }, 3000);\n }\n };\n\n socket.onerror = () => socket.close();\n }\n\n // Terminal input → WebSocket\n term.onData((data) => {\n if (ws && ws.readyState === WebSocket.OPEN) {\n ws.send(data);\n }\n });\n\n // Chat bridge integration — listen for sendToAgentChat messages\n const messageHandler = (event: MessageEvent) => {\n if (!isTrustedFrameMessage(event)) return;\n if (event.data?.type === \"agentNative.submitChat\") {\n const message = event.data.data?.message;\n if (message && ws && ws.readyState === WebSocket.OPEN) {\n ws.send(message + \"\\r\");\n agentRunning = true;\n notifyAgentRunning(true);\n }\n }\n };\n window.addEventListener(\"message\", messageHandler);\n cleanupMessageHandler = () =>\n window.removeEventListener(\"message\", messageHandler);\n\n connect(fullWsUrl);\n\n // Store cleanup references\n return () => {\n disposed = true;\n connectionId++;\n if (idleTimer) clearTimeout(idleTimer);\n disposeTerminal();\n if (ws) {\n ws.close();\n ws = null;\n }\n };\n }\n\n let cleanup: (() => void) | undefined;\n init().then((fn) => {\n cleanup = fn;\n });\n\n return () => {\n disposed = true;\n cleanup?.();\n cleanupMessageHandler?.();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [hideInFrame, inFrame, command, flags, wsUrlProp]);\n\n if (hideInFrame && inFrame) {\n return null;\n }\n\n const terminalBackground = theme?.background ?? DEFAULT_THEME.background;\n const mergedStyle = {\n ...style,\n background: terminalBackground,\n backgroundColor: terminalBackground,\n };\n\n return (\n <div\n ref={termRef}\n className={className}\n style={{\n width: \"100%\",\n height: \"100%\",\n padding: \"4px 12px\",\n position: \"relative\",\n ...mergedStyle,\n }}\n >\n {error && (\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n backgroundColor: \"#111\",\n color: \"#ff7b72\",\n fontSize: \"13px\",\n fontFamily: \"monospace\",\n padding: \"20px\",\n textAlign: \"center\",\n zIndex: 1,\n }}\n >\n {error}\n </div>\n )}\n </div>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"AgentTerminal.js","sourceRoot":"","sources":["../../../src/client/terminal/AgentTerminal.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * AgentTerminal — Embeddable CLI terminal component\n *\n * Renders an xterm.js terminal connected to a PTY WebSocket server.\n * When running inside a frame, renders nothing (the frame manages the terminal).\n *\n * Usage:\n * import { AgentTerminal } from \"@agent-native/core/terminal\";\n * <AgentTerminal className=\"w-full h-[400px]\" />\n */\n\nimport { useRef, useEffect, useState, type CSSProperties } from \"react\";\nimport { agentNativePath } from \"../api-path.js\";\nimport { getFrameOrigin, isTrustedFrameMessage } from \"../frame.js\";\nimport { parseSubmitChatMessage } from \"../agent-chat.js\";\n\nexport interface AgentTerminalProps {\n /** CLI command to run. Default: 'builder' */\n command?: string;\n /** Additional CLI flags */\n flags?: string;\n /** Custom WebSocket URL (overrides auto-discovery) */\n wsUrl?: string;\n /** Hide when running inside frame. Default: true */\n hideInFrame?: boolean;\n /** Terminal theme overrides */\n theme?: Record<string, string>;\n /** Font size. Default: 12 */\n fontSize?: number;\n /** CSS class for the container */\n className?: string;\n /** Inline styles for the container */\n style?: CSSProperties;\n /** Callback when connection state changes */\n onConnectionChange?: (connected: boolean) => void;\n /** Callback when agent running state changes */\n onAgentRunningChange?: (running: boolean) => void;\n}\n\n// Inject xterm CSS once\nlet cssInjected = false;\nfunction injectXtermCss() {\n if (cssInjected || typeof document === \"undefined\") return;\n cssInjected = true;\n const style = document.createElement(\"style\");\n style.textContent = `\n .xterm { position: relative; user-select: none; }\n .xterm.focus, .xterm:focus { outline: none; }\n .xterm .xterm-helpers { position: absolute; top: 0; z-index: 5; }\n .xterm .xterm-helper-textarea {\n padding: 0; border: 0; margin: 0;\n position: absolute; opacity: 0; left: -9999em; top: 0;\n width: 0; height: 0; z-index: -5;\n white-space: nowrap; overflow: hidden; resize: none;\n }\n .xterm .composition-view { display: none; position: absolute; white-space: nowrap; z-index: 1; }\n .xterm .composition-view.active { display: block; }\n .xterm .xterm-viewport {\n background-color: #000; overflow-y: scroll;\n cursor: default; position: absolute; right: 0; left: 0; top: 0; bottom: 0;\n }\n .xterm .xterm-screen { position: relative; }\n .xterm .xterm-screen canvas { position: absolute; left: 0; top: 0; }\n .xterm .xterm-scroll-area { visibility: hidden; }\n .xterm-char-measure-element {\n display: inline-block; visibility: hidden; position: absolute; top: 0; left: -9999em;\n line-height: normal;\n }\n .xterm.enable-mouse-events { cursor: default; }\n .xterm.xterm-cursor-pointer, .xterm .xterm-cursor-pointer { cursor: pointer; }\n .xterm.column-select.focus { cursor: crosshair; }\n .xterm .xterm-accessibility:not(.debug),\n .xterm .xterm-message { position: absolute; left: 0; top: 0; bottom: 0; right: 0; z-index: 10; color: transparent; pointer-events: none; }\n .xterm .xterm-accessibility-tree:not(.debug) *::selection { color: transparent; }\n .xterm .xterm-accessibility-tree { user-select: text; white-space: pre; }\n .xterm .live-region { position: absolute; left: -9999px; width: 1px; height: 1px; overflow: hidden; }\n .xterm .xterm-dim { opacity: 0.5; }\n .xterm .xterm-underline-1 { text-decoration: underline; }\n .xterm .xterm-underline-2 { text-decoration: double underline; }\n .xterm .xterm-underline-3 { text-decoration: wavy underline; }\n .xterm .xterm-underline-4 { text-decoration: dotted underline; }\n .xterm .xterm-underline-5 { text-decoration: dashed underline; }\n .xterm .xterm-overline { text-decoration: overline; }\n .xterm .xterm-strikethrough { text-decoration: line-through; }\n .xterm .xterm-screen .xterm-decoration-container .xterm-decoration { z-index: 6; position: absolute; }\n .xterm .xterm-screen .xterm-decoration-container .xterm-decoration.xterm-decoration-top-layer { z-index: 7; }\n .xterm .xterm-decoration-overview-ruler { z-index: 8; position: absolute; top: 0; right: 0; pointer-events: none; }\n .xterm .xterm-decoration-top { z-index: 2; position: relative; }\n `;\n document.head.appendChild(style);\n}\n\nconst DEFAULT_THEME = {\n background: \"#111\",\n foreground: \"#e0e0e0\",\n cursor: \"#58a6ff\",\n selectionBackground: \"#264f78\",\n black: \"#484f58\",\n red: \"#ff7b72\",\n green: \"#3fb950\",\n yellow: \"#d29922\",\n blue: \"#58a6ff\",\n magenta: \"#bc8cff\",\n cyan: \"#39d353\",\n white: \"#b1bac4\",\n};\n\ninterface TerminalInfo {\n available: boolean;\n wsPort?: number;\n command?: string;\n error?: string;\n}\n\nexport function formatWebSocketHostname(hostname: string) {\n return hostname.includes(\":\") && !hostname.startsWith(\"[\")\n ? `[${hostname}]`\n : hostname;\n}\n\nexport function AgentTerminal({\n command,\n flags,\n wsUrl: wsUrlProp,\n hideInFrame = true,\n theme,\n fontSize = 12,\n className,\n style,\n onConnectionChange,\n onAgentRunningChange,\n}: AgentTerminalProps) {\n const termRef = useRef<HTMLDivElement>(null);\n const [connected, setConnected] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [inFrame, setInFrame] = useState(false);\n\n // Check frame state after mount (postMessage is async)\n useEffect(() => {\n if (!hideInFrame) return;\n // Check immediately and also after a short delay for the postMessage to arrive\n const check = () => {\n if (getFrameOrigin()) setInFrame(true);\n };\n check();\n const timer = setTimeout(check, 500);\n return () => clearTimeout(timer);\n }, [hideInFrame]);\n\n // Notify parent of connection changes\n useEffect(() => {\n onConnectionChange?.(connected);\n }, [connected, onConnectionChange]);\n\n // Main terminal setup\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n if (hideInFrame && inFrame) return;\n\n const containerRaw = termRef.current;\n if (!containerRaw) return;\n // Non-null assertion: null branch exited above; closures lose the narrowing.\n const container: HTMLDivElement = containerRaw;\n\n let disposed = false;\n let ws: WebSocket | null = null;\n let cleanupMessageHandler: (() => void) | null = null;\n\n async function init() {\n // Dynamic imports for SSR safety\n const [{ Terminal }, { FitAddon }, { WebLinksAddon }] = await Promise.all(\n [\n import(\"@xterm/xterm\"),\n import(\"@xterm/addon-fit\"),\n import(\"@xterm/addon-web-links\"),\n ],\n );\n\n if (disposed || !container) return;\n\n injectXtermCss();\n\n const term = new Terminal({\n cursorBlink: true,\n fontSize,\n fontFamily: \"'SF Mono', 'Fira Code', 'Cascadia Code', Menlo, monospace\",\n theme: { ...DEFAULT_THEME, ...theme },\n });\n\n const fitAddon = new FitAddon();\n const webLinksAddon = new WebLinksAddon((_event, uri) => {\n window.open(uri, \"_blank\", \"noopener\");\n });\n\n term.loadAddon(fitAddon);\n term.loadAddon(webLinksAddon);\n term.open(container);\n\n let fitPending = false;\n function fitAndResize() {\n if (fitPending) return;\n fitPending = true;\n requestAnimationFrame(() => {\n fitPending = false;\n if (\n disposed ||\n !container.isConnected ||\n container.clientWidth <= 0 ||\n container.clientHeight <= 0\n ) {\n return;\n }\n try {\n fitAddon.fit();\n sendResize();\n } catch {}\n });\n }\n\n fitAndResize();\n const initialFitTimers = [\n setTimeout(fitAndResize, 50),\n setTimeout(fitAndResize, 250),\n ];\n\n const handleVisibilityOrFocus = () => fitAndResize();\n window.addEventListener(\"focus\", handleVisibilityOrFocus);\n document.addEventListener(\"visibilitychange\", handleVisibilityOrFocus);\n\n // Resize observer for auto-fitting\n const resizeObserver = new ResizeObserver(() => {\n fitAndResize();\n });\n resizeObserver.observe(container);\n\n let terminalDisposed = false;\n function disposeTerminal() {\n if (terminalDisposed) return;\n terminalDisposed = true;\n initialFitTimers.forEach(clearTimeout);\n window.removeEventListener(\"focus\", handleVisibilityOrFocus);\n document.removeEventListener(\n \"visibilitychange\",\n handleVisibilityOrFocus,\n );\n resizeObserver.disconnect();\n term.dispose();\n }\n\n // Discover WebSocket URL\n let wsUrl = wsUrlProp;\n let resolvedCommand = command;\n if (!wsUrl) {\n try {\n const res = await fetch(\n agentNativePath(\"/_agent-native/agent-terminal-info\"),\n );\n const info: TerminalInfo = await res.json();\n if (!info.available) {\n setError(info.error || \"Agent terminal not available\");\n disposeTerminal();\n return;\n }\n const protocol = location.protocol === \"https:\" ? \"wss:\" : \"ws:\";\n const host = formatWebSocketHostname(location.hostname);\n wsUrl = `${protocol}//${host}:${info.wsPort}/ws`;\n if (!resolvedCommand && info.command) {\n resolvedCommand = info.command;\n }\n } catch (err) {\n setError(\"Failed to discover terminal server\");\n disposeTerminal();\n return;\n }\n }\n\n // Build WebSocket URL with query params\n const qs = new URLSearchParams();\n if (resolvedCommand) qs.set(\"command\", resolvedCommand);\n if (flags) qs.set(\"flags\", flags);\n const qsStr = qs.toString();\n const fullWsUrl = qsStr ? `${wsUrl}?${qsStr}` : wsUrl;\n\n term.write(\n `\\x1b[2m[terminal] Starting ${resolvedCommand || \"CLI\"}...\\x1b[0m\\r\\n`,\n );\n\n // Connect WebSocket\n let agentRunning = false;\n let idleTimer: ReturnType<typeof setTimeout> | null = null;\n let connectionId = 0;\n\n function sendResize() {\n if (ws && ws.readyState === WebSocket.OPEN && term) {\n ws.send(\n JSON.stringify({\n type: \"resize\",\n cols: term.cols,\n rows: term.rows,\n }),\n );\n }\n }\n\n function notifyAgentRunning(running: boolean) {\n onAgentRunningChange?.(running);\n window.dispatchEvent(\n new CustomEvent(\"agentNative.chatRunning\", {\n detail: { isRunning: running },\n }),\n );\n }\n\n function connect(url: string) {\n const thisId = ++connectionId;\n\n if (ws) {\n ws.close();\n ws = null;\n }\n\n const socket = new WebSocket(url);\n socket.binaryType = \"arraybuffer\";\n ws = socket;\n\n socket.onopen = () => {\n setConnected(true);\n setError(null);\n socket.send(\n JSON.stringify({\n type: \"resize\",\n cols: term.cols,\n rows: term.rows,\n }),\n );\n };\n\n socket.onmessage = (event) => {\n const data =\n event.data instanceof ArrayBuffer\n ? new TextDecoder().decode(event.data)\n : event.data;\n\n // Check for setup-status JSON messages\n try {\n const msg = JSON.parse(data);\n if (msg.type === \"setup-status\") {\n if (msg.status === \"not-found\" || msg.status === \"failed\") {\n setError(msg.message);\n // Bump connectionId to suppress reconnect on close\n connectionId++;\n }\n return;\n }\n } catch {\n // Not JSON — regular terminal output\n }\n\n setError(null);\n term.write(data);\n\n // Idle detection — prompt or cursor visible means agent stopped\n if (data.includes(\"❯\") || data.includes(\"\\x1b[?25h\")) {\n if (idleTimer) clearTimeout(idleTimer);\n idleTimer = setTimeout(() => {\n if (agentRunning) {\n agentRunning = false;\n notifyAgentRunning(false);\n }\n }, 600);\n } else if (agentRunning) {\n if (idleTimer) clearTimeout(idleTimer);\n }\n };\n\n socket.onclose = () => {\n setConnected(false);\n if (connectionId === thisId && !disposed) {\n term.write(\n \"\\r\\n\\x1b[31m[terminal] Connection closed. Reconnecting in 3s...\\x1b[0m\\r\\n\",\n );\n setTimeout(() => {\n if (connectionId === thisId && !disposed) {\n connect(url);\n }\n }, 3000);\n }\n };\n\n socket.onerror = () => socket.close();\n }\n\n // Terminal input → WebSocket\n term.onData((data) => {\n if (ws && ws.readyState === WebSocket.OPEN) {\n ws.send(data);\n }\n });\n\n // Chat bridge integration — listen for sendToAgentChat messages\n const messageHandler = (event: MessageEvent) => {\n if (!isTrustedFrameMessage(event)) return;\n const parsed = parseSubmitChatMessage(event);\n if (parsed && ws && ws.readyState === WebSocket.OPEN) {\n ws.send(parsed.message + \"\\r\");\n agentRunning = true;\n notifyAgentRunning(true);\n }\n };\n window.addEventListener(\"message\", messageHandler);\n cleanupMessageHandler = () =>\n window.removeEventListener(\"message\", messageHandler);\n\n connect(fullWsUrl);\n\n // Store cleanup references\n return () => {\n disposed = true;\n connectionId++;\n if (idleTimer) clearTimeout(idleTimer);\n disposeTerminal();\n if (ws) {\n ws.close();\n ws = null;\n }\n };\n }\n\n let cleanup: (() => void) | undefined;\n init().then((fn) => {\n cleanup = fn;\n });\n\n return () => {\n disposed = true;\n cleanup?.();\n cleanupMessageHandler?.();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [hideInFrame, inFrame, command, flags, wsUrlProp]);\n\n if (hideInFrame && inFrame) {\n return null;\n }\n\n const terminalBackground = theme?.background ?? DEFAULT_THEME.background;\n const mergedStyle = {\n ...style,\n background: terminalBackground,\n backgroundColor: terminalBackground,\n };\n\n return (\n <div\n ref={termRef}\n className={className}\n style={{\n width: \"100%\",\n height: \"100%\",\n padding: \"4px 12px\",\n position: \"relative\",\n ...mergedStyle,\n }}\n >\n {error && (\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n backgroundColor: \"#111\",\n color: \"#ff7b72\",\n fontSize: \"13px\",\n fontFamily: \"monospace\",\n padding: \"20px\",\n textAlign: \"center\",\n zIndex: 1,\n }}\n >\n {error}\n </div>\n )}\n </div>\n );\n}\n"]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/** `unknown` until the first check resolves, so callers don't flash the gate. */
|
|
2
|
+
export type AgentEngineConfiguredState = "unknown" | "configured" | "missing";
|
|
3
|
+
export interface UseAgentEngineConfiguredResult {
|
|
4
|
+
/** True once we know nothing can run the agent (no key / Builder / BYOK). */
|
|
5
|
+
missing: boolean;
|
|
6
|
+
state: AgentEngineConfiguredState;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Shared "can the agent run?" gate — the single source of truth for the sidebar
|
|
10
|
+
* composer and app prompt boxes. Checks the env-key / Builder / BYOK status
|
|
11
|
+
* endpoints on mount, re-checks on `agent-engine:configured-changed`, and folds
|
|
12
|
+
* in the adapter's `agent-chat:missing-api-key` signal. Pass `enabled = false`
|
|
13
|
+
* to short-circuit to configured; flaky requests stay `unknown`.
|
|
14
|
+
*/
|
|
15
|
+
export declare function useAgentEngineConfigured(enabled?: boolean): UseAgentEngineConfiguredResult;
|
|
16
|
+
//# sourceMappingURL=use-agent-engine-configured.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-agent-engine-configured.d.ts","sourceRoot":"","sources":["../../src/client/use-agent-engine-configured.ts"],"names":[],"mappings":"AAMA,iFAAiF;AACjF,MAAM,MAAM,0BAA0B,GAAG,SAAS,GAAG,YAAY,GAAG,SAAS,CAAC;AAE9E,MAAM,WAAW,8BAA8B;IAC7C,6EAA6E;IAC7E,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,0BAA0B,CAAC;CACnC;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,UAAO,GACb,8BAA8B,CAsDhC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { useEffect, useState } from "react";
|
|
2
|
+
import { agentNativePath } from "./api-path.js";
|
|
3
|
+
import { PROVIDER_ENV_VARS } from "../agent/engine/provider-env-vars.js";
|
|
4
|
+
const PROVIDER_ENV_VAR_SET = new Set(PROVIDER_ENV_VARS);
|
|
5
|
+
/**
|
|
6
|
+
* Shared "can the agent run?" gate — the single source of truth for the sidebar
|
|
7
|
+
* composer and app prompt boxes. Checks the env-key / Builder / BYOK status
|
|
8
|
+
* endpoints on mount, re-checks on `agent-engine:configured-changed`, and folds
|
|
9
|
+
* in the adapter's `agent-chat:missing-api-key` signal. Pass `enabled = false`
|
|
10
|
+
* to short-circuit to configured; flaky requests stay `unknown`.
|
|
11
|
+
*/
|
|
12
|
+
export function useAgentEngineConfigured(enabled = true) {
|
|
13
|
+
const [state, setState] = useState("unknown");
|
|
14
|
+
// Mid-run adapter signal that no key is usable — honored even when disabled.
|
|
15
|
+
useEffect(() => {
|
|
16
|
+
const onMissing = () => setState("missing");
|
|
17
|
+
window.addEventListener("agent-chat:missing-api-key", onMissing);
|
|
18
|
+
return () => window.removeEventListener("agent-chat:missing-api-key", onMissing);
|
|
19
|
+
}, []);
|
|
20
|
+
useEffect(() => {
|
|
21
|
+
if (!enabled) {
|
|
22
|
+
setState("configured");
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
let cancelled = false;
|
|
26
|
+
const check = async () => {
|
|
27
|
+
const [envKeys, builderStatus, engineStatus] = await Promise.all([
|
|
28
|
+
fetch(agentNativePath("/_agent-native/env-status"))
|
|
29
|
+
.then((r) => (r.ok ? r.json() : null))
|
|
30
|
+
.catch(() => null),
|
|
31
|
+
fetch(agentNativePath("/_agent-native/builder/status"))
|
|
32
|
+
.then((r) => (r.ok ? r.json() : null))
|
|
33
|
+
.catch(() => null),
|
|
34
|
+
fetch(agentNativePath("/_agent-native/agent-engine/status"))
|
|
35
|
+
.then((r) => (r.ok ? r.json() : null))
|
|
36
|
+
.catch(() => null),
|
|
37
|
+
]);
|
|
38
|
+
if (cancelled)
|
|
39
|
+
return;
|
|
40
|
+
// All three failed — likely a flaky network; keep the current state.
|
|
41
|
+
if (envKeys == null && builderStatus == null && engineStatus == null) {
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
const keys = (envKeys ?? []);
|
|
45
|
+
const llmKeys = keys.filter((k) => PROVIDER_ENV_VAR_SET.has(k.key));
|
|
46
|
+
const anyConfigured = llmKeys.some((k) => k.configured) ||
|
|
47
|
+
builderStatus?.configured === true ||
|
|
48
|
+
engineStatus?.configured === true;
|
|
49
|
+
setState(anyConfigured ? "configured" : "missing");
|
|
50
|
+
};
|
|
51
|
+
void check();
|
|
52
|
+
window.addEventListener("agent-engine:configured-changed", check);
|
|
53
|
+
return () => {
|
|
54
|
+
cancelled = true;
|
|
55
|
+
window.removeEventListener("agent-engine:configured-changed", check);
|
|
56
|
+
};
|
|
57
|
+
}, [enabled]);
|
|
58
|
+
return { missing: state === "missing", state };
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=use-agent-engine-configured.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-agent-engine-configured.js","sourceRoot":"","sources":["../../src/client/use-agent-engine-configured.ts"],"names":[],"mappings":"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","sourcesContent":["import { useEffect, useState } from \"react\";\nimport { agentNativePath } from \"./api-path.js\";\nimport { PROVIDER_ENV_VARS } from \"../agent/engine/provider-env-vars.js\";\n\nconst PROVIDER_ENV_VAR_SET = new Set(PROVIDER_ENV_VARS);\n\n/** `unknown` until the first check resolves, so callers don't flash the gate. */\nexport type AgentEngineConfiguredState = \"unknown\" | \"configured\" | \"missing\";\n\nexport interface UseAgentEngineConfiguredResult {\n /** True once we know nothing can run the agent (no key / Builder / BYOK). */\n missing: boolean;\n state: AgentEngineConfiguredState;\n}\n\n/**\n * Shared \"can the agent run?\" gate — the single source of truth for the sidebar\n * composer and app prompt boxes. Checks the env-key / Builder / BYOK status\n * endpoints on mount, re-checks on `agent-engine:configured-changed`, and folds\n * in the adapter's `agent-chat:missing-api-key` signal. Pass `enabled = false`\n * to short-circuit to configured; flaky requests stay `unknown`.\n */\nexport function useAgentEngineConfigured(\n enabled = true,\n): UseAgentEngineConfiguredResult {\n const [state, setState] = useState<AgentEngineConfiguredState>(\"unknown\");\n\n // Mid-run adapter signal that no key is usable — honored even when disabled.\n useEffect(() => {\n const onMissing = () => setState(\"missing\");\n window.addEventListener(\"agent-chat:missing-api-key\", onMissing);\n return () =>\n window.removeEventListener(\"agent-chat:missing-api-key\", onMissing);\n }, []);\n\n useEffect(() => {\n if (!enabled) {\n setState(\"configured\");\n return;\n }\n let cancelled = false;\n const check = async () => {\n const [envKeys, builderStatus, engineStatus] = await Promise.all([\n fetch(agentNativePath(\"/_agent-native/env-status\"))\n .then((r) => (r.ok ? r.json() : null))\n .catch(() => null),\n fetch(agentNativePath(\"/_agent-native/builder/status\"))\n .then((r) => (r.ok ? r.json() : null))\n .catch(() => null),\n fetch(agentNativePath(\"/_agent-native/agent-engine/status\"))\n .then((r) => (r.ok ? r.json() : null))\n .catch(() => null),\n ]);\n if (cancelled) return;\n // All three failed — likely a flaky network; keep the current state.\n if (envKeys == null && builderStatus == null && engineStatus == null) {\n return;\n }\n const keys = (envKeys ?? []) as Array<{\n key: string;\n configured: boolean;\n }>;\n const llmKeys = keys.filter((k) => PROVIDER_ENV_VAR_SET.has(k.key));\n const anyConfigured =\n llmKeys.some((k) => k.configured) ||\n builderStatus?.configured === true ||\n engineStatus?.configured === true;\n setState(anyConfigured ? \"configured\" : \"missing\");\n };\n void check();\n window.addEventListener(\"agent-engine:configured-changed\", check);\n return () => {\n cancelled = true;\n window.removeEventListener(\"agent-engine:configured-changed\", check);\n };\n }, [enabled]);\n\n return { missing: state === \"missing\", state };\n}\n"]}
|