bs-agent 0.0.7 → 0.0.8

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/index.cjs CHANGED
@@ -425,6 +425,7 @@ function updateAgentMessageParts(parts, newPart) {
425
425
 
426
426
  // src/use-agent.ts
427
427
  function useAgent(agentId, agentUrl, accessKey) {
428
+ console.log("[useAgent] Hook called with:", { agentId, agentUrl, accessKey });
428
429
  const { allSessions, setAllSessions, debugData, setDebugData } = useAgentGlobalState();
429
430
  const [inProgress, setInProgress] = (0, import_react2.useState)(false);
430
431
  const [messages, setMessages] = (0, import_react2.useState)([]);
@@ -474,9 +475,10 @@ function useAgent(agentId, agentUrl, accessKey) {
474
475
  controller.current = new AbortController();
475
476
  const headers = {
476
477
  "Content-Type": "application/json",
477
- ...accessKey ? { Authorization: `Bearer ${accessKey}` } : {},
478
- ...options?.additionalHeaders || {}
478
+ ...options?.additionalHeaders || {},
479
+ ...accessKey ? { Authorization: `Bearer ${accessKey}` } : {}
479
480
  };
481
+ console.log("[useAgent] Request headers:", headers);
480
482
  if (currentSessionId) {
481
483
  headers["x-buildship-agent-session-id"] = currentSessionId;
482
484
  }
@@ -779,12 +781,15 @@ function AgentContextProvider({ children }) {
779
781
  {}
780
782
  );
781
783
  const initializeAgent = (0, import_react4.useCallback)((agentId, agentUrl, accessKey) => {
784
+ console.log("[AgentContext] initializeAgent called:", { agentId, agentUrl, accessKey });
782
785
  const existing = activeAgentsRef.current.get(agentId);
783
786
  if (!existing) {
784
787
  activeAgentsRef.current.set(agentId, { agentUrl, accessKey });
788
+ console.log("[AgentContext] New agent registered:", { agentId, agentUrl, accessKey });
785
789
  forceUpdate({});
786
790
  } else if (existing.agentUrl !== agentUrl || existing.accessKey !== accessKey) {
787
791
  activeAgentsRef.current.set(agentId, { agentUrl, accessKey });
792
+ console.log("[AgentContext] Agent updated:", { agentId, agentUrl, accessKey });
788
793
  forceUpdate({});
789
794
  }
790
795
  }, []);
@@ -822,7 +827,15 @@ function AgentContextProvider({ children }) {
822
827
  );
823
828
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(AgentContext.Provider, { value: contextValue, children: [
824
829
  children,
825
- Array.from(activeAgentsRef.current.entries()).map(([agentId, { agentUrl, accessKey }]) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(AgentRunnerInstance, { agentId, agentUrl, accessKey }, agentId))
830
+ Array.from(activeAgentsRef.current.entries()).map(([agentId, { agentUrl, accessKey }]) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
831
+ AgentRunnerInstance,
832
+ {
833
+ agentId,
834
+ agentUrl,
835
+ accessKey
836
+ },
837
+ agentId
838
+ ))
826
839
  ] });
827
840
  }
828
841
  function AgentRunnerInstance({
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/agent-context.tsx","../src/use-agent.ts","../src/constants.ts","../src/session-utils.ts","../src/debug-handlers.ts","../src/utils/schema.ts","../src/utils/message.ts","../src/utils/use-synced-local-storage.ts"],"sourcesContent":["export * from \"./types\";\nexport * from \"./agent-context\";\nexport { default as useAgent } from \"./use-agent\";\nexport * from \"./constants\";\nexport * from \"./utils/schema\";\nexport * from \"./utils/message\";\n","import {\n createContext,\n useContext,\n useCallback,\n useRef,\n useState,\n useEffect,\n useMemo,\n ReactNode,\n} from \"react\";\nimport useAgent from \"./use-agent\";\nimport type { Message, Session, DebugDataType, ClientToolDefinition } from \"./types\";\nimport { useSyncedLocalStorage } from \"./utils/use-synced-local-storage\";\nimport { AGENT_SESSIONS_KEY, AGENT_DEBUG_DATA_KEY } from \"./constants\";\n\nexport interface AgentRunner {\n messages: Message[];\n inProgress: boolean;\n sessionId: string;\n sessions: Session[];\n debugData: Record<string, DebugDataType>;\n handleSend: (\n input: string,\n options?: {\n context?: Record<string, unknown>;\n testBuildId?: string;\n skipUserMessage?: boolean;\n additionalHeaders?: Record<string, string>;\n tools?: ClientToolDefinition[];\n clientTools?: ClientToolDefinition[];\n },\n ) => Promise<void>;\n switchSession: (sessionId?: string) => void;\n deleteSession: (sessionId: string) => void;\n addOptimisticMessage: (input: string) => void;\n abort: () => void;\n}\n\ninterface AgentContextValue {\n initializeAgent: (agentId: string, agentUrl: string, accessKey?: string) => void;\n registerRunner: (agentId: string, runner: AgentRunner) => void;\n getRunner: (agentId: string) => AgentRunner | null;\n // Global state provided to useAgent hooks\n allSessions: Record<string, Record<string, Session>>;\n setAllSessions: (\n value:\n | Record<string, Record<string, Session>>\n | ((\n prev: Record<string, Record<string, Session>>,\n ) => Record<string, Record<string, Session>>),\n ) => void;\n debugData: Record<string, DebugDataType>;\n setDebugData: (\n value:\n | Record<string, DebugDataType>\n | ((prev: Record<string, DebugDataType>) => Record<string, DebugDataType>),\n ) => void;\n}\n\nconst AgentContext = createContext<AgentContextValue | null>(null);\n\nexport function AgentContextProvider({ children }: { children: ReactNode }) {\n const activeAgentsRef = useRef<Map<string, { agentUrl: string; accessKey?: string }>>(new Map());\n // Store runners in a ref since we push updates via registerRunner\n // Note: Changes to this Ref won't trigger re-renders of consumers of getRunner directly,\n // but since we return the 'runner' object which contains state,\n // and we access it via a hook that listens to updates (implemented below), it works out.\n // Actually, to make 'useAgentContext' reactive to runner changes, we need a subscription mechanism.\n const runnersRef = useRef<Map<string, AgentRunner>>(new Map());\n const listenersRef = useRef<Map<string, Set<() => void>>>(new Map());\n\n const [, forceUpdate] = useState({});\n\n // Global Sync State managed here to be shared\n const [allSessions, setAllSessions] = useSyncedLocalStorage<\n Record<string, Record<string, Session>>\n >(AGENT_SESSIONS_KEY, {});\n\n const [debugData, setDebugData] = useSyncedLocalStorage<Record<string, DebugDataType>>(\n AGENT_DEBUG_DATA_KEY,\n {},\n );\n\n const initializeAgent = useCallback((agentId: string, agentUrl: string, accessKey?: string) => {\n const existing = activeAgentsRef.current.get(agentId);\n\n if (!existing) {\n activeAgentsRef.current.set(agentId, { agentUrl, accessKey });\n forceUpdate({});\n } else if (existing.agentUrl !== agentUrl || existing.accessKey !== accessKey) {\n activeAgentsRef.current.set(agentId, { agentUrl, accessKey });\n forceUpdate({});\n }\n }, []);\n\n const registerRunner = useCallback((agentId: string, runner: AgentRunner) => {\n runnersRef.current.set(agentId, runner);\n // Notify listeners for this agentId\n const listeners = listenersRef.current.get(agentId);\n if (listeners) {\n listeners.forEach((callback) => callback());\n }\n }, []);\n\n const getRunner = useCallback((agentId: string) => {\n return runnersRef.current.get(agentId) || null;\n }, []);\n\n const contextValue = useMemo(\n () => ({\n initializeAgent,\n registerRunner,\n getRunner,\n allSessions,\n setAllSessions,\n debugData,\n setDebugData,\n runnersRef,\n listenersRef,\n }),\n [\n initializeAgent,\n registerRunner,\n getRunner,\n allSessions,\n setAllSessions,\n debugData,\n setDebugData,\n ],\n );\n\n return (\n <AgentContext.Provider value={contextValue}>\n {children}\n {Array.from(activeAgentsRef.current.entries()).map(([agentId, { agentUrl, accessKey }]) => (\n <AgentRunnerInstance key={agentId} agentId={agentId} agentUrl={agentUrl} accessKey={accessKey} />\n ))}\n </AgentContext.Provider>\n );\n}\n\nfunction AgentRunnerInstance({\n agentId,\n agentUrl,\n accessKey,\n}: {\n agentId: string;\n agentUrl: string;\n accessKey?: string;\n}) {\n const agent = useAgent(agentId, agentUrl, accessKey);\n const context = useContext(AgentContext);\n\n if (!context) return null;\n\n useEffect(() => {\n context.registerRunner(agentId, agent);\n }, [agentId, agent, context]);\n\n return null;\n}\n\nexport function useAgentContext(\n agentId: string,\n agentUrl: string,\n accessKey?: string,\n): AgentRunner {\n const context = useContext(AgentContext);\n\n if (!context) {\n throw new Error(\"useAgentContext must be used within AgentContextProvider\");\n }\n\n const { initializeAgent, getRunner, listenersRef } = context as AgentContextValue & {\n listenersRef: React.MutableRefObject<Map<string, Set<() => void>>>;\n };\n\n useEffect(() => {\n initializeAgent(agentId, agentUrl, accessKey);\n }, [agentId, agentUrl, initializeAgent]);\n\n // Reactive subscription to runner updates\n const [runner, setRunner] = useState<AgentRunner | null>(() => getRunner(agentId));\n\n useEffect(() => {\n // Current runner state\n const currentRunner = getRunner(agentId);\n if (currentRunner !== runner) {\n setRunner(currentRunner);\n }\n\n // Subscribe to future updates\n const callback = () => {\n setRunner(getRunner(agentId));\n };\n\n if (!listenersRef.current.has(agentId)) {\n listenersRef.current.set(agentId, new Set());\n }\n listenersRef.current.get(agentId)?.add(callback);\n\n return () => {\n listenersRef.current.get(agentId)?.delete(callback);\n };\n }, [agentId, getRunner]);\n\n const placeholder = useMemo(\n () => ({\n messages: [],\n inProgress: false,\n sessionId: \"\",\n sessions: [],\n debugData: {},\n handleSend: async () => {},\n switchSession: () => {},\n deleteSession: () => {},\n addOptimisticMessage: () => {},\n abort: () => {},\n }),\n [],\n );\n\n return runner || placeholder;\n}\n\n// Hook to access the global state for use-agent\nexport function useAgentGlobalState() {\n const context = useContext(AgentContext);\n if (!context) {\n throw new Error(\"useAgentGlobalState must be used within AgentContextProvider\");\n }\n return {\n allSessions: context.allSessions,\n setAllSessions: context.setAllSessions,\n debugData: context.debugData,\n setDebugData: context.setDebugData,\n };\n}\n","import { useCallback, useRef, useState, useEffect } from \"react\";\nimport { EventSourceMessage, fetchEventSource } from \"@microsoft/fetch-event-source\";\n\nimport { DEFAULT_SESSION_NAME, TEMPORARY_SESSION_ID } from \"./constants\";\nimport { useSessionUtils } from \"./session-utils\";\nimport { createDebugHandlers } from \"./debug-handlers\";\nimport { useAgentGlobalState } from \"./agent-context\";\nimport type { Message, MessagePart, OutputStreamEventType, ClientToolDefinition } from \"./types\";\nimport { cleanSchema, tryParseJSON } from \"./utils/schema\";\nimport { updateAgentMessageParts } from \"./utils/message\";\n\nexport default function useAgent(agentId: string, agentUrl: string, accessKey?: string) {\n // Use global state from Context instead of Jotai atoms\n const { allSessions, setAllSessions, debugData, setDebugData } = useAgentGlobalState();\n\n const [inProgress, setInProgress] = useState(false);\n const [messages, setMessages] = useState<Array<Message>>([]);\n\n const messagesRef = useRef<Array<Message>>([]);\n\n // Initialize currentSessionId later after sessionUtils is available\n const [currentSessionId, setCurrentSessionId] = useState<string>(TEMPORARY_SESSION_ID);\n\n const sessionUtils = useSessionUtils(\n agentId,\n allSessions,\n setAllSessions,\n currentSessionId,\n setCurrentSessionId,\n messagesRef,\n );\n\n // Set initial session ID after sessionUtils is available\n useEffect(() => {\n const initialSessionId = sessionUtils.getInitialSessionId();\n setCurrentSessionId(initialSessionId);\n }, []);\n\n const debugHandlers = createDebugHandlers(setDebugData);\n\n // Keep messagesRef in sync with messages state\n useEffect(() => {\n messagesRef.current = messages;\n }, [messages]);\n\n // Initialize or load session\n useEffect(() => {\n // Don't reset messages if we're currently in progress (streaming)\n if (inProgress) {\n return;\n }\n\n const session = sessionUtils.agentSessions[currentSessionId];\n\n if (session) {\n setMessages(session.messages);\n } else {\n setMessages([]);\n }\n }, [currentSessionId, sessionUtils.agentSessions, agentId, inProgress]);\n\n // Only sync on unmount to prevent data loss\n useEffect(() => {\n return () => {\n if (messagesRef.current.length > 0 && sessionUtils.syncSessionRef.current) {\n sessionUtils.syncSessionRef.current();\n }\n };\n }, []);\n\n const controller = useRef<AbortController>();\n\n const runAgent = useCallback(\n async (\n input: string,\n options?: {\n context?: object;\n testBuildId?: string;\n additionalHeaders?: Record<string, string>;\n tools?: ClientToolDefinition[];\n clientTools?: ClientToolDefinition[];\n },\n ) => {\n setInProgress(true);\n // Abort any existing request before creating a new controller\n if (controller.current) {\n controller.current.abort();\n }\n controller.current = new AbortController();\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n ...(accessKey ? { Authorization: `Bearer ${accessKey}` } : {}),\n ...(options?.additionalHeaders || {}),\n };\n\n // Include session ID in headers if we have one\n if (currentSessionId) {\n headers[\"x-buildship-agent-session-id\"] = currentSessionId;\n }\n\n const body = {\n stream: true,\n input,\n context: options?.context || {},\n testBuildId: options?.testBuildId,\n tools: options?.tools?.map((t: { parameters: unknown }) => ({\n ...t,\n parameters: cleanSchema(t.parameters),\n })),\n clientTools: options?.clientTools?.map((t: { parameters: unknown }) => ({\n ...t,\n parameters: cleanSchema(t.parameters),\n })),\n };\n\n try {\n await fetchEventSource(agentUrl, {\n method: \"POST\",\n headers,\n signal: controller.current.signal,\n openWhenHidden: true,\n body: JSON.stringify(body),\n onopen: async (resp) => {\n // catch the 404 status\n if (resp.status >= 400) {\n console.log(`AI onopen error with status: ${resp.status}`);\n\n if (resp.status === 404) {\n // for resume operations with 404, throw a specific error for retry\n throw new Error(`Not Found (${resp.statusText})`);\n }\n\n throw new Error(`Error status ${resp.status}`);\n }\n\n // Extract session ID from response headers if we don't have one\n if (!currentSessionId || currentSessionId === TEMPORARY_SESSION_ID) {\n const sessionId = resp.headers.get(\"x-buildship-agent-session-id\");\n if (sessionId) {\n // Transfer current messages to the new session before switching\n const currentMessages = messagesRef.current;\n const sessionName =\n resp.headers.get(\"x-buildship-agent-session-name\") || DEFAULT_SESSION_NAME;\n\n sessionUtils.createSessionFromResponse(sessionId, sessionName, currentMessages);\n setCurrentSessionId(sessionId);\n }\n }\n\n // Extract execution ID from response headers and update the last user message\n const executionId = resp.headers.get(\"x-buildship-agent-execution-id\");\n if (executionId) {\n setMessages((prev) => {\n const lastMessage = prev[prev.length - 1];\n if (lastMessage?.role === \"user\") {\n const updatedMessage = {\n ...lastMessage,\n executionId: executionId,\n };\n const updatedMessages = [...prev.slice(0, -1), updatedMessage];\n\n // Sync updated user message\n if (sessionUtils.syncSessionRef.current) {\n sessionUtils.syncSessionRef.current(updatedMessages);\n }\n\n return updatedMessages;\n }\n return prev;\n });\n }\n },\n onmessage: (event: EventSourceMessage) => {\n try {\n const parsed = JSON.parse(event.data) as OutputStreamEventType;\n\n if (parsed.type === \"llm_text_delta\") {\n setMessages((prev) => {\n const lastMessage = prev[prev.length - 1];\n const sequence = parsed.meta.sequence;\n const newPart: MessagePart = {\n type: \"text\",\n text: parsed.data,\n firstSequence: sequence,\n lastSequence: sequence,\n };\n\n let updatedMessages: Message[];\n\n if (lastMessage?.role === \"agent\") {\n const updatedMessage: Message = {\n ...lastMessage,\n content: lastMessage.content + parsed.data, // content is still useful for simple displays\n parts: updateAgentMessageParts(lastMessage.parts || [], newPart),\n };\n updatedMessages = [...prev.slice(0, -1), updatedMessage];\n } else {\n const updatedMessage: Message = {\n role: \"agent\" as const,\n content: parsed.data,\n parts: [newPart],\n executionId: parsed.meta.executionId,\n };\n updatedMessages = [...prev, updatedMessage];\n }\n\n if (sessionUtils.syncSessionRef.current) {\n sessionUtils.syncSessionRef.current(updatedMessages);\n }\n\n return updatedMessages;\n });\n } else if (parsed.type === \"client_tool_call\") {\n setMessages((prev) => {\n const lastMessage = prev[prev.length - 1];\n const newPart: MessagePart = {\n type: \"widget\",\n toolName: parsed.data.toolName,\n callId: parsed.data.callId,\n inputs: tryParseJSON(parsed.data.inputs),\n sequence: parsed.meta.sequence,\n };\n\n let updatedMessages: Message[];\n\n if (lastMessage?.role === \"agent\") {\n const updatedMessage: Message = {\n ...lastMessage,\n parts: updateAgentMessageParts(lastMessage.parts || [], newPart),\n };\n updatedMessages = [...prev.slice(0, -1), updatedMessage];\n } else {\n const updatedMessage: Message = {\n role: \"agent\" as const,\n content: \"\",\n parts: [newPart],\n executionId: parsed.meta.executionId,\n };\n updatedMessages = [...prev, updatedMessage];\n }\n\n if (sessionUtils.syncSessionRef.current) {\n sessionUtils.syncSessionRef.current(updatedMessages);\n }\n\n return updatedMessages;\n });\n } else if (\n parsed.type.startsWith(\"debug_\") ||\n parsed.type === \"llm_reasoning_delta\" ||\n parsed.type === \"agent_handoff\" ||\n parsed.type === \"mcp_tool_call_start\" ||\n parsed.type === \"mcp_tool_call_end\"\n ) {\n debugHandlers.handleDebugEvent(parsed);\n }\n } catch (e) {\n console.log(\"Failed to parse agent message\", e);\n }\n },\n onclose: () => {\n console.log(\"Agent closed\");\n setInProgress(false);\n // Sync messages when streaming completes\n if (sessionUtils.syncSessionRef.current) {\n sessionUtils.syncSessionRef.current();\n }\n },\n onerror: (e) => {\n console.log(\"Agent error\", e);\n setInProgress(false);\n // Sync messages on error to prevent data loss\n if (sessionUtils.syncSessionRef.current) {\n sessionUtils.syncSessionRef.current(messagesRef.current);\n }\n throw new Error(\"Failed to execute agent\");\n },\n });\n } catch (error) {\n console.log(\"Agent execution failed\", error);\n setInProgress(false);\n // Sync messages on execution failure\n if (sessionUtils.syncSessionRef.current) {\n sessionUtils.syncSessionRef.current(messagesRef.current);\n }\n throw error;\n }\n },\n [agentUrl, accessKey, currentSessionId, sessionUtils, debugHandlers],\n );\n\n const handleSend = useCallback(\n async (\n input: string,\n options?: {\n context?: object;\n testBuildId?: string;\n skipUserMessage?: boolean;\n additionalHeaders?: Record<string, string>;\n tools?: ClientToolDefinition[];\n clientTools?: ClientToolDefinition[];\n },\n ) => {\n const userMessage = {\n role: \"user\" as const,\n content: input,\n executionId: Date.now().toString(),\n };\n\n // Only add user message if not skipping\n if (!options?.skipUserMessage) {\n setMessages((prev) => {\n const updatedMessages = [...prev, userMessage];\n // Sync immediately after user message\n if (sessionUtils.syncSessionRef.current) {\n sessionUtils.syncSessionRef.current(updatedMessages);\n }\n return updatedMessages;\n });\n }\n\n try {\n await runAgent(input, options);\n } catch (error) {\n // Ensure user message is preserved even if agent execution fails\n if (!options?.skipUserMessage) {\n setMessages((prev) => {\n const updatedMessages = prev.some((m) => m === userMessage)\n ? prev\n : [...prev, userMessage];\n if (sessionUtils.syncSessionRef.current) {\n sessionUtils.syncSessionRef.current(updatedMessages);\n }\n return updatedMessages;\n });\n }\n throw error;\n }\n },\n [runAgent, sessionUtils.syncSessionRef],\n );\n\n const addOptimisticMessage = useCallback(\n (input: string) => {\n const userMessage = {\n role: \"user\" as const,\n content: input,\n executionId: Date.now().toString(),\n };\n\n setMessages((prev) => {\n const updatedMessages = [...prev, userMessage];\n // Sync immediately after user message\n if (sessionUtils.syncSessionRef.current) {\n sessionUtils.syncSessionRef.current(updatedMessages);\n }\n return updatedMessages;\n });\n },\n [sessionUtils.syncSessionRef],\n );\n\n const abort = useCallback(() => {\n if (controller.current) {\n controller.current.abort();\n }\n setInProgress(false);\n // Sync messages to prevent data loss\n if (sessionUtils.syncSessionRef.current) {\n sessionUtils.syncSessionRef.current(messagesRef.current);\n }\n }, [sessionUtils.syncSessionRef]);\n\n return {\n inProgress,\n messages,\n handleSend,\n addOptimisticMessage,\n abort,\n sessionId: currentSessionId,\n switchSession: sessionUtils.switchSession,\n deleteSession: sessionUtils.deleteSession,\n sessions: sessionUtils.sessionsList,\n debugData,\n };\n}\n","export const AGENT_SESSIONS_KEY = \"buildship:agent:conversations\";\nexport const AGENT_DEBUG_DATA_KEY = \"buildship:agent:debug\";\n\nexport const DEFAULT_SESSION_NAME = \"New Chat\";\nexport const TEMPORARY_SESSION_ID = \"sess_temp\";\n","import { useCallback, useMemo, useRef } from \"react\";\nimport type { Message, Session } from \"./types\";\nimport { TEMPORARY_SESSION_ID } from \"./constants\";\n\nexport const useSessionUtils = (\n agentId: string,\n allSessions: Record<string, Record<string, Session>>,\n setAllSessions: (\n value:\n | Record<string, Record<string, Session>>\n | ((\n prev: Record<string, Record<string, Session>>,\n ) => Record<string, Record<string, Session>>),\n ) => void,\n currentSessionId: string,\n setCurrentSessionId: (sessionId: string) => void,\n messagesRef: React.MutableRefObject<Array<Message>>,\n) => {\n const agentSessions = useMemo(() => allSessions[agentId] || {}, [agentId, allSessions]);\n\n const syncSessionRef = useRef<(messages?: Array<Message>) => void>();\n\n syncSessionRef.current = (updatedMessages?: Array<Message>) => {\n if (!currentSessionId || currentSessionId === TEMPORARY_SESSION_ID) {\n return;\n }\n\n setAllSessions((prev) => ({\n ...prev,\n [agentId]: {\n ...prev[agentId],\n [currentSessionId]: {\n ...prev[agentId]?.[currentSessionId],\n messages: updatedMessages ?? messagesRef.current,\n updatedAt: Date.now(),\n },\n },\n }));\n };\n\n const getInitialSessionId = () => {\n const sessions = Object.values(agentSessions);\n if (sessions.length > 0) {\n return sessions.sort((a, b) => b.updatedAt - a.updatedAt)[0].id;\n }\n return TEMPORARY_SESSION_ID;\n };\n\n const switchSession = useCallback(\n (sessionId: string = TEMPORARY_SESSION_ID) => {\n setCurrentSessionId(sessionId);\n },\n [setCurrentSessionId],\n );\n\n const deleteSession = useCallback(\n (sessionId: string) => {\n if (!sessionId || sessionId === TEMPORARY_SESSION_ID) {\n return;\n }\n\n setAllSessions((prev) => {\n const updatedAgentSessions = { ...prev[agentId] };\n delete updatedAgentSessions[sessionId];\n\n return {\n ...prev,\n [agentId]: updatedAgentSessions,\n };\n });\n\n if (sessionId === currentSessionId) {\n const remainingSessions = Object.values(agentSessions).filter((s) => s.id !== sessionId);\n if (remainingSessions.length > 0) {\n const mostRecent = remainingSessions.sort((a, b) => b.updatedAt - a.updatedAt)[0];\n setCurrentSessionId(mostRecent.id);\n } else {\n setCurrentSessionId(TEMPORARY_SESSION_ID);\n }\n }\n },\n [agentId, currentSessionId, agentSessions, setAllSessions, setCurrentSessionId],\n );\n\n const sessionsList = useMemo(\n () => Object.values(agentSessions).sort((a, b) => b.updatedAt - a.updatedAt),\n [agentSessions],\n );\n\n const createSessionFromResponse = (\n sessionId: string,\n sessionName: string,\n currentMessages: Array<Message>,\n ) => {\n setAllSessions((prev) => ({\n ...prev,\n [agentId]: {\n ...prev[agentId],\n [sessionId]: {\n id: sessionId,\n createdAt: Date.now(),\n updatedAt: Date.now(),\n messages: currentMessages,\n name: sessionName,\n },\n },\n }));\n };\n\n return {\n agentSessions,\n syncSessionRef,\n getInitialSessionId,\n switchSession,\n deleteSession,\n sessionsList,\n createSessionFromResponse,\n };\n};\n","import type {\n AgentDebugEventType,\n AgentHandoffEventType,\n DebugDataType,\n LLMReasoningDeltaEventType,\n ReasoningItem,\n ToolExecutionItem,\n HandoffItem,\n MCPToolCallStartEventType,\n MCPToolCallEndEventType,\n MCPToolExecutionItem,\n} from \"./types\";\n\nexport const createDebugHandlers = (\n setDebugData: (\n value:\n | Record<string, DebugDataType>\n | ((prev: Record<string, DebugDataType>) => Record<string, DebugDataType>),\n ) => void,\n) => {\n const handleDebugToolExecutionStarted = (parsed: AgentDebugEventType) => {\n const executionId = parsed.meta.executionId;\n setDebugData((prev) => ({\n ...prev,\n [executionId]: [\n ...(prev[executionId] || []),\n {\n itemType: \"tool_call\",\n toolId: (parsed.data as { toolId?: string }).toolId || \"unknown\",\n toolCallId: (parsed.data as { toolCallId?: string }).toolCallId,\n status: \"progress\",\n },\n ],\n }));\n };\n\n const handleDebugToolExecutionInputs = (parsed: AgentDebugEventType) => {\n const executionId = parsed.meta.executionId;\n const toolCallId = (parsed.data as { toolCallId?: string }).toolCallId;\n setDebugData((prev) => {\n const currentData = [...(prev[executionId] || [])];\n\n for (let i = currentData.length - 1; i >= 0; i--) {\n if (currentData[i].itemType === \"tool_call\") {\n const toolItem = currentData[i] as ToolExecutionItem;\n if (toolItem.toolCallId === toolCallId) {\n currentData[i] = {\n ...toolItem,\n inputs: (parsed.data as { value: unknown }).value,\n };\n break;\n }\n }\n }\n\n return {\n ...prev,\n [executionId]: currentData,\n };\n });\n };\n\n const handleDebugToolExecutionFinished = (parsed: AgentDebugEventType) => {\n const executionId = parsed.meta.executionId;\n const toolCallId = (parsed.data as { toolCallId?: string }).toolCallId;\n setDebugData((prev) => {\n const currentData = [...(prev[executionId] || [])];\n\n for (let i = currentData.length - 1; i >= 0; i--) {\n if (currentData[i].itemType === \"tool_call\") {\n const toolItem = currentData[i] as ToolExecutionItem;\n if (toolItem.toolCallId === toolCallId) {\n currentData[i] = {\n ...toolItem,\n status: \"complete\",\n output: (parsed.data as { value: unknown }).value,\n };\n break;\n }\n }\n }\n\n return {\n ...prev,\n [executionId]: currentData,\n };\n });\n };\n\n const handleDebugToolExecutionError = (parsed: AgentDebugEventType) => {\n const executionId = parsed.meta.executionId;\n const toolCallId = (parsed.data as { toolCallId?: string }).toolCallId;\n setDebugData((prev) => {\n const currentData = [...(prev[executionId] || [])];\n\n for (let i = currentData.length - 1; i >= 0; i--) {\n if (currentData[i].itemType === \"tool_call\") {\n const toolItem = currentData[i] as ToolExecutionItem;\n if (toolItem.toolCallId === toolCallId) {\n currentData[i] = {\n ...toolItem,\n status: \"error\",\n output: (parsed.data as { value: unknown }).value,\n };\n break;\n }\n }\n }\n\n return {\n ...prev,\n [executionId]: currentData,\n };\n });\n };\n\n const handleDebugToolLog = (parsed: AgentDebugEventType) => {\n const executionId = parsed.meta.executionId;\n const toolCallId = (parsed.data as { toolCallId?: string }).toolCallId;\n setDebugData((prev) => {\n const currentData = [...(prev[executionId] || [])];\n\n for (let i = currentData.length - 1; i >= 0; i--) {\n if (currentData[i].itemType === \"tool_call\") {\n const toolItem = currentData[i] as ToolExecutionItem;\n if (toolItem.toolCallId === toolCallId) {\n const currentLogs = toolItem.logs || [];\n currentData[i] = {\n ...toolItem,\n logs: [...currentLogs, (parsed.data as { value: unknown[] }).value[0]],\n };\n break;\n }\n }\n }\n\n return {\n ...prev,\n [executionId]: currentData,\n };\n });\n };\n\n let lastReasoningIndex = -1;\n const handleDebugReasoningStep = (parsed: LLMReasoningDeltaEventType) => {\n const executionId = parsed.meta.executionId;\n const { delta, index } = parsed.data;\n setDebugData((prev) => {\n const currentData = [...(prev[executionId] || [])];\n\n if (lastReasoningIndex < index) {\n currentData.push({ itemType: \"reasoning\", reasoning: \"\" });\n lastReasoningIndex = index;\n }\n\n for (let i = currentData.length - 1; i >= 0; i--) {\n if (currentData[i].itemType === \"reasoning\") {\n currentData[i] = {\n itemType: \"reasoning\",\n reasoning: (currentData[i] as ReasoningItem).reasoning + delta,\n };\n break;\n }\n }\n\n return {\n ...prev,\n [executionId]: currentData,\n };\n });\n };\n\n const handleAgentHandoff = (parsed: AgentHandoffEventType) => {\n const executionId = parsed.meta.executionId;\n setDebugData((prev) => ({\n ...prev,\n [executionId]: [\n ...(prev[executionId] || []),\n {\n itemType: \"handoff\",\n agentName: parsed.data.agentName,\n } as HandoffItem,\n ],\n }));\n };\n\n const handleMCPToolCallStart = (parsed: MCPToolCallStartEventType) => {\n const executionId = parsed.meta.executionId;\n setDebugData((prev) => ({\n ...prev,\n [executionId]: [\n ...(prev[executionId] || []),\n {\n itemType: \"mcp_tool_call\",\n toolName: parsed.data.toolName,\n serverName: parsed.data.serverName,\n callId: parsed.data.callId,\n status: \"progress\",\n inputs: parsed.data.inputs,\n } as MCPToolExecutionItem,\n ],\n }));\n };\n\n const handleMCPToolCallEnd = (parsed: MCPToolCallEndEventType) => {\n const executionId = parsed.meta.executionId;\n const callId = parsed.data.callId;\n setDebugData((prev) => {\n const currentData = [...(prev[executionId] || [])];\n\n for (let i = currentData.length - 1; i >= 0; i--) {\n if (currentData[i].itemType === \"mcp_tool_call\") {\n const mcpToolItem = currentData[i] as MCPToolExecutionItem;\n if (mcpToolItem.callId === callId) {\n currentData[i] = {\n ...mcpToolItem,\n status: parsed.data.error ? \"error\" : \"complete\",\n output: parsed.data.result,\n error: parsed.data.error,\n };\n break;\n }\n }\n }\n\n return {\n ...prev,\n [executionId]: currentData,\n };\n });\n };\n\n const handleDebugEvent = (\n parsed:\n | AgentDebugEventType\n | LLMReasoningDeltaEventType\n | AgentHandoffEventType\n | MCPToolCallStartEventType\n | MCPToolCallEndEventType,\n ) => {\n switch (parsed.type) {\n case \"debug_tool_execution_started\":\n handleDebugToolExecutionStarted(parsed);\n break;\n case \"debug_tool_execution_inputs\":\n handleDebugToolExecutionInputs(parsed);\n break;\n case \"debug_tool_execution_finished\":\n handleDebugToolExecutionFinished(parsed);\n break;\n case \"debug_tool_execution_error\":\n handleDebugToolExecutionError(parsed);\n break;\n case \"debug_tool_log\":\n handleDebugToolLog(parsed);\n break;\n case \"llm_reasoning_delta\":\n handleDebugReasoningStep(parsed);\n break;\n case \"agent_handoff\":\n handleAgentHandoff(parsed);\n break;\n case \"mcp_tool_call_start\":\n handleMCPToolCallStart(parsed);\n break;\n case \"mcp_tool_call_end\":\n handleMCPToolCallEnd(parsed);\n break;\n }\n };\n\n return {\n handleDebugEvent,\n };\n};\n","/**\n * Helper to clean JSON Schema for LLM compatibility.\n * Replaces modern Draft 2020-12 features with older, more compatible alternatives.\n * Specifically handles OpenAI's 'Strict Mode' requirements.\n */\nexport function cleanSchema(obj: unknown): unknown {\n if (Array.isArray(obj)) {\n return obj.map(cleanSchema);\n } else if (obj !== null && typeof obj === \"object\") {\n const newObj: Record<string, unknown> = {};\n const currentObj = obj as Record<string, any>;\n\n for (const key in currentObj) {\n // Remove keys that are not supported by most LLMs\n if (key === \"propertyNames\" || key === \"$schema\") {\n continue;\n }\n newObj[key] = cleanSchema(currentObj[key]);\n }\n\n // OpenAI and some other LLMs require additionalProperties: false for all objects in strict mode\n // AND every property must be explicitly listed in the 'required' array\n if (newObj.type === \"object\") {\n if (\n newObj.additionalProperties === undefined ||\n (newObj.additionalProperties &&\n typeof newObj.additionalProperties === \"object\" &&\n Object.keys(newObj.additionalProperties).length === 0)\n ) {\n newObj.additionalProperties = false;\n }\n\n if (newObj.additionalProperties === false && newObj.properties) {\n newObj.required = Object.keys(newObj.properties as object);\n }\n }\n\n return newObj;\n }\n return obj;\n}\n\n/**\n * Safely attempts to parse a value as JSON if it's a string.\n */\nexport function tryParseJSON(value: unknown): any {\n if (typeof value === \"string\") {\n try {\n return JSON.parse(value);\n } catch {\n return value;\n }\n }\n return value;\n}\n","import type { MessagePart } from \"../types\";\n\n/**\n * Updates a list of message parts with a new part,\n * ensuring chronological order by sequence and merging contiguous text deltas.\n */\nexport function updateAgentMessageParts(parts: MessagePart[], newPart: MessagePart): MessagePart[] {\n // 1. Combine and sort all parts by their sequence ID\n const sorted = [...parts, newPart].sort((a, b) => {\n const aStart = a.type === \"text\" ? a.firstSequence : a.sequence;\n const bStart = b.type === \"text\" ? b.firstSequence : b.sequence;\n return aStart - bStart;\n });\n\n // 2. Reduce the sorted parts to merge contiguous text blocks\n return sorted.reduce<MessagePart[]>((acc, current) => {\n const last = acc[acc.length - 1];\n\n // Check if we can merge this text part with the previous one\n const canMerge =\n last?.type === \"text\" &&\n current.type === \"text\" &&\n current.firstSequence === last.lastSequence + 1;\n\n if (canMerge) {\n acc[acc.length - 1] = {\n ...last,\n text: last.text + current.text,\n lastSequence: current.lastSequence,\n };\n return acc;\n }\n\n acc.push(current);\n return acc;\n }, []);\n}\n","import { useState, useEffect, useCallback } from \"react\";\n\n// Helper to handle JSON parsing cleanly\nfunction parseJSON<T>(value: string | null, defaultValue: T): T {\n if (value === null) return defaultValue;\n try {\n return JSON.parse(value);\n } catch {\n return defaultValue;\n }\n}\n\nexport function useSyncedLocalStorage<T>(\n key: string,\n initialValue: T,\n): [T, (value: T | ((val: T) => T)) => void] {\n // Initialize state function to avoid reading localStorage on every render\n const [storedValue, setStoredValue] = useState<T>(() => {\n if (typeof window === \"undefined\") {\n return initialValue;\n }\n try {\n const item = window.localStorage.getItem(key);\n return parseJSON(item, initialValue);\n } catch (error) {\n console.warn(`Error reading localStorage key \"${key}\":`, error);\n return initialValue;\n }\n });\n\n // Function to update state and localStorage\n const setValue = useCallback(\n (value: T | ((val: T) => T)) => {\n try {\n setStoredValue((prev) => {\n const valueToStore = value instanceof Function ? value(prev) : value;\n\n if (typeof window !== \"undefined\") {\n window.localStorage.setItem(key, JSON.stringify(valueToStore));\n // Dispatch a custom event so other hooks in the same window update\n window.dispatchEvent(\n new StorageEvent(\"storage\", { key, newValue: JSON.stringify(valueToStore) }),\n );\n }\n return valueToStore;\n });\n } catch (error) {\n console.warn(`Error setting localStorage key \"${key}\":`, error);\n }\n },\n [key],\n );\n\n // Sync across tabs/windows and within the same window\n useEffect(() => {\n const handleStorageChange = (event: StorageEvent) => {\n if (event.key === key) {\n setStoredValue(parseJSON(event.newValue, initialValue));\n }\n };\n\n window.addEventListener(\"storage\", handleStorageChange);\n return () => window.removeEventListener(\"storage\", handleStorageChange);\n }, [key, initialValue]);\n\n return [storedValue, setValue];\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,IAAAA,gBASO;;;ACTP,IAAAC,gBAAyD;AACzD,gCAAqD;;;ACD9C,IAAM,qBAAqB;AAC3B,IAAM,uBAAuB;AAE7B,IAAM,uBAAuB;AAC7B,IAAM,uBAAuB;;;ACJpC,mBAA6C;AAItC,IAAM,kBAAkB,CAC7B,SACA,aACA,gBAOA,kBACA,qBACA,gBACG;AACH,QAAM,oBAAgB,sBAAQ,MAAM,YAAY,OAAO,KAAK,CAAC,GAAG,CAAC,SAAS,WAAW,CAAC;AAEtF,QAAM,qBAAiB,qBAA4C;AAEnE,iBAAe,UAAU,CAAC,oBAAqC;AAC7D,QAAI,CAAC,oBAAoB,qBAAqB,sBAAsB;AAClE;AAAA,IACF;AAEA,mBAAe,CAAC,UAAU;AAAA,MACxB,GAAG;AAAA,MACH,CAAC,OAAO,GAAG;AAAA,QACT,GAAG,KAAK,OAAO;AAAA,QACf,CAAC,gBAAgB,GAAG;AAAA,UAClB,GAAG,KAAK,OAAO,IAAI,gBAAgB;AAAA,UACnC,UAAU,mBAAmB,YAAY;AAAA,UACzC,WAAW,KAAK,IAAI;AAAA,QACtB;AAAA,MACF;AAAA,IACF,EAAE;AAAA,EACJ;AAEA,QAAM,sBAAsB,MAAM;AAChC,UAAM,WAAW,OAAO,OAAO,aAAa;AAC5C,QAAI,SAAS,SAAS,GAAG;AACvB,aAAO,SAAS,KAAK,CAAC,GAAG,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC,EAAE;AAAA,IAC/D;AACA,WAAO;AAAA,EACT;AAEA,QAAM,oBAAgB;AAAA,IACpB,CAAC,YAAoB,yBAAyB;AAC5C,0BAAoB,SAAS;AAAA,IAC/B;AAAA,IACA,CAAC,mBAAmB;AAAA,EACtB;AAEA,QAAM,oBAAgB;AAAA,IACpB,CAAC,cAAsB;AACrB,UAAI,CAAC,aAAa,cAAc,sBAAsB;AACpD;AAAA,MACF;AAEA,qBAAe,CAAC,SAAS;AACvB,cAAM,uBAAuB,EAAE,GAAG,KAAK,OAAO,EAAE;AAChD,eAAO,qBAAqB,SAAS;AAErC,eAAO;AAAA,UACL,GAAG;AAAA,UACH,CAAC,OAAO,GAAG;AAAA,QACb;AAAA,MACF,CAAC;AAED,UAAI,cAAc,kBAAkB;AAClC,cAAM,oBAAoB,OAAO,OAAO,aAAa,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,SAAS;AACvF,YAAI,kBAAkB,SAAS,GAAG;AAChC,gBAAM,aAAa,kBAAkB,KAAK,CAAC,GAAG,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC;AAChF,8BAAoB,WAAW,EAAE;AAAA,QACnC,OAAO;AACL,8BAAoB,oBAAoB;AAAA,QAC1C;AAAA,MACF;AAAA,IACF;AAAA,IACA,CAAC,SAAS,kBAAkB,eAAe,gBAAgB,mBAAmB;AAAA,EAChF;AAEA,QAAM,mBAAe;AAAA,IACnB,MAAM,OAAO,OAAO,aAAa,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,YAAY,EAAE,SAAS;AAAA,IAC3E,CAAC,aAAa;AAAA,EAChB;AAEA,QAAM,4BAA4B,CAChC,WACA,aACA,oBACG;AACH,mBAAe,CAAC,UAAU;AAAA,MACxB,GAAG;AAAA,MACH,CAAC,OAAO,GAAG;AAAA,QACT,GAAG,KAAK,OAAO;AAAA,QACf,CAAC,SAAS,GAAG;AAAA,UACX,IAAI;AAAA,UACJ,WAAW,KAAK,IAAI;AAAA,UACpB,WAAW,KAAK,IAAI;AAAA,UACpB,UAAU;AAAA,UACV,MAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF,EAAE;AAAA,EACJ;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ACzGO,IAAM,sBAAsB,CACjC,iBAKG;AACH,QAAM,kCAAkC,CAAC,WAAgC;AACvE,UAAM,cAAc,OAAO,KAAK;AAChC,iBAAa,CAAC,UAAU;AAAA,MACtB,GAAG;AAAA,MACH,CAAC,WAAW,GAAG;AAAA,QACb,GAAI,KAAK,WAAW,KAAK,CAAC;AAAA,QAC1B;AAAA,UACE,UAAU;AAAA,UACV,QAAS,OAAO,KAA6B,UAAU;AAAA,UACvD,YAAa,OAAO,KAAiC;AAAA,UACrD,QAAQ;AAAA,QACV;AAAA,MACF;AAAA,IACF,EAAE;AAAA,EACJ;AAEA,QAAM,iCAAiC,CAAC,WAAgC;AACtE,UAAM,cAAc,OAAO,KAAK;AAChC,UAAM,aAAc,OAAO,KAAiC;AAC5D,iBAAa,CAAC,SAAS;AACrB,YAAM,cAAc,CAAC,GAAI,KAAK,WAAW,KAAK,CAAC,CAAE;AAEjD,eAAS,IAAI,YAAY,SAAS,GAAG,KAAK,GAAG,KAAK;AAChD,YAAI,YAAY,CAAC,EAAE,aAAa,aAAa;AAC3C,gBAAM,WAAW,YAAY,CAAC;AAC9B,cAAI,SAAS,eAAe,YAAY;AACtC,wBAAY,CAAC,IAAI;AAAA,cACf,GAAG;AAAA,cACH,QAAS,OAAO,KAA4B;AAAA,YAC9C;AACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,aAAO;AAAA,QACL,GAAG;AAAA,QACH,CAAC,WAAW,GAAG;AAAA,MACjB;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,mCAAmC,CAAC,WAAgC;AACxE,UAAM,cAAc,OAAO,KAAK;AAChC,UAAM,aAAc,OAAO,KAAiC;AAC5D,iBAAa,CAAC,SAAS;AACrB,YAAM,cAAc,CAAC,GAAI,KAAK,WAAW,KAAK,CAAC,CAAE;AAEjD,eAAS,IAAI,YAAY,SAAS,GAAG,KAAK,GAAG,KAAK;AAChD,YAAI,YAAY,CAAC,EAAE,aAAa,aAAa;AAC3C,gBAAM,WAAW,YAAY,CAAC;AAC9B,cAAI,SAAS,eAAe,YAAY;AACtC,wBAAY,CAAC,IAAI;AAAA,cACf,GAAG;AAAA,cACH,QAAQ;AAAA,cACR,QAAS,OAAO,KAA4B;AAAA,YAC9C;AACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,aAAO;AAAA,QACL,GAAG;AAAA,QACH,CAAC,WAAW,GAAG;AAAA,MACjB;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,gCAAgC,CAAC,WAAgC;AACrE,UAAM,cAAc,OAAO,KAAK;AAChC,UAAM,aAAc,OAAO,KAAiC;AAC5D,iBAAa,CAAC,SAAS;AACrB,YAAM,cAAc,CAAC,GAAI,KAAK,WAAW,KAAK,CAAC,CAAE;AAEjD,eAAS,IAAI,YAAY,SAAS,GAAG,KAAK,GAAG,KAAK;AAChD,YAAI,YAAY,CAAC,EAAE,aAAa,aAAa;AAC3C,gBAAM,WAAW,YAAY,CAAC;AAC9B,cAAI,SAAS,eAAe,YAAY;AACtC,wBAAY,CAAC,IAAI;AAAA,cACf,GAAG;AAAA,cACH,QAAQ;AAAA,cACR,QAAS,OAAO,KAA4B;AAAA,YAC9C;AACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,aAAO;AAAA,QACL,GAAG;AAAA,QACH,CAAC,WAAW,GAAG;AAAA,MACjB;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,qBAAqB,CAAC,WAAgC;AAC1D,UAAM,cAAc,OAAO,KAAK;AAChC,UAAM,aAAc,OAAO,KAAiC;AAC5D,iBAAa,CAAC,SAAS;AACrB,YAAM,cAAc,CAAC,GAAI,KAAK,WAAW,KAAK,CAAC,CAAE;AAEjD,eAAS,IAAI,YAAY,SAAS,GAAG,KAAK,GAAG,KAAK;AAChD,YAAI,YAAY,CAAC,EAAE,aAAa,aAAa;AAC3C,gBAAM,WAAW,YAAY,CAAC;AAC9B,cAAI,SAAS,eAAe,YAAY;AACtC,kBAAM,cAAc,SAAS,QAAQ,CAAC;AACtC,wBAAY,CAAC,IAAI;AAAA,cACf,GAAG;AAAA,cACH,MAAM,CAAC,GAAG,aAAc,OAAO,KAA8B,MAAM,CAAC,CAAC;AAAA,YACvE;AACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,aAAO;AAAA,QACL,GAAG;AAAA,QACH,CAAC,WAAW,GAAG;AAAA,MACjB;AAAA,IACF,CAAC;AAAA,EACH;AAEA,MAAI,qBAAqB;AACzB,QAAM,2BAA2B,CAAC,WAAuC;AACvE,UAAM,cAAc,OAAO,KAAK;AAChC,UAAM,EAAE,OAAO,MAAM,IAAI,OAAO;AAChC,iBAAa,CAAC,SAAS;AACrB,YAAM,cAAc,CAAC,GAAI,KAAK,WAAW,KAAK,CAAC,CAAE;AAEjD,UAAI,qBAAqB,OAAO;AAC9B,oBAAY,KAAK,EAAE,UAAU,aAAa,WAAW,GAAG,CAAC;AACzD,6BAAqB;AAAA,MACvB;AAEA,eAAS,IAAI,YAAY,SAAS,GAAG,KAAK,GAAG,KAAK;AAChD,YAAI,YAAY,CAAC,EAAE,aAAa,aAAa;AAC3C,sBAAY,CAAC,IAAI;AAAA,YACf,UAAU;AAAA,YACV,WAAY,YAAY,CAAC,EAAoB,YAAY;AAAA,UAC3D;AACA;AAAA,QACF;AAAA,MACF;AAEA,aAAO;AAAA,QACL,GAAG;AAAA,QACH,CAAC,WAAW,GAAG;AAAA,MACjB;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,qBAAqB,CAAC,WAAkC;AAC5D,UAAM,cAAc,OAAO,KAAK;AAChC,iBAAa,CAAC,UAAU;AAAA,MACtB,GAAG;AAAA,MACH,CAAC,WAAW,GAAG;AAAA,QACb,GAAI,KAAK,WAAW,KAAK,CAAC;AAAA,QAC1B;AAAA,UACE,UAAU;AAAA,UACV,WAAW,OAAO,KAAK;AAAA,QACzB;AAAA,MACF;AAAA,IACF,EAAE;AAAA,EACJ;AAEA,QAAM,yBAAyB,CAAC,WAAsC;AACpE,UAAM,cAAc,OAAO,KAAK;AAChC,iBAAa,CAAC,UAAU;AAAA,MACtB,GAAG;AAAA,MACH,CAAC,WAAW,GAAG;AAAA,QACb,GAAI,KAAK,WAAW,KAAK,CAAC;AAAA,QAC1B;AAAA,UACE,UAAU;AAAA,UACV,UAAU,OAAO,KAAK;AAAA,UACtB,YAAY,OAAO,KAAK;AAAA,UACxB,QAAQ,OAAO,KAAK;AAAA,UACpB,QAAQ;AAAA,UACR,QAAQ,OAAO,KAAK;AAAA,QACtB;AAAA,MACF;AAAA,IACF,EAAE;AAAA,EACJ;AAEA,QAAM,uBAAuB,CAAC,WAAoC;AAChE,UAAM,cAAc,OAAO,KAAK;AAChC,UAAM,SAAS,OAAO,KAAK;AAC3B,iBAAa,CAAC,SAAS;AACrB,YAAM,cAAc,CAAC,GAAI,KAAK,WAAW,KAAK,CAAC,CAAE;AAEjD,eAAS,IAAI,YAAY,SAAS,GAAG,KAAK,GAAG,KAAK;AAChD,YAAI,YAAY,CAAC,EAAE,aAAa,iBAAiB;AAC/C,gBAAM,cAAc,YAAY,CAAC;AACjC,cAAI,YAAY,WAAW,QAAQ;AACjC,wBAAY,CAAC,IAAI;AAAA,cACf,GAAG;AAAA,cACH,QAAQ,OAAO,KAAK,QAAQ,UAAU;AAAA,cACtC,QAAQ,OAAO,KAAK;AAAA,cACpB,OAAO,OAAO,KAAK;AAAA,YACrB;AACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,aAAO;AAAA,QACL,GAAG;AAAA,QACH,CAAC,WAAW,GAAG;AAAA,MACjB;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,mBAAmB,CACvB,WAMG;AACH,YAAQ,OAAO,MAAM;AAAA,MACnB,KAAK;AACH,wCAAgC,MAAM;AACtC;AAAA,MACF,KAAK;AACH,uCAA+B,MAAM;AACrC;AAAA,MACF,KAAK;AACH,yCAAiC,MAAM;AACvC;AAAA,MACF,KAAK;AACH,sCAA8B,MAAM;AACpC;AAAA,MACF,KAAK;AACH,2BAAmB,MAAM;AACzB;AAAA,MACF,KAAK;AACH,iCAAyB,MAAM;AAC/B;AAAA,MACF,KAAK;AACH,2BAAmB,MAAM;AACzB;AAAA,MACF,KAAK;AACH,+BAAuB,MAAM;AAC7B;AAAA,MACF,KAAK;AACH,6BAAqB,MAAM;AAC3B;AAAA,IACJ;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,EACF;AACF;;;AC7QO,SAAS,YAAY,KAAuB;AACjD,MAAI,MAAM,QAAQ,GAAG,GAAG;AACtB,WAAO,IAAI,IAAI,WAAW;AAAA,EAC5B,WAAW,QAAQ,QAAQ,OAAO,QAAQ,UAAU;AAClD,UAAM,SAAkC,CAAC;AACzC,UAAM,aAAa;AAEnB,eAAW,OAAO,YAAY;AAE5B,UAAI,QAAQ,mBAAmB,QAAQ,WAAW;AAChD;AAAA,MACF;AACA,aAAO,GAAG,IAAI,YAAY,WAAW,GAAG,CAAC;AAAA,IAC3C;AAIA,QAAI,OAAO,SAAS,UAAU;AAC5B,UACE,OAAO,yBAAyB,UAC/B,OAAO,wBACN,OAAO,OAAO,yBAAyB,YACvC,OAAO,KAAK,OAAO,oBAAoB,EAAE,WAAW,GACtD;AACA,eAAO,uBAAuB;AAAA,MAChC;AAEA,UAAI,OAAO,yBAAyB,SAAS,OAAO,YAAY;AAC9D,eAAO,WAAW,OAAO,KAAK,OAAO,UAAoB;AAAA,MAC3D;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAKO,SAAS,aAAa,OAAqB;AAChD,MAAI,OAAO,UAAU,UAAU;AAC7B,QAAI;AACF,aAAO,KAAK,MAAM,KAAK;AAAA,IACzB,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;;;AChDO,SAAS,wBAAwB,OAAsB,SAAqC;AAEjG,QAAM,SAAS,CAAC,GAAG,OAAO,OAAO,EAAE,KAAK,CAAC,GAAG,MAAM;AAChD,UAAM,SAAS,EAAE,SAAS,SAAS,EAAE,gBAAgB,EAAE;AACvD,UAAM,SAAS,EAAE,SAAS,SAAS,EAAE,gBAAgB,EAAE;AACvD,WAAO,SAAS;AAAA,EAClB,CAAC;AAGD,SAAO,OAAO,OAAsB,CAAC,KAAK,YAAY;AACpD,UAAM,OAAO,IAAI,IAAI,SAAS,CAAC;AAG/B,UAAM,WACJ,MAAM,SAAS,UACf,QAAQ,SAAS,UACjB,QAAQ,kBAAkB,KAAK,eAAe;AAEhD,QAAI,UAAU;AACZ,UAAI,IAAI,SAAS,CAAC,IAAI;AAAA,QACpB,GAAG;AAAA,QACH,MAAM,KAAK,OAAO,QAAQ;AAAA,QAC1B,cAAc,QAAQ;AAAA,MACxB;AACA,aAAO;AAAA,IACT;AAEA,QAAI,KAAK,OAAO;AAChB,WAAO;AAAA,EACT,GAAG,CAAC,CAAC;AACP;;;ALzBe,SAAR,SAA0B,SAAiB,UAAkB,WAAoB;AAEtF,QAAM,EAAE,aAAa,gBAAgB,WAAW,aAAa,IAAI,oBAAoB;AAErF,QAAM,CAAC,YAAY,aAAa,QAAI,wBAAS,KAAK;AAClD,QAAM,CAAC,UAAU,WAAW,QAAI,wBAAyB,CAAC,CAAC;AAE3D,QAAM,kBAAc,sBAAuB,CAAC,CAAC;AAG7C,QAAM,CAAC,kBAAkB,mBAAmB,QAAI,wBAAiB,oBAAoB;AAErF,QAAM,eAAe;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAGA,+BAAU,MAAM;AACd,UAAM,mBAAmB,aAAa,oBAAoB;AAC1D,wBAAoB,gBAAgB;AAAA,EACtC,GAAG,CAAC,CAAC;AAEL,QAAM,gBAAgB,oBAAoB,YAAY;AAGtD,+BAAU,MAAM;AACd,gBAAY,UAAU;AAAA,EACxB,GAAG,CAAC,QAAQ,CAAC;AAGb,+BAAU,MAAM;AAEd,QAAI,YAAY;AACd;AAAA,IACF;AAEA,UAAM,UAAU,aAAa,cAAc,gBAAgB;AAE3D,QAAI,SAAS;AACX,kBAAY,QAAQ,QAAQ;AAAA,IAC9B,OAAO;AACL,kBAAY,CAAC,CAAC;AAAA,IAChB;AAAA,EACF,GAAG,CAAC,kBAAkB,aAAa,eAAe,SAAS,UAAU,CAAC;AAGtE,+BAAU,MAAM;AACd,WAAO,MAAM;AACX,UAAI,YAAY,QAAQ,SAAS,KAAK,aAAa,eAAe,SAAS;AACzE,qBAAa,eAAe,QAAQ;AAAA,MACtC;AAAA,IACF;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,iBAAa,sBAAwB;AAE3C,QAAM,eAAW;AAAA,IACf,OACE,OACA,YAOG;AACH,oBAAc,IAAI;AAElB,UAAI,WAAW,SAAS;AACtB,mBAAW,QAAQ,MAAM;AAAA,MAC3B;AACA,iBAAW,UAAU,IAAI,gBAAgB;AAEzC,YAAM,UAAkC;AAAA,QACtC,gBAAgB;AAAA,QAChB,GAAI,YAAY,EAAE,eAAe,UAAU,SAAS,GAAG,IAAI,CAAC;AAAA,QAC5D,GAAI,SAAS,qBAAqB,CAAC;AAAA,MACrC;AAGA,UAAI,kBAAkB;AACpB,gBAAQ,8BAA8B,IAAI;AAAA,MAC5C;AAEA,YAAM,OAAO;AAAA,QACX,QAAQ;AAAA,QACR;AAAA,QACA,SAAS,SAAS,WAAW,CAAC;AAAA,QAC9B,aAAa,SAAS;AAAA,QACtB,OAAO,SAAS,OAAO,IAAI,CAAC,OAAgC;AAAA,UAC1D,GAAG;AAAA,UACH,YAAY,YAAY,EAAE,UAAU;AAAA,QACtC,EAAE;AAAA,QACF,aAAa,SAAS,aAAa,IAAI,CAAC,OAAgC;AAAA,UACtE,GAAG;AAAA,UACH,YAAY,YAAY,EAAE,UAAU;AAAA,QACtC,EAAE;AAAA,MACJ;AAEA,UAAI;AACF,kBAAM,4CAAiB,UAAU;AAAA,UAC/B,QAAQ;AAAA,UACR;AAAA,UACA,QAAQ,WAAW,QAAQ;AAAA,UAC3B,gBAAgB;AAAA,UAChB,MAAM,KAAK,UAAU,IAAI;AAAA,UACzB,QAAQ,OAAO,SAAS;AAEtB,gBAAI,KAAK,UAAU,KAAK;AACtB,sBAAQ,IAAI,gCAAgC,KAAK,MAAM,EAAE;AAEzD,kBAAI,KAAK,WAAW,KAAK;AAEvB,sBAAM,IAAI,MAAM,cAAc,KAAK,UAAU,GAAG;AAAA,cAClD;AAEA,oBAAM,IAAI,MAAM,gBAAgB,KAAK,MAAM,EAAE;AAAA,YAC/C;AAGA,gBAAI,CAAC,oBAAoB,qBAAqB,sBAAsB;AAClE,oBAAM,YAAY,KAAK,QAAQ,IAAI,8BAA8B;AACjE,kBAAI,WAAW;AAEb,sBAAM,kBAAkB,YAAY;AACpC,sBAAM,cACJ,KAAK,QAAQ,IAAI,gCAAgC,KAAK;AAExD,6BAAa,0BAA0B,WAAW,aAAa,eAAe;AAC9E,oCAAoB,SAAS;AAAA,cAC/B;AAAA,YACF;AAGA,kBAAM,cAAc,KAAK,QAAQ,IAAI,gCAAgC;AACrE,gBAAI,aAAa;AACf,0BAAY,CAAC,SAAS;AACpB,sBAAM,cAAc,KAAK,KAAK,SAAS,CAAC;AACxC,oBAAI,aAAa,SAAS,QAAQ;AAChC,wBAAM,iBAAiB;AAAA,oBACrB,GAAG;AAAA,oBACH;AAAA,kBACF;AACA,wBAAM,kBAAkB,CAAC,GAAG,KAAK,MAAM,GAAG,EAAE,GAAG,cAAc;AAG7D,sBAAI,aAAa,eAAe,SAAS;AACvC,iCAAa,eAAe,QAAQ,eAAe;AAAA,kBACrD;AAEA,yBAAO;AAAA,gBACT;AACA,uBAAO;AAAA,cACT,CAAC;AAAA,YACH;AAAA,UACF;AAAA,UACA,WAAW,CAAC,UAA8B;AACxC,gBAAI;AACF,oBAAM,SAAS,KAAK,MAAM,MAAM,IAAI;AAEpC,kBAAI,OAAO,SAAS,kBAAkB;AACpC,4BAAY,CAAC,SAAS;AACpB,wBAAM,cAAc,KAAK,KAAK,SAAS,CAAC;AACxC,wBAAM,WAAW,OAAO,KAAK;AAC7B,wBAAM,UAAuB;AAAA,oBAC3B,MAAM;AAAA,oBACN,MAAM,OAAO;AAAA,oBACb,eAAe;AAAA,oBACf,cAAc;AAAA,kBAChB;AAEA,sBAAI;AAEJ,sBAAI,aAAa,SAAS,SAAS;AACjC,0BAAM,iBAA0B;AAAA,sBAC9B,GAAG;AAAA,sBACH,SAAS,YAAY,UAAU,OAAO;AAAA;AAAA,sBACtC,OAAO,wBAAwB,YAAY,SAAS,CAAC,GAAG,OAAO;AAAA,oBACjE;AACA,sCAAkB,CAAC,GAAG,KAAK,MAAM,GAAG,EAAE,GAAG,cAAc;AAAA,kBACzD,OAAO;AACL,0BAAM,iBAA0B;AAAA,sBAC9B,MAAM;AAAA,sBACN,SAAS,OAAO;AAAA,sBAChB,OAAO,CAAC,OAAO;AAAA,sBACf,aAAa,OAAO,KAAK;AAAA,oBAC3B;AACA,sCAAkB,CAAC,GAAG,MAAM,cAAc;AAAA,kBAC5C;AAEA,sBAAI,aAAa,eAAe,SAAS;AACvC,iCAAa,eAAe,QAAQ,eAAe;AAAA,kBACrD;AAEA,yBAAO;AAAA,gBACT,CAAC;AAAA,cACH,WAAW,OAAO,SAAS,oBAAoB;AAC7C,4BAAY,CAAC,SAAS;AACpB,wBAAM,cAAc,KAAK,KAAK,SAAS,CAAC;AACxC,wBAAM,UAAuB;AAAA,oBAC3B,MAAM;AAAA,oBACN,UAAU,OAAO,KAAK;AAAA,oBACtB,QAAQ,OAAO,KAAK;AAAA,oBACpB,QAAQ,aAAa,OAAO,KAAK,MAAM;AAAA,oBACvC,UAAU,OAAO,KAAK;AAAA,kBACxB;AAEA,sBAAI;AAEJ,sBAAI,aAAa,SAAS,SAAS;AACjC,0BAAM,iBAA0B;AAAA,sBAC9B,GAAG;AAAA,sBACH,OAAO,wBAAwB,YAAY,SAAS,CAAC,GAAG,OAAO;AAAA,oBACjE;AACA,sCAAkB,CAAC,GAAG,KAAK,MAAM,GAAG,EAAE,GAAG,cAAc;AAAA,kBACzD,OAAO;AACL,0BAAM,iBAA0B;AAAA,sBAC9B,MAAM;AAAA,sBACN,SAAS;AAAA,sBACT,OAAO,CAAC,OAAO;AAAA,sBACf,aAAa,OAAO,KAAK;AAAA,oBAC3B;AACA,sCAAkB,CAAC,GAAG,MAAM,cAAc;AAAA,kBAC5C;AAEA,sBAAI,aAAa,eAAe,SAAS;AACvC,iCAAa,eAAe,QAAQ,eAAe;AAAA,kBACrD;AAEA,yBAAO;AAAA,gBACT,CAAC;AAAA,cACH,WACE,OAAO,KAAK,WAAW,QAAQ,KAC/B,OAAO,SAAS,yBAChB,OAAO,SAAS,mBAChB,OAAO,SAAS,yBAChB,OAAO,SAAS,qBAChB;AACA,8BAAc,iBAAiB,MAAM;AAAA,cACvC;AAAA,YACF,SAAS,GAAG;AACV,sBAAQ,IAAI,iCAAiC,CAAC;AAAA,YAChD;AAAA,UACF;AAAA,UACA,SAAS,MAAM;AACb,oBAAQ,IAAI,cAAc;AAC1B,0BAAc,KAAK;AAEnB,gBAAI,aAAa,eAAe,SAAS;AACvC,2BAAa,eAAe,QAAQ;AAAA,YACtC;AAAA,UACF;AAAA,UACA,SAAS,CAAC,MAAM;AACd,oBAAQ,IAAI,eAAe,CAAC;AAC5B,0BAAc,KAAK;AAEnB,gBAAI,aAAa,eAAe,SAAS;AACvC,2BAAa,eAAe,QAAQ,YAAY,OAAO;AAAA,YACzD;AACA,kBAAM,IAAI,MAAM,yBAAyB;AAAA,UAC3C;AAAA,QACF,CAAC;AAAA,MACH,SAAS,OAAO;AACd,gBAAQ,IAAI,0BAA0B,KAAK;AAC3C,sBAAc,KAAK;AAEnB,YAAI,aAAa,eAAe,SAAS;AACvC,uBAAa,eAAe,QAAQ,YAAY,OAAO;AAAA,QACzD;AACA,cAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,CAAC,UAAU,WAAW,kBAAkB,cAAc,aAAa;AAAA,EACrE;AAEA,QAAM,iBAAa;AAAA,IACjB,OACE,OACA,YAQG;AACH,YAAM,cAAc;AAAA,QAClB,MAAM;AAAA,QACN,SAAS;AAAA,QACT,aAAa,KAAK,IAAI,EAAE,SAAS;AAAA,MACnC;AAGA,UAAI,CAAC,SAAS,iBAAiB;AAC7B,oBAAY,CAAC,SAAS;AACpB,gBAAM,kBAAkB,CAAC,GAAG,MAAM,WAAW;AAE7C,cAAI,aAAa,eAAe,SAAS;AACvC,yBAAa,eAAe,QAAQ,eAAe;AAAA,UACrD;AACA,iBAAO;AAAA,QACT,CAAC;AAAA,MACH;AAEA,UAAI;AACF,cAAM,SAAS,OAAO,OAAO;AAAA,MAC/B,SAAS,OAAO;AAEd,YAAI,CAAC,SAAS,iBAAiB;AAC7B,sBAAY,CAAC,SAAS;AACpB,kBAAM,kBAAkB,KAAK,KAAK,CAAC,MAAM,MAAM,WAAW,IACtD,OACA,CAAC,GAAG,MAAM,WAAW;AACzB,gBAAI,aAAa,eAAe,SAAS;AACvC,2BAAa,eAAe,QAAQ,eAAe;AAAA,YACrD;AACA,mBAAO;AAAA,UACT,CAAC;AAAA,QACH;AACA,cAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,CAAC,UAAU,aAAa,cAAc;AAAA,EACxC;AAEA,QAAM,2BAAuB;AAAA,IAC3B,CAAC,UAAkB;AACjB,YAAM,cAAc;AAAA,QAClB,MAAM;AAAA,QACN,SAAS;AAAA,QACT,aAAa,KAAK,IAAI,EAAE,SAAS;AAAA,MACnC;AAEA,kBAAY,CAAC,SAAS;AACpB,cAAM,kBAAkB,CAAC,GAAG,MAAM,WAAW;AAE7C,YAAI,aAAa,eAAe,SAAS;AACvC,uBAAa,eAAe,QAAQ,eAAe;AAAA,QACrD;AACA,eAAO;AAAA,MACT,CAAC;AAAA,IACH;AAAA,IACA,CAAC,aAAa,cAAc;AAAA,EAC9B;AAEA,QAAM,YAAQ,2BAAY,MAAM;AAC9B,QAAI,WAAW,SAAS;AACtB,iBAAW,QAAQ,MAAM;AAAA,IAC3B;AACA,kBAAc,KAAK;AAEnB,QAAI,aAAa,eAAe,SAAS;AACvC,mBAAa,eAAe,QAAQ,YAAY,OAAO;AAAA,IACzD;AAAA,EACF,GAAG,CAAC,aAAa,cAAc,CAAC;AAEhC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX,eAAe,aAAa;AAAA,IAC5B,eAAe,aAAa;AAAA,IAC5B,UAAU,aAAa;AAAA,IACvB;AAAA,EACF;AACF;;;AMlYA,IAAAC,gBAAiD;AAGjD,SAAS,UAAa,OAAsB,cAAoB;AAC9D,MAAI,UAAU,KAAM,QAAO;AAC3B,MAAI;AACF,WAAO,KAAK,MAAM,KAAK;AAAA,EACzB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,sBACd,KACA,cAC2C;AAE3C,QAAM,CAAC,aAAa,cAAc,QAAI,wBAAY,MAAM;AACtD,QAAI,OAAO,WAAW,aAAa;AACjC,aAAO;AAAA,IACT;AACA,QAAI;AACF,YAAM,OAAO,OAAO,aAAa,QAAQ,GAAG;AAC5C,aAAO,UAAU,MAAM,YAAY;AAAA,IACrC,SAAS,OAAO;AACd,cAAQ,KAAK,mCAAmC,GAAG,MAAM,KAAK;AAC9D,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AAGD,QAAM,eAAW;AAAA,IACf,CAAC,UAA+B;AAC9B,UAAI;AACF,uBAAe,CAAC,SAAS;AACvB,gBAAM,eAAe,iBAAiB,WAAW,MAAM,IAAI,IAAI;AAE/D,cAAI,OAAO,WAAW,aAAa;AACjC,mBAAO,aAAa,QAAQ,KAAK,KAAK,UAAU,YAAY,CAAC;AAE7D,mBAAO;AAAA,cACL,IAAI,aAAa,WAAW,EAAE,KAAK,UAAU,KAAK,UAAU,YAAY,EAAE,CAAC;AAAA,YAC7E;AAAA,UACF;AACA,iBAAO;AAAA,QACT,CAAC;AAAA,MACH,SAAS,OAAO;AACd,gBAAQ,KAAK,mCAAmC,GAAG,MAAM,KAAK;AAAA,MAChE;AAAA,IACF;AAAA,IACA,CAAC,GAAG;AAAA,EACN;AAGA,+BAAU,MAAM;AACd,UAAM,sBAAsB,CAAC,UAAwB;AACnD,UAAI,MAAM,QAAQ,KAAK;AACrB,uBAAe,UAAU,MAAM,UAAU,YAAY,CAAC;AAAA,MACxD;AAAA,IACF;AAEA,WAAO,iBAAiB,WAAW,mBAAmB;AACtD,WAAO,MAAM,OAAO,oBAAoB,WAAW,mBAAmB;AAAA,EACxE,GAAG,CAAC,KAAK,YAAY,CAAC;AAEtB,SAAO,CAAC,aAAa,QAAQ;AAC/B;;;APkEI;AAzEJ,IAAM,mBAAe,6BAAwC,IAAI;AAE1D,SAAS,qBAAqB,EAAE,SAAS,GAA4B;AAC1E,QAAM,sBAAkB,sBAA8D,oBAAI,IAAI,CAAC;AAM/F,QAAM,iBAAa,sBAAiC,oBAAI,IAAI,CAAC;AAC7D,QAAM,mBAAe,sBAAqC,oBAAI,IAAI,CAAC;AAEnE,QAAM,CAAC,EAAE,WAAW,QAAI,wBAAS,CAAC,CAAC;AAGnC,QAAM,CAAC,aAAa,cAAc,IAAI,sBAEpC,oBAAoB,CAAC,CAAC;AAExB,QAAM,CAAC,WAAW,YAAY,IAAI;AAAA,IAChC;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,sBAAkB,2BAAY,CAAC,SAAiB,UAAkB,cAAuB;AAC7F,UAAM,WAAW,gBAAgB,QAAQ,IAAI,OAAO;AAEpD,QAAI,CAAC,UAAU;AACb,sBAAgB,QAAQ,IAAI,SAAS,EAAE,UAAU,UAAU,CAAC;AAC5D,kBAAY,CAAC,CAAC;AAAA,IAChB,WAAW,SAAS,aAAa,YAAY,SAAS,cAAc,WAAW;AAC7E,sBAAgB,QAAQ,IAAI,SAAS,EAAE,UAAU,UAAU,CAAC;AAC5D,kBAAY,CAAC,CAAC;AAAA,IAChB;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,qBAAiB,2BAAY,CAAC,SAAiB,WAAwB;AAC3E,eAAW,QAAQ,IAAI,SAAS,MAAM;AAEtC,UAAM,YAAY,aAAa,QAAQ,IAAI,OAAO;AAClD,QAAI,WAAW;AACb,gBAAU,QAAQ,CAAC,aAAa,SAAS,CAAC;AAAA,IAC5C;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,gBAAY,2BAAY,CAAC,YAAoB;AACjD,WAAO,WAAW,QAAQ,IAAI,OAAO,KAAK;AAAA,EAC5C,GAAG,CAAC,CAAC;AAEL,QAAM,mBAAe;AAAA,IACnB,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,SACE,6CAAC,aAAa,UAAb,EAAsB,OAAO,cAC3B;AAAA;AAAA,IACA,MAAM,KAAK,gBAAgB,QAAQ,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC,SAAS,EAAE,UAAU,UAAU,CAAC,MACnF,4CAAC,uBAAkC,SAAkB,UAAoB,aAA/C,OAAqE,CAChG;AAAA,KACH;AAEJ;AAEA,SAAS,oBAAoB;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,QAAM,QAAQ,SAAS,SAAS,UAAU,SAAS;AACnD,QAAM,cAAU,0BAAW,YAAY;AAEvC,MAAI,CAAC,QAAS,QAAO;AAErB,+BAAU,MAAM;AACd,YAAQ,eAAe,SAAS,KAAK;AAAA,EACvC,GAAG,CAAC,SAAS,OAAO,OAAO,CAAC;AAE5B,SAAO;AACT;AAEO,SAAS,gBACd,SACA,UACA,WACa;AACb,QAAM,cAAU,0BAAW,YAAY;AAEvC,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,0DAA0D;AAAA,EAC5E;AAEA,QAAM,EAAE,iBAAiB,WAAW,aAAa,IAAI;AAIrD,+BAAU,MAAM;AACd,oBAAgB,SAAS,UAAU,SAAS;AAAA,EAC9C,GAAG,CAAC,SAAS,UAAU,eAAe,CAAC;AAGvC,QAAM,CAAC,QAAQ,SAAS,QAAI,wBAA6B,MAAM,UAAU,OAAO,CAAC;AAEjF,+BAAU,MAAM;AAEd,UAAM,gBAAgB,UAAU,OAAO;AACvC,QAAI,kBAAkB,QAAQ;AAC5B,gBAAU,aAAa;AAAA,IACzB;AAGA,UAAM,WAAW,MAAM;AACrB,gBAAU,UAAU,OAAO,CAAC;AAAA,IAC9B;AAEA,QAAI,CAAC,aAAa,QAAQ,IAAI,OAAO,GAAG;AACtC,mBAAa,QAAQ,IAAI,SAAS,oBAAI,IAAI,CAAC;AAAA,IAC7C;AACA,iBAAa,QAAQ,IAAI,OAAO,GAAG,IAAI,QAAQ;AAE/C,WAAO,MAAM;AACX,mBAAa,QAAQ,IAAI,OAAO,GAAG,OAAO,QAAQ;AAAA,IACpD;AAAA,EACF,GAAG,CAAC,SAAS,SAAS,CAAC;AAEvB,QAAM,kBAAc;AAAA,IAClB,OAAO;AAAA,MACL,UAAU,CAAC;AAAA,MACX,YAAY;AAAA,MACZ,WAAW;AAAA,MACX,UAAU,CAAC;AAAA,MACX,WAAW,CAAC;AAAA,MACZ,YAAY,YAAY;AAAA,MAAC;AAAA,MACzB,eAAe,MAAM;AAAA,MAAC;AAAA,MACtB,eAAe,MAAM;AAAA,MAAC;AAAA,MACtB,sBAAsB,MAAM;AAAA,MAAC;AAAA,MAC7B,OAAO,MAAM;AAAA,MAAC;AAAA,IAChB;AAAA,IACA,CAAC;AAAA,EACH;AAEA,SAAO,UAAU;AACnB;AAGO,SAAS,sBAAsB;AACpC,QAAM,cAAU,0BAAW,YAAY;AACvC,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,8DAA8D;AAAA,EAChF;AACA,SAAO;AAAA,IACL,aAAa,QAAQ;AAAA,IACrB,gBAAgB,QAAQ;AAAA,IACxB,WAAW,QAAQ;AAAA,IACnB,cAAc,QAAQ;AAAA,EACxB;AACF;","names":["import_react","import_react","import_react"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/agent-context.tsx","../src/use-agent.ts","../src/constants.ts","../src/session-utils.ts","../src/debug-handlers.ts","../src/utils/schema.ts","../src/utils/message.ts","../src/utils/use-synced-local-storage.ts"],"sourcesContent":["export * from \"./types\";\nexport * from \"./agent-context\";\nexport { default as useAgent } from \"./use-agent\";\nexport * from \"./constants\";\nexport * from \"./utils/schema\";\nexport * from \"./utils/message\";\n","import {\n createContext,\n useContext,\n useCallback,\n useRef,\n useState,\n useEffect,\n useMemo,\n ReactNode,\n} from \"react\";\nimport useAgent from \"./use-agent\";\nimport type { Message, Session, DebugDataType, ClientToolDefinition } from \"./types\";\nimport { useSyncedLocalStorage } from \"./utils/use-synced-local-storage\";\nimport { AGENT_SESSIONS_KEY, AGENT_DEBUG_DATA_KEY } from \"./constants\";\n\nexport interface AgentRunner {\n messages: Message[];\n inProgress: boolean;\n sessionId: string;\n sessions: Session[];\n debugData: Record<string, DebugDataType>;\n handleSend: (\n input: string,\n options?: {\n context?: Record<string, unknown>;\n testBuildId?: string;\n skipUserMessage?: boolean;\n additionalHeaders?: Record<string, string>;\n tools?: ClientToolDefinition[];\n clientTools?: ClientToolDefinition[];\n },\n ) => Promise<void>;\n switchSession: (sessionId?: string) => void;\n deleteSession: (sessionId: string) => void;\n addOptimisticMessage: (input: string) => void;\n abort: () => void;\n}\n\ninterface AgentContextValue {\n initializeAgent: (agentId: string, agentUrl: string, accessKey: string) => void;\n registerRunner: (agentId: string, runner: AgentRunner) => void;\n getRunner: (agentId: string) => AgentRunner | null;\n // Global state provided to useAgent hooks\n allSessions: Record<string, Record<string, Session>>;\n setAllSessions: (\n value:\n | Record<string, Record<string, Session>>\n | ((\n prev: Record<string, Record<string, Session>>,\n ) => Record<string, Record<string, Session>>),\n ) => void;\n debugData: Record<string, DebugDataType>;\n setDebugData: (\n value:\n | Record<string, DebugDataType>\n | ((prev: Record<string, DebugDataType>) => Record<string, DebugDataType>),\n ) => void;\n}\n\nconst AgentContext = createContext<AgentContextValue | null>(null);\n\nexport function AgentContextProvider({ children }: { children: ReactNode }) {\n const activeAgentsRef = useRef<Map<string, { agentUrl: string; accessKey: string }>>(new Map());\n // Store runners in a ref since we push updates via registerRunner\n // Note: Changes to this Ref won't trigger re-renders of consumers of getRunner directly,\n // but since we return the 'runner' object which contains state,\n // and we access it via a hook that listens to updates (implemented below), it works out.\n // Actually, to make 'useAgentContext' reactive to runner changes, we need a subscription mechanism.\n const runnersRef = useRef<Map<string, AgentRunner>>(new Map());\n const listenersRef = useRef<Map<string, Set<() => void>>>(new Map());\n\n const [, forceUpdate] = useState({});\n\n // Global Sync State managed here to be shared\n const [allSessions, setAllSessions] = useSyncedLocalStorage<\n Record<string, Record<string, Session>>\n >(AGENT_SESSIONS_KEY, {});\n\n const [debugData, setDebugData] = useSyncedLocalStorage<Record<string, DebugDataType>>(\n AGENT_DEBUG_DATA_KEY,\n {},\n );\n\n const initializeAgent = useCallback((agentId: string, agentUrl: string, accessKey: string) => {\n console.log(\"[AgentContext] initializeAgent called:\", { agentId, agentUrl, accessKey });\n const existing = activeAgentsRef.current.get(agentId);\n\n if (!existing) {\n activeAgentsRef.current.set(agentId, { agentUrl, accessKey });\n console.log(\"[AgentContext] New agent registered:\", { agentId, agentUrl, accessKey });\n forceUpdate({});\n } else if (existing.agentUrl !== agentUrl || existing.accessKey !== accessKey) {\n activeAgentsRef.current.set(agentId, { agentUrl, accessKey });\n console.log(\"[AgentContext] Agent updated:\", { agentId, agentUrl, accessKey });\n forceUpdate({});\n }\n }, []);\n\n const registerRunner = useCallback((agentId: string, runner: AgentRunner) => {\n runnersRef.current.set(agentId, runner);\n // Notify listeners for this agentId\n const listeners = listenersRef.current.get(agentId);\n if (listeners) {\n listeners.forEach((callback) => callback());\n }\n }, []);\n\n const getRunner = useCallback((agentId: string) => {\n return runnersRef.current.get(agentId) || null;\n }, []);\n\n const contextValue = useMemo(\n () => ({\n initializeAgent,\n registerRunner,\n getRunner,\n allSessions,\n setAllSessions,\n debugData,\n setDebugData,\n runnersRef,\n listenersRef,\n }),\n [\n initializeAgent,\n registerRunner,\n getRunner,\n allSessions,\n setAllSessions,\n debugData,\n setDebugData,\n ],\n );\n\n return (\n <AgentContext.Provider value={contextValue}>\n {children}\n {Array.from(activeAgentsRef.current.entries()).map(([agentId, { agentUrl, accessKey }]) => (\n <AgentRunnerInstance\n key={agentId}\n agentId={agentId}\n agentUrl={agentUrl}\n accessKey={accessKey}\n />\n ))}\n </AgentContext.Provider>\n );\n}\n\nfunction AgentRunnerInstance({\n agentId,\n agentUrl,\n accessKey,\n}: {\n agentId: string;\n agentUrl: string;\n accessKey: string;\n}) {\n const agent = useAgent(agentId, agentUrl, accessKey);\n const context = useContext(AgentContext);\n\n if (!context) return null;\n\n useEffect(() => {\n context.registerRunner(agentId, agent);\n }, [agentId, agent, context]);\n\n return null;\n}\n\nexport function useAgentContext(agentId: string, agentUrl: string, accessKey: string): AgentRunner {\n const context = useContext(AgentContext);\n\n if (!context) {\n throw new Error(\"useAgentContext must be used within AgentContextProvider\");\n }\n\n const { initializeAgent, getRunner, listenersRef } = context as AgentContextValue & {\n listenersRef: React.MutableRefObject<Map<string, Set<() => void>>>;\n };\n\n useEffect(() => {\n initializeAgent(agentId, agentUrl, accessKey);\n }, [agentId, agentUrl, initializeAgent]);\n\n // Reactive subscription to runner updates\n const [runner, setRunner] = useState<AgentRunner | null>(() => getRunner(agentId));\n\n useEffect(() => {\n // Current runner state\n const currentRunner = getRunner(agentId);\n if (currentRunner !== runner) {\n setRunner(currentRunner);\n }\n\n // Subscribe to future updates\n const callback = () => {\n setRunner(getRunner(agentId));\n };\n\n if (!listenersRef.current.has(agentId)) {\n listenersRef.current.set(agentId, new Set());\n }\n listenersRef.current.get(agentId)?.add(callback);\n\n return () => {\n listenersRef.current.get(agentId)?.delete(callback);\n };\n }, [agentId, getRunner]);\n\n const placeholder = useMemo(\n () => ({\n messages: [],\n inProgress: false,\n sessionId: \"\",\n sessions: [],\n debugData: {},\n handleSend: async () => {},\n switchSession: () => {},\n deleteSession: () => {},\n addOptimisticMessage: () => {},\n abort: () => {},\n }),\n [],\n );\n\n return runner || placeholder;\n}\n\n// Hook to access the global state for use-agent\nexport function useAgentGlobalState() {\n const context = useContext(AgentContext);\n if (!context) {\n throw new Error(\"useAgentGlobalState must be used within AgentContextProvider\");\n }\n return {\n allSessions: context.allSessions,\n setAllSessions: context.setAllSessions,\n debugData: context.debugData,\n setDebugData: context.setDebugData,\n };\n}\n","import { useCallback, useRef, useState, useEffect } from \"react\";\nimport { EventSourceMessage, fetchEventSource } from \"@microsoft/fetch-event-source\";\n\nimport { DEFAULT_SESSION_NAME, TEMPORARY_SESSION_ID } from \"./constants\";\nimport { useSessionUtils } from \"./session-utils\";\nimport { createDebugHandlers } from \"./debug-handlers\";\nimport { useAgentGlobalState } from \"./agent-context\";\nimport type { Message, MessagePart, OutputStreamEventType, ClientToolDefinition } from \"./types\";\nimport { cleanSchema, tryParseJSON } from \"./utils/schema\";\nimport { updateAgentMessageParts } from \"./utils/message\";\n\nexport default function useAgent(agentId: string, agentUrl: string, accessKey: string) {\n console.log(\"[useAgent] Hook called with:\", { agentId, agentUrl, accessKey });\n // Use global state from Context instead of Jotai atoms\n const { allSessions, setAllSessions, debugData, setDebugData } = useAgentGlobalState();\n\n const [inProgress, setInProgress] = useState(false);\n const [messages, setMessages] = useState<Array<Message>>([]);\n\n const messagesRef = useRef<Array<Message>>([]);\n\n // Initialize currentSessionId later after sessionUtils is available\n const [currentSessionId, setCurrentSessionId] = useState<string>(TEMPORARY_SESSION_ID);\n\n const sessionUtils = useSessionUtils(\n agentId,\n allSessions,\n setAllSessions,\n currentSessionId,\n setCurrentSessionId,\n messagesRef,\n );\n\n // Set initial session ID after sessionUtils is available\n useEffect(() => {\n const initialSessionId = sessionUtils.getInitialSessionId();\n setCurrentSessionId(initialSessionId);\n }, []);\n\n const debugHandlers = createDebugHandlers(setDebugData);\n\n // Keep messagesRef in sync with messages state\n useEffect(() => {\n messagesRef.current = messages;\n }, [messages]);\n\n // Initialize or load session\n useEffect(() => {\n // Don't reset messages if we're currently in progress (streaming)\n if (inProgress) {\n return;\n }\n\n const session = sessionUtils.agentSessions[currentSessionId];\n\n if (session) {\n setMessages(session.messages);\n } else {\n setMessages([]);\n }\n }, [currentSessionId, sessionUtils.agentSessions, agentId, inProgress]);\n\n // Only sync on unmount to prevent data loss\n useEffect(() => {\n return () => {\n if (messagesRef.current.length > 0 && sessionUtils.syncSessionRef.current) {\n sessionUtils.syncSessionRef.current();\n }\n };\n }, []);\n\n const controller = useRef<AbortController>();\n\n const runAgent = useCallback(\n async (\n input: string,\n options?: {\n context?: object;\n testBuildId?: string;\n additionalHeaders?: Record<string, string>;\n tools?: ClientToolDefinition[];\n clientTools?: ClientToolDefinition[];\n },\n ) => {\n setInProgress(true);\n // Abort any existing request before creating a new controller\n if (controller.current) {\n controller.current.abort();\n }\n controller.current = new AbortController();\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n ...(options?.additionalHeaders || {}),\n ...(accessKey ? { Authorization: `Bearer ${accessKey}` } : {}),\n };\n console.log(\"[useAgent] Request headers:\", headers);\n\n // Include session ID in headers if we have one\n if (currentSessionId) {\n headers[\"x-buildship-agent-session-id\"] = currentSessionId;\n }\n\n const body = {\n stream: true,\n input,\n context: options?.context || {},\n testBuildId: options?.testBuildId,\n tools: options?.tools?.map((t: { parameters: unknown }) => ({\n ...t,\n parameters: cleanSchema(t.parameters),\n })),\n clientTools: options?.clientTools?.map((t: { parameters: unknown }) => ({\n ...t,\n parameters: cleanSchema(t.parameters),\n })),\n };\n\n try {\n await fetchEventSource(agentUrl, {\n method: \"POST\",\n headers,\n signal: controller.current.signal,\n openWhenHidden: true,\n body: JSON.stringify(body),\n onopen: async (resp) => {\n // catch the 404 status\n if (resp.status >= 400) {\n console.log(`AI onopen error with status: ${resp.status}`);\n\n if (resp.status === 404) {\n // for resume operations with 404, throw a specific error for retry\n throw new Error(`Not Found (${resp.statusText})`);\n }\n\n throw new Error(`Error status ${resp.status}`);\n }\n\n // Extract session ID from response headers if we don't have one\n if (!currentSessionId || currentSessionId === TEMPORARY_SESSION_ID) {\n const sessionId = resp.headers.get(\"x-buildship-agent-session-id\");\n if (sessionId) {\n // Transfer current messages to the new session before switching\n const currentMessages = messagesRef.current;\n const sessionName =\n resp.headers.get(\"x-buildship-agent-session-name\") || DEFAULT_SESSION_NAME;\n\n sessionUtils.createSessionFromResponse(sessionId, sessionName, currentMessages);\n setCurrentSessionId(sessionId);\n }\n }\n\n // Extract execution ID from response headers and update the last user message\n const executionId = resp.headers.get(\"x-buildship-agent-execution-id\");\n if (executionId) {\n setMessages((prev) => {\n const lastMessage = prev[prev.length - 1];\n if (lastMessage?.role === \"user\") {\n const updatedMessage = {\n ...lastMessage,\n executionId: executionId,\n };\n const updatedMessages = [...prev.slice(0, -1), updatedMessage];\n\n // Sync updated user message\n if (sessionUtils.syncSessionRef.current) {\n sessionUtils.syncSessionRef.current(updatedMessages);\n }\n\n return updatedMessages;\n }\n return prev;\n });\n }\n },\n onmessage: (event: EventSourceMessage) => {\n try {\n const parsed = JSON.parse(event.data) as OutputStreamEventType;\n\n if (parsed.type === \"llm_text_delta\") {\n setMessages((prev) => {\n const lastMessage = prev[prev.length - 1];\n const sequence = parsed.meta.sequence;\n const newPart: MessagePart = {\n type: \"text\",\n text: parsed.data,\n firstSequence: sequence,\n lastSequence: sequence,\n };\n\n let updatedMessages: Message[];\n\n if (lastMessage?.role === \"agent\") {\n const updatedMessage: Message = {\n ...lastMessage,\n content: lastMessage.content + parsed.data, // content is still useful for simple displays\n parts: updateAgentMessageParts(lastMessage.parts || [], newPart),\n };\n updatedMessages = [...prev.slice(0, -1), updatedMessage];\n } else {\n const updatedMessage: Message = {\n role: \"agent\" as const,\n content: parsed.data,\n parts: [newPart],\n executionId: parsed.meta.executionId,\n };\n updatedMessages = [...prev, updatedMessage];\n }\n\n if (sessionUtils.syncSessionRef.current) {\n sessionUtils.syncSessionRef.current(updatedMessages);\n }\n\n return updatedMessages;\n });\n } else if (parsed.type === \"client_tool_call\") {\n setMessages((prev) => {\n const lastMessage = prev[prev.length - 1];\n const newPart: MessagePart = {\n type: \"widget\",\n toolName: parsed.data.toolName,\n callId: parsed.data.callId,\n inputs: tryParseJSON(parsed.data.inputs),\n sequence: parsed.meta.sequence,\n };\n\n let updatedMessages: Message[];\n\n if (lastMessage?.role === \"agent\") {\n const updatedMessage: Message = {\n ...lastMessage,\n parts: updateAgentMessageParts(lastMessage.parts || [], newPart),\n };\n updatedMessages = [...prev.slice(0, -1), updatedMessage];\n } else {\n const updatedMessage: Message = {\n role: \"agent\" as const,\n content: \"\",\n parts: [newPart],\n executionId: parsed.meta.executionId,\n };\n updatedMessages = [...prev, updatedMessage];\n }\n\n if (sessionUtils.syncSessionRef.current) {\n sessionUtils.syncSessionRef.current(updatedMessages);\n }\n\n return updatedMessages;\n });\n } else if (\n parsed.type.startsWith(\"debug_\") ||\n parsed.type === \"llm_reasoning_delta\" ||\n parsed.type === \"agent_handoff\" ||\n parsed.type === \"mcp_tool_call_start\" ||\n parsed.type === \"mcp_tool_call_end\"\n ) {\n debugHandlers.handleDebugEvent(parsed);\n }\n } catch (e) {\n console.log(\"Failed to parse agent message\", e);\n }\n },\n onclose: () => {\n console.log(\"Agent closed\");\n setInProgress(false);\n // Sync messages when streaming completes\n if (sessionUtils.syncSessionRef.current) {\n sessionUtils.syncSessionRef.current();\n }\n },\n onerror: (e) => {\n console.log(\"Agent error\", e);\n setInProgress(false);\n // Sync messages on error to prevent data loss\n if (sessionUtils.syncSessionRef.current) {\n sessionUtils.syncSessionRef.current(messagesRef.current);\n }\n throw new Error(\"Failed to execute agent\");\n },\n });\n } catch (error) {\n console.log(\"Agent execution failed\", error);\n setInProgress(false);\n // Sync messages on execution failure\n if (sessionUtils.syncSessionRef.current) {\n sessionUtils.syncSessionRef.current(messagesRef.current);\n }\n throw error;\n }\n },\n [agentUrl, accessKey, currentSessionId, sessionUtils, debugHandlers],\n );\n\n const handleSend = useCallback(\n async (\n input: string,\n options?: {\n context?: object;\n testBuildId?: string;\n skipUserMessage?: boolean;\n additionalHeaders?: Record<string, string>;\n tools?: ClientToolDefinition[];\n clientTools?: ClientToolDefinition[];\n },\n ) => {\n const userMessage = {\n role: \"user\" as const,\n content: input,\n executionId: Date.now().toString(),\n };\n\n // Only add user message if not skipping\n if (!options?.skipUserMessage) {\n setMessages((prev) => {\n const updatedMessages = [...prev, userMessage];\n // Sync immediately after user message\n if (sessionUtils.syncSessionRef.current) {\n sessionUtils.syncSessionRef.current(updatedMessages);\n }\n return updatedMessages;\n });\n }\n\n try {\n await runAgent(input, options);\n } catch (error) {\n // Ensure user message is preserved even if agent execution fails\n if (!options?.skipUserMessage) {\n setMessages((prev) => {\n const updatedMessages = prev.some((m) => m === userMessage)\n ? prev\n : [...prev, userMessage];\n if (sessionUtils.syncSessionRef.current) {\n sessionUtils.syncSessionRef.current(updatedMessages);\n }\n return updatedMessages;\n });\n }\n throw error;\n }\n },\n [runAgent, sessionUtils.syncSessionRef],\n );\n\n const addOptimisticMessage = useCallback(\n (input: string) => {\n const userMessage = {\n role: \"user\" as const,\n content: input,\n executionId: Date.now().toString(),\n };\n\n setMessages((prev) => {\n const updatedMessages = [...prev, userMessage];\n // Sync immediately after user message\n if (sessionUtils.syncSessionRef.current) {\n sessionUtils.syncSessionRef.current(updatedMessages);\n }\n return updatedMessages;\n });\n },\n [sessionUtils.syncSessionRef],\n );\n\n const abort = useCallback(() => {\n if (controller.current) {\n controller.current.abort();\n }\n setInProgress(false);\n // Sync messages to prevent data loss\n if (sessionUtils.syncSessionRef.current) {\n sessionUtils.syncSessionRef.current(messagesRef.current);\n }\n }, [sessionUtils.syncSessionRef]);\n\n return {\n inProgress,\n messages,\n handleSend,\n addOptimisticMessage,\n abort,\n sessionId: currentSessionId,\n switchSession: sessionUtils.switchSession,\n deleteSession: sessionUtils.deleteSession,\n sessions: sessionUtils.sessionsList,\n debugData,\n };\n}\n","export const AGENT_SESSIONS_KEY = \"buildship:agent:conversations\";\nexport const AGENT_DEBUG_DATA_KEY = \"buildship:agent:debug\";\n\nexport const DEFAULT_SESSION_NAME = \"New Chat\";\nexport const TEMPORARY_SESSION_ID = \"sess_temp\";\n","import { useCallback, useMemo, useRef } from \"react\";\nimport type { Message, Session } from \"./types\";\nimport { TEMPORARY_SESSION_ID } from \"./constants\";\n\nexport const useSessionUtils = (\n agentId: string,\n allSessions: Record<string, Record<string, Session>>,\n setAllSessions: (\n value:\n | Record<string, Record<string, Session>>\n | ((\n prev: Record<string, Record<string, Session>>,\n ) => Record<string, Record<string, Session>>),\n ) => void,\n currentSessionId: string,\n setCurrentSessionId: (sessionId: string) => void,\n messagesRef: React.MutableRefObject<Array<Message>>,\n) => {\n const agentSessions = useMemo(() => allSessions[agentId] || {}, [agentId, allSessions]);\n\n const syncSessionRef = useRef<(messages?: Array<Message>) => void>();\n\n syncSessionRef.current = (updatedMessages?: Array<Message>) => {\n if (!currentSessionId || currentSessionId === TEMPORARY_SESSION_ID) {\n return;\n }\n\n setAllSessions((prev) => ({\n ...prev,\n [agentId]: {\n ...prev[agentId],\n [currentSessionId]: {\n ...prev[agentId]?.[currentSessionId],\n messages: updatedMessages ?? messagesRef.current,\n updatedAt: Date.now(),\n },\n },\n }));\n };\n\n const getInitialSessionId = () => {\n const sessions = Object.values(agentSessions);\n if (sessions.length > 0) {\n return sessions.sort((a, b) => b.updatedAt - a.updatedAt)[0].id;\n }\n return TEMPORARY_SESSION_ID;\n };\n\n const switchSession = useCallback(\n (sessionId: string = TEMPORARY_SESSION_ID) => {\n setCurrentSessionId(sessionId);\n },\n [setCurrentSessionId],\n );\n\n const deleteSession = useCallback(\n (sessionId: string) => {\n if (!sessionId || sessionId === TEMPORARY_SESSION_ID) {\n return;\n }\n\n setAllSessions((prev) => {\n const updatedAgentSessions = { ...prev[agentId] };\n delete updatedAgentSessions[sessionId];\n\n return {\n ...prev,\n [agentId]: updatedAgentSessions,\n };\n });\n\n if (sessionId === currentSessionId) {\n const remainingSessions = Object.values(agentSessions).filter((s) => s.id !== sessionId);\n if (remainingSessions.length > 0) {\n const mostRecent = remainingSessions.sort((a, b) => b.updatedAt - a.updatedAt)[0];\n setCurrentSessionId(mostRecent.id);\n } else {\n setCurrentSessionId(TEMPORARY_SESSION_ID);\n }\n }\n },\n [agentId, currentSessionId, agentSessions, setAllSessions, setCurrentSessionId],\n );\n\n const sessionsList = useMemo(\n () => Object.values(agentSessions).sort((a, b) => b.updatedAt - a.updatedAt),\n [agentSessions],\n );\n\n const createSessionFromResponse = (\n sessionId: string,\n sessionName: string,\n currentMessages: Array<Message>,\n ) => {\n setAllSessions((prev) => ({\n ...prev,\n [agentId]: {\n ...prev[agentId],\n [sessionId]: {\n id: sessionId,\n createdAt: Date.now(),\n updatedAt: Date.now(),\n messages: currentMessages,\n name: sessionName,\n },\n },\n }));\n };\n\n return {\n agentSessions,\n syncSessionRef,\n getInitialSessionId,\n switchSession,\n deleteSession,\n sessionsList,\n createSessionFromResponse,\n };\n};\n","import type {\n AgentDebugEventType,\n AgentHandoffEventType,\n DebugDataType,\n LLMReasoningDeltaEventType,\n ReasoningItem,\n ToolExecutionItem,\n HandoffItem,\n MCPToolCallStartEventType,\n MCPToolCallEndEventType,\n MCPToolExecutionItem,\n} from \"./types\";\n\nexport const createDebugHandlers = (\n setDebugData: (\n value:\n | Record<string, DebugDataType>\n | ((prev: Record<string, DebugDataType>) => Record<string, DebugDataType>),\n ) => void,\n) => {\n const handleDebugToolExecutionStarted = (parsed: AgentDebugEventType) => {\n const executionId = parsed.meta.executionId;\n setDebugData((prev) => ({\n ...prev,\n [executionId]: [\n ...(prev[executionId] || []),\n {\n itemType: \"tool_call\",\n toolId: (parsed.data as { toolId?: string }).toolId || \"unknown\",\n toolCallId: (parsed.data as { toolCallId?: string }).toolCallId,\n status: \"progress\",\n },\n ],\n }));\n };\n\n const handleDebugToolExecutionInputs = (parsed: AgentDebugEventType) => {\n const executionId = parsed.meta.executionId;\n const toolCallId = (parsed.data as { toolCallId?: string }).toolCallId;\n setDebugData((prev) => {\n const currentData = [...(prev[executionId] || [])];\n\n for (let i = currentData.length - 1; i >= 0; i--) {\n if (currentData[i].itemType === \"tool_call\") {\n const toolItem = currentData[i] as ToolExecutionItem;\n if (toolItem.toolCallId === toolCallId) {\n currentData[i] = {\n ...toolItem,\n inputs: (parsed.data as { value: unknown }).value,\n };\n break;\n }\n }\n }\n\n return {\n ...prev,\n [executionId]: currentData,\n };\n });\n };\n\n const handleDebugToolExecutionFinished = (parsed: AgentDebugEventType) => {\n const executionId = parsed.meta.executionId;\n const toolCallId = (parsed.data as { toolCallId?: string }).toolCallId;\n setDebugData((prev) => {\n const currentData = [...(prev[executionId] || [])];\n\n for (let i = currentData.length - 1; i >= 0; i--) {\n if (currentData[i].itemType === \"tool_call\") {\n const toolItem = currentData[i] as ToolExecutionItem;\n if (toolItem.toolCallId === toolCallId) {\n currentData[i] = {\n ...toolItem,\n status: \"complete\",\n output: (parsed.data as { value: unknown }).value,\n };\n break;\n }\n }\n }\n\n return {\n ...prev,\n [executionId]: currentData,\n };\n });\n };\n\n const handleDebugToolExecutionError = (parsed: AgentDebugEventType) => {\n const executionId = parsed.meta.executionId;\n const toolCallId = (parsed.data as { toolCallId?: string }).toolCallId;\n setDebugData((prev) => {\n const currentData = [...(prev[executionId] || [])];\n\n for (let i = currentData.length - 1; i >= 0; i--) {\n if (currentData[i].itemType === \"tool_call\") {\n const toolItem = currentData[i] as ToolExecutionItem;\n if (toolItem.toolCallId === toolCallId) {\n currentData[i] = {\n ...toolItem,\n status: \"error\",\n output: (parsed.data as { value: unknown }).value,\n };\n break;\n }\n }\n }\n\n return {\n ...prev,\n [executionId]: currentData,\n };\n });\n };\n\n const handleDebugToolLog = (parsed: AgentDebugEventType) => {\n const executionId = parsed.meta.executionId;\n const toolCallId = (parsed.data as { toolCallId?: string }).toolCallId;\n setDebugData((prev) => {\n const currentData = [...(prev[executionId] || [])];\n\n for (let i = currentData.length - 1; i >= 0; i--) {\n if (currentData[i].itemType === \"tool_call\") {\n const toolItem = currentData[i] as ToolExecutionItem;\n if (toolItem.toolCallId === toolCallId) {\n const currentLogs = toolItem.logs || [];\n currentData[i] = {\n ...toolItem,\n logs: [...currentLogs, (parsed.data as { value: unknown[] }).value[0]],\n };\n break;\n }\n }\n }\n\n return {\n ...prev,\n [executionId]: currentData,\n };\n });\n };\n\n let lastReasoningIndex = -1;\n const handleDebugReasoningStep = (parsed: LLMReasoningDeltaEventType) => {\n const executionId = parsed.meta.executionId;\n const { delta, index } = parsed.data;\n setDebugData((prev) => {\n const currentData = [...(prev[executionId] || [])];\n\n if (lastReasoningIndex < index) {\n currentData.push({ itemType: \"reasoning\", reasoning: \"\" });\n lastReasoningIndex = index;\n }\n\n for (let i = currentData.length - 1; i >= 0; i--) {\n if (currentData[i].itemType === \"reasoning\") {\n currentData[i] = {\n itemType: \"reasoning\",\n reasoning: (currentData[i] as ReasoningItem).reasoning + delta,\n };\n break;\n }\n }\n\n return {\n ...prev,\n [executionId]: currentData,\n };\n });\n };\n\n const handleAgentHandoff = (parsed: AgentHandoffEventType) => {\n const executionId = parsed.meta.executionId;\n setDebugData((prev) => ({\n ...prev,\n [executionId]: [\n ...(prev[executionId] || []),\n {\n itemType: \"handoff\",\n agentName: parsed.data.agentName,\n } as HandoffItem,\n ],\n }));\n };\n\n const handleMCPToolCallStart = (parsed: MCPToolCallStartEventType) => {\n const executionId = parsed.meta.executionId;\n setDebugData((prev) => ({\n ...prev,\n [executionId]: [\n ...(prev[executionId] || []),\n {\n itemType: \"mcp_tool_call\",\n toolName: parsed.data.toolName,\n serverName: parsed.data.serverName,\n callId: parsed.data.callId,\n status: \"progress\",\n inputs: parsed.data.inputs,\n } as MCPToolExecutionItem,\n ],\n }));\n };\n\n const handleMCPToolCallEnd = (parsed: MCPToolCallEndEventType) => {\n const executionId = parsed.meta.executionId;\n const callId = parsed.data.callId;\n setDebugData((prev) => {\n const currentData = [...(prev[executionId] || [])];\n\n for (let i = currentData.length - 1; i >= 0; i--) {\n if (currentData[i].itemType === \"mcp_tool_call\") {\n const mcpToolItem = currentData[i] as MCPToolExecutionItem;\n if (mcpToolItem.callId === callId) {\n currentData[i] = {\n ...mcpToolItem,\n status: parsed.data.error ? \"error\" : \"complete\",\n output: parsed.data.result,\n error: parsed.data.error,\n };\n break;\n }\n }\n }\n\n return {\n ...prev,\n [executionId]: currentData,\n };\n });\n };\n\n const handleDebugEvent = (\n parsed:\n | AgentDebugEventType\n | LLMReasoningDeltaEventType\n | AgentHandoffEventType\n | MCPToolCallStartEventType\n | MCPToolCallEndEventType,\n ) => {\n switch (parsed.type) {\n case \"debug_tool_execution_started\":\n handleDebugToolExecutionStarted(parsed);\n break;\n case \"debug_tool_execution_inputs\":\n handleDebugToolExecutionInputs(parsed);\n break;\n case \"debug_tool_execution_finished\":\n handleDebugToolExecutionFinished(parsed);\n break;\n case \"debug_tool_execution_error\":\n handleDebugToolExecutionError(parsed);\n break;\n case \"debug_tool_log\":\n handleDebugToolLog(parsed);\n break;\n case \"llm_reasoning_delta\":\n handleDebugReasoningStep(parsed);\n break;\n case \"agent_handoff\":\n handleAgentHandoff(parsed);\n break;\n case \"mcp_tool_call_start\":\n handleMCPToolCallStart(parsed);\n break;\n case \"mcp_tool_call_end\":\n handleMCPToolCallEnd(parsed);\n break;\n }\n };\n\n return {\n handleDebugEvent,\n };\n};\n","/**\n * Helper to clean JSON Schema for LLM compatibility.\n * Replaces modern Draft 2020-12 features with older, more compatible alternatives.\n * Specifically handles OpenAI's 'Strict Mode' requirements.\n */\nexport function cleanSchema(obj: unknown): unknown {\n if (Array.isArray(obj)) {\n return obj.map(cleanSchema);\n } else if (obj !== null && typeof obj === \"object\") {\n const newObj: Record<string, unknown> = {};\n const currentObj = obj as Record<string, any>;\n\n for (const key in currentObj) {\n // Remove keys that are not supported by most LLMs\n if (key === \"propertyNames\" || key === \"$schema\") {\n continue;\n }\n newObj[key] = cleanSchema(currentObj[key]);\n }\n\n // OpenAI and some other LLMs require additionalProperties: false for all objects in strict mode\n // AND every property must be explicitly listed in the 'required' array\n if (newObj.type === \"object\") {\n if (\n newObj.additionalProperties === undefined ||\n (newObj.additionalProperties &&\n typeof newObj.additionalProperties === \"object\" &&\n Object.keys(newObj.additionalProperties).length === 0)\n ) {\n newObj.additionalProperties = false;\n }\n\n if (newObj.additionalProperties === false && newObj.properties) {\n newObj.required = Object.keys(newObj.properties as object);\n }\n }\n\n return newObj;\n }\n return obj;\n}\n\n/**\n * Safely attempts to parse a value as JSON if it's a string.\n */\nexport function tryParseJSON(value: unknown): any {\n if (typeof value === \"string\") {\n try {\n return JSON.parse(value);\n } catch {\n return value;\n }\n }\n return value;\n}\n","import type { MessagePart } from \"../types\";\n\n/**\n * Updates a list of message parts with a new part,\n * ensuring chronological order by sequence and merging contiguous text deltas.\n */\nexport function updateAgentMessageParts(parts: MessagePart[], newPart: MessagePart): MessagePart[] {\n // 1. Combine and sort all parts by their sequence ID\n const sorted = [...parts, newPart].sort((a, b) => {\n const aStart = a.type === \"text\" ? a.firstSequence : a.sequence;\n const bStart = b.type === \"text\" ? b.firstSequence : b.sequence;\n return aStart - bStart;\n });\n\n // 2. Reduce the sorted parts to merge contiguous text blocks\n return sorted.reduce<MessagePart[]>((acc, current) => {\n const last = acc[acc.length - 1];\n\n // Check if we can merge this text part with the previous one\n const canMerge =\n last?.type === \"text\" &&\n current.type === \"text\" &&\n current.firstSequence === last.lastSequence + 1;\n\n if (canMerge) {\n acc[acc.length - 1] = {\n ...last,\n text: last.text + current.text,\n lastSequence: current.lastSequence,\n };\n return acc;\n }\n\n acc.push(current);\n return acc;\n }, []);\n}\n","import { useState, useEffect, useCallback } from \"react\";\n\n// Helper to handle JSON parsing cleanly\nfunction parseJSON<T>(value: string | null, defaultValue: T): T {\n if (value === null) return defaultValue;\n try {\n return JSON.parse(value);\n } catch {\n return defaultValue;\n }\n}\n\nexport function useSyncedLocalStorage<T>(\n key: string,\n initialValue: T,\n): [T, (value: T | ((val: T) => T)) => void] {\n // Initialize state function to avoid reading localStorage on every render\n const [storedValue, setStoredValue] = useState<T>(() => {\n if (typeof window === \"undefined\") {\n return initialValue;\n }\n try {\n const item = window.localStorage.getItem(key);\n return parseJSON(item, initialValue);\n } catch (error) {\n console.warn(`Error reading localStorage key \"${key}\":`, error);\n return initialValue;\n }\n });\n\n // Function to update state and localStorage\n const setValue = useCallback(\n (value: T | ((val: T) => T)) => {\n try {\n setStoredValue((prev) => {\n const valueToStore = value instanceof Function ? value(prev) : value;\n\n if (typeof window !== \"undefined\") {\n window.localStorage.setItem(key, JSON.stringify(valueToStore));\n // Dispatch a custom event so other hooks in the same window update\n window.dispatchEvent(\n new StorageEvent(\"storage\", { key, newValue: JSON.stringify(valueToStore) }),\n );\n }\n return valueToStore;\n });\n } catch (error) {\n console.warn(`Error setting localStorage key \"${key}\":`, error);\n }\n },\n [key],\n );\n\n // Sync across tabs/windows and within the same window\n useEffect(() => {\n const handleStorageChange = (event: StorageEvent) => {\n if (event.key === key) {\n setStoredValue(parseJSON(event.newValue, initialValue));\n }\n };\n\n window.addEventListener(\"storage\", handleStorageChange);\n return () => window.removeEventListener(\"storage\", handleStorageChange);\n }, [key, initialValue]);\n\n return [storedValue, setValue];\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,IAAAA,gBASO;;;ACTP,IAAAC,gBAAyD;AACzD,gCAAqD;;;ACD9C,IAAM,qBAAqB;AAC3B,IAAM,uBAAuB;AAE7B,IAAM,uBAAuB;AAC7B,IAAM,uBAAuB;;;ACJpC,mBAA6C;AAItC,IAAM,kBAAkB,CAC7B,SACA,aACA,gBAOA,kBACA,qBACA,gBACG;AACH,QAAM,oBAAgB,sBAAQ,MAAM,YAAY,OAAO,KAAK,CAAC,GAAG,CAAC,SAAS,WAAW,CAAC;AAEtF,QAAM,qBAAiB,qBAA4C;AAEnE,iBAAe,UAAU,CAAC,oBAAqC;AAC7D,QAAI,CAAC,oBAAoB,qBAAqB,sBAAsB;AAClE;AAAA,IACF;AAEA,mBAAe,CAAC,UAAU;AAAA,MACxB,GAAG;AAAA,MACH,CAAC,OAAO,GAAG;AAAA,QACT,GAAG,KAAK,OAAO;AAAA,QACf,CAAC,gBAAgB,GAAG;AAAA,UAClB,GAAG,KAAK,OAAO,IAAI,gBAAgB;AAAA,UACnC,UAAU,mBAAmB,YAAY;AAAA,UACzC,WAAW,KAAK,IAAI;AAAA,QACtB;AAAA,MACF;AAAA,IACF,EAAE;AAAA,EACJ;AAEA,QAAM,sBAAsB,MAAM;AAChC,UAAM,WAAW,OAAO,OAAO,aAAa;AAC5C,QAAI,SAAS,SAAS,GAAG;AACvB,aAAO,SAAS,KAAK,CAAC,GAAG,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC,EAAE;AAAA,IAC/D;AACA,WAAO;AAAA,EACT;AAEA,QAAM,oBAAgB;AAAA,IACpB,CAAC,YAAoB,yBAAyB;AAC5C,0BAAoB,SAAS;AAAA,IAC/B;AAAA,IACA,CAAC,mBAAmB;AAAA,EACtB;AAEA,QAAM,oBAAgB;AAAA,IACpB,CAAC,cAAsB;AACrB,UAAI,CAAC,aAAa,cAAc,sBAAsB;AACpD;AAAA,MACF;AAEA,qBAAe,CAAC,SAAS;AACvB,cAAM,uBAAuB,EAAE,GAAG,KAAK,OAAO,EAAE;AAChD,eAAO,qBAAqB,SAAS;AAErC,eAAO;AAAA,UACL,GAAG;AAAA,UACH,CAAC,OAAO,GAAG;AAAA,QACb;AAAA,MACF,CAAC;AAED,UAAI,cAAc,kBAAkB;AAClC,cAAM,oBAAoB,OAAO,OAAO,aAAa,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,SAAS;AACvF,YAAI,kBAAkB,SAAS,GAAG;AAChC,gBAAM,aAAa,kBAAkB,KAAK,CAAC,GAAG,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC;AAChF,8BAAoB,WAAW,EAAE;AAAA,QACnC,OAAO;AACL,8BAAoB,oBAAoB;AAAA,QAC1C;AAAA,MACF;AAAA,IACF;AAAA,IACA,CAAC,SAAS,kBAAkB,eAAe,gBAAgB,mBAAmB;AAAA,EAChF;AAEA,QAAM,mBAAe;AAAA,IACnB,MAAM,OAAO,OAAO,aAAa,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,YAAY,EAAE,SAAS;AAAA,IAC3E,CAAC,aAAa;AAAA,EAChB;AAEA,QAAM,4BAA4B,CAChC,WACA,aACA,oBACG;AACH,mBAAe,CAAC,UAAU;AAAA,MACxB,GAAG;AAAA,MACH,CAAC,OAAO,GAAG;AAAA,QACT,GAAG,KAAK,OAAO;AAAA,QACf,CAAC,SAAS,GAAG;AAAA,UACX,IAAI;AAAA,UACJ,WAAW,KAAK,IAAI;AAAA,UACpB,WAAW,KAAK,IAAI;AAAA,UACpB,UAAU;AAAA,UACV,MAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF,EAAE;AAAA,EACJ;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ACzGO,IAAM,sBAAsB,CACjC,iBAKG;AACH,QAAM,kCAAkC,CAAC,WAAgC;AACvE,UAAM,cAAc,OAAO,KAAK;AAChC,iBAAa,CAAC,UAAU;AAAA,MACtB,GAAG;AAAA,MACH,CAAC,WAAW,GAAG;AAAA,QACb,GAAI,KAAK,WAAW,KAAK,CAAC;AAAA,QAC1B;AAAA,UACE,UAAU;AAAA,UACV,QAAS,OAAO,KAA6B,UAAU;AAAA,UACvD,YAAa,OAAO,KAAiC;AAAA,UACrD,QAAQ;AAAA,QACV;AAAA,MACF;AAAA,IACF,EAAE;AAAA,EACJ;AAEA,QAAM,iCAAiC,CAAC,WAAgC;AACtE,UAAM,cAAc,OAAO,KAAK;AAChC,UAAM,aAAc,OAAO,KAAiC;AAC5D,iBAAa,CAAC,SAAS;AACrB,YAAM,cAAc,CAAC,GAAI,KAAK,WAAW,KAAK,CAAC,CAAE;AAEjD,eAAS,IAAI,YAAY,SAAS,GAAG,KAAK,GAAG,KAAK;AAChD,YAAI,YAAY,CAAC,EAAE,aAAa,aAAa;AAC3C,gBAAM,WAAW,YAAY,CAAC;AAC9B,cAAI,SAAS,eAAe,YAAY;AACtC,wBAAY,CAAC,IAAI;AAAA,cACf,GAAG;AAAA,cACH,QAAS,OAAO,KAA4B;AAAA,YAC9C;AACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,aAAO;AAAA,QACL,GAAG;AAAA,QACH,CAAC,WAAW,GAAG;AAAA,MACjB;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,mCAAmC,CAAC,WAAgC;AACxE,UAAM,cAAc,OAAO,KAAK;AAChC,UAAM,aAAc,OAAO,KAAiC;AAC5D,iBAAa,CAAC,SAAS;AACrB,YAAM,cAAc,CAAC,GAAI,KAAK,WAAW,KAAK,CAAC,CAAE;AAEjD,eAAS,IAAI,YAAY,SAAS,GAAG,KAAK,GAAG,KAAK;AAChD,YAAI,YAAY,CAAC,EAAE,aAAa,aAAa;AAC3C,gBAAM,WAAW,YAAY,CAAC;AAC9B,cAAI,SAAS,eAAe,YAAY;AACtC,wBAAY,CAAC,IAAI;AAAA,cACf,GAAG;AAAA,cACH,QAAQ;AAAA,cACR,QAAS,OAAO,KAA4B;AAAA,YAC9C;AACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,aAAO;AAAA,QACL,GAAG;AAAA,QACH,CAAC,WAAW,GAAG;AAAA,MACjB;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,gCAAgC,CAAC,WAAgC;AACrE,UAAM,cAAc,OAAO,KAAK;AAChC,UAAM,aAAc,OAAO,KAAiC;AAC5D,iBAAa,CAAC,SAAS;AACrB,YAAM,cAAc,CAAC,GAAI,KAAK,WAAW,KAAK,CAAC,CAAE;AAEjD,eAAS,IAAI,YAAY,SAAS,GAAG,KAAK,GAAG,KAAK;AAChD,YAAI,YAAY,CAAC,EAAE,aAAa,aAAa;AAC3C,gBAAM,WAAW,YAAY,CAAC;AAC9B,cAAI,SAAS,eAAe,YAAY;AACtC,wBAAY,CAAC,IAAI;AAAA,cACf,GAAG;AAAA,cACH,QAAQ;AAAA,cACR,QAAS,OAAO,KAA4B;AAAA,YAC9C;AACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,aAAO;AAAA,QACL,GAAG;AAAA,QACH,CAAC,WAAW,GAAG;AAAA,MACjB;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,qBAAqB,CAAC,WAAgC;AAC1D,UAAM,cAAc,OAAO,KAAK;AAChC,UAAM,aAAc,OAAO,KAAiC;AAC5D,iBAAa,CAAC,SAAS;AACrB,YAAM,cAAc,CAAC,GAAI,KAAK,WAAW,KAAK,CAAC,CAAE;AAEjD,eAAS,IAAI,YAAY,SAAS,GAAG,KAAK,GAAG,KAAK;AAChD,YAAI,YAAY,CAAC,EAAE,aAAa,aAAa;AAC3C,gBAAM,WAAW,YAAY,CAAC;AAC9B,cAAI,SAAS,eAAe,YAAY;AACtC,kBAAM,cAAc,SAAS,QAAQ,CAAC;AACtC,wBAAY,CAAC,IAAI;AAAA,cACf,GAAG;AAAA,cACH,MAAM,CAAC,GAAG,aAAc,OAAO,KAA8B,MAAM,CAAC,CAAC;AAAA,YACvE;AACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,aAAO;AAAA,QACL,GAAG;AAAA,QACH,CAAC,WAAW,GAAG;AAAA,MACjB;AAAA,IACF,CAAC;AAAA,EACH;AAEA,MAAI,qBAAqB;AACzB,QAAM,2BAA2B,CAAC,WAAuC;AACvE,UAAM,cAAc,OAAO,KAAK;AAChC,UAAM,EAAE,OAAO,MAAM,IAAI,OAAO;AAChC,iBAAa,CAAC,SAAS;AACrB,YAAM,cAAc,CAAC,GAAI,KAAK,WAAW,KAAK,CAAC,CAAE;AAEjD,UAAI,qBAAqB,OAAO;AAC9B,oBAAY,KAAK,EAAE,UAAU,aAAa,WAAW,GAAG,CAAC;AACzD,6BAAqB;AAAA,MACvB;AAEA,eAAS,IAAI,YAAY,SAAS,GAAG,KAAK,GAAG,KAAK;AAChD,YAAI,YAAY,CAAC,EAAE,aAAa,aAAa;AAC3C,sBAAY,CAAC,IAAI;AAAA,YACf,UAAU;AAAA,YACV,WAAY,YAAY,CAAC,EAAoB,YAAY;AAAA,UAC3D;AACA;AAAA,QACF;AAAA,MACF;AAEA,aAAO;AAAA,QACL,GAAG;AAAA,QACH,CAAC,WAAW,GAAG;AAAA,MACjB;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,qBAAqB,CAAC,WAAkC;AAC5D,UAAM,cAAc,OAAO,KAAK;AAChC,iBAAa,CAAC,UAAU;AAAA,MACtB,GAAG;AAAA,MACH,CAAC,WAAW,GAAG;AAAA,QACb,GAAI,KAAK,WAAW,KAAK,CAAC;AAAA,QAC1B;AAAA,UACE,UAAU;AAAA,UACV,WAAW,OAAO,KAAK;AAAA,QACzB;AAAA,MACF;AAAA,IACF,EAAE;AAAA,EACJ;AAEA,QAAM,yBAAyB,CAAC,WAAsC;AACpE,UAAM,cAAc,OAAO,KAAK;AAChC,iBAAa,CAAC,UAAU;AAAA,MACtB,GAAG;AAAA,MACH,CAAC,WAAW,GAAG;AAAA,QACb,GAAI,KAAK,WAAW,KAAK,CAAC;AAAA,QAC1B;AAAA,UACE,UAAU;AAAA,UACV,UAAU,OAAO,KAAK;AAAA,UACtB,YAAY,OAAO,KAAK;AAAA,UACxB,QAAQ,OAAO,KAAK;AAAA,UACpB,QAAQ;AAAA,UACR,QAAQ,OAAO,KAAK;AAAA,QACtB;AAAA,MACF;AAAA,IACF,EAAE;AAAA,EACJ;AAEA,QAAM,uBAAuB,CAAC,WAAoC;AAChE,UAAM,cAAc,OAAO,KAAK;AAChC,UAAM,SAAS,OAAO,KAAK;AAC3B,iBAAa,CAAC,SAAS;AACrB,YAAM,cAAc,CAAC,GAAI,KAAK,WAAW,KAAK,CAAC,CAAE;AAEjD,eAAS,IAAI,YAAY,SAAS,GAAG,KAAK,GAAG,KAAK;AAChD,YAAI,YAAY,CAAC,EAAE,aAAa,iBAAiB;AAC/C,gBAAM,cAAc,YAAY,CAAC;AACjC,cAAI,YAAY,WAAW,QAAQ;AACjC,wBAAY,CAAC,IAAI;AAAA,cACf,GAAG;AAAA,cACH,QAAQ,OAAO,KAAK,QAAQ,UAAU;AAAA,cACtC,QAAQ,OAAO,KAAK;AAAA,cACpB,OAAO,OAAO,KAAK;AAAA,YACrB;AACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,aAAO;AAAA,QACL,GAAG;AAAA,QACH,CAAC,WAAW,GAAG;AAAA,MACjB;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,mBAAmB,CACvB,WAMG;AACH,YAAQ,OAAO,MAAM;AAAA,MACnB,KAAK;AACH,wCAAgC,MAAM;AACtC;AAAA,MACF,KAAK;AACH,uCAA+B,MAAM;AACrC;AAAA,MACF,KAAK;AACH,yCAAiC,MAAM;AACvC;AAAA,MACF,KAAK;AACH,sCAA8B,MAAM;AACpC;AAAA,MACF,KAAK;AACH,2BAAmB,MAAM;AACzB;AAAA,MACF,KAAK;AACH,iCAAyB,MAAM;AAC/B;AAAA,MACF,KAAK;AACH,2BAAmB,MAAM;AACzB;AAAA,MACF,KAAK;AACH,+BAAuB,MAAM;AAC7B;AAAA,MACF,KAAK;AACH,6BAAqB,MAAM;AAC3B;AAAA,IACJ;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,EACF;AACF;;;AC7QO,SAAS,YAAY,KAAuB;AACjD,MAAI,MAAM,QAAQ,GAAG,GAAG;AACtB,WAAO,IAAI,IAAI,WAAW;AAAA,EAC5B,WAAW,QAAQ,QAAQ,OAAO,QAAQ,UAAU;AAClD,UAAM,SAAkC,CAAC;AACzC,UAAM,aAAa;AAEnB,eAAW,OAAO,YAAY;AAE5B,UAAI,QAAQ,mBAAmB,QAAQ,WAAW;AAChD;AAAA,MACF;AACA,aAAO,GAAG,IAAI,YAAY,WAAW,GAAG,CAAC;AAAA,IAC3C;AAIA,QAAI,OAAO,SAAS,UAAU;AAC5B,UACE,OAAO,yBAAyB,UAC/B,OAAO,wBACN,OAAO,OAAO,yBAAyB,YACvC,OAAO,KAAK,OAAO,oBAAoB,EAAE,WAAW,GACtD;AACA,eAAO,uBAAuB;AAAA,MAChC;AAEA,UAAI,OAAO,yBAAyB,SAAS,OAAO,YAAY;AAC9D,eAAO,WAAW,OAAO,KAAK,OAAO,UAAoB;AAAA,MAC3D;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAKO,SAAS,aAAa,OAAqB;AAChD,MAAI,OAAO,UAAU,UAAU;AAC7B,QAAI;AACF,aAAO,KAAK,MAAM,KAAK;AAAA,IACzB,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;;;AChDO,SAAS,wBAAwB,OAAsB,SAAqC;AAEjG,QAAM,SAAS,CAAC,GAAG,OAAO,OAAO,EAAE,KAAK,CAAC,GAAG,MAAM;AAChD,UAAM,SAAS,EAAE,SAAS,SAAS,EAAE,gBAAgB,EAAE;AACvD,UAAM,SAAS,EAAE,SAAS,SAAS,EAAE,gBAAgB,EAAE;AACvD,WAAO,SAAS;AAAA,EAClB,CAAC;AAGD,SAAO,OAAO,OAAsB,CAAC,KAAK,YAAY;AACpD,UAAM,OAAO,IAAI,IAAI,SAAS,CAAC;AAG/B,UAAM,WACJ,MAAM,SAAS,UACf,QAAQ,SAAS,UACjB,QAAQ,kBAAkB,KAAK,eAAe;AAEhD,QAAI,UAAU;AACZ,UAAI,IAAI,SAAS,CAAC,IAAI;AAAA,QACpB,GAAG;AAAA,QACH,MAAM,KAAK,OAAO,QAAQ;AAAA,QAC1B,cAAc,QAAQ;AAAA,MACxB;AACA,aAAO;AAAA,IACT;AAEA,QAAI,KAAK,OAAO;AAChB,WAAO;AAAA,EACT,GAAG,CAAC,CAAC;AACP;;;ALzBe,SAAR,SAA0B,SAAiB,UAAkB,WAAmB;AACrF,UAAQ,IAAI,gCAAgC,EAAE,SAAS,UAAU,UAAU,CAAC;AAE5E,QAAM,EAAE,aAAa,gBAAgB,WAAW,aAAa,IAAI,oBAAoB;AAErF,QAAM,CAAC,YAAY,aAAa,QAAI,wBAAS,KAAK;AAClD,QAAM,CAAC,UAAU,WAAW,QAAI,wBAAyB,CAAC,CAAC;AAE3D,QAAM,kBAAc,sBAAuB,CAAC,CAAC;AAG7C,QAAM,CAAC,kBAAkB,mBAAmB,QAAI,wBAAiB,oBAAoB;AAErF,QAAM,eAAe;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAGA,+BAAU,MAAM;AACd,UAAM,mBAAmB,aAAa,oBAAoB;AAC1D,wBAAoB,gBAAgB;AAAA,EACtC,GAAG,CAAC,CAAC;AAEL,QAAM,gBAAgB,oBAAoB,YAAY;AAGtD,+BAAU,MAAM;AACd,gBAAY,UAAU;AAAA,EACxB,GAAG,CAAC,QAAQ,CAAC;AAGb,+BAAU,MAAM;AAEd,QAAI,YAAY;AACd;AAAA,IACF;AAEA,UAAM,UAAU,aAAa,cAAc,gBAAgB;AAE3D,QAAI,SAAS;AACX,kBAAY,QAAQ,QAAQ;AAAA,IAC9B,OAAO;AACL,kBAAY,CAAC,CAAC;AAAA,IAChB;AAAA,EACF,GAAG,CAAC,kBAAkB,aAAa,eAAe,SAAS,UAAU,CAAC;AAGtE,+BAAU,MAAM;AACd,WAAO,MAAM;AACX,UAAI,YAAY,QAAQ,SAAS,KAAK,aAAa,eAAe,SAAS;AACzE,qBAAa,eAAe,QAAQ;AAAA,MACtC;AAAA,IACF;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,iBAAa,sBAAwB;AAE3C,QAAM,eAAW;AAAA,IACf,OACE,OACA,YAOG;AACH,oBAAc,IAAI;AAElB,UAAI,WAAW,SAAS;AACtB,mBAAW,QAAQ,MAAM;AAAA,MAC3B;AACA,iBAAW,UAAU,IAAI,gBAAgB;AAEzC,YAAM,UAAkC;AAAA,QACtC,gBAAgB;AAAA,QAChB,GAAI,SAAS,qBAAqB,CAAC;AAAA,QACnC,GAAI,YAAY,EAAE,eAAe,UAAU,SAAS,GAAG,IAAI,CAAC;AAAA,MAC9D;AACA,cAAQ,IAAI,+BAA+B,OAAO;AAGlD,UAAI,kBAAkB;AACpB,gBAAQ,8BAA8B,IAAI;AAAA,MAC5C;AAEA,YAAM,OAAO;AAAA,QACX,QAAQ;AAAA,QACR;AAAA,QACA,SAAS,SAAS,WAAW,CAAC;AAAA,QAC9B,aAAa,SAAS;AAAA,QACtB,OAAO,SAAS,OAAO,IAAI,CAAC,OAAgC;AAAA,UAC1D,GAAG;AAAA,UACH,YAAY,YAAY,EAAE,UAAU;AAAA,QACtC,EAAE;AAAA,QACF,aAAa,SAAS,aAAa,IAAI,CAAC,OAAgC;AAAA,UACtE,GAAG;AAAA,UACH,YAAY,YAAY,EAAE,UAAU;AAAA,QACtC,EAAE;AAAA,MACJ;AAEA,UAAI;AACF,kBAAM,4CAAiB,UAAU;AAAA,UAC/B,QAAQ;AAAA,UACR;AAAA,UACA,QAAQ,WAAW,QAAQ;AAAA,UAC3B,gBAAgB;AAAA,UAChB,MAAM,KAAK,UAAU,IAAI;AAAA,UACzB,QAAQ,OAAO,SAAS;AAEtB,gBAAI,KAAK,UAAU,KAAK;AACtB,sBAAQ,IAAI,gCAAgC,KAAK,MAAM,EAAE;AAEzD,kBAAI,KAAK,WAAW,KAAK;AAEvB,sBAAM,IAAI,MAAM,cAAc,KAAK,UAAU,GAAG;AAAA,cAClD;AAEA,oBAAM,IAAI,MAAM,gBAAgB,KAAK,MAAM,EAAE;AAAA,YAC/C;AAGA,gBAAI,CAAC,oBAAoB,qBAAqB,sBAAsB;AAClE,oBAAM,YAAY,KAAK,QAAQ,IAAI,8BAA8B;AACjE,kBAAI,WAAW;AAEb,sBAAM,kBAAkB,YAAY;AACpC,sBAAM,cACJ,KAAK,QAAQ,IAAI,gCAAgC,KAAK;AAExD,6BAAa,0BAA0B,WAAW,aAAa,eAAe;AAC9E,oCAAoB,SAAS;AAAA,cAC/B;AAAA,YACF;AAGA,kBAAM,cAAc,KAAK,QAAQ,IAAI,gCAAgC;AACrE,gBAAI,aAAa;AACf,0BAAY,CAAC,SAAS;AACpB,sBAAM,cAAc,KAAK,KAAK,SAAS,CAAC;AACxC,oBAAI,aAAa,SAAS,QAAQ;AAChC,wBAAM,iBAAiB;AAAA,oBACrB,GAAG;AAAA,oBACH;AAAA,kBACF;AACA,wBAAM,kBAAkB,CAAC,GAAG,KAAK,MAAM,GAAG,EAAE,GAAG,cAAc;AAG7D,sBAAI,aAAa,eAAe,SAAS;AACvC,iCAAa,eAAe,QAAQ,eAAe;AAAA,kBACrD;AAEA,yBAAO;AAAA,gBACT;AACA,uBAAO;AAAA,cACT,CAAC;AAAA,YACH;AAAA,UACF;AAAA,UACA,WAAW,CAAC,UAA8B;AACxC,gBAAI;AACF,oBAAM,SAAS,KAAK,MAAM,MAAM,IAAI;AAEpC,kBAAI,OAAO,SAAS,kBAAkB;AACpC,4BAAY,CAAC,SAAS;AACpB,wBAAM,cAAc,KAAK,KAAK,SAAS,CAAC;AACxC,wBAAM,WAAW,OAAO,KAAK;AAC7B,wBAAM,UAAuB;AAAA,oBAC3B,MAAM;AAAA,oBACN,MAAM,OAAO;AAAA,oBACb,eAAe;AAAA,oBACf,cAAc;AAAA,kBAChB;AAEA,sBAAI;AAEJ,sBAAI,aAAa,SAAS,SAAS;AACjC,0BAAM,iBAA0B;AAAA,sBAC9B,GAAG;AAAA,sBACH,SAAS,YAAY,UAAU,OAAO;AAAA;AAAA,sBACtC,OAAO,wBAAwB,YAAY,SAAS,CAAC,GAAG,OAAO;AAAA,oBACjE;AACA,sCAAkB,CAAC,GAAG,KAAK,MAAM,GAAG,EAAE,GAAG,cAAc;AAAA,kBACzD,OAAO;AACL,0BAAM,iBAA0B;AAAA,sBAC9B,MAAM;AAAA,sBACN,SAAS,OAAO;AAAA,sBAChB,OAAO,CAAC,OAAO;AAAA,sBACf,aAAa,OAAO,KAAK;AAAA,oBAC3B;AACA,sCAAkB,CAAC,GAAG,MAAM,cAAc;AAAA,kBAC5C;AAEA,sBAAI,aAAa,eAAe,SAAS;AACvC,iCAAa,eAAe,QAAQ,eAAe;AAAA,kBACrD;AAEA,yBAAO;AAAA,gBACT,CAAC;AAAA,cACH,WAAW,OAAO,SAAS,oBAAoB;AAC7C,4BAAY,CAAC,SAAS;AACpB,wBAAM,cAAc,KAAK,KAAK,SAAS,CAAC;AACxC,wBAAM,UAAuB;AAAA,oBAC3B,MAAM;AAAA,oBACN,UAAU,OAAO,KAAK;AAAA,oBACtB,QAAQ,OAAO,KAAK;AAAA,oBACpB,QAAQ,aAAa,OAAO,KAAK,MAAM;AAAA,oBACvC,UAAU,OAAO,KAAK;AAAA,kBACxB;AAEA,sBAAI;AAEJ,sBAAI,aAAa,SAAS,SAAS;AACjC,0BAAM,iBAA0B;AAAA,sBAC9B,GAAG;AAAA,sBACH,OAAO,wBAAwB,YAAY,SAAS,CAAC,GAAG,OAAO;AAAA,oBACjE;AACA,sCAAkB,CAAC,GAAG,KAAK,MAAM,GAAG,EAAE,GAAG,cAAc;AAAA,kBACzD,OAAO;AACL,0BAAM,iBAA0B;AAAA,sBAC9B,MAAM;AAAA,sBACN,SAAS;AAAA,sBACT,OAAO,CAAC,OAAO;AAAA,sBACf,aAAa,OAAO,KAAK;AAAA,oBAC3B;AACA,sCAAkB,CAAC,GAAG,MAAM,cAAc;AAAA,kBAC5C;AAEA,sBAAI,aAAa,eAAe,SAAS;AACvC,iCAAa,eAAe,QAAQ,eAAe;AAAA,kBACrD;AAEA,yBAAO;AAAA,gBACT,CAAC;AAAA,cACH,WACE,OAAO,KAAK,WAAW,QAAQ,KAC/B,OAAO,SAAS,yBAChB,OAAO,SAAS,mBAChB,OAAO,SAAS,yBAChB,OAAO,SAAS,qBAChB;AACA,8BAAc,iBAAiB,MAAM;AAAA,cACvC;AAAA,YACF,SAAS,GAAG;AACV,sBAAQ,IAAI,iCAAiC,CAAC;AAAA,YAChD;AAAA,UACF;AAAA,UACA,SAAS,MAAM;AACb,oBAAQ,IAAI,cAAc;AAC1B,0BAAc,KAAK;AAEnB,gBAAI,aAAa,eAAe,SAAS;AACvC,2BAAa,eAAe,QAAQ;AAAA,YACtC;AAAA,UACF;AAAA,UACA,SAAS,CAAC,MAAM;AACd,oBAAQ,IAAI,eAAe,CAAC;AAC5B,0BAAc,KAAK;AAEnB,gBAAI,aAAa,eAAe,SAAS;AACvC,2BAAa,eAAe,QAAQ,YAAY,OAAO;AAAA,YACzD;AACA,kBAAM,IAAI,MAAM,yBAAyB;AAAA,UAC3C;AAAA,QACF,CAAC;AAAA,MACH,SAAS,OAAO;AACd,gBAAQ,IAAI,0BAA0B,KAAK;AAC3C,sBAAc,KAAK;AAEnB,YAAI,aAAa,eAAe,SAAS;AACvC,uBAAa,eAAe,QAAQ,YAAY,OAAO;AAAA,QACzD;AACA,cAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,CAAC,UAAU,WAAW,kBAAkB,cAAc,aAAa;AAAA,EACrE;AAEA,QAAM,iBAAa;AAAA,IACjB,OACE,OACA,YAQG;AACH,YAAM,cAAc;AAAA,QAClB,MAAM;AAAA,QACN,SAAS;AAAA,QACT,aAAa,KAAK,IAAI,EAAE,SAAS;AAAA,MACnC;AAGA,UAAI,CAAC,SAAS,iBAAiB;AAC7B,oBAAY,CAAC,SAAS;AACpB,gBAAM,kBAAkB,CAAC,GAAG,MAAM,WAAW;AAE7C,cAAI,aAAa,eAAe,SAAS;AACvC,yBAAa,eAAe,QAAQ,eAAe;AAAA,UACrD;AACA,iBAAO;AAAA,QACT,CAAC;AAAA,MACH;AAEA,UAAI;AACF,cAAM,SAAS,OAAO,OAAO;AAAA,MAC/B,SAAS,OAAO;AAEd,YAAI,CAAC,SAAS,iBAAiB;AAC7B,sBAAY,CAAC,SAAS;AACpB,kBAAM,kBAAkB,KAAK,KAAK,CAAC,MAAM,MAAM,WAAW,IACtD,OACA,CAAC,GAAG,MAAM,WAAW;AACzB,gBAAI,aAAa,eAAe,SAAS;AACvC,2BAAa,eAAe,QAAQ,eAAe;AAAA,YACrD;AACA,mBAAO;AAAA,UACT,CAAC;AAAA,QACH;AACA,cAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,CAAC,UAAU,aAAa,cAAc;AAAA,EACxC;AAEA,QAAM,2BAAuB;AAAA,IAC3B,CAAC,UAAkB;AACjB,YAAM,cAAc;AAAA,QAClB,MAAM;AAAA,QACN,SAAS;AAAA,QACT,aAAa,KAAK,IAAI,EAAE,SAAS;AAAA,MACnC;AAEA,kBAAY,CAAC,SAAS;AACpB,cAAM,kBAAkB,CAAC,GAAG,MAAM,WAAW;AAE7C,YAAI,aAAa,eAAe,SAAS;AACvC,uBAAa,eAAe,QAAQ,eAAe;AAAA,QACrD;AACA,eAAO;AAAA,MACT,CAAC;AAAA,IACH;AAAA,IACA,CAAC,aAAa,cAAc;AAAA,EAC9B;AAEA,QAAM,YAAQ,2BAAY,MAAM;AAC9B,QAAI,WAAW,SAAS;AACtB,iBAAW,QAAQ,MAAM;AAAA,IAC3B;AACA,kBAAc,KAAK;AAEnB,QAAI,aAAa,eAAe,SAAS;AACvC,mBAAa,eAAe,QAAQ,YAAY,OAAO;AAAA,IACzD;AAAA,EACF,GAAG,CAAC,aAAa,cAAc,CAAC;AAEhC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX,eAAe,aAAa;AAAA,IAC5B,eAAe,aAAa;AAAA,IAC5B,UAAU,aAAa;AAAA,IACvB;AAAA,EACF;AACF;;;AMpYA,IAAAC,gBAAiD;AAGjD,SAAS,UAAa,OAAsB,cAAoB;AAC9D,MAAI,UAAU,KAAM,QAAO;AAC3B,MAAI;AACF,WAAO,KAAK,MAAM,KAAK;AAAA,EACzB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,sBACd,KACA,cAC2C;AAE3C,QAAM,CAAC,aAAa,cAAc,QAAI,wBAAY,MAAM;AACtD,QAAI,OAAO,WAAW,aAAa;AACjC,aAAO;AAAA,IACT;AACA,QAAI;AACF,YAAM,OAAO,OAAO,aAAa,QAAQ,GAAG;AAC5C,aAAO,UAAU,MAAM,YAAY;AAAA,IACrC,SAAS,OAAO;AACd,cAAQ,KAAK,mCAAmC,GAAG,MAAM,KAAK;AAC9D,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AAGD,QAAM,eAAW;AAAA,IACf,CAAC,UAA+B;AAC9B,UAAI;AACF,uBAAe,CAAC,SAAS;AACvB,gBAAM,eAAe,iBAAiB,WAAW,MAAM,IAAI,IAAI;AAE/D,cAAI,OAAO,WAAW,aAAa;AACjC,mBAAO,aAAa,QAAQ,KAAK,KAAK,UAAU,YAAY,CAAC;AAE7D,mBAAO;AAAA,cACL,IAAI,aAAa,WAAW,EAAE,KAAK,UAAU,KAAK,UAAU,YAAY,EAAE,CAAC;AAAA,YAC7E;AAAA,UACF;AACA,iBAAO;AAAA,QACT,CAAC;AAAA,MACH,SAAS,OAAO;AACd,gBAAQ,KAAK,mCAAmC,GAAG,MAAM,KAAK;AAAA,MAChE;AAAA,IACF;AAAA,IACA,CAAC,GAAG;AAAA,EACN;AAGA,+BAAU,MAAM;AACd,UAAM,sBAAsB,CAAC,UAAwB;AACnD,UAAI,MAAM,QAAQ,KAAK;AACrB,uBAAe,UAAU,MAAM,UAAU,YAAY,CAAC;AAAA,MACxD;AAAA,IACF;AAEA,WAAO,iBAAiB,WAAW,mBAAmB;AACtD,WAAO,MAAM,OAAO,oBAAoB,WAAW,mBAAmB;AAAA,EACxE,GAAG,CAAC,KAAK,YAAY,CAAC;AAEtB,SAAO,CAAC,aAAa,QAAQ;AAC/B;;;APqEI;AA5EJ,IAAM,mBAAe,6BAAwC,IAAI;AAE1D,SAAS,qBAAqB,EAAE,SAAS,GAA4B;AAC1E,QAAM,sBAAkB,sBAA6D,oBAAI,IAAI,CAAC;AAM9F,QAAM,iBAAa,sBAAiC,oBAAI,IAAI,CAAC;AAC7D,QAAM,mBAAe,sBAAqC,oBAAI,IAAI,CAAC;AAEnE,QAAM,CAAC,EAAE,WAAW,QAAI,wBAAS,CAAC,CAAC;AAGnC,QAAM,CAAC,aAAa,cAAc,IAAI,sBAEpC,oBAAoB,CAAC,CAAC;AAExB,QAAM,CAAC,WAAW,YAAY,IAAI;AAAA,IAChC;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,sBAAkB,2BAAY,CAAC,SAAiB,UAAkB,cAAsB;AAC5F,YAAQ,IAAI,0CAA0C,EAAE,SAAS,UAAU,UAAU,CAAC;AACtF,UAAM,WAAW,gBAAgB,QAAQ,IAAI,OAAO;AAEpD,QAAI,CAAC,UAAU;AACb,sBAAgB,QAAQ,IAAI,SAAS,EAAE,UAAU,UAAU,CAAC;AAC5D,cAAQ,IAAI,wCAAwC,EAAE,SAAS,UAAU,UAAU,CAAC;AACpF,kBAAY,CAAC,CAAC;AAAA,IAChB,WAAW,SAAS,aAAa,YAAY,SAAS,cAAc,WAAW;AAC7E,sBAAgB,QAAQ,IAAI,SAAS,EAAE,UAAU,UAAU,CAAC;AAC5D,cAAQ,IAAI,iCAAiC,EAAE,SAAS,UAAU,UAAU,CAAC;AAC7E,kBAAY,CAAC,CAAC;AAAA,IAChB;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,qBAAiB,2BAAY,CAAC,SAAiB,WAAwB;AAC3E,eAAW,QAAQ,IAAI,SAAS,MAAM;AAEtC,UAAM,YAAY,aAAa,QAAQ,IAAI,OAAO;AAClD,QAAI,WAAW;AACb,gBAAU,QAAQ,CAAC,aAAa,SAAS,CAAC;AAAA,IAC5C;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,gBAAY,2BAAY,CAAC,YAAoB;AACjD,WAAO,WAAW,QAAQ,IAAI,OAAO,KAAK;AAAA,EAC5C,GAAG,CAAC,CAAC;AAEL,QAAM,mBAAe;AAAA,IACnB,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,SACE,6CAAC,aAAa,UAAb,EAAsB,OAAO,cAC3B;AAAA;AAAA,IACA,MAAM,KAAK,gBAAgB,QAAQ,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC,SAAS,EAAE,UAAU,UAAU,CAAC,MACnF;AAAA,MAAC;AAAA;AAAA,QAEC;AAAA,QACA;AAAA,QACA;AAAA;AAAA,MAHK;AAAA,IAIP,CACD;AAAA,KACH;AAEJ;AAEA,SAAS,oBAAoB;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,QAAM,QAAQ,SAAS,SAAS,UAAU,SAAS;AACnD,QAAM,cAAU,0BAAW,YAAY;AAEvC,MAAI,CAAC,QAAS,QAAO;AAErB,+BAAU,MAAM;AACd,YAAQ,eAAe,SAAS,KAAK;AAAA,EACvC,GAAG,CAAC,SAAS,OAAO,OAAO,CAAC;AAE5B,SAAO;AACT;AAEO,SAAS,gBAAgB,SAAiB,UAAkB,WAAgC;AACjG,QAAM,cAAU,0BAAW,YAAY;AAEvC,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,0DAA0D;AAAA,EAC5E;AAEA,QAAM,EAAE,iBAAiB,WAAW,aAAa,IAAI;AAIrD,+BAAU,MAAM;AACd,oBAAgB,SAAS,UAAU,SAAS;AAAA,EAC9C,GAAG,CAAC,SAAS,UAAU,eAAe,CAAC;AAGvC,QAAM,CAAC,QAAQ,SAAS,QAAI,wBAA6B,MAAM,UAAU,OAAO,CAAC;AAEjF,+BAAU,MAAM;AAEd,UAAM,gBAAgB,UAAU,OAAO;AACvC,QAAI,kBAAkB,QAAQ;AAC5B,gBAAU,aAAa;AAAA,IACzB;AAGA,UAAM,WAAW,MAAM;AACrB,gBAAU,UAAU,OAAO,CAAC;AAAA,IAC9B;AAEA,QAAI,CAAC,aAAa,QAAQ,IAAI,OAAO,GAAG;AACtC,mBAAa,QAAQ,IAAI,SAAS,oBAAI,IAAI,CAAC;AAAA,IAC7C;AACA,iBAAa,QAAQ,IAAI,OAAO,GAAG,IAAI,QAAQ;AAE/C,WAAO,MAAM;AACX,mBAAa,QAAQ,IAAI,OAAO,GAAG,OAAO,QAAQ;AAAA,IACpD;AAAA,EACF,GAAG,CAAC,SAAS,SAAS,CAAC;AAEvB,QAAM,kBAAc;AAAA,IAClB,OAAO;AAAA,MACL,UAAU,CAAC;AAAA,MACX,YAAY;AAAA,MACZ,WAAW;AAAA,MACX,UAAU,CAAC;AAAA,MACX,WAAW,CAAC;AAAA,MACZ,YAAY,YAAY;AAAA,MAAC;AAAA,MACzB,eAAe,MAAM;AAAA,MAAC;AAAA,MACtB,eAAe,MAAM;AAAA,MAAC;AAAA,MACtB,sBAAsB,MAAM;AAAA,MAAC;AAAA,MAC7B,OAAO,MAAM;AAAA,MAAC;AAAA,IAChB;AAAA,IACA,CAAC;AAAA,EACH;AAEA,SAAO,UAAU;AACnB;AAGO,SAAS,sBAAsB;AACpC,QAAM,cAAU,0BAAW,YAAY;AACvC,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,8DAA8D;AAAA,EAChF;AACA,SAAO;AAAA,IACL,aAAa,QAAQ;AAAA,IACrB,gBAAgB,QAAQ;AAAA,IACxB,WAAW,QAAQ;AAAA,IACnB,cAAc,QAAQ;AAAA,EACxB;AACF;","names":["import_react","import_react","import_react"]}
package/dist/index.d.cts CHANGED
@@ -143,7 +143,7 @@ interface AgentRunner {
143
143
  declare function AgentContextProvider({ children }: {
144
144
  children: ReactNode;
145
145
  }): react_jsx_runtime.JSX.Element;
146
- declare function useAgentContext(agentId: string, agentUrl: string, accessKey?: string): AgentRunner;
146
+ declare function useAgentContext(agentId: string, agentUrl: string, accessKey: string): AgentRunner;
147
147
  declare function useAgentGlobalState(): {
148
148
  allSessions: Record<string, Record<string, Session>>;
149
149
  setAllSessions: (value: Record<string, Record<string, Session>> | ((prev: Record<string, Record<string, Session>>) => Record<string, Record<string, Session>>)) => void;
@@ -151,7 +151,7 @@ declare function useAgentGlobalState(): {
151
151
  setDebugData: (value: Record<string, DebugDataType> | ((prev: Record<string, DebugDataType>) => Record<string, DebugDataType>)) => void;
152
152
  };
153
153
 
154
- declare function useAgent(agentId: string, agentUrl: string, accessKey?: string): {
154
+ declare function useAgent(agentId: string, agentUrl: string, accessKey: string): {
155
155
  inProgress: boolean;
156
156
  messages: Message[];
157
157
  handleSend: (input: string, options?: {
package/dist/index.d.ts CHANGED
@@ -143,7 +143,7 @@ interface AgentRunner {
143
143
  declare function AgentContextProvider({ children }: {
144
144
  children: ReactNode;
145
145
  }): react_jsx_runtime.JSX.Element;
146
- declare function useAgentContext(agentId: string, agentUrl: string, accessKey?: string): AgentRunner;
146
+ declare function useAgentContext(agentId: string, agentUrl: string, accessKey: string): AgentRunner;
147
147
  declare function useAgentGlobalState(): {
148
148
  allSessions: Record<string, Record<string, Session>>;
149
149
  setAllSessions: (value: Record<string, Record<string, Session>> | ((prev: Record<string, Record<string, Session>>) => Record<string, Record<string, Session>>)) => void;
@@ -151,7 +151,7 @@ declare function useAgentGlobalState(): {
151
151
  setDebugData: (value: Record<string, DebugDataType> | ((prev: Record<string, DebugDataType>) => Record<string, DebugDataType>)) => void;
152
152
  };
153
153
 
154
- declare function useAgent(agentId: string, agentUrl: string, accessKey?: string): {
154
+ declare function useAgent(agentId: string, agentUrl: string, accessKey: string): {
155
155
  inProgress: boolean;
156
156
  messages: Message[];
157
157
  handleSend: (input: string, options?: {
package/dist/index.js CHANGED
@@ -397,6 +397,7 @@ function updateAgentMessageParts(parts, newPart) {
397
397
 
398
398
  // src/use-agent.ts
399
399
  function useAgent(agentId, agentUrl, accessKey) {
400
+ console.log("[useAgent] Hook called with:", { agentId, agentUrl, accessKey });
400
401
  const { allSessions, setAllSessions, debugData, setDebugData } = useAgentGlobalState();
401
402
  const [inProgress, setInProgress] = useState(false);
402
403
  const [messages, setMessages] = useState([]);
@@ -446,9 +447,10 @@ function useAgent(agentId, agentUrl, accessKey) {
446
447
  controller.current = new AbortController();
447
448
  const headers = {
448
449
  "Content-Type": "application/json",
449
- ...accessKey ? { Authorization: `Bearer ${accessKey}` } : {},
450
- ...options?.additionalHeaders || {}
450
+ ...options?.additionalHeaders || {},
451
+ ...accessKey ? { Authorization: `Bearer ${accessKey}` } : {}
451
452
  };
453
+ console.log("[useAgent] Request headers:", headers);
452
454
  if (currentSessionId) {
453
455
  headers["x-buildship-agent-session-id"] = currentSessionId;
454
456
  }
@@ -751,12 +753,15 @@ function AgentContextProvider({ children }) {
751
753
  {}
752
754
  );
753
755
  const initializeAgent = useCallback4((agentId, agentUrl, accessKey) => {
756
+ console.log("[AgentContext] initializeAgent called:", { agentId, agentUrl, accessKey });
754
757
  const existing = activeAgentsRef.current.get(agentId);
755
758
  if (!existing) {
756
759
  activeAgentsRef.current.set(agentId, { agentUrl, accessKey });
760
+ console.log("[AgentContext] New agent registered:", { agentId, agentUrl, accessKey });
757
761
  forceUpdate({});
758
762
  } else if (existing.agentUrl !== agentUrl || existing.accessKey !== accessKey) {
759
763
  activeAgentsRef.current.set(agentId, { agentUrl, accessKey });
764
+ console.log("[AgentContext] Agent updated:", { agentId, agentUrl, accessKey });
760
765
  forceUpdate({});
761
766
  }
762
767
  }, []);
@@ -794,7 +799,15 @@ function AgentContextProvider({ children }) {
794
799
  );
795
800
  return /* @__PURE__ */ jsxs(AgentContext.Provider, { value: contextValue, children: [
796
801
  children,
797
- Array.from(activeAgentsRef.current.entries()).map(([agentId, { agentUrl, accessKey }]) => /* @__PURE__ */ jsx(AgentRunnerInstance, { agentId, agentUrl, accessKey }, agentId))
802
+ Array.from(activeAgentsRef.current.entries()).map(([agentId, { agentUrl, accessKey }]) => /* @__PURE__ */ jsx(
803
+ AgentRunnerInstance,
804
+ {
805
+ agentId,
806
+ agentUrl,
807
+ accessKey
808
+ },
809
+ agentId
810
+ ))
798
811
  ] });
799
812
  }
800
813
  function AgentRunnerInstance({
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/agent-context.tsx","../src/use-agent.ts","../src/constants.ts","../src/session-utils.ts","../src/debug-handlers.ts","../src/utils/schema.ts","../src/utils/message.ts","../src/utils/use-synced-local-storage.ts"],"sourcesContent":["import {\n createContext,\n useContext,\n useCallback,\n useRef,\n useState,\n useEffect,\n useMemo,\n ReactNode,\n} from \"react\";\nimport useAgent from \"./use-agent\";\nimport type { Message, Session, DebugDataType, ClientToolDefinition } from \"./types\";\nimport { useSyncedLocalStorage } from \"./utils/use-synced-local-storage\";\nimport { AGENT_SESSIONS_KEY, AGENT_DEBUG_DATA_KEY } from \"./constants\";\n\nexport interface AgentRunner {\n messages: Message[];\n inProgress: boolean;\n sessionId: string;\n sessions: Session[];\n debugData: Record<string, DebugDataType>;\n handleSend: (\n input: string,\n options?: {\n context?: Record<string, unknown>;\n testBuildId?: string;\n skipUserMessage?: boolean;\n additionalHeaders?: Record<string, string>;\n tools?: ClientToolDefinition[];\n clientTools?: ClientToolDefinition[];\n },\n ) => Promise<void>;\n switchSession: (sessionId?: string) => void;\n deleteSession: (sessionId: string) => void;\n addOptimisticMessage: (input: string) => void;\n abort: () => void;\n}\n\ninterface AgentContextValue {\n initializeAgent: (agentId: string, agentUrl: string, accessKey?: string) => void;\n registerRunner: (agentId: string, runner: AgentRunner) => void;\n getRunner: (agentId: string) => AgentRunner | null;\n // Global state provided to useAgent hooks\n allSessions: Record<string, Record<string, Session>>;\n setAllSessions: (\n value:\n | Record<string, Record<string, Session>>\n | ((\n prev: Record<string, Record<string, Session>>,\n ) => Record<string, Record<string, Session>>),\n ) => void;\n debugData: Record<string, DebugDataType>;\n setDebugData: (\n value:\n | Record<string, DebugDataType>\n | ((prev: Record<string, DebugDataType>) => Record<string, DebugDataType>),\n ) => void;\n}\n\nconst AgentContext = createContext<AgentContextValue | null>(null);\n\nexport function AgentContextProvider({ children }: { children: ReactNode }) {\n const activeAgentsRef = useRef<Map<string, { agentUrl: string; accessKey?: string }>>(new Map());\n // Store runners in a ref since we push updates via registerRunner\n // Note: Changes to this Ref won't trigger re-renders of consumers of getRunner directly,\n // but since we return the 'runner' object which contains state,\n // and we access it via a hook that listens to updates (implemented below), it works out.\n // Actually, to make 'useAgentContext' reactive to runner changes, we need a subscription mechanism.\n const runnersRef = useRef<Map<string, AgentRunner>>(new Map());\n const listenersRef = useRef<Map<string, Set<() => void>>>(new Map());\n\n const [, forceUpdate] = useState({});\n\n // Global Sync State managed here to be shared\n const [allSessions, setAllSessions] = useSyncedLocalStorage<\n Record<string, Record<string, Session>>\n >(AGENT_SESSIONS_KEY, {});\n\n const [debugData, setDebugData] = useSyncedLocalStorage<Record<string, DebugDataType>>(\n AGENT_DEBUG_DATA_KEY,\n {},\n );\n\n const initializeAgent = useCallback((agentId: string, agentUrl: string, accessKey?: string) => {\n const existing = activeAgentsRef.current.get(agentId);\n\n if (!existing) {\n activeAgentsRef.current.set(agentId, { agentUrl, accessKey });\n forceUpdate({});\n } else if (existing.agentUrl !== agentUrl || existing.accessKey !== accessKey) {\n activeAgentsRef.current.set(agentId, { agentUrl, accessKey });\n forceUpdate({});\n }\n }, []);\n\n const registerRunner = useCallback((agentId: string, runner: AgentRunner) => {\n runnersRef.current.set(agentId, runner);\n // Notify listeners for this agentId\n const listeners = listenersRef.current.get(agentId);\n if (listeners) {\n listeners.forEach((callback) => callback());\n }\n }, []);\n\n const getRunner = useCallback((agentId: string) => {\n return runnersRef.current.get(agentId) || null;\n }, []);\n\n const contextValue = useMemo(\n () => ({\n initializeAgent,\n registerRunner,\n getRunner,\n allSessions,\n setAllSessions,\n debugData,\n setDebugData,\n runnersRef,\n listenersRef,\n }),\n [\n initializeAgent,\n registerRunner,\n getRunner,\n allSessions,\n setAllSessions,\n debugData,\n setDebugData,\n ],\n );\n\n return (\n <AgentContext.Provider value={contextValue}>\n {children}\n {Array.from(activeAgentsRef.current.entries()).map(([agentId, { agentUrl, accessKey }]) => (\n <AgentRunnerInstance key={agentId} agentId={agentId} agentUrl={agentUrl} accessKey={accessKey} />\n ))}\n </AgentContext.Provider>\n );\n}\n\nfunction AgentRunnerInstance({\n agentId,\n agentUrl,\n accessKey,\n}: {\n agentId: string;\n agentUrl: string;\n accessKey?: string;\n}) {\n const agent = useAgent(agentId, agentUrl, accessKey);\n const context = useContext(AgentContext);\n\n if (!context) return null;\n\n useEffect(() => {\n context.registerRunner(agentId, agent);\n }, [agentId, agent, context]);\n\n return null;\n}\n\nexport function useAgentContext(\n agentId: string,\n agentUrl: string,\n accessKey?: string,\n): AgentRunner {\n const context = useContext(AgentContext);\n\n if (!context) {\n throw new Error(\"useAgentContext must be used within AgentContextProvider\");\n }\n\n const { initializeAgent, getRunner, listenersRef } = context as AgentContextValue & {\n listenersRef: React.MutableRefObject<Map<string, Set<() => void>>>;\n };\n\n useEffect(() => {\n initializeAgent(agentId, agentUrl, accessKey);\n }, [agentId, agentUrl, initializeAgent]);\n\n // Reactive subscription to runner updates\n const [runner, setRunner] = useState<AgentRunner | null>(() => getRunner(agentId));\n\n useEffect(() => {\n // Current runner state\n const currentRunner = getRunner(agentId);\n if (currentRunner !== runner) {\n setRunner(currentRunner);\n }\n\n // Subscribe to future updates\n const callback = () => {\n setRunner(getRunner(agentId));\n };\n\n if (!listenersRef.current.has(agentId)) {\n listenersRef.current.set(agentId, new Set());\n }\n listenersRef.current.get(agentId)?.add(callback);\n\n return () => {\n listenersRef.current.get(agentId)?.delete(callback);\n };\n }, [agentId, getRunner]);\n\n const placeholder = useMemo(\n () => ({\n messages: [],\n inProgress: false,\n sessionId: \"\",\n sessions: [],\n debugData: {},\n handleSend: async () => {},\n switchSession: () => {},\n deleteSession: () => {},\n addOptimisticMessage: () => {},\n abort: () => {},\n }),\n [],\n );\n\n return runner || placeholder;\n}\n\n// Hook to access the global state for use-agent\nexport function useAgentGlobalState() {\n const context = useContext(AgentContext);\n if (!context) {\n throw new Error(\"useAgentGlobalState must be used within AgentContextProvider\");\n }\n return {\n allSessions: context.allSessions,\n setAllSessions: context.setAllSessions,\n debugData: context.debugData,\n setDebugData: context.setDebugData,\n };\n}\n","import { useCallback, useRef, useState, useEffect } from \"react\";\nimport { EventSourceMessage, fetchEventSource } from \"@microsoft/fetch-event-source\";\n\nimport { DEFAULT_SESSION_NAME, TEMPORARY_SESSION_ID } from \"./constants\";\nimport { useSessionUtils } from \"./session-utils\";\nimport { createDebugHandlers } from \"./debug-handlers\";\nimport { useAgentGlobalState } from \"./agent-context\";\nimport type { Message, MessagePart, OutputStreamEventType, ClientToolDefinition } from \"./types\";\nimport { cleanSchema, tryParseJSON } from \"./utils/schema\";\nimport { updateAgentMessageParts } from \"./utils/message\";\n\nexport default function useAgent(agentId: string, agentUrl: string, accessKey?: string) {\n // Use global state from Context instead of Jotai atoms\n const { allSessions, setAllSessions, debugData, setDebugData } = useAgentGlobalState();\n\n const [inProgress, setInProgress] = useState(false);\n const [messages, setMessages] = useState<Array<Message>>([]);\n\n const messagesRef = useRef<Array<Message>>([]);\n\n // Initialize currentSessionId later after sessionUtils is available\n const [currentSessionId, setCurrentSessionId] = useState<string>(TEMPORARY_SESSION_ID);\n\n const sessionUtils = useSessionUtils(\n agentId,\n allSessions,\n setAllSessions,\n currentSessionId,\n setCurrentSessionId,\n messagesRef,\n );\n\n // Set initial session ID after sessionUtils is available\n useEffect(() => {\n const initialSessionId = sessionUtils.getInitialSessionId();\n setCurrentSessionId(initialSessionId);\n }, []);\n\n const debugHandlers = createDebugHandlers(setDebugData);\n\n // Keep messagesRef in sync with messages state\n useEffect(() => {\n messagesRef.current = messages;\n }, [messages]);\n\n // Initialize or load session\n useEffect(() => {\n // Don't reset messages if we're currently in progress (streaming)\n if (inProgress) {\n return;\n }\n\n const session = sessionUtils.agentSessions[currentSessionId];\n\n if (session) {\n setMessages(session.messages);\n } else {\n setMessages([]);\n }\n }, [currentSessionId, sessionUtils.agentSessions, agentId, inProgress]);\n\n // Only sync on unmount to prevent data loss\n useEffect(() => {\n return () => {\n if (messagesRef.current.length > 0 && sessionUtils.syncSessionRef.current) {\n sessionUtils.syncSessionRef.current();\n }\n };\n }, []);\n\n const controller = useRef<AbortController>();\n\n const runAgent = useCallback(\n async (\n input: string,\n options?: {\n context?: object;\n testBuildId?: string;\n additionalHeaders?: Record<string, string>;\n tools?: ClientToolDefinition[];\n clientTools?: ClientToolDefinition[];\n },\n ) => {\n setInProgress(true);\n // Abort any existing request before creating a new controller\n if (controller.current) {\n controller.current.abort();\n }\n controller.current = new AbortController();\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n ...(accessKey ? { Authorization: `Bearer ${accessKey}` } : {}),\n ...(options?.additionalHeaders || {}),\n };\n\n // Include session ID in headers if we have one\n if (currentSessionId) {\n headers[\"x-buildship-agent-session-id\"] = currentSessionId;\n }\n\n const body = {\n stream: true,\n input,\n context: options?.context || {},\n testBuildId: options?.testBuildId,\n tools: options?.tools?.map((t: { parameters: unknown }) => ({\n ...t,\n parameters: cleanSchema(t.parameters),\n })),\n clientTools: options?.clientTools?.map((t: { parameters: unknown }) => ({\n ...t,\n parameters: cleanSchema(t.parameters),\n })),\n };\n\n try {\n await fetchEventSource(agentUrl, {\n method: \"POST\",\n headers,\n signal: controller.current.signal,\n openWhenHidden: true,\n body: JSON.stringify(body),\n onopen: async (resp) => {\n // catch the 404 status\n if (resp.status >= 400) {\n console.log(`AI onopen error with status: ${resp.status}`);\n\n if (resp.status === 404) {\n // for resume operations with 404, throw a specific error for retry\n throw new Error(`Not Found (${resp.statusText})`);\n }\n\n throw new Error(`Error status ${resp.status}`);\n }\n\n // Extract session ID from response headers if we don't have one\n if (!currentSessionId || currentSessionId === TEMPORARY_SESSION_ID) {\n const sessionId = resp.headers.get(\"x-buildship-agent-session-id\");\n if (sessionId) {\n // Transfer current messages to the new session before switching\n const currentMessages = messagesRef.current;\n const sessionName =\n resp.headers.get(\"x-buildship-agent-session-name\") || DEFAULT_SESSION_NAME;\n\n sessionUtils.createSessionFromResponse(sessionId, sessionName, currentMessages);\n setCurrentSessionId(sessionId);\n }\n }\n\n // Extract execution ID from response headers and update the last user message\n const executionId = resp.headers.get(\"x-buildship-agent-execution-id\");\n if (executionId) {\n setMessages((prev) => {\n const lastMessage = prev[prev.length - 1];\n if (lastMessage?.role === \"user\") {\n const updatedMessage = {\n ...lastMessage,\n executionId: executionId,\n };\n const updatedMessages = [...prev.slice(0, -1), updatedMessage];\n\n // Sync updated user message\n if (sessionUtils.syncSessionRef.current) {\n sessionUtils.syncSessionRef.current(updatedMessages);\n }\n\n return updatedMessages;\n }\n return prev;\n });\n }\n },\n onmessage: (event: EventSourceMessage) => {\n try {\n const parsed = JSON.parse(event.data) as OutputStreamEventType;\n\n if (parsed.type === \"llm_text_delta\") {\n setMessages((prev) => {\n const lastMessage = prev[prev.length - 1];\n const sequence = parsed.meta.sequence;\n const newPart: MessagePart = {\n type: \"text\",\n text: parsed.data,\n firstSequence: sequence,\n lastSequence: sequence,\n };\n\n let updatedMessages: Message[];\n\n if (lastMessage?.role === \"agent\") {\n const updatedMessage: Message = {\n ...lastMessage,\n content: lastMessage.content + parsed.data, // content is still useful for simple displays\n parts: updateAgentMessageParts(lastMessage.parts || [], newPart),\n };\n updatedMessages = [...prev.slice(0, -1), updatedMessage];\n } else {\n const updatedMessage: Message = {\n role: \"agent\" as const,\n content: parsed.data,\n parts: [newPart],\n executionId: parsed.meta.executionId,\n };\n updatedMessages = [...prev, updatedMessage];\n }\n\n if (sessionUtils.syncSessionRef.current) {\n sessionUtils.syncSessionRef.current(updatedMessages);\n }\n\n return updatedMessages;\n });\n } else if (parsed.type === \"client_tool_call\") {\n setMessages((prev) => {\n const lastMessage = prev[prev.length - 1];\n const newPart: MessagePart = {\n type: \"widget\",\n toolName: parsed.data.toolName,\n callId: parsed.data.callId,\n inputs: tryParseJSON(parsed.data.inputs),\n sequence: parsed.meta.sequence,\n };\n\n let updatedMessages: Message[];\n\n if (lastMessage?.role === \"agent\") {\n const updatedMessage: Message = {\n ...lastMessage,\n parts: updateAgentMessageParts(lastMessage.parts || [], newPart),\n };\n updatedMessages = [...prev.slice(0, -1), updatedMessage];\n } else {\n const updatedMessage: Message = {\n role: \"agent\" as const,\n content: \"\",\n parts: [newPart],\n executionId: parsed.meta.executionId,\n };\n updatedMessages = [...prev, updatedMessage];\n }\n\n if (sessionUtils.syncSessionRef.current) {\n sessionUtils.syncSessionRef.current(updatedMessages);\n }\n\n return updatedMessages;\n });\n } else if (\n parsed.type.startsWith(\"debug_\") ||\n parsed.type === \"llm_reasoning_delta\" ||\n parsed.type === \"agent_handoff\" ||\n parsed.type === \"mcp_tool_call_start\" ||\n parsed.type === \"mcp_tool_call_end\"\n ) {\n debugHandlers.handleDebugEvent(parsed);\n }\n } catch (e) {\n console.log(\"Failed to parse agent message\", e);\n }\n },\n onclose: () => {\n console.log(\"Agent closed\");\n setInProgress(false);\n // Sync messages when streaming completes\n if (sessionUtils.syncSessionRef.current) {\n sessionUtils.syncSessionRef.current();\n }\n },\n onerror: (e) => {\n console.log(\"Agent error\", e);\n setInProgress(false);\n // Sync messages on error to prevent data loss\n if (sessionUtils.syncSessionRef.current) {\n sessionUtils.syncSessionRef.current(messagesRef.current);\n }\n throw new Error(\"Failed to execute agent\");\n },\n });\n } catch (error) {\n console.log(\"Agent execution failed\", error);\n setInProgress(false);\n // Sync messages on execution failure\n if (sessionUtils.syncSessionRef.current) {\n sessionUtils.syncSessionRef.current(messagesRef.current);\n }\n throw error;\n }\n },\n [agentUrl, accessKey, currentSessionId, sessionUtils, debugHandlers],\n );\n\n const handleSend = useCallback(\n async (\n input: string,\n options?: {\n context?: object;\n testBuildId?: string;\n skipUserMessage?: boolean;\n additionalHeaders?: Record<string, string>;\n tools?: ClientToolDefinition[];\n clientTools?: ClientToolDefinition[];\n },\n ) => {\n const userMessage = {\n role: \"user\" as const,\n content: input,\n executionId: Date.now().toString(),\n };\n\n // Only add user message if not skipping\n if (!options?.skipUserMessage) {\n setMessages((prev) => {\n const updatedMessages = [...prev, userMessage];\n // Sync immediately after user message\n if (sessionUtils.syncSessionRef.current) {\n sessionUtils.syncSessionRef.current(updatedMessages);\n }\n return updatedMessages;\n });\n }\n\n try {\n await runAgent(input, options);\n } catch (error) {\n // Ensure user message is preserved even if agent execution fails\n if (!options?.skipUserMessage) {\n setMessages((prev) => {\n const updatedMessages = prev.some((m) => m === userMessage)\n ? prev\n : [...prev, userMessage];\n if (sessionUtils.syncSessionRef.current) {\n sessionUtils.syncSessionRef.current(updatedMessages);\n }\n return updatedMessages;\n });\n }\n throw error;\n }\n },\n [runAgent, sessionUtils.syncSessionRef],\n );\n\n const addOptimisticMessage = useCallback(\n (input: string) => {\n const userMessage = {\n role: \"user\" as const,\n content: input,\n executionId: Date.now().toString(),\n };\n\n setMessages((prev) => {\n const updatedMessages = [...prev, userMessage];\n // Sync immediately after user message\n if (sessionUtils.syncSessionRef.current) {\n sessionUtils.syncSessionRef.current(updatedMessages);\n }\n return updatedMessages;\n });\n },\n [sessionUtils.syncSessionRef],\n );\n\n const abort = useCallback(() => {\n if (controller.current) {\n controller.current.abort();\n }\n setInProgress(false);\n // Sync messages to prevent data loss\n if (sessionUtils.syncSessionRef.current) {\n sessionUtils.syncSessionRef.current(messagesRef.current);\n }\n }, [sessionUtils.syncSessionRef]);\n\n return {\n inProgress,\n messages,\n handleSend,\n addOptimisticMessage,\n abort,\n sessionId: currentSessionId,\n switchSession: sessionUtils.switchSession,\n deleteSession: sessionUtils.deleteSession,\n sessions: sessionUtils.sessionsList,\n debugData,\n };\n}\n","export const AGENT_SESSIONS_KEY = \"buildship:agent:conversations\";\nexport const AGENT_DEBUG_DATA_KEY = \"buildship:agent:debug\";\n\nexport const DEFAULT_SESSION_NAME = \"New Chat\";\nexport const TEMPORARY_SESSION_ID = \"sess_temp\";\n","import { useCallback, useMemo, useRef } from \"react\";\nimport type { Message, Session } from \"./types\";\nimport { TEMPORARY_SESSION_ID } from \"./constants\";\n\nexport const useSessionUtils = (\n agentId: string,\n allSessions: Record<string, Record<string, Session>>,\n setAllSessions: (\n value:\n | Record<string, Record<string, Session>>\n | ((\n prev: Record<string, Record<string, Session>>,\n ) => Record<string, Record<string, Session>>),\n ) => void,\n currentSessionId: string,\n setCurrentSessionId: (sessionId: string) => void,\n messagesRef: React.MutableRefObject<Array<Message>>,\n) => {\n const agentSessions = useMemo(() => allSessions[agentId] || {}, [agentId, allSessions]);\n\n const syncSessionRef = useRef<(messages?: Array<Message>) => void>();\n\n syncSessionRef.current = (updatedMessages?: Array<Message>) => {\n if (!currentSessionId || currentSessionId === TEMPORARY_SESSION_ID) {\n return;\n }\n\n setAllSessions((prev) => ({\n ...prev,\n [agentId]: {\n ...prev[agentId],\n [currentSessionId]: {\n ...prev[agentId]?.[currentSessionId],\n messages: updatedMessages ?? messagesRef.current,\n updatedAt: Date.now(),\n },\n },\n }));\n };\n\n const getInitialSessionId = () => {\n const sessions = Object.values(agentSessions);\n if (sessions.length > 0) {\n return sessions.sort((a, b) => b.updatedAt - a.updatedAt)[0].id;\n }\n return TEMPORARY_SESSION_ID;\n };\n\n const switchSession = useCallback(\n (sessionId: string = TEMPORARY_SESSION_ID) => {\n setCurrentSessionId(sessionId);\n },\n [setCurrentSessionId],\n );\n\n const deleteSession = useCallback(\n (sessionId: string) => {\n if (!sessionId || sessionId === TEMPORARY_SESSION_ID) {\n return;\n }\n\n setAllSessions((prev) => {\n const updatedAgentSessions = { ...prev[agentId] };\n delete updatedAgentSessions[sessionId];\n\n return {\n ...prev,\n [agentId]: updatedAgentSessions,\n };\n });\n\n if (sessionId === currentSessionId) {\n const remainingSessions = Object.values(agentSessions).filter((s) => s.id !== sessionId);\n if (remainingSessions.length > 0) {\n const mostRecent = remainingSessions.sort((a, b) => b.updatedAt - a.updatedAt)[0];\n setCurrentSessionId(mostRecent.id);\n } else {\n setCurrentSessionId(TEMPORARY_SESSION_ID);\n }\n }\n },\n [agentId, currentSessionId, agentSessions, setAllSessions, setCurrentSessionId],\n );\n\n const sessionsList = useMemo(\n () => Object.values(agentSessions).sort((a, b) => b.updatedAt - a.updatedAt),\n [agentSessions],\n );\n\n const createSessionFromResponse = (\n sessionId: string,\n sessionName: string,\n currentMessages: Array<Message>,\n ) => {\n setAllSessions((prev) => ({\n ...prev,\n [agentId]: {\n ...prev[agentId],\n [sessionId]: {\n id: sessionId,\n createdAt: Date.now(),\n updatedAt: Date.now(),\n messages: currentMessages,\n name: sessionName,\n },\n },\n }));\n };\n\n return {\n agentSessions,\n syncSessionRef,\n getInitialSessionId,\n switchSession,\n deleteSession,\n sessionsList,\n createSessionFromResponse,\n };\n};\n","import type {\n AgentDebugEventType,\n AgentHandoffEventType,\n DebugDataType,\n LLMReasoningDeltaEventType,\n ReasoningItem,\n ToolExecutionItem,\n HandoffItem,\n MCPToolCallStartEventType,\n MCPToolCallEndEventType,\n MCPToolExecutionItem,\n} from \"./types\";\n\nexport const createDebugHandlers = (\n setDebugData: (\n value:\n | Record<string, DebugDataType>\n | ((prev: Record<string, DebugDataType>) => Record<string, DebugDataType>),\n ) => void,\n) => {\n const handleDebugToolExecutionStarted = (parsed: AgentDebugEventType) => {\n const executionId = parsed.meta.executionId;\n setDebugData((prev) => ({\n ...prev,\n [executionId]: [\n ...(prev[executionId] || []),\n {\n itemType: \"tool_call\",\n toolId: (parsed.data as { toolId?: string }).toolId || \"unknown\",\n toolCallId: (parsed.data as { toolCallId?: string }).toolCallId,\n status: \"progress\",\n },\n ],\n }));\n };\n\n const handleDebugToolExecutionInputs = (parsed: AgentDebugEventType) => {\n const executionId = parsed.meta.executionId;\n const toolCallId = (parsed.data as { toolCallId?: string }).toolCallId;\n setDebugData((prev) => {\n const currentData = [...(prev[executionId] || [])];\n\n for (let i = currentData.length - 1; i >= 0; i--) {\n if (currentData[i].itemType === \"tool_call\") {\n const toolItem = currentData[i] as ToolExecutionItem;\n if (toolItem.toolCallId === toolCallId) {\n currentData[i] = {\n ...toolItem,\n inputs: (parsed.data as { value: unknown }).value,\n };\n break;\n }\n }\n }\n\n return {\n ...prev,\n [executionId]: currentData,\n };\n });\n };\n\n const handleDebugToolExecutionFinished = (parsed: AgentDebugEventType) => {\n const executionId = parsed.meta.executionId;\n const toolCallId = (parsed.data as { toolCallId?: string }).toolCallId;\n setDebugData((prev) => {\n const currentData = [...(prev[executionId] || [])];\n\n for (let i = currentData.length - 1; i >= 0; i--) {\n if (currentData[i].itemType === \"tool_call\") {\n const toolItem = currentData[i] as ToolExecutionItem;\n if (toolItem.toolCallId === toolCallId) {\n currentData[i] = {\n ...toolItem,\n status: \"complete\",\n output: (parsed.data as { value: unknown }).value,\n };\n break;\n }\n }\n }\n\n return {\n ...prev,\n [executionId]: currentData,\n };\n });\n };\n\n const handleDebugToolExecutionError = (parsed: AgentDebugEventType) => {\n const executionId = parsed.meta.executionId;\n const toolCallId = (parsed.data as { toolCallId?: string }).toolCallId;\n setDebugData((prev) => {\n const currentData = [...(prev[executionId] || [])];\n\n for (let i = currentData.length - 1; i >= 0; i--) {\n if (currentData[i].itemType === \"tool_call\") {\n const toolItem = currentData[i] as ToolExecutionItem;\n if (toolItem.toolCallId === toolCallId) {\n currentData[i] = {\n ...toolItem,\n status: \"error\",\n output: (parsed.data as { value: unknown }).value,\n };\n break;\n }\n }\n }\n\n return {\n ...prev,\n [executionId]: currentData,\n };\n });\n };\n\n const handleDebugToolLog = (parsed: AgentDebugEventType) => {\n const executionId = parsed.meta.executionId;\n const toolCallId = (parsed.data as { toolCallId?: string }).toolCallId;\n setDebugData((prev) => {\n const currentData = [...(prev[executionId] || [])];\n\n for (let i = currentData.length - 1; i >= 0; i--) {\n if (currentData[i].itemType === \"tool_call\") {\n const toolItem = currentData[i] as ToolExecutionItem;\n if (toolItem.toolCallId === toolCallId) {\n const currentLogs = toolItem.logs || [];\n currentData[i] = {\n ...toolItem,\n logs: [...currentLogs, (parsed.data as { value: unknown[] }).value[0]],\n };\n break;\n }\n }\n }\n\n return {\n ...prev,\n [executionId]: currentData,\n };\n });\n };\n\n let lastReasoningIndex = -1;\n const handleDebugReasoningStep = (parsed: LLMReasoningDeltaEventType) => {\n const executionId = parsed.meta.executionId;\n const { delta, index } = parsed.data;\n setDebugData((prev) => {\n const currentData = [...(prev[executionId] || [])];\n\n if (lastReasoningIndex < index) {\n currentData.push({ itemType: \"reasoning\", reasoning: \"\" });\n lastReasoningIndex = index;\n }\n\n for (let i = currentData.length - 1; i >= 0; i--) {\n if (currentData[i].itemType === \"reasoning\") {\n currentData[i] = {\n itemType: \"reasoning\",\n reasoning: (currentData[i] as ReasoningItem).reasoning + delta,\n };\n break;\n }\n }\n\n return {\n ...prev,\n [executionId]: currentData,\n };\n });\n };\n\n const handleAgentHandoff = (parsed: AgentHandoffEventType) => {\n const executionId = parsed.meta.executionId;\n setDebugData((prev) => ({\n ...prev,\n [executionId]: [\n ...(prev[executionId] || []),\n {\n itemType: \"handoff\",\n agentName: parsed.data.agentName,\n } as HandoffItem,\n ],\n }));\n };\n\n const handleMCPToolCallStart = (parsed: MCPToolCallStartEventType) => {\n const executionId = parsed.meta.executionId;\n setDebugData((prev) => ({\n ...prev,\n [executionId]: [\n ...(prev[executionId] || []),\n {\n itemType: \"mcp_tool_call\",\n toolName: parsed.data.toolName,\n serverName: parsed.data.serverName,\n callId: parsed.data.callId,\n status: \"progress\",\n inputs: parsed.data.inputs,\n } as MCPToolExecutionItem,\n ],\n }));\n };\n\n const handleMCPToolCallEnd = (parsed: MCPToolCallEndEventType) => {\n const executionId = parsed.meta.executionId;\n const callId = parsed.data.callId;\n setDebugData((prev) => {\n const currentData = [...(prev[executionId] || [])];\n\n for (let i = currentData.length - 1; i >= 0; i--) {\n if (currentData[i].itemType === \"mcp_tool_call\") {\n const mcpToolItem = currentData[i] as MCPToolExecutionItem;\n if (mcpToolItem.callId === callId) {\n currentData[i] = {\n ...mcpToolItem,\n status: parsed.data.error ? \"error\" : \"complete\",\n output: parsed.data.result,\n error: parsed.data.error,\n };\n break;\n }\n }\n }\n\n return {\n ...prev,\n [executionId]: currentData,\n };\n });\n };\n\n const handleDebugEvent = (\n parsed:\n | AgentDebugEventType\n | LLMReasoningDeltaEventType\n | AgentHandoffEventType\n | MCPToolCallStartEventType\n | MCPToolCallEndEventType,\n ) => {\n switch (parsed.type) {\n case \"debug_tool_execution_started\":\n handleDebugToolExecutionStarted(parsed);\n break;\n case \"debug_tool_execution_inputs\":\n handleDebugToolExecutionInputs(parsed);\n break;\n case \"debug_tool_execution_finished\":\n handleDebugToolExecutionFinished(parsed);\n break;\n case \"debug_tool_execution_error\":\n handleDebugToolExecutionError(parsed);\n break;\n case \"debug_tool_log\":\n handleDebugToolLog(parsed);\n break;\n case \"llm_reasoning_delta\":\n handleDebugReasoningStep(parsed);\n break;\n case \"agent_handoff\":\n handleAgentHandoff(parsed);\n break;\n case \"mcp_tool_call_start\":\n handleMCPToolCallStart(parsed);\n break;\n case \"mcp_tool_call_end\":\n handleMCPToolCallEnd(parsed);\n break;\n }\n };\n\n return {\n handleDebugEvent,\n };\n};\n","/**\n * Helper to clean JSON Schema for LLM compatibility.\n * Replaces modern Draft 2020-12 features with older, more compatible alternatives.\n * Specifically handles OpenAI's 'Strict Mode' requirements.\n */\nexport function cleanSchema(obj: unknown): unknown {\n if (Array.isArray(obj)) {\n return obj.map(cleanSchema);\n } else if (obj !== null && typeof obj === \"object\") {\n const newObj: Record<string, unknown> = {};\n const currentObj = obj as Record<string, any>;\n\n for (const key in currentObj) {\n // Remove keys that are not supported by most LLMs\n if (key === \"propertyNames\" || key === \"$schema\") {\n continue;\n }\n newObj[key] = cleanSchema(currentObj[key]);\n }\n\n // OpenAI and some other LLMs require additionalProperties: false for all objects in strict mode\n // AND every property must be explicitly listed in the 'required' array\n if (newObj.type === \"object\") {\n if (\n newObj.additionalProperties === undefined ||\n (newObj.additionalProperties &&\n typeof newObj.additionalProperties === \"object\" &&\n Object.keys(newObj.additionalProperties).length === 0)\n ) {\n newObj.additionalProperties = false;\n }\n\n if (newObj.additionalProperties === false && newObj.properties) {\n newObj.required = Object.keys(newObj.properties as object);\n }\n }\n\n return newObj;\n }\n return obj;\n}\n\n/**\n * Safely attempts to parse a value as JSON if it's a string.\n */\nexport function tryParseJSON(value: unknown): any {\n if (typeof value === \"string\") {\n try {\n return JSON.parse(value);\n } catch {\n return value;\n }\n }\n return value;\n}\n","import type { MessagePart } from \"../types\";\n\n/**\n * Updates a list of message parts with a new part,\n * ensuring chronological order by sequence and merging contiguous text deltas.\n */\nexport function updateAgentMessageParts(parts: MessagePart[], newPart: MessagePart): MessagePart[] {\n // 1. Combine and sort all parts by their sequence ID\n const sorted = [...parts, newPart].sort((a, b) => {\n const aStart = a.type === \"text\" ? a.firstSequence : a.sequence;\n const bStart = b.type === \"text\" ? b.firstSequence : b.sequence;\n return aStart - bStart;\n });\n\n // 2. Reduce the sorted parts to merge contiguous text blocks\n return sorted.reduce<MessagePart[]>((acc, current) => {\n const last = acc[acc.length - 1];\n\n // Check if we can merge this text part with the previous one\n const canMerge =\n last?.type === \"text\" &&\n current.type === \"text\" &&\n current.firstSequence === last.lastSequence + 1;\n\n if (canMerge) {\n acc[acc.length - 1] = {\n ...last,\n text: last.text + current.text,\n lastSequence: current.lastSequence,\n };\n return acc;\n }\n\n acc.push(current);\n return acc;\n }, []);\n}\n","import { useState, useEffect, useCallback } from \"react\";\n\n// Helper to handle JSON parsing cleanly\nfunction parseJSON<T>(value: string | null, defaultValue: T): T {\n if (value === null) return defaultValue;\n try {\n return JSON.parse(value);\n } catch {\n return defaultValue;\n }\n}\n\nexport function useSyncedLocalStorage<T>(\n key: string,\n initialValue: T,\n): [T, (value: T | ((val: T) => T)) => void] {\n // Initialize state function to avoid reading localStorage on every render\n const [storedValue, setStoredValue] = useState<T>(() => {\n if (typeof window === \"undefined\") {\n return initialValue;\n }\n try {\n const item = window.localStorage.getItem(key);\n return parseJSON(item, initialValue);\n } catch (error) {\n console.warn(`Error reading localStorage key \"${key}\":`, error);\n return initialValue;\n }\n });\n\n // Function to update state and localStorage\n const setValue = useCallback(\n (value: T | ((val: T) => T)) => {\n try {\n setStoredValue((prev) => {\n const valueToStore = value instanceof Function ? value(prev) : value;\n\n if (typeof window !== \"undefined\") {\n window.localStorage.setItem(key, JSON.stringify(valueToStore));\n // Dispatch a custom event so other hooks in the same window update\n window.dispatchEvent(\n new StorageEvent(\"storage\", { key, newValue: JSON.stringify(valueToStore) }),\n );\n }\n return valueToStore;\n });\n } catch (error) {\n console.warn(`Error setting localStorage key \"${key}\":`, error);\n }\n },\n [key],\n );\n\n // Sync across tabs/windows and within the same window\n useEffect(() => {\n const handleStorageChange = (event: StorageEvent) => {\n if (event.key === key) {\n setStoredValue(parseJSON(event.newValue, initialValue));\n }\n };\n\n window.addEventListener(\"storage\", handleStorageChange);\n return () => window.removeEventListener(\"storage\", handleStorageChange);\n }, [key, initialValue]);\n\n return [storedValue, setValue];\n}\n"],"mappings":"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","names":["useCallback","useRef","useState","useEffect","useMemo","useCallback","useRef","useRef","useCallback","useState","useEffect","useCallback","useRef","useState","useCallback","useMemo","useEffect"]}
1
+ {"version":3,"sources":["../src/agent-context.tsx","../src/use-agent.ts","../src/constants.ts","../src/session-utils.ts","../src/debug-handlers.ts","../src/utils/schema.ts","../src/utils/message.ts","../src/utils/use-synced-local-storage.ts"],"sourcesContent":["import {\n createContext,\n useContext,\n useCallback,\n useRef,\n useState,\n useEffect,\n useMemo,\n ReactNode,\n} from \"react\";\nimport useAgent from \"./use-agent\";\nimport type { Message, Session, DebugDataType, ClientToolDefinition } from \"./types\";\nimport { useSyncedLocalStorage } from \"./utils/use-synced-local-storage\";\nimport { AGENT_SESSIONS_KEY, AGENT_DEBUG_DATA_KEY } from \"./constants\";\n\nexport interface AgentRunner {\n messages: Message[];\n inProgress: boolean;\n sessionId: string;\n sessions: Session[];\n debugData: Record<string, DebugDataType>;\n handleSend: (\n input: string,\n options?: {\n context?: Record<string, unknown>;\n testBuildId?: string;\n skipUserMessage?: boolean;\n additionalHeaders?: Record<string, string>;\n tools?: ClientToolDefinition[];\n clientTools?: ClientToolDefinition[];\n },\n ) => Promise<void>;\n switchSession: (sessionId?: string) => void;\n deleteSession: (sessionId: string) => void;\n addOptimisticMessage: (input: string) => void;\n abort: () => void;\n}\n\ninterface AgentContextValue {\n initializeAgent: (agentId: string, agentUrl: string, accessKey: string) => void;\n registerRunner: (agentId: string, runner: AgentRunner) => void;\n getRunner: (agentId: string) => AgentRunner | null;\n // Global state provided to useAgent hooks\n allSessions: Record<string, Record<string, Session>>;\n setAllSessions: (\n value:\n | Record<string, Record<string, Session>>\n | ((\n prev: Record<string, Record<string, Session>>,\n ) => Record<string, Record<string, Session>>),\n ) => void;\n debugData: Record<string, DebugDataType>;\n setDebugData: (\n value:\n | Record<string, DebugDataType>\n | ((prev: Record<string, DebugDataType>) => Record<string, DebugDataType>),\n ) => void;\n}\n\nconst AgentContext = createContext<AgentContextValue | null>(null);\n\nexport function AgentContextProvider({ children }: { children: ReactNode }) {\n const activeAgentsRef = useRef<Map<string, { agentUrl: string; accessKey: string }>>(new Map());\n // Store runners in a ref since we push updates via registerRunner\n // Note: Changes to this Ref won't trigger re-renders of consumers of getRunner directly,\n // but since we return the 'runner' object which contains state,\n // and we access it via a hook that listens to updates (implemented below), it works out.\n // Actually, to make 'useAgentContext' reactive to runner changes, we need a subscription mechanism.\n const runnersRef = useRef<Map<string, AgentRunner>>(new Map());\n const listenersRef = useRef<Map<string, Set<() => void>>>(new Map());\n\n const [, forceUpdate] = useState({});\n\n // Global Sync State managed here to be shared\n const [allSessions, setAllSessions] = useSyncedLocalStorage<\n Record<string, Record<string, Session>>\n >(AGENT_SESSIONS_KEY, {});\n\n const [debugData, setDebugData] = useSyncedLocalStorage<Record<string, DebugDataType>>(\n AGENT_DEBUG_DATA_KEY,\n {},\n );\n\n const initializeAgent = useCallback((agentId: string, agentUrl: string, accessKey: string) => {\n console.log(\"[AgentContext] initializeAgent called:\", { agentId, agentUrl, accessKey });\n const existing = activeAgentsRef.current.get(agentId);\n\n if (!existing) {\n activeAgentsRef.current.set(agentId, { agentUrl, accessKey });\n console.log(\"[AgentContext] New agent registered:\", { agentId, agentUrl, accessKey });\n forceUpdate({});\n } else if (existing.agentUrl !== agentUrl || existing.accessKey !== accessKey) {\n activeAgentsRef.current.set(agentId, { agentUrl, accessKey });\n console.log(\"[AgentContext] Agent updated:\", { agentId, agentUrl, accessKey });\n forceUpdate({});\n }\n }, []);\n\n const registerRunner = useCallback((agentId: string, runner: AgentRunner) => {\n runnersRef.current.set(agentId, runner);\n // Notify listeners for this agentId\n const listeners = listenersRef.current.get(agentId);\n if (listeners) {\n listeners.forEach((callback) => callback());\n }\n }, []);\n\n const getRunner = useCallback((agentId: string) => {\n return runnersRef.current.get(agentId) || null;\n }, []);\n\n const contextValue = useMemo(\n () => ({\n initializeAgent,\n registerRunner,\n getRunner,\n allSessions,\n setAllSessions,\n debugData,\n setDebugData,\n runnersRef,\n listenersRef,\n }),\n [\n initializeAgent,\n registerRunner,\n getRunner,\n allSessions,\n setAllSessions,\n debugData,\n setDebugData,\n ],\n );\n\n return (\n <AgentContext.Provider value={contextValue}>\n {children}\n {Array.from(activeAgentsRef.current.entries()).map(([agentId, { agentUrl, accessKey }]) => (\n <AgentRunnerInstance\n key={agentId}\n agentId={agentId}\n agentUrl={agentUrl}\n accessKey={accessKey}\n />\n ))}\n </AgentContext.Provider>\n );\n}\n\nfunction AgentRunnerInstance({\n agentId,\n agentUrl,\n accessKey,\n}: {\n agentId: string;\n agentUrl: string;\n accessKey: string;\n}) {\n const agent = useAgent(agentId, agentUrl, accessKey);\n const context = useContext(AgentContext);\n\n if (!context) return null;\n\n useEffect(() => {\n context.registerRunner(agentId, agent);\n }, [agentId, agent, context]);\n\n return null;\n}\n\nexport function useAgentContext(agentId: string, agentUrl: string, accessKey: string): AgentRunner {\n const context = useContext(AgentContext);\n\n if (!context) {\n throw new Error(\"useAgentContext must be used within AgentContextProvider\");\n }\n\n const { initializeAgent, getRunner, listenersRef } = context as AgentContextValue & {\n listenersRef: React.MutableRefObject<Map<string, Set<() => void>>>;\n };\n\n useEffect(() => {\n initializeAgent(agentId, agentUrl, accessKey);\n }, [agentId, agentUrl, initializeAgent]);\n\n // Reactive subscription to runner updates\n const [runner, setRunner] = useState<AgentRunner | null>(() => getRunner(agentId));\n\n useEffect(() => {\n // Current runner state\n const currentRunner = getRunner(agentId);\n if (currentRunner !== runner) {\n setRunner(currentRunner);\n }\n\n // Subscribe to future updates\n const callback = () => {\n setRunner(getRunner(agentId));\n };\n\n if (!listenersRef.current.has(agentId)) {\n listenersRef.current.set(agentId, new Set());\n }\n listenersRef.current.get(agentId)?.add(callback);\n\n return () => {\n listenersRef.current.get(agentId)?.delete(callback);\n };\n }, [agentId, getRunner]);\n\n const placeholder = useMemo(\n () => ({\n messages: [],\n inProgress: false,\n sessionId: \"\",\n sessions: [],\n debugData: {},\n handleSend: async () => {},\n switchSession: () => {},\n deleteSession: () => {},\n addOptimisticMessage: () => {},\n abort: () => {},\n }),\n [],\n );\n\n return runner || placeholder;\n}\n\n// Hook to access the global state for use-agent\nexport function useAgentGlobalState() {\n const context = useContext(AgentContext);\n if (!context) {\n throw new Error(\"useAgentGlobalState must be used within AgentContextProvider\");\n }\n return {\n allSessions: context.allSessions,\n setAllSessions: context.setAllSessions,\n debugData: context.debugData,\n setDebugData: context.setDebugData,\n };\n}\n","import { useCallback, useRef, useState, useEffect } from \"react\";\nimport { EventSourceMessage, fetchEventSource } from \"@microsoft/fetch-event-source\";\n\nimport { DEFAULT_SESSION_NAME, TEMPORARY_SESSION_ID } from \"./constants\";\nimport { useSessionUtils } from \"./session-utils\";\nimport { createDebugHandlers } from \"./debug-handlers\";\nimport { useAgentGlobalState } from \"./agent-context\";\nimport type { Message, MessagePart, OutputStreamEventType, ClientToolDefinition } from \"./types\";\nimport { cleanSchema, tryParseJSON } from \"./utils/schema\";\nimport { updateAgentMessageParts } from \"./utils/message\";\n\nexport default function useAgent(agentId: string, agentUrl: string, accessKey: string) {\n console.log(\"[useAgent] Hook called with:\", { agentId, agentUrl, accessKey });\n // Use global state from Context instead of Jotai atoms\n const { allSessions, setAllSessions, debugData, setDebugData } = useAgentGlobalState();\n\n const [inProgress, setInProgress] = useState(false);\n const [messages, setMessages] = useState<Array<Message>>([]);\n\n const messagesRef = useRef<Array<Message>>([]);\n\n // Initialize currentSessionId later after sessionUtils is available\n const [currentSessionId, setCurrentSessionId] = useState<string>(TEMPORARY_SESSION_ID);\n\n const sessionUtils = useSessionUtils(\n agentId,\n allSessions,\n setAllSessions,\n currentSessionId,\n setCurrentSessionId,\n messagesRef,\n );\n\n // Set initial session ID after sessionUtils is available\n useEffect(() => {\n const initialSessionId = sessionUtils.getInitialSessionId();\n setCurrentSessionId(initialSessionId);\n }, []);\n\n const debugHandlers = createDebugHandlers(setDebugData);\n\n // Keep messagesRef in sync with messages state\n useEffect(() => {\n messagesRef.current = messages;\n }, [messages]);\n\n // Initialize or load session\n useEffect(() => {\n // Don't reset messages if we're currently in progress (streaming)\n if (inProgress) {\n return;\n }\n\n const session = sessionUtils.agentSessions[currentSessionId];\n\n if (session) {\n setMessages(session.messages);\n } else {\n setMessages([]);\n }\n }, [currentSessionId, sessionUtils.agentSessions, agentId, inProgress]);\n\n // Only sync on unmount to prevent data loss\n useEffect(() => {\n return () => {\n if (messagesRef.current.length > 0 && sessionUtils.syncSessionRef.current) {\n sessionUtils.syncSessionRef.current();\n }\n };\n }, []);\n\n const controller = useRef<AbortController>();\n\n const runAgent = useCallback(\n async (\n input: string,\n options?: {\n context?: object;\n testBuildId?: string;\n additionalHeaders?: Record<string, string>;\n tools?: ClientToolDefinition[];\n clientTools?: ClientToolDefinition[];\n },\n ) => {\n setInProgress(true);\n // Abort any existing request before creating a new controller\n if (controller.current) {\n controller.current.abort();\n }\n controller.current = new AbortController();\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n ...(options?.additionalHeaders || {}),\n ...(accessKey ? { Authorization: `Bearer ${accessKey}` } : {}),\n };\n console.log(\"[useAgent] Request headers:\", headers);\n\n // Include session ID in headers if we have one\n if (currentSessionId) {\n headers[\"x-buildship-agent-session-id\"] = currentSessionId;\n }\n\n const body = {\n stream: true,\n input,\n context: options?.context || {},\n testBuildId: options?.testBuildId,\n tools: options?.tools?.map((t: { parameters: unknown }) => ({\n ...t,\n parameters: cleanSchema(t.parameters),\n })),\n clientTools: options?.clientTools?.map((t: { parameters: unknown }) => ({\n ...t,\n parameters: cleanSchema(t.parameters),\n })),\n };\n\n try {\n await fetchEventSource(agentUrl, {\n method: \"POST\",\n headers,\n signal: controller.current.signal,\n openWhenHidden: true,\n body: JSON.stringify(body),\n onopen: async (resp) => {\n // catch the 404 status\n if (resp.status >= 400) {\n console.log(`AI onopen error with status: ${resp.status}`);\n\n if (resp.status === 404) {\n // for resume operations with 404, throw a specific error for retry\n throw new Error(`Not Found (${resp.statusText})`);\n }\n\n throw new Error(`Error status ${resp.status}`);\n }\n\n // Extract session ID from response headers if we don't have one\n if (!currentSessionId || currentSessionId === TEMPORARY_SESSION_ID) {\n const sessionId = resp.headers.get(\"x-buildship-agent-session-id\");\n if (sessionId) {\n // Transfer current messages to the new session before switching\n const currentMessages = messagesRef.current;\n const sessionName =\n resp.headers.get(\"x-buildship-agent-session-name\") || DEFAULT_SESSION_NAME;\n\n sessionUtils.createSessionFromResponse(sessionId, sessionName, currentMessages);\n setCurrentSessionId(sessionId);\n }\n }\n\n // Extract execution ID from response headers and update the last user message\n const executionId = resp.headers.get(\"x-buildship-agent-execution-id\");\n if (executionId) {\n setMessages((prev) => {\n const lastMessage = prev[prev.length - 1];\n if (lastMessage?.role === \"user\") {\n const updatedMessage = {\n ...lastMessage,\n executionId: executionId,\n };\n const updatedMessages = [...prev.slice(0, -1), updatedMessage];\n\n // Sync updated user message\n if (sessionUtils.syncSessionRef.current) {\n sessionUtils.syncSessionRef.current(updatedMessages);\n }\n\n return updatedMessages;\n }\n return prev;\n });\n }\n },\n onmessage: (event: EventSourceMessage) => {\n try {\n const parsed = JSON.parse(event.data) as OutputStreamEventType;\n\n if (parsed.type === \"llm_text_delta\") {\n setMessages((prev) => {\n const lastMessage = prev[prev.length - 1];\n const sequence = parsed.meta.sequence;\n const newPart: MessagePart = {\n type: \"text\",\n text: parsed.data,\n firstSequence: sequence,\n lastSequence: sequence,\n };\n\n let updatedMessages: Message[];\n\n if (lastMessage?.role === \"agent\") {\n const updatedMessage: Message = {\n ...lastMessage,\n content: lastMessage.content + parsed.data, // content is still useful for simple displays\n parts: updateAgentMessageParts(lastMessage.parts || [], newPart),\n };\n updatedMessages = [...prev.slice(0, -1), updatedMessage];\n } else {\n const updatedMessage: Message = {\n role: \"agent\" as const,\n content: parsed.data,\n parts: [newPart],\n executionId: parsed.meta.executionId,\n };\n updatedMessages = [...prev, updatedMessage];\n }\n\n if (sessionUtils.syncSessionRef.current) {\n sessionUtils.syncSessionRef.current(updatedMessages);\n }\n\n return updatedMessages;\n });\n } else if (parsed.type === \"client_tool_call\") {\n setMessages((prev) => {\n const lastMessage = prev[prev.length - 1];\n const newPart: MessagePart = {\n type: \"widget\",\n toolName: parsed.data.toolName,\n callId: parsed.data.callId,\n inputs: tryParseJSON(parsed.data.inputs),\n sequence: parsed.meta.sequence,\n };\n\n let updatedMessages: Message[];\n\n if (lastMessage?.role === \"agent\") {\n const updatedMessage: Message = {\n ...lastMessage,\n parts: updateAgentMessageParts(lastMessage.parts || [], newPart),\n };\n updatedMessages = [...prev.slice(0, -1), updatedMessage];\n } else {\n const updatedMessage: Message = {\n role: \"agent\" as const,\n content: \"\",\n parts: [newPart],\n executionId: parsed.meta.executionId,\n };\n updatedMessages = [...prev, updatedMessage];\n }\n\n if (sessionUtils.syncSessionRef.current) {\n sessionUtils.syncSessionRef.current(updatedMessages);\n }\n\n return updatedMessages;\n });\n } else if (\n parsed.type.startsWith(\"debug_\") ||\n parsed.type === \"llm_reasoning_delta\" ||\n parsed.type === \"agent_handoff\" ||\n parsed.type === \"mcp_tool_call_start\" ||\n parsed.type === \"mcp_tool_call_end\"\n ) {\n debugHandlers.handleDebugEvent(parsed);\n }\n } catch (e) {\n console.log(\"Failed to parse agent message\", e);\n }\n },\n onclose: () => {\n console.log(\"Agent closed\");\n setInProgress(false);\n // Sync messages when streaming completes\n if (sessionUtils.syncSessionRef.current) {\n sessionUtils.syncSessionRef.current();\n }\n },\n onerror: (e) => {\n console.log(\"Agent error\", e);\n setInProgress(false);\n // Sync messages on error to prevent data loss\n if (sessionUtils.syncSessionRef.current) {\n sessionUtils.syncSessionRef.current(messagesRef.current);\n }\n throw new Error(\"Failed to execute agent\");\n },\n });\n } catch (error) {\n console.log(\"Agent execution failed\", error);\n setInProgress(false);\n // Sync messages on execution failure\n if (sessionUtils.syncSessionRef.current) {\n sessionUtils.syncSessionRef.current(messagesRef.current);\n }\n throw error;\n }\n },\n [agentUrl, accessKey, currentSessionId, sessionUtils, debugHandlers],\n );\n\n const handleSend = useCallback(\n async (\n input: string,\n options?: {\n context?: object;\n testBuildId?: string;\n skipUserMessage?: boolean;\n additionalHeaders?: Record<string, string>;\n tools?: ClientToolDefinition[];\n clientTools?: ClientToolDefinition[];\n },\n ) => {\n const userMessage = {\n role: \"user\" as const,\n content: input,\n executionId: Date.now().toString(),\n };\n\n // Only add user message if not skipping\n if (!options?.skipUserMessage) {\n setMessages((prev) => {\n const updatedMessages = [...prev, userMessage];\n // Sync immediately after user message\n if (sessionUtils.syncSessionRef.current) {\n sessionUtils.syncSessionRef.current(updatedMessages);\n }\n return updatedMessages;\n });\n }\n\n try {\n await runAgent(input, options);\n } catch (error) {\n // Ensure user message is preserved even if agent execution fails\n if (!options?.skipUserMessage) {\n setMessages((prev) => {\n const updatedMessages = prev.some((m) => m === userMessage)\n ? prev\n : [...prev, userMessage];\n if (sessionUtils.syncSessionRef.current) {\n sessionUtils.syncSessionRef.current(updatedMessages);\n }\n return updatedMessages;\n });\n }\n throw error;\n }\n },\n [runAgent, sessionUtils.syncSessionRef],\n );\n\n const addOptimisticMessage = useCallback(\n (input: string) => {\n const userMessage = {\n role: \"user\" as const,\n content: input,\n executionId: Date.now().toString(),\n };\n\n setMessages((prev) => {\n const updatedMessages = [...prev, userMessage];\n // Sync immediately after user message\n if (sessionUtils.syncSessionRef.current) {\n sessionUtils.syncSessionRef.current(updatedMessages);\n }\n return updatedMessages;\n });\n },\n [sessionUtils.syncSessionRef],\n );\n\n const abort = useCallback(() => {\n if (controller.current) {\n controller.current.abort();\n }\n setInProgress(false);\n // Sync messages to prevent data loss\n if (sessionUtils.syncSessionRef.current) {\n sessionUtils.syncSessionRef.current(messagesRef.current);\n }\n }, [sessionUtils.syncSessionRef]);\n\n return {\n inProgress,\n messages,\n handleSend,\n addOptimisticMessage,\n abort,\n sessionId: currentSessionId,\n switchSession: sessionUtils.switchSession,\n deleteSession: sessionUtils.deleteSession,\n sessions: sessionUtils.sessionsList,\n debugData,\n };\n}\n","export const AGENT_SESSIONS_KEY = \"buildship:agent:conversations\";\nexport const AGENT_DEBUG_DATA_KEY = \"buildship:agent:debug\";\n\nexport const DEFAULT_SESSION_NAME = \"New Chat\";\nexport const TEMPORARY_SESSION_ID = \"sess_temp\";\n","import { useCallback, useMemo, useRef } from \"react\";\nimport type { Message, Session } from \"./types\";\nimport { TEMPORARY_SESSION_ID } from \"./constants\";\n\nexport const useSessionUtils = (\n agentId: string,\n allSessions: Record<string, Record<string, Session>>,\n setAllSessions: (\n value:\n | Record<string, Record<string, Session>>\n | ((\n prev: Record<string, Record<string, Session>>,\n ) => Record<string, Record<string, Session>>),\n ) => void,\n currentSessionId: string,\n setCurrentSessionId: (sessionId: string) => void,\n messagesRef: React.MutableRefObject<Array<Message>>,\n) => {\n const agentSessions = useMemo(() => allSessions[agentId] || {}, [agentId, allSessions]);\n\n const syncSessionRef = useRef<(messages?: Array<Message>) => void>();\n\n syncSessionRef.current = (updatedMessages?: Array<Message>) => {\n if (!currentSessionId || currentSessionId === TEMPORARY_SESSION_ID) {\n return;\n }\n\n setAllSessions((prev) => ({\n ...prev,\n [agentId]: {\n ...prev[agentId],\n [currentSessionId]: {\n ...prev[agentId]?.[currentSessionId],\n messages: updatedMessages ?? messagesRef.current,\n updatedAt: Date.now(),\n },\n },\n }));\n };\n\n const getInitialSessionId = () => {\n const sessions = Object.values(agentSessions);\n if (sessions.length > 0) {\n return sessions.sort((a, b) => b.updatedAt - a.updatedAt)[0].id;\n }\n return TEMPORARY_SESSION_ID;\n };\n\n const switchSession = useCallback(\n (sessionId: string = TEMPORARY_SESSION_ID) => {\n setCurrentSessionId(sessionId);\n },\n [setCurrentSessionId],\n );\n\n const deleteSession = useCallback(\n (sessionId: string) => {\n if (!sessionId || sessionId === TEMPORARY_SESSION_ID) {\n return;\n }\n\n setAllSessions((prev) => {\n const updatedAgentSessions = { ...prev[agentId] };\n delete updatedAgentSessions[sessionId];\n\n return {\n ...prev,\n [agentId]: updatedAgentSessions,\n };\n });\n\n if (sessionId === currentSessionId) {\n const remainingSessions = Object.values(agentSessions).filter((s) => s.id !== sessionId);\n if (remainingSessions.length > 0) {\n const mostRecent = remainingSessions.sort((a, b) => b.updatedAt - a.updatedAt)[0];\n setCurrentSessionId(mostRecent.id);\n } else {\n setCurrentSessionId(TEMPORARY_SESSION_ID);\n }\n }\n },\n [agentId, currentSessionId, agentSessions, setAllSessions, setCurrentSessionId],\n );\n\n const sessionsList = useMemo(\n () => Object.values(agentSessions).sort((a, b) => b.updatedAt - a.updatedAt),\n [agentSessions],\n );\n\n const createSessionFromResponse = (\n sessionId: string,\n sessionName: string,\n currentMessages: Array<Message>,\n ) => {\n setAllSessions((prev) => ({\n ...prev,\n [agentId]: {\n ...prev[agentId],\n [sessionId]: {\n id: sessionId,\n createdAt: Date.now(),\n updatedAt: Date.now(),\n messages: currentMessages,\n name: sessionName,\n },\n },\n }));\n };\n\n return {\n agentSessions,\n syncSessionRef,\n getInitialSessionId,\n switchSession,\n deleteSession,\n sessionsList,\n createSessionFromResponse,\n };\n};\n","import type {\n AgentDebugEventType,\n AgentHandoffEventType,\n DebugDataType,\n LLMReasoningDeltaEventType,\n ReasoningItem,\n ToolExecutionItem,\n HandoffItem,\n MCPToolCallStartEventType,\n MCPToolCallEndEventType,\n MCPToolExecutionItem,\n} from \"./types\";\n\nexport const createDebugHandlers = (\n setDebugData: (\n value:\n | Record<string, DebugDataType>\n | ((prev: Record<string, DebugDataType>) => Record<string, DebugDataType>),\n ) => void,\n) => {\n const handleDebugToolExecutionStarted = (parsed: AgentDebugEventType) => {\n const executionId = parsed.meta.executionId;\n setDebugData((prev) => ({\n ...prev,\n [executionId]: [\n ...(prev[executionId] || []),\n {\n itemType: \"tool_call\",\n toolId: (parsed.data as { toolId?: string }).toolId || \"unknown\",\n toolCallId: (parsed.data as { toolCallId?: string }).toolCallId,\n status: \"progress\",\n },\n ],\n }));\n };\n\n const handleDebugToolExecutionInputs = (parsed: AgentDebugEventType) => {\n const executionId = parsed.meta.executionId;\n const toolCallId = (parsed.data as { toolCallId?: string }).toolCallId;\n setDebugData((prev) => {\n const currentData = [...(prev[executionId] || [])];\n\n for (let i = currentData.length - 1; i >= 0; i--) {\n if (currentData[i].itemType === \"tool_call\") {\n const toolItem = currentData[i] as ToolExecutionItem;\n if (toolItem.toolCallId === toolCallId) {\n currentData[i] = {\n ...toolItem,\n inputs: (parsed.data as { value: unknown }).value,\n };\n break;\n }\n }\n }\n\n return {\n ...prev,\n [executionId]: currentData,\n };\n });\n };\n\n const handleDebugToolExecutionFinished = (parsed: AgentDebugEventType) => {\n const executionId = parsed.meta.executionId;\n const toolCallId = (parsed.data as { toolCallId?: string }).toolCallId;\n setDebugData((prev) => {\n const currentData = [...(prev[executionId] || [])];\n\n for (let i = currentData.length - 1; i >= 0; i--) {\n if (currentData[i].itemType === \"tool_call\") {\n const toolItem = currentData[i] as ToolExecutionItem;\n if (toolItem.toolCallId === toolCallId) {\n currentData[i] = {\n ...toolItem,\n status: \"complete\",\n output: (parsed.data as { value: unknown }).value,\n };\n break;\n }\n }\n }\n\n return {\n ...prev,\n [executionId]: currentData,\n };\n });\n };\n\n const handleDebugToolExecutionError = (parsed: AgentDebugEventType) => {\n const executionId = parsed.meta.executionId;\n const toolCallId = (parsed.data as { toolCallId?: string }).toolCallId;\n setDebugData((prev) => {\n const currentData = [...(prev[executionId] || [])];\n\n for (let i = currentData.length - 1; i >= 0; i--) {\n if (currentData[i].itemType === \"tool_call\") {\n const toolItem = currentData[i] as ToolExecutionItem;\n if (toolItem.toolCallId === toolCallId) {\n currentData[i] = {\n ...toolItem,\n status: \"error\",\n output: (parsed.data as { value: unknown }).value,\n };\n break;\n }\n }\n }\n\n return {\n ...prev,\n [executionId]: currentData,\n };\n });\n };\n\n const handleDebugToolLog = (parsed: AgentDebugEventType) => {\n const executionId = parsed.meta.executionId;\n const toolCallId = (parsed.data as { toolCallId?: string }).toolCallId;\n setDebugData((prev) => {\n const currentData = [...(prev[executionId] || [])];\n\n for (let i = currentData.length - 1; i >= 0; i--) {\n if (currentData[i].itemType === \"tool_call\") {\n const toolItem = currentData[i] as ToolExecutionItem;\n if (toolItem.toolCallId === toolCallId) {\n const currentLogs = toolItem.logs || [];\n currentData[i] = {\n ...toolItem,\n logs: [...currentLogs, (parsed.data as { value: unknown[] }).value[0]],\n };\n break;\n }\n }\n }\n\n return {\n ...prev,\n [executionId]: currentData,\n };\n });\n };\n\n let lastReasoningIndex = -1;\n const handleDebugReasoningStep = (parsed: LLMReasoningDeltaEventType) => {\n const executionId = parsed.meta.executionId;\n const { delta, index } = parsed.data;\n setDebugData((prev) => {\n const currentData = [...(prev[executionId] || [])];\n\n if (lastReasoningIndex < index) {\n currentData.push({ itemType: \"reasoning\", reasoning: \"\" });\n lastReasoningIndex = index;\n }\n\n for (let i = currentData.length - 1; i >= 0; i--) {\n if (currentData[i].itemType === \"reasoning\") {\n currentData[i] = {\n itemType: \"reasoning\",\n reasoning: (currentData[i] as ReasoningItem).reasoning + delta,\n };\n break;\n }\n }\n\n return {\n ...prev,\n [executionId]: currentData,\n };\n });\n };\n\n const handleAgentHandoff = (parsed: AgentHandoffEventType) => {\n const executionId = parsed.meta.executionId;\n setDebugData((prev) => ({\n ...prev,\n [executionId]: [\n ...(prev[executionId] || []),\n {\n itemType: \"handoff\",\n agentName: parsed.data.agentName,\n } as HandoffItem,\n ],\n }));\n };\n\n const handleMCPToolCallStart = (parsed: MCPToolCallStartEventType) => {\n const executionId = parsed.meta.executionId;\n setDebugData((prev) => ({\n ...prev,\n [executionId]: [\n ...(prev[executionId] || []),\n {\n itemType: \"mcp_tool_call\",\n toolName: parsed.data.toolName,\n serverName: parsed.data.serverName,\n callId: parsed.data.callId,\n status: \"progress\",\n inputs: parsed.data.inputs,\n } as MCPToolExecutionItem,\n ],\n }));\n };\n\n const handleMCPToolCallEnd = (parsed: MCPToolCallEndEventType) => {\n const executionId = parsed.meta.executionId;\n const callId = parsed.data.callId;\n setDebugData((prev) => {\n const currentData = [...(prev[executionId] || [])];\n\n for (let i = currentData.length - 1; i >= 0; i--) {\n if (currentData[i].itemType === \"mcp_tool_call\") {\n const mcpToolItem = currentData[i] as MCPToolExecutionItem;\n if (mcpToolItem.callId === callId) {\n currentData[i] = {\n ...mcpToolItem,\n status: parsed.data.error ? \"error\" : \"complete\",\n output: parsed.data.result,\n error: parsed.data.error,\n };\n break;\n }\n }\n }\n\n return {\n ...prev,\n [executionId]: currentData,\n };\n });\n };\n\n const handleDebugEvent = (\n parsed:\n | AgentDebugEventType\n | LLMReasoningDeltaEventType\n | AgentHandoffEventType\n | MCPToolCallStartEventType\n | MCPToolCallEndEventType,\n ) => {\n switch (parsed.type) {\n case \"debug_tool_execution_started\":\n handleDebugToolExecutionStarted(parsed);\n break;\n case \"debug_tool_execution_inputs\":\n handleDebugToolExecutionInputs(parsed);\n break;\n case \"debug_tool_execution_finished\":\n handleDebugToolExecutionFinished(parsed);\n break;\n case \"debug_tool_execution_error\":\n handleDebugToolExecutionError(parsed);\n break;\n case \"debug_tool_log\":\n handleDebugToolLog(parsed);\n break;\n case \"llm_reasoning_delta\":\n handleDebugReasoningStep(parsed);\n break;\n case \"agent_handoff\":\n handleAgentHandoff(parsed);\n break;\n case \"mcp_tool_call_start\":\n handleMCPToolCallStart(parsed);\n break;\n case \"mcp_tool_call_end\":\n handleMCPToolCallEnd(parsed);\n break;\n }\n };\n\n return {\n handleDebugEvent,\n };\n};\n","/**\n * Helper to clean JSON Schema for LLM compatibility.\n * Replaces modern Draft 2020-12 features with older, more compatible alternatives.\n * Specifically handles OpenAI's 'Strict Mode' requirements.\n */\nexport function cleanSchema(obj: unknown): unknown {\n if (Array.isArray(obj)) {\n return obj.map(cleanSchema);\n } else if (obj !== null && typeof obj === \"object\") {\n const newObj: Record<string, unknown> = {};\n const currentObj = obj as Record<string, any>;\n\n for (const key in currentObj) {\n // Remove keys that are not supported by most LLMs\n if (key === \"propertyNames\" || key === \"$schema\") {\n continue;\n }\n newObj[key] = cleanSchema(currentObj[key]);\n }\n\n // OpenAI and some other LLMs require additionalProperties: false for all objects in strict mode\n // AND every property must be explicitly listed in the 'required' array\n if (newObj.type === \"object\") {\n if (\n newObj.additionalProperties === undefined ||\n (newObj.additionalProperties &&\n typeof newObj.additionalProperties === \"object\" &&\n Object.keys(newObj.additionalProperties).length === 0)\n ) {\n newObj.additionalProperties = false;\n }\n\n if (newObj.additionalProperties === false && newObj.properties) {\n newObj.required = Object.keys(newObj.properties as object);\n }\n }\n\n return newObj;\n }\n return obj;\n}\n\n/**\n * Safely attempts to parse a value as JSON if it's a string.\n */\nexport function tryParseJSON(value: unknown): any {\n if (typeof value === \"string\") {\n try {\n return JSON.parse(value);\n } catch {\n return value;\n }\n }\n return value;\n}\n","import type { MessagePart } from \"../types\";\n\n/**\n * Updates a list of message parts with a new part,\n * ensuring chronological order by sequence and merging contiguous text deltas.\n */\nexport function updateAgentMessageParts(parts: MessagePart[], newPart: MessagePart): MessagePart[] {\n // 1. Combine and sort all parts by their sequence ID\n const sorted = [...parts, newPart].sort((a, b) => {\n const aStart = a.type === \"text\" ? a.firstSequence : a.sequence;\n const bStart = b.type === \"text\" ? b.firstSequence : b.sequence;\n return aStart - bStart;\n });\n\n // 2. Reduce the sorted parts to merge contiguous text blocks\n return sorted.reduce<MessagePart[]>((acc, current) => {\n const last = acc[acc.length - 1];\n\n // Check if we can merge this text part with the previous one\n const canMerge =\n last?.type === \"text\" &&\n current.type === \"text\" &&\n current.firstSequence === last.lastSequence + 1;\n\n if (canMerge) {\n acc[acc.length - 1] = {\n ...last,\n text: last.text + current.text,\n lastSequence: current.lastSequence,\n };\n return acc;\n }\n\n acc.push(current);\n return acc;\n }, []);\n}\n","import { useState, useEffect, useCallback } from \"react\";\n\n// Helper to handle JSON parsing cleanly\nfunction parseJSON<T>(value: string | null, defaultValue: T): T {\n if (value === null) return defaultValue;\n try {\n return JSON.parse(value);\n } catch {\n return defaultValue;\n }\n}\n\nexport function useSyncedLocalStorage<T>(\n key: string,\n initialValue: T,\n): [T, (value: T | ((val: T) => T)) => void] {\n // Initialize state function to avoid reading localStorage on every render\n const [storedValue, setStoredValue] = useState<T>(() => {\n if (typeof window === \"undefined\") {\n return initialValue;\n }\n try {\n const item = window.localStorage.getItem(key);\n return parseJSON(item, initialValue);\n } catch (error) {\n console.warn(`Error reading localStorage key \"${key}\":`, error);\n return initialValue;\n }\n });\n\n // Function to update state and localStorage\n const setValue = useCallback(\n (value: T | ((val: T) => T)) => {\n try {\n setStoredValue((prev) => {\n const valueToStore = value instanceof Function ? value(prev) : value;\n\n if (typeof window !== \"undefined\") {\n window.localStorage.setItem(key, JSON.stringify(valueToStore));\n // Dispatch a custom event so other hooks in the same window update\n window.dispatchEvent(\n new StorageEvent(\"storage\", { key, newValue: JSON.stringify(valueToStore) }),\n );\n }\n return valueToStore;\n });\n } catch (error) {\n console.warn(`Error setting localStorage key \"${key}\":`, error);\n }\n },\n [key],\n );\n\n // Sync across tabs/windows and within the same window\n useEffect(() => {\n const handleStorageChange = (event: StorageEvent) => {\n if (event.key === key) {\n setStoredValue(parseJSON(event.newValue, initialValue));\n }\n };\n\n window.addEventListener(\"storage\", handleStorageChange);\n return () => window.removeEventListener(\"storage\", handleStorageChange);\n }, [key, initialValue]);\n\n return [storedValue, setValue];\n}\n"],"mappings":"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","names":["useCallback","useRef","useState","useEffect","useMemo","useCallback","useRef","useRef","useCallback","useState","useEffect","useCallback","useRef","useState","useCallback","useMemo","useEffect"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bs-agent",
3
- "version": "0.0.7",
3
+ "version": "0.0.8",
4
4
  "description": "A React library for integrating BuildShip AI agents into your frontend applications.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",