bs-agent 0.0.5 → 0.0.7

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
@@ -636,7 +636,7 @@ function useAgent(agentId, agentUrl, accessKey) {
636
636
  throw error;
637
637
  }
638
638
  },
639
- [agentUrl, currentSessionId, sessionUtils, debugHandlers]
639
+ [agentUrl, accessKey, currentSessionId, sessionUtils, debugHandlers]
640
640
  );
641
641
  const handleSend = (0, import_react2.useCallback)(
642
642
  async (input, options) => {
@@ -778,13 +778,13 @@ function AgentContextProvider({ children }) {
778
778
  AGENT_DEBUG_DATA_KEY,
779
779
  {}
780
780
  );
781
- const initializeAgent = (0, import_react4.useCallback)((agentId, agentUrl) => {
782
- const existingUrl = activeAgentsRef.current.get(agentId);
783
- if (!existingUrl) {
784
- activeAgentsRef.current.set(agentId, agentUrl);
781
+ const initializeAgent = (0, import_react4.useCallback)((agentId, agentUrl, accessKey) => {
782
+ const existing = activeAgentsRef.current.get(agentId);
783
+ if (!existing) {
784
+ activeAgentsRef.current.set(agentId, { agentUrl, accessKey });
785
785
  forceUpdate({});
786
- } else if (existingUrl !== agentUrl) {
787
- activeAgentsRef.current.set(agentId, agentUrl);
786
+ } else if (existing.agentUrl !== agentUrl || existing.accessKey !== accessKey) {
787
+ activeAgentsRef.current.set(agentId, { agentUrl, accessKey });
788
788
  forceUpdate({});
789
789
  }
790
790
  }, []);
@@ -822,7 +822,7 @@ function AgentContextProvider({ children }) {
822
822
  );
823
823
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(AgentContext.Provider, { value: contextValue, children: [
824
824
  children,
825
- Array.from(activeAgentsRef.current.entries()).map(([agentId, agentUrl]) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(AgentRunnerInstance, { agentId, agentUrl }, agentId))
825
+ Array.from(activeAgentsRef.current.entries()).map(([agentId, { agentUrl, accessKey }]) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(AgentRunnerInstance, { agentId, agentUrl, accessKey }, agentId))
826
826
  ] });
827
827
  }
828
828
  function AgentRunnerInstance({
@@ -838,14 +838,14 @@ function AgentRunnerInstance({
838
838
  }, [agentId, agent, context]);
839
839
  return null;
840
840
  }
841
- function useAgentContext(agentId, agentUrl) {
841
+ function useAgentContext(agentId, agentUrl, accessKey) {
842
842
  const context = (0, import_react4.useContext)(AgentContext);
843
843
  if (!context) {
844
844
  throw new Error("useAgentContext must be used within AgentContextProvider");
845
845
  }
846
846
  const { initializeAgent, getRunner, listenersRef } = context;
847
847
  (0, import_react4.useEffect)(() => {
848
- initializeAgent(agentId, agentUrl);
848
+ initializeAgent(agentId, agentUrl, accessKey);
849
849
  }, [agentId, agentUrl, initializeAgent]);
850
850
  const [runner, setRunner] = (0, import_react4.useState)(() => getRunner(agentId));
851
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({\n agentId,\n agentUrl,\n accessKey,\n}: {\n agentId: string;\n agentUrl: string;\n accessKey?: string;\n}) {\n const agent = useAgent(agentId, agentUrl, accessKey);\n const context = useContext(AgentContext);\n\n if (!context) return null;\n\n useEffect(() => {\n context.registerRunner(agentId, agent);\n }, [agentId, agent, context]);\n\n return null;\n}\n\nexport function useAgentContext(agentId: string, agentUrl: string): 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, { agentUrl: string; accessKey?: string }>>(new Map());\n // Store runners in a ref since we push updates via registerRunner\n // Note: Changes to this Ref won't trigger re-renders of consumers of getRunner directly,\n // but since we return the 'runner' object which contains state,\n // and we access it via a hook that listens to updates (implemented below), it works out.\n // Actually, to make 'useAgentContext' reactive to runner changes, we need a subscription mechanism.\n const runnersRef = useRef<Map<string, AgentRunner>>(new Map());\n const listenersRef = useRef<Map<string, Set<() => void>>>(new Map());\n\n const [, forceUpdate] = useState({});\n\n // Global Sync State managed here to be shared\n const [allSessions, setAllSessions] = useSyncedLocalStorage<\n Record<string, Record<string, Session>>\n >(AGENT_SESSIONS_KEY, {});\n\n const [debugData, setDebugData] = useSyncedLocalStorage<Record<string, DebugDataType>>(\n AGENT_DEBUG_DATA_KEY,\n {},\n );\n\n const initializeAgent = useCallback((agentId: string, agentUrl: string, accessKey?: string) => {\n const existing = activeAgentsRef.current.get(agentId);\n\n if (!existing) {\n activeAgentsRef.current.set(agentId, { agentUrl, accessKey });\n forceUpdate({});\n } else if (existing.agentUrl !== agentUrl || existing.accessKey !== accessKey) {\n activeAgentsRef.current.set(agentId, { agentUrl, accessKey });\n forceUpdate({});\n }\n }, []);\n\n const registerRunner = useCallback((agentId: string, runner: AgentRunner) => {\n runnersRef.current.set(agentId, runner);\n // Notify listeners for this agentId\n const listeners = listenersRef.current.get(agentId);\n if (listeners) {\n listeners.forEach((callback) => callback());\n }\n }, []);\n\n const getRunner = useCallback((agentId: string) => {\n return runnersRef.current.get(agentId) || null;\n }, []);\n\n const contextValue = useMemo(\n () => ({\n initializeAgent,\n registerRunner,\n getRunner,\n allSessions,\n setAllSessions,\n debugData,\n setDebugData,\n runnersRef,\n listenersRef,\n }),\n [\n initializeAgent,\n registerRunner,\n getRunner,\n allSessions,\n setAllSessions,\n debugData,\n setDebugData,\n ],\n );\n\n return (\n <AgentContext.Provider value={contextValue}>\n {children}\n {Array.from(activeAgentsRef.current.entries()).map(([agentId, { agentUrl, accessKey }]) => (\n <AgentRunnerInstance key={agentId} agentId={agentId} agentUrl={agentUrl} accessKey={accessKey} />\n ))}\n </AgentContext.Provider>\n );\n}\n\nfunction AgentRunnerInstance({\n agentId,\n agentUrl,\n accessKey,\n}: {\n agentId: string;\n agentUrl: string;\n accessKey?: string;\n}) {\n const agent = useAgent(agentId, agentUrl, accessKey);\n const context = useContext(AgentContext);\n\n if (!context) return null;\n\n useEffect(() => {\n context.registerRunner(agentId, agent);\n }, [agentId, agent, context]);\n\n return null;\n}\n\nexport function useAgentContext(\n agentId: string,\n agentUrl: string,\n accessKey?: string,\n): AgentRunner {\n const context = useContext(AgentContext);\n\n if (!context) {\n throw new Error(\"useAgentContext must be used within AgentContextProvider\");\n }\n\n const { initializeAgent, getRunner, listenersRef } = context as AgentContextValue & {\n listenersRef: React.MutableRefObject<Map<string, Set<() => void>>>;\n };\n\n useEffect(() => {\n initializeAgent(agentId, agentUrl, accessKey);\n }, [agentId, agentUrl, initializeAgent]);\n\n // Reactive subscription to runner updates\n const [runner, setRunner] = useState<AgentRunner | null>(() => getRunner(agentId));\n\n useEffect(() => {\n // Current runner state\n const currentRunner = getRunner(agentId);\n if (currentRunner !== runner) {\n setRunner(currentRunner);\n }\n\n // Subscribe to future updates\n const callback = () => {\n setRunner(getRunner(agentId));\n };\n\n if (!listenersRef.current.has(agentId)) {\n listenersRef.current.set(agentId, new Set());\n }\n listenersRef.current.get(agentId)?.add(callback);\n\n return () => {\n listenersRef.current.get(agentId)?.delete(callback);\n };\n }, [agentId, getRunner]);\n\n const placeholder = useMemo(\n () => ({\n messages: [],\n inProgress: false,\n sessionId: \"\",\n sessions: [],\n debugData: {},\n handleSend: async () => {},\n switchSession: () => {},\n deleteSession: () => {},\n addOptimisticMessage: () => {},\n abort: () => {},\n }),\n [],\n );\n\n return runner || placeholder;\n}\n\n// Hook to access the global state for use-agent\nexport function useAgentGlobalState() {\n const context = useContext(AgentContext);\n if (!context) {\n throw new Error(\"useAgentGlobalState must be used within AgentContextProvider\");\n }\n return {\n allSessions: context.allSessions,\n setAllSessions: context.setAllSessions,\n debugData: context.debugData,\n setDebugData: context.setDebugData,\n };\n}\n","import { useCallback, useRef, useState, useEffect } from \"react\";\nimport { EventSourceMessage, fetchEventSource } from \"@microsoft/fetch-event-source\";\n\nimport { DEFAULT_SESSION_NAME, TEMPORARY_SESSION_ID } from \"./constants\";\nimport { useSessionUtils } from \"./session-utils\";\nimport { createDebugHandlers } from \"./debug-handlers\";\nimport { useAgentGlobalState } from \"./agent-context\";\nimport type { Message, MessagePart, OutputStreamEventType, ClientToolDefinition } from \"./types\";\nimport { cleanSchema, tryParseJSON } from \"./utils/schema\";\nimport { updateAgentMessageParts } from \"./utils/message\";\n\nexport default function useAgent(agentId: string, agentUrl: string, accessKey?: string) {\n // Use global state from Context instead of Jotai atoms\n const { allSessions, setAllSessions, debugData, setDebugData } = useAgentGlobalState();\n\n const [inProgress, setInProgress] = useState(false);\n const [messages, setMessages] = useState<Array<Message>>([]);\n\n const messagesRef = useRef<Array<Message>>([]);\n\n // Initialize currentSessionId later after sessionUtils is available\n const [currentSessionId, setCurrentSessionId] = useState<string>(TEMPORARY_SESSION_ID);\n\n const sessionUtils = useSessionUtils(\n agentId,\n allSessions,\n setAllSessions,\n currentSessionId,\n setCurrentSessionId,\n messagesRef,\n );\n\n // Set initial session ID after sessionUtils is available\n useEffect(() => {\n const initialSessionId = sessionUtils.getInitialSessionId();\n setCurrentSessionId(initialSessionId);\n }, []);\n\n const debugHandlers = createDebugHandlers(setDebugData);\n\n // Keep messagesRef in sync with messages state\n useEffect(() => {\n messagesRef.current = messages;\n }, [messages]);\n\n // Initialize or load session\n useEffect(() => {\n // Don't reset messages if we're currently in progress (streaming)\n if (inProgress) {\n return;\n }\n\n const session = sessionUtils.agentSessions[currentSessionId];\n\n if (session) {\n setMessages(session.messages);\n } else {\n setMessages([]);\n }\n }, [currentSessionId, sessionUtils.agentSessions, agentId, inProgress]);\n\n // Only sync on unmount to prevent data loss\n useEffect(() => {\n return () => {\n if (messagesRef.current.length > 0 && sessionUtils.syncSessionRef.current) {\n sessionUtils.syncSessionRef.current();\n }\n };\n }, []);\n\n const controller = useRef<AbortController>();\n\n const runAgent = useCallback(\n async (\n input: string,\n options?: {\n context?: object;\n testBuildId?: string;\n additionalHeaders?: Record<string, string>;\n tools?: ClientToolDefinition[];\n clientTools?: ClientToolDefinition[];\n },\n ) => {\n setInProgress(true);\n // Abort any existing request before creating a new controller\n if (controller.current) {\n controller.current.abort();\n }\n controller.current = new AbortController();\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n ...(accessKey ? { Authorization: `Bearer ${accessKey}` } : {}),\n ...(options?.additionalHeaders || {}),\n };\n\n // Include session ID in headers if we have one\n if (currentSessionId) {\n headers[\"x-buildship-agent-session-id\"] = currentSessionId;\n }\n\n const body = {\n stream: true,\n input,\n context: options?.context || {},\n testBuildId: options?.testBuildId,\n tools: options?.tools?.map((t: { parameters: unknown }) => ({\n ...t,\n parameters: cleanSchema(t.parameters),\n })),\n clientTools: options?.clientTools?.map((t: { parameters: unknown }) => ({\n ...t,\n parameters: cleanSchema(t.parameters),\n })),\n };\n\n try {\n await fetchEventSource(agentUrl, {\n method: \"POST\",\n headers,\n signal: controller.current.signal,\n openWhenHidden: true,\n body: JSON.stringify(body),\n onopen: async (resp) => {\n // catch the 404 status\n if (resp.status >= 400) {\n console.log(`AI onopen error with status: ${resp.status}`);\n\n if (resp.status === 404) {\n // for resume operations with 404, throw a specific error for retry\n throw new Error(`Not Found (${resp.statusText})`);\n }\n\n throw new Error(`Error status ${resp.status}`);\n }\n\n // Extract session ID from response headers if we don't have one\n if (!currentSessionId || currentSessionId === TEMPORARY_SESSION_ID) {\n const sessionId = resp.headers.get(\"x-buildship-agent-session-id\");\n if (sessionId) {\n // Transfer current messages to the new session before switching\n const currentMessages = messagesRef.current;\n const sessionName =\n resp.headers.get(\"x-buildship-agent-session-name\") || DEFAULT_SESSION_NAME;\n\n sessionUtils.createSessionFromResponse(sessionId, sessionName, currentMessages);\n setCurrentSessionId(sessionId);\n }\n }\n\n // Extract execution ID from response headers and update the last user message\n const executionId = resp.headers.get(\"x-buildship-agent-execution-id\");\n if (executionId) {\n setMessages((prev) => {\n const lastMessage = prev[prev.length - 1];\n if (lastMessage?.role === \"user\") {\n const updatedMessage = {\n ...lastMessage,\n executionId: executionId,\n };\n const updatedMessages = [...prev.slice(0, -1), updatedMessage];\n\n // Sync updated user message\n if (sessionUtils.syncSessionRef.current) {\n sessionUtils.syncSessionRef.current(updatedMessages);\n }\n\n return updatedMessages;\n }\n return prev;\n });\n }\n },\n onmessage: (event: EventSourceMessage) => {\n try {\n const parsed = JSON.parse(event.data) as OutputStreamEventType;\n\n if (parsed.type === \"llm_text_delta\") {\n setMessages((prev) => {\n const lastMessage = prev[prev.length - 1];\n const sequence = parsed.meta.sequence;\n const newPart: MessagePart = {\n type: \"text\",\n text: parsed.data,\n firstSequence: sequence,\n lastSequence: sequence,\n };\n\n let updatedMessages: Message[];\n\n if (lastMessage?.role === \"agent\") {\n const updatedMessage: Message = {\n ...lastMessage,\n content: lastMessage.content + parsed.data, // content is still useful for simple displays\n parts: updateAgentMessageParts(lastMessage.parts || [], newPart),\n };\n updatedMessages = [...prev.slice(0, -1), updatedMessage];\n } else {\n const updatedMessage: Message = {\n role: \"agent\" as const,\n content: parsed.data,\n parts: [newPart],\n executionId: parsed.meta.executionId,\n };\n updatedMessages = [...prev, updatedMessage];\n }\n\n if (sessionUtils.syncSessionRef.current) {\n sessionUtils.syncSessionRef.current(updatedMessages);\n }\n\n return updatedMessages;\n });\n } else if (parsed.type === \"client_tool_call\") {\n setMessages((prev) => {\n const lastMessage = prev[prev.length - 1];\n const newPart: MessagePart = {\n type: \"widget\",\n toolName: parsed.data.toolName,\n callId: parsed.data.callId,\n inputs: tryParseJSON(parsed.data.inputs),\n sequence: parsed.meta.sequence,\n };\n\n let updatedMessages: Message[];\n\n if (lastMessage?.role === \"agent\") {\n const updatedMessage: Message = {\n ...lastMessage,\n parts: updateAgentMessageParts(lastMessage.parts || [], newPart),\n };\n updatedMessages = [...prev.slice(0, -1), updatedMessage];\n } else {\n const updatedMessage: Message = {\n role: \"agent\" as const,\n content: \"\",\n parts: [newPart],\n executionId: parsed.meta.executionId,\n };\n updatedMessages = [...prev, updatedMessage];\n }\n\n if (sessionUtils.syncSessionRef.current) {\n sessionUtils.syncSessionRef.current(updatedMessages);\n }\n\n return updatedMessages;\n });\n } else if (\n parsed.type.startsWith(\"debug_\") ||\n parsed.type === \"llm_reasoning_delta\" ||\n parsed.type === \"agent_handoff\" ||\n parsed.type === \"mcp_tool_call_start\" ||\n parsed.type === \"mcp_tool_call_end\"\n ) {\n debugHandlers.handleDebugEvent(parsed);\n }\n } catch (e) {\n console.log(\"Failed to parse agent message\", e);\n }\n },\n onclose: () => {\n console.log(\"Agent closed\");\n setInProgress(false);\n // Sync messages when streaming completes\n if (sessionUtils.syncSessionRef.current) {\n sessionUtils.syncSessionRef.current();\n }\n },\n onerror: (e) => {\n console.log(\"Agent error\", e);\n setInProgress(false);\n // Sync messages on error to prevent data loss\n if (sessionUtils.syncSessionRef.current) {\n sessionUtils.syncSessionRef.current(messagesRef.current);\n }\n throw new Error(\"Failed to execute agent\");\n },\n });\n } catch (error) {\n console.log(\"Agent execution failed\", error);\n setInProgress(false);\n // Sync messages on execution failure\n if (sessionUtils.syncSessionRef.current) {\n sessionUtils.syncSessionRef.current(messagesRef.current);\n }\n throw error;\n }\n },\n [agentUrl, accessKey, currentSessionId, sessionUtils, debugHandlers],\n );\n\n const handleSend = useCallback(\n async (\n input: string,\n options?: {\n context?: object;\n testBuildId?: string;\n skipUserMessage?: boolean;\n additionalHeaders?: Record<string, string>;\n tools?: ClientToolDefinition[];\n clientTools?: ClientToolDefinition[];\n },\n ) => {\n const userMessage = {\n role: \"user\" as const,\n content: input,\n executionId: Date.now().toString(),\n };\n\n // Only add user message if not skipping\n if (!options?.skipUserMessage) {\n setMessages((prev) => {\n const updatedMessages = [...prev, userMessage];\n // Sync immediately after user message\n if (sessionUtils.syncSessionRef.current) {\n sessionUtils.syncSessionRef.current(updatedMessages);\n }\n return updatedMessages;\n });\n }\n\n try {\n await runAgent(input, options);\n } catch (error) {\n // Ensure user message is preserved even if agent execution fails\n if (!options?.skipUserMessage) {\n setMessages((prev) => {\n const updatedMessages = prev.some((m) => m === userMessage)\n ? prev\n : [...prev, userMessage];\n if (sessionUtils.syncSessionRef.current) {\n sessionUtils.syncSessionRef.current(updatedMessages);\n }\n return updatedMessages;\n });\n }\n throw error;\n }\n },\n [runAgent, sessionUtils.syncSessionRef],\n );\n\n const addOptimisticMessage = useCallback(\n (input: string) => {\n const userMessage = {\n role: \"user\" as const,\n content: input,\n executionId: Date.now().toString(),\n };\n\n setMessages((prev) => {\n const updatedMessages = [...prev, userMessage];\n // Sync immediately after user message\n if (sessionUtils.syncSessionRef.current) {\n sessionUtils.syncSessionRef.current(updatedMessages);\n }\n return updatedMessages;\n });\n },\n [sessionUtils.syncSessionRef],\n );\n\n const abort = useCallback(() => {\n if (controller.current) {\n controller.current.abort();\n }\n setInProgress(false);\n // Sync messages to prevent data loss\n if (sessionUtils.syncSessionRef.current) {\n sessionUtils.syncSessionRef.current(messagesRef.current);\n }\n }, [sessionUtils.syncSessionRef]);\n\n return {\n inProgress,\n messages,\n handleSend,\n addOptimisticMessage,\n abort,\n sessionId: currentSessionId,\n switchSession: sessionUtils.switchSession,\n deleteSession: sessionUtils.deleteSession,\n sessions: sessionUtils.sessionsList,\n debugData,\n };\n}\n","export const AGENT_SESSIONS_KEY = \"buildship:agent:conversations\";\nexport const AGENT_DEBUG_DATA_KEY = \"buildship:agent:debug\";\n\nexport const DEFAULT_SESSION_NAME = \"New Chat\";\nexport const TEMPORARY_SESSION_ID = \"sess_temp\";\n","import { useCallback, useMemo, useRef } from \"react\";\nimport type { Message, Session } from \"./types\";\nimport { TEMPORARY_SESSION_ID } from \"./constants\";\n\nexport const useSessionUtils = (\n agentId: string,\n allSessions: Record<string, Record<string, Session>>,\n setAllSessions: (\n value:\n | Record<string, Record<string, Session>>\n | ((\n prev: Record<string, Record<string, Session>>,\n ) => Record<string, Record<string, Session>>),\n ) => void,\n currentSessionId: string,\n setCurrentSessionId: (sessionId: string) => void,\n messagesRef: React.MutableRefObject<Array<Message>>,\n) => {\n const agentSessions = useMemo(() => allSessions[agentId] || {}, [agentId, allSessions]);\n\n const syncSessionRef = useRef<(messages?: Array<Message>) => void>();\n\n syncSessionRef.current = (updatedMessages?: Array<Message>) => {\n if (!currentSessionId || currentSessionId === TEMPORARY_SESSION_ID) {\n return;\n }\n\n setAllSessions((prev) => ({\n ...prev,\n [agentId]: {\n ...prev[agentId],\n [currentSessionId]: {\n ...prev[agentId]?.[currentSessionId],\n messages: updatedMessages ?? messagesRef.current,\n updatedAt: Date.now(),\n },\n },\n }));\n };\n\n const getInitialSessionId = () => {\n const sessions = Object.values(agentSessions);\n if (sessions.length > 0) {\n return sessions.sort((a, b) => b.updatedAt - a.updatedAt)[0].id;\n }\n return TEMPORARY_SESSION_ID;\n };\n\n const switchSession = useCallback(\n (sessionId: string = TEMPORARY_SESSION_ID) => {\n setCurrentSessionId(sessionId);\n },\n [setCurrentSessionId],\n );\n\n const deleteSession = useCallback(\n (sessionId: string) => {\n if (!sessionId || sessionId === TEMPORARY_SESSION_ID) {\n return;\n }\n\n setAllSessions((prev) => {\n const updatedAgentSessions = { ...prev[agentId] };\n delete updatedAgentSessions[sessionId];\n\n return {\n ...prev,\n [agentId]: updatedAgentSessions,\n };\n });\n\n if (sessionId === currentSessionId) {\n const remainingSessions = Object.values(agentSessions).filter((s) => s.id !== sessionId);\n if (remainingSessions.length > 0) {\n const mostRecent = remainingSessions.sort((a, b) => b.updatedAt - a.updatedAt)[0];\n setCurrentSessionId(mostRecent.id);\n } else {\n setCurrentSessionId(TEMPORARY_SESSION_ID);\n }\n }\n },\n [agentId, currentSessionId, agentSessions, setAllSessions, setCurrentSessionId],\n );\n\n const sessionsList = useMemo(\n () => Object.values(agentSessions).sort((a, b) => b.updatedAt - a.updatedAt),\n [agentSessions],\n );\n\n const createSessionFromResponse = (\n sessionId: string,\n sessionName: string,\n currentMessages: Array<Message>,\n ) => {\n setAllSessions((prev) => ({\n ...prev,\n [agentId]: {\n ...prev[agentId],\n [sessionId]: {\n id: sessionId,\n createdAt: Date.now(),\n updatedAt: Date.now(),\n messages: currentMessages,\n name: sessionName,\n },\n },\n }));\n };\n\n return {\n agentSessions,\n syncSessionRef,\n getInitialSessionId,\n switchSession,\n deleteSession,\n sessionsList,\n createSessionFromResponse,\n };\n};\n","import type {\n AgentDebugEventType,\n AgentHandoffEventType,\n DebugDataType,\n LLMReasoningDeltaEventType,\n ReasoningItem,\n ToolExecutionItem,\n HandoffItem,\n MCPToolCallStartEventType,\n MCPToolCallEndEventType,\n MCPToolExecutionItem,\n} from \"./types\";\n\nexport const createDebugHandlers = (\n setDebugData: (\n value:\n | Record<string, DebugDataType>\n | ((prev: Record<string, DebugDataType>) => Record<string, DebugDataType>),\n ) => void,\n) => {\n const handleDebugToolExecutionStarted = (parsed: AgentDebugEventType) => {\n const executionId = parsed.meta.executionId;\n setDebugData((prev) => ({\n ...prev,\n [executionId]: [\n ...(prev[executionId] || []),\n {\n itemType: \"tool_call\",\n toolId: (parsed.data as { toolId?: string }).toolId || \"unknown\",\n toolCallId: (parsed.data as { toolCallId?: string }).toolCallId,\n status: \"progress\",\n },\n ],\n }));\n };\n\n const handleDebugToolExecutionInputs = (parsed: AgentDebugEventType) => {\n const executionId = parsed.meta.executionId;\n const toolCallId = (parsed.data as { toolCallId?: string }).toolCallId;\n setDebugData((prev) => {\n const currentData = [...(prev[executionId] || [])];\n\n for (let i = currentData.length - 1; i >= 0; i--) {\n if (currentData[i].itemType === \"tool_call\") {\n const toolItem = currentData[i] as ToolExecutionItem;\n if (toolItem.toolCallId === toolCallId) {\n currentData[i] = {\n ...toolItem,\n inputs: (parsed.data as { value: unknown }).value,\n };\n break;\n }\n }\n }\n\n return {\n ...prev,\n [executionId]: currentData,\n };\n });\n };\n\n const handleDebugToolExecutionFinished = (parsed: AgentDebugEventType) => {\n const executionId = parsed.meta.executionId;\n const toolCallId = (parsed.data as { toolCallId?: string }).toolCallId;\n setDebugData((prev) => {\n const currentData = [...(prev[executionId] || [])];\n\n for (let i = currentData.length - 1; i >= 0; i--) {\n if (currentData[i].itemType === \"tool_call\") {\n const toolItem = currentData[i] as ToolExecutionItem;\n if (toolItem.toolCallId === toolCallId) {\n currentData[i] = {\n ...toolItem,\n status: \"complete\",\n output: (parsed.data as { value: unknown }).value,\n };\n break;\n }\n }\n }\n\n return {\n ...prev,\n [executionId]: currentData,\n };\n });\n };\n\n const handleDebugToolExecutionError = (parsed: AgentDebugEventType) => {\n const executionId = parsed.meta.executionId;\n const toolCallId = (parsed.data as { toolCallId?: string }).toolCallId;\n setDebugData((prev) => {\n const currentData = [...(prev[executionId] || [])];\n\n for (let i = currentData.length - 1; i >= 0; i--) {\n if (currentData[i].itemType === \"tool_call\") {\n const toolItem = currentData[i] as ToolExecutionItem;\n if (toolItem.toolCallId === toolCallId) {\n currentData[i] = {\n ...toolItem,\n status: \"error\",\n output: (parsed.data as { value: unknown }).value,\n };\n break;\n }\n }\n }\n\n return {\n ...prev,\n [executionId]: currentData,\n };\n });\n };\n\n const handleDebugToolLog = (parsed: AgentDebugEventType) => {\n const executionId = parsed.meta.executionId;\n const toolCallId = (parsed.data as { toolCallId?: string }).toolCallId;\n setDebugData((prev) => {\n const currentData = [...(prev[executionId] || [])];\n\n for (let i = currentData.length - 1; i >= 0; i--) {\n if (currentData[i].itemType === \"tool_call\") {\n const toolItem = currentData[i] as ToolExecutionItem;\n if (toolItem.toolCallId === toolCallId) {\n const currentLogs = toolItem.logs || [];\n currentData[i] = {\n ...toolItem,\n logs: [...currentLogs, (parsed.data as { value: unknown[] }).value[0]],\n };\n break;\n }\n }\n }\n\n return {\n ...prev,\n [executionId]: currentData,\n };\n });\n };\n\n let lastReasoningIndex = -1;\n const handleDebugReasoningStep = (parsed: LLMReasoningDeltaEventType) => {\n const executionId = parsed.meta.executionId;\n const { delta, index } = parsed.data;\n setDebugData((prev) => {\n const currentData = [...(prev[executionId] || [])];\n\n if (lastReasoningIndex < index) {\n currentData.push({ itemType: \"reasoning\", reasoning: \"\" });\n lastReasoningIndex = index;\n }\n\n for (let i = currentData.length - 1; i >= 0; i--) {\n if (currentData[i].itemType === \"reasoning\") {\n currentData[i] = {\n itemType: \"reasoning\",\n reasoning: (currentData[i] as ReasoningItem).reasoning + delta,\n };\n break;\n }\n }\n\n return {\n ...prev,\n [executionId]: currentData,\n };\n });\n };\n\n const handleAgentHandoff = (parsed: AgentHandoffEventType) => {\n const executionId = parsed.meta.executionId;\n setDebugData((prev) => ({\n ...prev,\n [executionId]: [\n ...(prev[executionId] || []),\n {\n itemType: \"handoff\",\n agentName: parsed.data.agentName,\n } as HandoffItem,\n ],\n }));\n };\n\n const handleMCPToolCallStart = (parsed: MCPToolCallStartEventType) => {\n const executionId = parsed.meta.executionId;\n setDebugData((prev) => ({\n ...prev,\n [executionId]: [\n ...(prev[executionId] || []),\n {\n itemType: \"mcp_tool_call\",\n toolName: parsed.data.toolName,\n serverName: parsed.data.serverName,\n callId: parsed.data.callId,\n status: \"progress\",\n inputs: parsed.data.inputs,\n } as MCPToolExecutionItem,\n ],\n }));\n };\n\n const handleMCPToolCallEnd = (parsed: MCPToolCallEndEventType) => {\n const executionId = parsed.meta.executionId;\n const callId = parsed.data.callId;\n setDebugData((prev) => {\n const currentData = [...(prev[executionId] || [])];\n\n for (let i = currentData.length - 1; i >= 0; i--) {\n if (currentData[i].itemType === \"mcp_tool_call\") {\n const mcpToolItem = currentData[i] as MCPToolExecutionItem;\n if (mcpToolItem.callId === callId) {\n currentData[i] = {\n ...mcpToolItem,\n status: parsed.data.error ? \"error\" : \"complete\",\n output: parsed.data.result,\n error: parsed.data.error,\n };\n break;\n }\n }\n }\n\n return {\n ...prev,\n [executionId]: currentData,\n };\n });\n };\n\n const handleDebugEvent = (\n parsed:\n | AgentDebugEventType\n | LLMReasoningDeltaEventType\n | AgentHandoffEventType\n | MCPToolCallStartEventType\n | MCPToolCallEndEventType,\n ) => {\n switch (parsed.type) {\n case \"debug_tool_execution_started\":\n handleDebugToolExecutionStarted(parsed);\n break;\n case \"debug_tool_execution_inputs\":\n handleDebugToolExecutionInputs(parsed);\n break;\n case \"debug_tool_execution_finished\":\n handleDebugToolExecutionFinished(parsed);\n break;\n case \"debug_tool_execution_error\":\n handleDebugToolExecutionError(parsed);\n break;\n case \"debug_tool_log\":\n handleDebugToolLog(parsed);\n break;\n case \"llm_reasoning_delta\":\n handleDebugReasoningStep(parsed);\n break;\n case \"agent_handoff\":\n handleAgentHandoff(parsed);\n break;\n case \"mcp_tool_call_start\":\n handleMCPToolCallStart(parsed);\n break;\n case \"mcp_tool_call_end\":\n handleMCPToolCallEnd(parsed);\n break;\n }\n };\n\n return {\n handleDebugEvent,\n };\n};\n","/**\n * Helper to clean JSON Schema for LLM compatibility.\n * Replaces modern Draft 2020-12 features with older, more compatible alternatives.\n * Specifically handles OpenAI's 'Strict Mode' requirements.\n */\nexport function cleanSchema(obj: unknown): unknown {\n if (Array.isArray(obj)) {\n return obj.map(cleanSchema);\n } else if (obj !== null && typeof obj === \"object\") {\n const newObj: Record<string, unknown> = {};\n const currentObj = obj as Record<string, any>;\n\n for (const key in currentObj) {\n // Remove keys that are not supported by most LLMs\n if (key === \"propertyNames\" || key === \"$schema\") {\n continue;\n }\n newObj[key] = cleanSchema(currentObj[key]);\n }\n\n // OpenAI and some other LLMs require additionalProperties: false for all objects in strict mode\n // AND every property must be explicitly listed in the 'required' array\n if (newObj.type === \"object\") {\n if (\n newObj.additionalProperties === undefined ||\n (newObj.additionalProperties &&\n typeof newObj.additionalProperties === \"object\" &&\n Object.keys(newObj.additionalProperties).length === 0)\n ) {\n newObj.additionalProperties = false;\n }\n\n if (newObj.additionalProperties === false && newObj.properties) {\n newObj.required = Object.keys(newObj.properties as object);\n }\n }\n\n return newObj;\n }\n return obj;\n}\n\n/**\n * Safely attempts to parse a value as JSON if it's a string.\n */\nexport function tryParseJSON(value: unknown): any {\n if (typeof value === \"string\") {\n try {\n return JSON.parse(value);\n } catch {\n return value;\n }\n }\n return value;\n}\n","import type { MessagePart } from \"../types\";\n\n/**\n * Updates a list of message parts with a new part,\n * ensuring chronological order by sequence and merging contiguous text deltas.\n */\nexport function updateAgentMessageParts(parts: MessagePart[], newPart: MessagePart): MessagePart[] {\n // 1. Combine and sort all parts by their sequence ID\n const sorted = [...parts, newPart].sort((a, b) => {\n const aStart = a.type === \"text\" ? a.firstSequence : a.sequence;\n const bStart = b.type === \"text\" ? b.firstSequence : b.sequence;\n return aStart - bStart;\n });\n\n // 2. Reduce the sorted parts to merge contiguous text blocks\n return sorted.reduce<MessagePart[]>((acc, current) => {\n const last = acc[acc.length - 1];\n\n // Check if we can merge this text part with the previous one\n const canMerge =\n last?.type === \"text\" &&\n current.type === \"text\" &&\n current.firstSequence === last.lastSequence + 1;\n\n if (canMerge) {\n acc[acc.length - 1] = {\n ...last,\n text: last.text + current.text,\n lastSequence: current.lastSequence,\n };\n return acc;\n }\n\n acc.push(current);\n return acc;\n }, []);\n}\n","import { useState, useEffect, useCallback } from \"react\";\n\n// Helper to handle JSON parsing cleanly\nfunction parseJSON<T>(value: string | null, defaultValue: T): T {\n if (value === null) return defaultValue;\n try {\n return JSON.parse(value);\n } catch {\n return defaultValue;\n }\n}\n\nexport function useSyncedLocalStorage<T>(\n key: string,\n initialValue: T,\n): [T, (value: T | ((val: T) => T)) => void] {\n // Initialize state function to avoid reading localStorage on every render\n const [storedValue, setStoredValue] = useState<T>(() => {\n if (typeof window === \"undefined\") {\n return initialValue;\n }\n try {\n const item = window.localStorage.getItem(key);\n return parseJSON(item, initialValue);\n } catch (error) {\n console.warn(`Error reading localStorage key \"${key}\":`, error);\n return initialValue;\n }\n });\n\n // Function to update state and localStorage\n const setValue = useCallback(\n (value: T | ((val: T) => T)) => {\n try {\n setStoredValue((prev) => {\n const valueToStore = value instanceof Function ? value(prev) : value;\n\n if (typeof window !== \"undefined\") {\n window.localStorage.setItem(key, JSON.stringify(valueToStore));\n // Dispatch a custom event so other hooks in the same window update\n window.dispatchEvent(\n new StorageEvent(\"storage\", { key, newValue: JSON.stringify(valueToStore) }),\n );\n }\n return valueToStore;\n });\n } catch (error) {\n console.warn(`Error setting localStorage key \"${key}\":`, error);\n }\n },\n [key],\n );\n\n // Sync across tabs/windows and within the same window\n useEffect(() => {\n const handleStorageChange = (event: StorageEvent) => {\n if (event.key === key) {\n setStoredValue(parseJSON(event.newValue, initialValue));\n }\n };\n\n window.addEventListener(\"storage\", handleStorageChange);\n return () => window.removeEventListener(\"storage\", handleStorageChange);\n }, [key, initialValue]);\n\n return [storedValue, setValue];\n}\n"],"mappings":"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","names":["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
@@ -608,7 +608,7 @@ function useAgent(agentId, agentUrl, accessKey) {
608
608
  throw error;
609
609
  }
610
610
  },
611
- [agentUrl, currentSessionId, sessionUtils, debugHandlers]
611
+ [agentUrl, accessKey, currentSessionId, sessionUtils, debugHandlers]
612
612
  );
613
613
  const handleSend = useCallback2(
614
614
  async (input, options) => {
@@ -750,13 +750,13 @@ function AgentContextProvider({ children }) {
750
750
  AGENT_DEBUG_DATA_KEY,
751
751
  {}
752
752
  );
753
- const initializeAgent = useCallback4((agentId, agentUrl) => {
754
- const existingUrl = activeAgentsRef.current.get(agentId);
755
- if (!existingUrl) {
756
- activeAgentsRef.current.set(agentId, agentUrl);
753
+ const initializeAgent = useCallback4((agentId, agentUrl, accessKey) => {
754
+ const existing = activeAgentsRef.current.get(agentId);
755
+ if (!existing) {
756
+ activeAgentsRef.current.set(agentId, { agentUrl, accessKey });
757
757
  forceUpdate({});
758
- } else if (existingUrl !== agentUrl) {
759
- activeAgentsRef.current.set(agentId, agentUrl);
758
+ } else if (existing.agentUrl !== agentUrl || existing.accessKey !== accessKey) {
759
+ activeAgentsRef.current.set(agentId, { agentUrl, accessKey });
760
760
  forceUpdate({});
761
761
  }
762
762
  }, []);
@@ -794,7 +794,7 @@ function AgentContextProvider({ children }) {
794
794
  );
795
795
  return /* @__PURE__ */ jsxs(AgentContext.Provider, { value: contextValue, children: [
796
796
  children,
797
- Array.from(activeAgentsRef.current.entries()).map(([agentId, agentUrl]) => /* @__PURE__ */ jsx(AgentRunnerInstance, { agentId, agentUrl }, agentId))
797
+ Array.from(activeAgentsRef.current.entries()).map(([agentId, { agentUrl, accessKey }]) => /* @__PURE__ */ jsx(AgentRunnerInstance, { agentId, agentUrl, accessKey }, agentId))
798
798
  ] });
799
799
  }
800
800
  function AgentRunnerInstance({
@@ -810,14 +810,14 @@ function AgentRunnerInstance({
810
810
  }, [agentId, agent, context]);
811
811
  return null;
812
812
  }
813
- function useAgentContext(agentId, agentUrl) {
813
+ function useAgentContext(agentId, agentUrl, accessKey) {
814
814
  const context = useContext(AgentContext);
815
815
  if (!context) {
816
816
  throw new Error("useAgentContext must be used within AgentContextProvider");
817
817
  }
818
818
  const { initializeAgent, getRunner, listenersRef } = context;
819
819
  useEffect3(() => {
820
- initializeAgent(agentId, agentUrl);
820
+ initializeAgent(agentId, agentUrl, accessKey);
821
821
  }, [agentId, agentUrl, initializeAgent]);
822
822
  const [runner, setRunner] = useState3(() => getRunner(agentId));
823
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({\n agentId,\n agentUrl,\n accessKey,\n}: {\n agentId: string;\n agentUrl: string;\n accessKey?: string;\n}) {\n const agent = useAgent(agentId, agentUrl, accessKey);\n const context = useContext(AgentContext);\n\n if (!context) return null;\n\n useEffect(() => {\n context.registerRunner(agentId, agent);\n }, [agentId, agent, context]);\n\n return null;\n}\n\nexport function useAgentContext(agentId: string, agentUrl: string): 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, { agentUrl: string; accessKey?: string }>>(new Map());\n // Store runners in a ref since we push updates via registerRunner\n // Note: Changes to this Ref won't trigger re-renders of consumers of getRunner directly,\n // but since we return the 'runner' object which contains state,\n // and we access it via a hook that listens to updates (implemented below), it works out.\n // Actually, to make 'useAgentContext' reactive to runner changes, we need a subscription mechanism.\n const runnersRef = useRef<Map<string, AgentRunner>>(new Map());\n const listenersRef = useRef<Map<string, Set<() => void>>>(new Map());\n\n const [, forceUpdate] = useState({});\n\n // Global Sync State managed here to be shared\n const [allSessions, setAllSessions] = useSyncedLocalStorage<\n Record<string, Record<string, Session>>\n >(AGENT_SESSIONS_KEY, {});\n\n const [debugData, setDebugData] = useSyncedLocalStorage<Record<string, DebugDataType>>(\n AGENT_DEBUG_DATA_KEY,\n {},\n );\n\n const initializeAgent = useCallback((agentId: string, agentUrl: string, accessKey?: string) => {\n const existing = activeAgentsRef.current.get(agentId);\n\n if (!existing) {\n activeAgentsRef.current.set(agentId, { agentUrl, accessKey });\n forceUpdate({});\n } else if (existing.agentUrl !== agentUrl || existing.accessKey !== accessKey) {\n activeAgentsRef.current.set(agentId, { agentUrl, accessKey });\n forceUpdate({});\n }\n }, []);\n\n const registerRunner = useCallback((agentId: string, runner: AgentRunner) => {\n runnersRef.current.set(agentId, runner);\n // Notify listeners for this agentId\n const listeners = listenersRef.current.get(agentId);\n if (listeners) {\n listeners.forEach((callback) => callback());\n }\n }, []);\n\n const getRunner = useCallback((agentId: string) => {\n return runnersRef.current.get(agentId) || null;\n }, []);\n\n const contextValue = useMemo(\n () => ({\n initializeAgent,\n registerRunner,\n getRunner,\n allSessions,\n setAllSessions,\n debugData,\n setDebugData,\n runnersRef,\n listenersRef,\n }),\n [\n initializeAgent,\n registerRunner,\n getRunner,\n allSessions,\n setAllSessions,\n debugData,\n setDebugData,\n ],\n );\n\n return (\n <AgentContext.Provider value={contextValue}>\n {children}\n {Array.from(activeAgentsRef.current.entries()).map(([agentId, { agentUrl, accessKey }]) => (\n <AgentRunnerInstance key={agentId} agentId={agentId} agentUrl={agentUrl} accessKey={accessKey} />\n ))}\n </AgentContext.Provider>\n );\n}\n\nfunction AgentRunnerInstance({\n agentId,\n agentUrl,\n accessKey,\n}: {\n agentId: string;\n agentUrl: string;\n accessKey?: string;\n}) {\n const agent = useAgent(agentId, agentUrl, accessKey);\n const context = useContext(AgentContext);\n\n if (!context) return null;\n\n useEffect(() => {\n context.registerRunner(agentId, agent);\n }, [agentId, agent, context]);\n\n return null;\n}\n\nexport function useAgentContext(\n agentId: string,\n agentUrl: string,\n accessKey?: string,\n): AgentRunner {\n const context = useContext(AgentContext);\n\n if (!context) {\n throw new Error(\"useAgentContext must be used within AgentContextProvider\");\n }\n\n const { initializeAgent, getRunner, listenersRef } = context as AgentContextValue & {\n listenersRef: React.MutableRefObject<Map<string, Set<() => void>>>;\n };\n\n useEffect(() => {\n initializeAgent(agentId, agentUrl, accessKey);\n }, [agentId, agentUrl, initializeAgent]);\n\n // Reactive subscription to runner updates\n const [runner, setRunner] = useState<AgentRunner | null>(() => getRunner(agentId));\n\n useEffect(() => {\n // Current runner state\n const currentRunner = getRunner(agentId);\n if (currentRunner !== runner) {\n setRunner(currentRunner);\n }\n\n // Subscribe to future updates\n const callback = () => {\n setRunner(getRunner(agentId));\n };\n\n if (!listenersRef.current.has(agentId)) {\n listenersRef.current.set(agentId, new Set());\n }\n listenersRef.current.get(agentId)?.add(callback);\n\n return () => {\n listenersRef.current.get(agentId)?.delete(callback);\n };\n }, [agentId, getRunner]);\n\n const placeholder = useMemo(\n () => ({\n messages: [],\n inProgress: false,\n sessionId: \"\",\n sessions: [],\n debugData: {},\n handleSend: async () => {},\n switchSession: () => {},\n deleteSession: () => {},\n addOptimisticMessage: () => {},\n abort: () => {},\n }),\n [],\n );\n\n return runner || placeholder;\n}\n\n// Hook to access the global state for use-agent\nexport function useAgentGlobalState() {\n const context = useContext(AgentContext);\n if (!context) {\n throw new Error(\"useAgentGlobalState must be used within AgentContextProvider\");\n }\n return {\n allSessions: context.allSessions,\n setAllSessions: context.setAllSessions,\n debugData: context.debugData,\n setDebugData: context.setDebugData,\n };\n}\n","import { useCallback, useRef, useState, useEffect } from \"react\";\nimport { EventSourceMessage, fetchEventSource } from \"@microsoft/fetch-event-source\";\n\nimport { DEFAULT_SESSION_NAME, TEMPORARY_SESSION_ID } from \"./constants\";\nimport { useSessionUtils } from \"./session-utils\";\nimport { createDebugHandlers } from \"./debug-handlers\";\nimport { useAgentGlobalState } from \"./agent-context\";\nimport type { Message, MessagePart, OutputStreamEventType, ClientToolDefinition } from \"./types\";\nimport { cleanSchema, tryParseJSON } from \"./utils/schema\";\nimport { updateAgentMessageParts } from \"./utils/message\";\n\nexport default function useAgent(agentId: string, agentUrl: string, accessKey?: string) {\n // Use global state from Context instead of Jotai atoms\n const { allSessions, setAllSessions, debugData, setDebugData } = useAgentGlobalState();\n\n const [inProgress, setInProgress] = useState(false);\n const [messages, setMessages] = useState<Array<Message>>([]);\n\n const messagesRef = useRef<Array<Message>>([]);\n\n // Initialize currentSessionId later after sessionUtils is available\n const [currentSessionId, setCurrentSessionId] = useState<string>(TEMPORARY_SESSION_ID);\n\n const sessionUtils = useSessionUtils(\n agentId,\n allSessions,\n setAllSessions,\n currentSessionId,\n setCurrentSessionId,\n messagesRef,\n );\n\n // Set initial session ID after sessionUtils is available\n useEffect(() => {\n const initialSessionId = sessionUtils.getInitialSessionId();\n setCurrentSessionId(initialSessionId);\n }, []);\n\n const debugHandlers = createDebugHandlers(setDebugData);\n\n // Keep messagesRef in sync with messages state\n useEffect(() => {\n messagesRef.current = messages;\n }, [messages]);\n\n // Initialize or load session\n useEffect(() => {\n // Don't reset messages if we're currently in progress (streaming)\n if (inProgress) {\n return;\n }\n\n const session = sessionUtils.agentSessions[currentSessionId];\n\n if (session) {\n setMessages(session.messages);\n } else {\n setMessages([]);\n }\n }, [currentSessionId, sessionUtils.agentSessions, agentId, inProgress]);\n\n // Only sync on unmount to prevent data loss\n useEffect(() => {\n return () => {\n if (messagesRef.current.length > 0 && sessionUtils.syncSessionRef.current) {\n sessionUtils.syncSessionRef.current();\n }\n };\n }, []);\n\n const controller = useRef<AbortController>();\n\n const runAgent = useCallback(\n async (\n input: string,\n options?: {\n context?: object;\n testBuildId?: string;\n additionalHeaders?: Record<string, string>;\n tools?: ClientToolDefinition[];\n clientTools?: ClientToolDefinition[];\n },\n ) => {\n setInProgress(true);\n // Abort any existing request before creating a new controller\n if (controller.current) {\n controller.current.abort();\n }\n controller.current = new AbortController();\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n ...(accessKey ? { Authorization: `Bearer ${accessKey}` } : {}),\n ...(options?.additionalHeaders || {}),\n };\n\n // Include session ID in headers if we have one\n if (currentSessionId) {\n headers[\"x-buildship-agent-session-id\"] = currentSessionId;\n }\n\n const body = {\n stream: true,\n input,\n context: options?.context || {},\n testBuildId: options?.testBuildId,\n tools: options?.tools?.map((t: { parameters: unknown }) => ({\n ...t,\n parameters: cleanSchema(t.parameters),\n })),\n clientTools: options?.clientTools?.map((t: { parameters: unknown }) => ({\n ...t,\n parameters: cleanSchema(t.parameters),\n })),\n };\n\n try {\n await fetchEventSource(agentUrl, {\n method: \"POST\",\n headers,\n signal: controller.current.signal,\n openWhenHidden: true,\n body: JSON.stringify(body),\n onopen: async (resp) => {\n // catch the 404 status\n if (resp.status >= 400) {\n console.log(`AI onopen error with status: ${resp.status}`);\n\n if (resp.status === 404) {\n // for resume operations with 404, throw a specific error for retry\n throw new Error(`Not Found (${resp.statusText})`);\n }\n\n throw new Error(`Error status ${resp.status}`);\n }\n\n // Extract session ID from response headers if we don't have one\n if (!currentSessionId || currentSessionId === TEMPORARY_SESSION_ID) {\n const sessionId = resp.headers.get(\"x-buildship-agent-session-id\");\n if (sessionId) {\n // Transfer current messages to the new session before switching\n const currentMessages = messagesRef.current;\n const sessionName =\n resp.headers.get(\"x-buildship-agent-session-name\") || DEFAULT_SESSION_NAME;\n\n sessionUtils.createSessionFromResponse(sessionId, sessionName, currentMessages);\n setCurrentSessionId(sessionId);\n }\n }\n\n // Extract execution ID from response headers and update the last user message\n const executionId = resp.headers.get(\"x-buildship-agent-execution-id\");\n if (executionId) {\n setMessages((prev) => {\n const lastMessage = prev[prev.length - 1];\n if (lastMessage?.role === \"user\") {\n const updatedMessage = {\n ...lastMessage,\n executionId: executionId,\n };\n const updatedMessages = [...prev.slice(0, -1), updatedMessage];\n\n // Sync updated user message\n if (sessionUtils.syncSessionRef.current) {\n sessionUtils.syncSessionRef.current(updatedMessages);\n }\n\n return updatedMessages;\n }\n return prev;\n });\n }\n },\n onmessage: (event: EventSourceMessage) => {\n try {\n const parsed = JSON.parse(event.data) as OutputStreamEventType;\n\n if (parsed.type === \"llm_text_delta\") {\n setMessages((prev) => {\n const lastMessage = prev[prev.length - 1];\n const sequence = parsed.meta.sequence;\n const newPart: MessagePart = {\n type: \"text\",\n text: parsed.data,\n firstSequence: sequence,\n lastSequence: sequence,\n };\n\n let updatedMessages: Message[];\n\n if (lastMessage?.role === \"agent\") {\n const updatedMessage: Message = {\n ...lastMessage,\n content: lastMessage.content + parsed.data, // content is still useful for simple displays\n parts: updateAgentMessageParts(lastMessage.parts || [], newPart),\n };\n updatedMessages = [...prev.slice(0, -1), updatedMessage];\n } else {\n const updatedMessage: Message = {\n role: \"agent\" as const,\n content: parsed.data,\n parts: [newPart],\n executionId: parsed.meta.executionId,\n };\n updatedMessages = [...prev, updatedMessage];\n }\n\n if (sessionUtils.syncSessionRef.current) {\n sessionUtils.syncSessionRef.current(updatedMessages);\n }\n\n return updatedMessages;\n });\n } else if (parsed.type === \"client_tool_call\") {\n setMessages((prev) => {\n const lastMessage = prev[prev.length - 1];\n const newPart: MessagePart = {\n type: \"widget\",\n toolName: parsed.data.toolName,\n callId: parsed.data.callId,\n inputs: tryParseJSON(parsed.data.inputs),\n sequence: parsed.meta.sequence,\n };\n\n let updatedMessages: Message[];\n\n if (lastMessage?.role === \"agent\") {\n const updatedMessage: Message = {\n ...lastMessage,\n parts: updateAgentMessageParts(lastMessage.parts || [], newPart),\n };\n updatedMessages = [...prev.slice(0, -1), updatedMessage];\n } else {\n const updatedMessage: Message = {\n role: \"agent\" as const,\n content: \"\",\n parts: [newPart],\n executionId: parsed.meta.executionId,\n };\n updatedMessages = [...prev, updatedMessage];\n }\n\n if (sessionUtils.syncSessionRef.current) {\n sessionUtils.syncSessionRef.current(updatedMessages);\n }\n\n return updatedMessages;\n });\n } else if (\n parsed.type.startsWith(\"debug_\") ||\n parsed.type === \"llm_reasoning_delta\" ||\n parsed.type === \"agent_handoff\" ||\n parsed.type === \"mcp_tool_call_start\" ||\n parsed.type === \"mcp_tool_call_end\"\n ) {\n debugHandlers.handleDebugEvent(parsed);\n }\n } catch (e) {\n console.log(\"Failed to parse agent message\", e);\n }\n },\n onclose: () => {\n console.log(\"Agent closed\");\n setInProgress(false);\n // Sync messages when streaming completes\n if (sessionUtils.syncSessionRef.current) {\n sessionUtils.syncSessionRef.current();\n }\n },\n onerror: (e) => {\n console.log(\"Agent error\", e);\n setInProgress(false);\n // Sync messages on error to prevent data loss\n if (sessionUtils.syncSessionRef.current) {\n sessionUtils.syncSessionRef.current(messagesRef.current);\n }\n throw new Error(\"Failed to execute agent\");\n },\n });\n } catch (error) {\n console.log(\"Agent execution failed\", error);\n setInProgress(false);\n // Sync messages on execution failure\n if (sessionUtils.syncSessionRef.current) {\n sessionUtils.syncSessionRef.current(messagesRef.current);\n }\n throw error;\n }\n },\n [agentUrl, accessKey, currentSessionId, sessionUtils, debugHandlers],\n );\n\n const handleSend = useCallback(\n async (\n input: string,\n options?: {\n context?: object;\n testBuildId?: string;\n skipUserMessage?: boolean;\n additionalHeaders?: Record<string, string>;\n tools?: ClientToolDefinition[];\n clientTools?: ClientToolDefinition[];\n },\n ) => {\n const userMessage = {\n role: \"user\" as const,\n content: input,\n executionId: Date.now().toString(),\n };\n\n // Only add user message if not skipping\n if (!options?.skipUserMessage) {\n setMessages((prev) => {\n const updatedMessages = [...prev, userMessage];\n // Sync immediately after user message\n if (sessionUtils.syncSessionRef.current) {\n sessionUtils.syncSessionRef.current(updatedMessages);\n }\n return updatedMessages;\n });\n }\n\n try {\n await runAgent(input, options);\n } catch (error) {\n // Ensure user message is preserved even if agent execution fails\n if (!options?.skipUserMessage) {\n setMessages((prev) => {\n const updatedMessages = prev.some((m) => m === userMessage)\n ? prev\n : [...prev, userMessage];\n if (sessionUtils.syncSessionRef.current) {\n sessionUtils.syncSessionRef.current(updatedMessages);\n }\n return updatedMessages;\n });\n }\n throw error;\n }\n },\n [runAgent, sessionUtils.syncSessionRef],\n );\n\n const addOptimisticMessage = useCallback(\n (input: string) => {\n const userMessage = {\n role: \"user\" as const,\n content: input,\n executionId: Date.now().toString(),\n };\n\n setMessages((prev) => {\n const updatedMessages = [...prev, userMessage];\n // Sync immediately after user message\n if (sessionUtils.syncSessionRef.current) {\n sessionUtils.syncSessionRef.current(updatedMessages);\n }\n return updatedMessages;\n });\n },\n [sessionUtils.syncSessionRef],\n );\n\n const abort = useCallback(() => {\n if (controller.current) {\n controller.current.abort();\n }\n setInProgress(false);\n // Sync messages to prevent data loss\n if (sessionUtils.syncSessionRef.current) {\n sessionUtils.syncSessionRef.current(messagesRef.current);\n }\n }, [sessionUtils.syncSessionRef]);\n\n return {\n inProgress,\n messages,\n handleSend,\n addOptimisticMessage,\n abort,\n sessionId: currentSessionId,\n switchSession: sessionUtils.switchSession,\n deleteSession: sessionUtils.deleteSession,\n sessions: sessionUtils.sessionsList,\n debugData,\n };\n}\n","export const AGENT_SESSIONS_KEY = \"buildship:agent:conversations\";\nexport const AGENT_DEBUG_DATA_KEY = \"buildship:agent:debug\";\n\nexport const DEFAULT_SESSION_NAME = \"New Chat\";\nexport const TEMPORARY_SESSION_ID = \"sess_temp\";\n","import { useCallback, useMemo, useRef } from \"react\";\nimport type { Message, Session } from \"./types\";\nimport { TEMPORARY_SESSION_ID } from \"./constants\";\n\nexport const useSessionUtils = (\n agentId: string,\n allSessions: Record<string, Record<string, Session>>,\n setAllSessions: (\n value:\n | Record<string, Record<string, Session>>\n | ((\n prev: Record<string, Record<string, Session>>,\n ) => Record<string, Record<string, Session>>),\n ) => void,\n currentSessionId: string,\n setCurrentSessionId: (sessionId: string) => void,\n messagesRef: React.MutableRefObject<Array<Message>>,\n) => {\n const agentSessions = useMemo(() => allSessions[agentId] || {}, [agentId, allSessions]);\n\n const syncSessionRef = useRef<(messages?: Array<Message>) => void>();\n\n syncSessionRef.current = (updatedMessages?: Array<Message>) => {\n if (!currentSessionId || currentSessionId === TEMPORARY_SESSION_ID) {\n return;\n }\n\n setAllSessions((prev) => ({\n ...prev,\n [agentId]: {\n ...prev[agentId],\n [currentSessionId]: {\n ...prev[agentId]?.[currentSessionId],\n messages: updatedMessages ?? messagesRef.current,\n updatedAt: Date.now(),\n },\n },\n }));\n };\n\n const getInitialSessionId = () => {\n const sessions = Object.values(agentSessions);\n if (sessions.length > 0) {\n return sessions.sort((a, b) => b.updatedAt - a.updatedAt)[0].id;\n }\n return TEMPORARY_SESSION_ID;\n };\n\n const switchSession = useCallback(\n (sessionId: string = TEMPORARY_SESSION_ID) => {\n setCurrentSessionId(sessionId);\n },\n [setCurrentSessionId],\n );\n\n const deleteSession = useCallback(\n (sessionId: string) => {\n if (!sessionId || sessionId === TEMPORARY_SESSION_ID) {\n return;\n }\n\n setAllSessions((prev) => {\n const updatedAgentSessions = { ...prev[agentId] };\n delete updatedAgentSessions[sessionId];\n\n return {\n ...prev,\n [agentId]: updatedAgentSessions,\n };\n });\n\n if (sessionId === currentSessionId) {\n const remainingSessions = Object.values(agentSessions).filter((s) => s.id !== sessionId);\n if (remainingSessions.length > 0) {\n const mostRecent = remainingSessions.sort((a, b) => b.updatedAt - a.updatedAt)[0];\n setCurrentSessionId(mostRecent.id);\n } else {\n setCurrentSessionId(TEMPORARY_SESSION_ID);\n }\n }\n },\n [agentId, currentSessionId, agentSessions, setAllSessions, setCurrentSessionId],\n );\n\n const sessionsList = useMemo(\n () => Object.values(agentSessions).sort((a, b) => b.updatedAt - a.updatedAt),\n [agentSessions],\n );\n\n const createSessionFromResponse = (\n sessionId: string,\n sessionName: string,\n currentMessages: Array<Message>,\n ) => {\n setAllSessions((prev) => ({\n ...prev,\n [agentId]: {\n ...prev[agentId],\n [sessionId]: {\n id: sessionId,\n createdAt: Date.now(),\n updatedAt: Date.now(),\n messages: currentMessages,\n name: sessionName,\n },\n },\n }));\n };\n\n return {\n agentSessions,\n syncSessionRef,\n getInitialSessionId,\n switchSession,\n deleteSession,\n sessionsList,\n createSessionFromResponse,\n };\n};\n","import type {\n AgentDebugEventType,\n AgentHandoffEventType,\n DebugDataType,\n LLMReasoningDeltaEventType,\n ReasoningItem,\n ToolExecutionItem,\n HandoffItem,\n MCPToolCallStartEventType,\n MCPToolCallEndEventType,\n MCPToolExecutionItem,\n} from \"./types\";\n\nexport const createDebugHandlers = (\n setDebugData: (\n value:\n | Record<string, DebugDataType>\n | ((prev: Record<string, DebugDataType>) => Record<string, DebugDataType>),\n ) => void,\n) => {\n const handleDebugToolExecutionStarted = (parsed: AgentDebugEventType) => {\n const executionId = parsed.meta.executionId;\n setDebugData((prev) => ({\n ...prev,\n [executionId]: [\n ...(prev[executionId] || []),\n {\n itemType: \"tool_call\",\n toolId: (parsed.data as { toolId?: string }).toolId || \"unknown\",\n toolCallId: (parsed.data as { toolCallId?: string }).toolCallId,\n status: \"progress\",\n },\n ],\n }));\n };\n\n const handleDebugToolExecutionInputs = (parsed: AgentDebugEventType) => {\n const executionId = parsed.meta.executionId;\n const toolCallId = (parsed.data as { toolCallId?: string }).toolCallId;\n setDebugData((prev) => {\n const currentData = [...(prev[executionId] || [])];\n\n for (let i = currentData.length - 1; i >= 0; i--) {\n if (currentData[i].itemType === \"tool_call\") {\n const toolItem = currentData[i] as ToolExecutionItem;\n if (toolItem.toolCallId === toolCallId) {\n currentData[i] = {\n ...toolItem,\n inputs: (parsed.data as { value: unknown }).value,\n };\n break;\n }\n }\n }\n\n return {\n ...prev,\n [executionId]: currentData,\n };\n });\n };\n\n const handleDebugToolExecutionFinished = (parsed: AgentDebugEventType) => {\n const executionId = parsed.meta.executionId;\n const toolCallId = (parsed.data as { toolCallId?: string }).toolCallId;\n setDebugData((prev) => {\n const currentData = [...(prev[executionId] || [])];\n\n for (let i = currentData.length - 1; i >= 0; i--) {\n if (currentData[i].itemType === \"tool_call\") {\n const toolItem = currentData[i] as ToolExecutionItem;\n if (toolItem.toolCallId === toolCallId) {\n currentData[i] = {\n ...toolItem,\n status: \"complete\",\n output: (parsed.data as { value: unknown }).value,\n };\n break;\n }\n }\n }\n\n return {\n ...prev,\n [executionId]: currentData,\n };\n });\n };\n\n const handleDebugToolExecutionError = (parsed: AgentDebugEventType) => {\n const executionId = parsed.meta.executionId;\n const toolCallId = (parsed.data as { toolCallId?: string }).toolCallId;\n setDebugData((prev) => {\n const currentData = [...(prev[executionId] || [])];\n\n for (let i = currentData.length - 1; i >= 0; i--) {\n if (currentData[i].itemType === \"tool_call\") {\n const toolItem = currentData[i] as ToolExecutionItem;\n if (toolItem.toolCallId === toolCallId) {\n currentData[i] = {\n ...toolItem,\n status: \"error\",\n output: (parsed.data as { value: unknown }).value,\n };\n break;\n }\n }\n }\n\n return {\n ...prev,\n [executionId]: currentData,\n };\n });\n };\n\n const handleDebugToolLog = (parsed: AgentDebugEventType) => {\n const executionId = parsed.meta.executionId;\n const toolCallId = (parsed.data as { toolCallId?: string }).toolCallId;\n setDebugData((prev) => {\n const currentData = [...(prev[executionId] || [])];\n\n for (let i = currentData.length - 1; i >= 0; i--) {\n if (currentData[i].itemType === \"tool_call\") {\n const toolItem = currentData[i] as ToolExecutionItem;\n if (toolItem.toolCallId === toolCallId) {\n const currentLogs = toolItem.logs || [];\n currentData[i] = {\n ...toolItem,\n logs: [...currentLogs, (parsed.data as { value: unknown[] }).value[0]],\n };\n break;\n }\n }\n }\n\n return {\n ...prev,\n [executionId]: currentData,\n };\n });\n };\n\n let lastReasoningIndex = -1;\n const handleDebugReasoningStep = (parsed: LLMReasoningDeltaEventType) => {\n const executionId = parsed.meta.executionId;\n const { delta, index } = parsed.data;\n setDebugData((prev) => {\n const currentData = [...(prev[executionId] || [])];\n\n if (lastReasoningIndex < index) {\n currentData.push({ itemType: \"reasoning\", reasoning: \"\" });\n lastReasoningIndex = index;\n }\n\n for (let i = currentData.length - 1; i >= 0; i--) {\n if (currentData[i].itemType === \"reasoning\") {\n currentData[i] = {\n itemType: \"reasoning\",\n reasoning: (currentData[i] as ReasoningItem).reasoning + delta,\n };\n break;\n }\n }\n\n return {\n ...prev,\n [executionId]: currentData,\n };\n });\n };\n\n const handleAgentHandoff = (parsed: AgentHandoffEventType) => {\n const executionId = parsed.meta.executionId;\n setDebugData((prev) => ({\n ...prev,\n [executionId]: [\n ...(prev[executionId] || []),\n {\n itemType: \"handoff\",\n agentName: parsed.data.agentName,\n } as HandoffItem,\n ],\n }));\n };\n\n const handleMCPToolCallStart = (parsed: MCPToolCallStartEventType) => {\n const executionId = parsed.meta.executionId;\n setDebugData((prev) => ({\n ...prev,\n [executionId]: [\n ...(prev[executionId] || []),\n {\n itemType: \"mcp_tool_call\",\n toolName: parsed.data.toolName,\n serverName: parsed.data.serverName,\n callId: parsed.data.callId,\n status: \"progress\",\n inputs: parsed.data.inputs,\n } as MCPToolExecutionItem,\n ],\n }));\n };\n\n const handleMCPToolCallEnd = (parsed: MCPToolCallEndEventType) => {\n const executionId = parsed.meta.executionId;\n const callId = parsed.data.callId;\n setDebugData((prev) => {\n const currentData = [...(prev[executionId] || [])];\n\n for (let i = currentData.length - 1; i >= 0; i--) {\n if (currentData[i].itemType === \"mcp_tool_call\") {\n const mcpToolItem = currentData[i] as MCPToolExecutionItem;\n if (mcpToolItem.callId === callId) {\n currentData[i] = {\n ...mcpToolItem,\n status: parsed.data.error ? \"error\" : \"complete\",\n output: parsed.data.result,\n error: parsed.data.error,\n };\n break;\n }\n }\n }\n\n return {\n ...prev,\n [executionId]: currentData,\n };\n });\n };\n\n const handleDebugEvent = (\n parsed:\n | AgentDebugEventType\n | LLMReasoningDeltaEventType\n | AgentHandoffEventType\n | MCPToolCallStartEventType\n | MCPToolCallEndEventType,\n ) => {\n switch (parsed.type) {\n case \"debug_tool_execution_started\":\n handleDebugToolExecutionStarted(parsed);\n break;\n case \"debug_tool_execution_inputs\":\n handleDebugToolExecutionInputs(parsed);\n break;\n case \"debug_tool_execution_finished\":\n handleDebugToolExecutionFinished(parsed);\n break;\n case \"debug_tool_execution_error\":\n handleDebugToolExecutionError(parsed);\n break;\n case \"debug_tool_log\":\n handleDebugToolLog(parsed);\n break;\n case \"llm_reasoning_delta\":\n handleDebugReasoningStep(parsed);\n break;\n case \"agent_handoff\":\n handleAgentHandoff(parsed);\n break;\n case \"mcp_tool_call_start\":\n handleMCPToolCallStart(parsed);\n break;\n case \"mcp_tool_call_end\":\n handleMCPToolCallEnd(parsed);\n break;\n }\n };\n\n return {\n handleDebugEvent,\n };\n};\n","/**\n * Helper to clean JSON Schema for LLM compatibility.\n * Replaces modern Draft 2020-12 features with older, more compatible alternatives.\n * Specifically handles OpenAI's 'Strict Mode' requirements.\n */\nexport function cleanSchema(obj: unknown): unknown {\n if (Array.isArray(obj)) {\n return obj.map(cleanSchema);\n } else if (obj !== null && typeof obj === \"object\") {\n const newObj: Record<string, unknown> = {};\n const currentObj = obj as Record<string, any>;\n\n for (const key in currentObj) {\n // Remove keys that are not supported by most LLMs\n if (key === \"propertyNames\" || key === \"$schema\") {\n continue;\n }\n newObj[key] = cleanSchema(currentObj[key]);\n }\n\n // OpenAI and some other LLMs require additionalProperties: false for all objects in strict mode\n // AND every property must be explicitly listed in the 'required' array\n if (newObj.type === \"object\") {\n if (\n newObj.additionalProperties === undefined ||\n (newObj.additionalProperties &&\n typeof newObj.additionalProperties === \"object\" &&\n Object.keys(newObj.additionalProperties).length === 0)\n ) {\n newObj.additionalProperties = false;\n }\n\n if (newObj.additionalProperties === false && newObj.properties) {\n newObj.required = Object.keys(newObj.properties as object);\n }\n }\n\n return newObj;\n }\n return obj;\n}\n\n/**\n * Safely attempts to parse a value as JSON if it's a string.\n */\nexport function tryParseJSON(value: unknown): any {\n if (typeof value === \"string\") {\n try {\n return JSON.parse(value);\n } catch {\n return value;\n }\n }\n return value;\n}\n","import type { MessagePart } from \"../types\";\n\n/**\n * Updates a list of message parts with a new part,\n * ensuring chronological order by sequence and merging contiguous text deltas.\n */\nexport function updateAgentMessageParts(parts: MessagePart[], newPart: MessagePart): MessagePart[] {\n // 1. Combine and sort all parts by their sequence ID\n const sorted = [...parts, newPart].sort((a, b) => {\n const aStart = a.type === \"text\" ? a.firstSequence : a.sequence;\n const bStart = b.type === \"text\" ? b.firstSequence : b.sequence;\n return aStart - bStart;\n });\n\n // 2. Reduce the sorted parts to merge contiguous text blocks\n return sorted.reduce<MessagePart[]>((acc, current) => {\n const last = acc[acc.length - 1];\n\n // Check if we can merge this text part with the previous one\n const canMerge =\n last?.type === \"text\" &&\n current.type === \"text\" &&\n current.firstSequence === last.lastSequence + 1;\n\n if (canMerge) {\n acc[acc.length - 1] = {\n ...last,\n text: last.text + current.text,\n lastSequence: current.lastSequence,\n };\n return acc;\n }\n\n acc.push(current);\n return acc;\n }, []);\n}\n","import { useState, useEffect, useCallback } from \"react\";\n\n// Helper to handle JSON parsing cleanly\nfunction parseJSON<T>(value: string | null, defaultValue: T): T {\n if (value === null) return defaultValue;\n try {\n return JSON.parse(value);\n } catch {\n return defaultValue;\n }\n}\n\nexport function useSyncedLocalStorage<T>(\n key: string,\n initialValue: T,\n): [T, (value: T | ((val: T) => T)) => void] {\n // Initialize state function to avoid reading localStorage on every render\n const [storedValue, setStoredValue] = useState<T>(() => {\n if (typeof window === \"undefined\") {\n return initialValue;\n }\n try {\n const item = window.localStorage.getItem(key);\n return parseJSON(item, initialValue);\n } catch (error) {\n console.warn(`Error reading localStorage key \"${key}\":`, error);\n return initialValue;\n }\n });\n\n // Function to update state and localStorage\n const setValue = useCallback(\n (value: T | ((val: T) => T)) => {\n try {\n setStoredValue((prev) => {\n const valueToStore = value instanceof Function ? value(prev) : value;\n\n if (typeof window !== \"undefined\") {\n window.localStorage.setItem(key, JSON.stringify(valueToStore));\n // Dispatch a custom event so other hooks in the same window update\n window.dispatchEvent(\n new StorageEvent(\"storage\", { key, newValue: JSON.stringify(valueToStore) }),\n );\n }\n return valueToStore;\n });\n } catch (error) {\n console.warn(`Error setting localStorage key \"${key}\":`, error);\n }\n },\n [key],\n );\n\n // Sync across tabs/windows and within the same window\n useEffect(() => {\n const handleStorageChange = (event: StorageEvent) => {\n if (event.key === key) {\n setStoredValue(parseJSON(event.newValue, initialValue));\n }\n };\n\n window.addEventListener(\"storage\", handleStorageChange);\n return () => window.removeEventListener(\"storage\", handleStorageChange);\n }, [key, initialValue]);\n\n return [storedValue, setValue];\n}\n"],"mappings":"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","names":["useCallback","useRef","useState","useEffect","useMemo","useCallback","useRef","useRef","useCallback","useState","useEffect","useCallback","useRef","useState","useCallback","useMemo","useEffect"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bs-agent",
3
- "version": "0.0.5",
3
+ "version": "0.0.7",
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",