bs-agent 0.0.4 → 0.0.6

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/README.md CHANGED
@@ -144,7 +144,7 @@ The `useAgentContext` hook returns an `AgentRunner` object with:
144
144
 
145
145
  ```tsx
146
146
  function SessionList() {
147
- const agent = useAgentContext("agent-id", "agent-url");
147
+ const agent = useAgentContext("agent-id", "agent-url", "access-key");
148
148
 
149
149
  return (
150
150
  <div>
@@ -194,7 +194,7 @@ async function uploadFiles(files: File[]): Promise<Record<string, string>> {
194
194
 
195
195
  ```tsx
196
196
  function FileUpload() {
197
- const agent = useAgentContext("agent-id", "agent-url");
197
+ const agent = useAgentContext("agent-id", "agent-url", "access-key");
198
198
  const [files, setFiles] = useState<File[]>([]);
199
199
 
200
200
  const handleSendWithFiles = async () => {
@@ -331,7 +331,7 @@ export function getToolDefinitions(): ClientToolDefinition[] {
331
331
  import { getToolDefinitions } from "./widget-registry";
332
332
 
333
333
  function ChatWithWidgets() {
334
- const agent = useAgentContext("agent-id", "agent-url");
334
+ const agent = useAgentContext("agent-id", "agent-url", "access-key");
335
335
  const tools = getToolDefinitions();
336
336
 
337
337
  const handleSend = async (input: string) => {
@@ -356,7 +356,7 @@ function ChatWithWidgets() {
356
356
  import { widgetRegistry } from "./widget-registry";
357
357
 
358
358
  function MessageDisplay() {
359
- const agent = useAgentContext("agent-id", "agent-url");
359
+ const agent = useAgentContext("agent-id", "agent-url", "access-key");
360
360
 
361
361
  return (
362
362
  <div>
@@ -459,7 +459,7 @@ Access detailed execution information:
459
459
 
460
460
  ```tsx
461
461
  function DebugView() {
462
- const agent = useAgentContext("agent-id", "agent-url");
462
+ const agent = useAgentContext("agent-id", "agent-url", "access-key");
463
463
 
464
464
  return (
465
465
  <div>
@@ -489,7 +489,7 @@ await agent.handleSend("message", {
489
489
 
490
490
  ```tsx
491
491
  function CancellableRequest() {
492
- const agent = useAgentContext("agent-id", "agent-url");
492
+ const agent = useAgentContext("agent-id", "agent-url", "access-key");
493
493
 
494
494
  return (
495
495
  <div>
@@ -506,7 +506,7 @@ function CancellableRequest() {
506
506
 
507
507
  ```tsx
508
508
  function OptimisticMessage() {
509
- const agent = useAgentContext("agent-id", "agent-url");
509
+ const agent = useAgentContext("agent-id", "agent-url", "access-key");
510
510
 
511
511
  const handleSend = async (input: string) => {
512
512
  // Add message to UI immediately
package/dist/index.cjs CHANGED
@@ -825,8 +825,12 @@ function AgentContextProvider({ children }) {
825
825
  Array.from(activeAgentsRef.current.entries()).map(([agentId, agentUrl]) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(AgentRunnerInstance, { agentId, agentUrl }, agentId))
826
826
  ] });
827
827
  }
828
- function AgentRunnerInstance({ agentId, agentUrl }) {
829
- const agent = useAgent(agentId, agentUrl);
828
+ function AgentRunnerInstance({
829
+ agentId,
830
+ agentUrl,
831
+ accessKey
832
+ }) {
833
+ const agent = useAgent(agentId, agentUrl, accessKey);
830
834
  const context = (0, import_react4.useContext)(AgentContext);
831
835
  if (!context) return null;
832
836
  (0, import_react4.useEffect)(() => {
@@ -834,14 +838,14 @@ function AgentRunnerInstance({ agentId, agentUrl }) {
834
838
  }, [agentId, agent, context]);
835
839
  return null;
836
840
  }
837
- function useAgentContext(agentId, agentUrl) {
841
+ function useAgentContext(agentId, agentUrl, accessKey) {
838
842
  const context = (0, import_react4.useContext)(AgentContext);
839
843
  if (!context) {
840
844
  throw new Error("useAgentContext must be used within AgentContextProvider");
841
845
  }
842
846
  const { initializeAgent, getRunner, listenersRef } = context;
843
847
  (0, import_react4.useEffect)(() => {
844
- initializeAgent(agentId, agentUrl);
848
+ initializeAgent(agentId, agentUrl, accessKey);
845
849
  }, [agentId, agentUrl, initializeAgent]);
846
850
  const [runner, setRunner] = (0, import_react4.useState)(() => getRunner(agentId));
847
851
  (0, import_react4.useEffect)(() => {
@@ -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) => 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, 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) => {\n const existingUrl = activeAgentsRef.current.get(agentId);\n\n if (!existingUrl) {\n activeAgentsRef.current.set(agentId, agentUrl);\n forceUpdate({});\n } else if (existingUrl !== agentUrl) {\n activeAgentsRef.current.set(agentId, agentUrl);\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]) => (\n <AgentRunnerInstance key={agentId} agentId={agentId} agentUrl={agentUrl} />\n ))}\n </AgentContext.Provider>\n );\n}\n\nfunction AgentRunnerInstance({ agentId, agentUrl }: { agentId: string; agentUrl: string }) {\n const agent = useAgent(agentId, agentUrl);\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): 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);\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, 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":["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, 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) => {\n const existingUrl = activeAgentsRef.current.get(agentId);\n\n if (!existingUrl) {\n activeAgentsRef.current.set(agentId, agentUrl);\n forceUpdate({});\n } else if (existingUrl !== agentUrl) {\n activeAgentsRef.current.set(agentId, agentUrl);\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]) => (\n <AgentRunnerInstance key={agentId} agentId={agentId} agentUrl={agentUrl} />\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, 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":["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): 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;
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): 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;
package/dist/index.js CHANGED
@@ -797,8 +797,12 @@ function AgentContextProvider({ children }) {
797
797
  Array.from(activeAgentsRef.current.entries()).map(([agentId, agentUrl]) => /* @__PURE__ */ jsx(AgentRunnerInstance, { agentId, agentUrl }, agentId))
798
798
  ] });
799
799
  }
800
- function AgentRunnerInstance({ agentId, agentUrl }) {
801
- const agent = useAgent(agentId, agentUrl);
800
+ function AgentRunnerInstance({
801
+ agentId,
802
+ agentUrl,
803
+ accessKey
804
+ }) {
805
+ const agent = useAgent(agentId, agentUrl, accessKey);
802
806
  const context = useContext(AgentContext);
803
807
  if (!context) return null;
804
808
  useEffect3(() => {
@@ -806,14 +810,14 @@ function AgentRunnerInstance({ agentId, agentUrl }) {
806
810
  }, [agentId, agent, context]);
807
811
  return null;
808
812
  }
809
- function useAgentContext(agentId, agentUrl) {
813
+ function useAgentContext(agentId, agentUrl, accessKey) {
810
814
  const context = useContext(AgentContext);
811
815
  if (!context) {
812
816
  throw new Error("useAgentContext must be used within AgentContextProvider");
813
817
  }
814
818
  const { initializeAgent, getRunner, listenersRef } = context;
815
819
  useEffect3(() => {
816
- initializeAgent(agentId, agentUrl);
820
+ initializeAgent(agentId, agentUrl, accessKey);
817
821
  }, [agentId, agentUrl, initializeAgent]);
818
822
  const [runner, setRunner] = useState3(() => getRunner(agentId));
819
823
  useEffect3(() => {
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) => 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, 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) => {\n const existingUrl = activeAgentsRef.current.get(agentId);\n\n if (!existingUrl) {\n activeAgentsRef.current.set(agentId, agentUrl);\n forceUpdate({});\n } else if (existingUrl !== agentUrl) {\n activeAgentsRef.current.set(agentId, agentUrl);\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]) => (\n <AgentRunnerInstance key={agentId} agentId={agentId} agentUrl={agentUrl} />\n ))}\n </AgentContext.Provider>\n );\n}\n\nfunction AgentRunnerInstance({ agentId, agentUrl }: { agentId: string; agentUrl: string }) {\n const agent = useAgent(agentId, agentUrl);\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): 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);\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, 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, 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) => {\n const existingUrl = activeAgentsRef.current.get(agentId);\n\n if (!existingUrl) {\n activeAgentsRef.current.set(agentId, agentUrl);\n forceUpdate({});\n } else if (existingUrl !== agentUrl) {\n activeAgentsRef.current.set(agentId, agentUrl);\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]) => (\n <AgentRunnerInstance key={agentId} agentId={agentId} agentUrl={agentUrl} />\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, 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.4",
3
+ "version": "0.0.6",
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",