@hastekit/hastekit-converse 0.0.17 → 0.0.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -297,8 +297,15 @@ class ChunkProcessor {
297
297
  if (!this.currentOutputItem || this.currentOutputItem.type !== "reasoning")
298
298
  return;
299
299
  const reasoning = this.currentOutputItem;
300
+ reasoning.summary = reasoning.summary || [];
300
301
  const summaries = reasoning.summary;
301
- if (!summaries?.length || !chunk.delta)
302
+ if (summaries.length === 0) {
303
+ reasoning.summary.push({
304
+ type: exports.ContentType.SummaryText,
305
+ text: "",
306
+ });
307
+ }
308
+ if (!chunk.delta)
302
309
  return;
303
310
  const lastSummary = summaries[summaries.length - 1];
304
311
  if (lastSummary) {
@@ -402,7 +409,7 @@ async function streamSSE(url, requestOptions, callbacks, abortSignal) {
402
409
  }
403
410
 
404
411
  function useProject(options) {
405
- const { projectName, baseUrl, getHeaders, autoLoad = true } = options;
412
+ const { projectName, baseUrl, orgId, getHeaders, autoLoad = true } = options;
406
413
  // Project state
407
414
  const [projectId, setProjectId] = react.useState('');
408
415
  const [projectLoading, setProjectLoading] = react.useState(false);
@@ -412,6 +419,17 @@ function useProject(options) {
412
419
  react.useEffect(() => {
413
420
  projectIdRef.current = projectId;
414
421
  }, [projectId]);
422
+ // ── Clear stale projectId synchronously during render when projectName changes ──
423
+ // When the org switches, ProjectContext clears selectedProject (during render),
424
+ // causing projectName to become ''. Without this guard, downstream consumers
425
+ // (useConversation, ChatPage, etc.) would still see the OLD projectId in their
426
+ // effects, firing API calls with a stale project_id or without one entirely.
427
+ const prevProjectNameRef = react.useRef(undefined);
428
+ if (prevProjectNameRef.current !== undefined && projectName !== prevProjectNameRef.current) {
429
+ setProjectId('');
430
+ projectIdRef.current = '';
431
+ }
432
+ prevProjectNameRef.current = projectName;
415
433
  // Create axios instance with request interceptor for custom headers and project_id
416
434
  const axiosInstance = react.useMemo(() => {
417
435
  const instance = axios.create({
@@ -420,8 +438,12 @@ function useProject(options) {
420
438
  'Content-Type': 'application/json',
421
439
  },
422
440
  });
423
- // Add request interceptor to inject custom headers and project_id
441
+ // Add request interceptor to inject custom headers, org_id, and project_id
424
442
  instance.interceptors.request.use(async (config) => {
443
+ // Add org ID header if provided
444
+ if (orgId) {
445
+ config.headers.set('X-Org-ID', orgId);
446
+ }
425
447
  // Add custom headers if getHeaders function is provided
426
448
  if (getHeaders) {
427
449
  const customHeaders = await getHeaders();
@@ -443,7 +465,7 @@ function useProject(options) {
443
465
  return config;
444
466
  });
445
467
  return instance;
446
- }, [baseUrl, getHeaders]);
468
+ }, [baseUrl, orgId, getHeaders]);
447
469
  // ============================================
448
470
  // API Helper Functions
449
471
  // ============================================
@@ -454,19 +476,23 @@ function useProject(options) {
454
476
  return params || {};
455
477
  }, []);
456
478
  /**
457
- * Get headers for streaming requests (combines default + custom headers)
479
+ * Get headers for streaming requests (combines default + custom + org headers)
458
480
  */
459
481
  const getRequestHeaders = react.useCallback(async () => {
460
482
  const headers = {
461
483
  'Content-Type': 'application/json',
462
484
  };
485
+ // Add org ID header if provided
486
+ if (orgId) {
487
+ headers['X-Org-ID'] = orgId;
488
+ }
463
489
  // Add custom headers if getHeaders function is provided
464
490
  if (getHeaders) {
465
491
  const customHeaders = await getHeaders();
466
492
  Object.assign(headers, customHeaders);
467
493
  }
468
494
  return headers;
469
- }, [getHeaders]);
495
+ }, [orgId, getHeaders]);
470
496
  // ============================================
471
497
  // Project Management
472
498
  // ============================================
@@ -496,7 +522,7 @@ function useProject(options) {
496
522
  // ============================================
497
523
  // Effects for auto-loading
498
524
  // ============================================
499
- // Fetch project ID on mount
525
+ // Fetch project ID when projectName changes (or on mount)
500
526
  react.useEffect(() => {
501
527
  if (autoLoad && projectName) {
502
528
  fetchProjectId();
@@ -551,11 +577,12 @@ const ProjectContext = react.createContext(undefined);
551
577
  * }
552
578
  * ```
553
579
  */
554
- const ProjectProvider = ({ baseUrl, projectName, getHeaders, autoLoad = true, children, }) => {
580
+ const ProjectProvider = ({ baseUrl, projectName, orgId, getHeaders, autoLoad = true, children, }) => {
555
581
  // Use the useProject hook to manage project state
556
582
  const projectState = useProject({
557
583
  baseUrl,
558
584
  projectName,
585
+ orgId,
559
586
  getHeaders,
560
587
  autoLoad,
561
588
  });
@@ -662,7 +689,6 @@ function useConversation(options) {
662
689
  // Current selection
663
690
  const [currentConversationId, setCurrentConversationId] = react.useState(null);
664
691
  const [currentThreadId, setCurrentThreadId] = react.useState(null);
665
- const [previousMessageId, setPreviousMessageId] = react.useState('');
666
692
  // Refs
667
693
  const processorRef = react.useRef(null);
668
694
  const abortControllerRef = react.useRef(null);
@@ -749,14 +775,13 @@ function useConversation(options) {
749
775
  params: buildParams({ thread_id: threadId, namespace }),
750
776
  });
751
777
  const loadedMessages = 'data' in response.data ? response.data.data : response.data;
752
- // Extract last message ID for continuation
753
- if (loadedMessages.length > 0) {
754
- const lastMsgId = loadedMessages[loadedMessages.length - 1].message_id;
755
- setPreviousMessageId(lastMsgId);
756
- }
757
- else {
758
- setPreviousMessageId('');
759
- }
778
+ // // Extract last message ID for continuation
779
+ // if (loadedMessages.length > 0) {
780
+ // const lastMsgId = loadedMessages[loadedMessages.length - 1].message_id;
781
+ // setPreviousMessageId(lastMsgId);
782
+ // } else {
783
+ // setPreviousMessageId('');
784
+ // }
760
785
  setMessages(loadedMessages);
761
786
  }
762
787
  catch (error) {
@@ -806,7 +831,7 @@ function useConversation(options) {
806
831
  // Prepare request body
807
832
  const body = JSON.stringify({
808
833
  namespace: config.namespace,
809
- previous_message_id: previousMessageId,
834
+ thread_id: currentThreadId,
810
835
  message: userMessages[0],
811
836
  context: config.context || {},
812
837
  });
@@ -853,7 +878,7 @@ function useConversation(options) {
853
878
  setMessages(prev => [...prev, { ...finalConversation, isStreaming: false }]);
854
879
  }
855
880
  setStreamingMessage(null);
856
- setPreviousMessageId(finalConversation.message_id);
881
+ // setPreviousMessageId(finalConversation.message_id);
857
882
  }
858
883
  },
859
884
  onError: (error) => {
@@ -862,7 +887,7 @@ function useConversation(options) {
862
887
  },
863
888
  }, abortControllerRef.current.signal);
864
889
  // If this was a new conversation, fetch the conversation info
865
- if (previousMessageId === '' && processorRef.current) {
890
+ if (!currentThreadId || currentThreadId === '' && processorRef.current) {
866
891
  try {
867
892
  const response = await axiosInstance.get(`/messages/${processorRef.current.getConversation().message_id}`, { params: buildParams({ namespace }) });
868
893
  const messageData = 'data' in response.data ? response.data.data : response.data;
@@ -888,7 +913,7 @@ function useConversation(options) {
888
913
  setIsStreaming(false);
889
914
  abortControllerRef.current = null;
890
915
  }
891
- }, [currentConversationId, currentThreadId, previousMessageId, namespace, baseUrl, projectId, axiosInstance, buildParams, getRequestHeaders]);
916
+ }, [currentConversationId, currentThreadId, namespace, baseUrl, projectId, axiosInstance, buildParams, getRequestHeaders]);
892
917
  // ============================================
893
918
  // Utility Actions
894
919
  // ============================================
@@ -906,7 +931,6 @@ function useConversation(options) {
906
931
  setThreads([]);
907
932
  setMessages([]);
908
933
  setStreamingMessage(null);
909
- setPreviousMessageId('');
910
934
  setIsStreaming(false);
911
935
  setIsThinking(false);
912
936
  processorRef.current = null;
@@ -914,6 +938,22 @@ function useConversation(options) {
914
938
  // ============================================
915
939
  // Effects for auto-loading
916
940
  // ============================================
941
+ // Clear stale conversation state when project changes (e.g., org switch).
942
+ // This runs before the loading effect below (effects execute in declaration
943
+ // order) and ensures we never show data from a previous project/org.
944
+ react.useEffect(() => {
945
+ setConversations([]);
946
+ setThreads([]);
947
+ setMessages([]);
948
+ setStreamingMessage(null);
949
+ setCurrentConversationId(null);
950
+ setCurrentThreadId(null);
951
+ if (abortControllerRef.current) {
952
+ abortControllerRef.current.abort();
953
+ abortControllerRef.current = null;
954
+ }
955
+ processorRef.current = null;
956
+ }, [projectId]);
917
957
  // Load conversations after project ID is fetched
918
958
  react.useEffect(() => {
919
959
  if (autoLoad && projectId) {
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../src/types.ts","../src/streaming/ChunkProcessor.ts","../src/streaming/streamSSE.ts","../src/hooks/useProject.tsx","../src/ProjectProvider/index.tsx","../src/hooks/useConversation.ts","../src/hooks/useAgent.ts"],"sourcesContent":["export interface Agent {\n id: string;\n agent_id: string;\n name: string;\n version: number;\n}\n\n// Message Roles\nexport enum Role {\n User = \"user\",\n Developer = \"developer\",\n System = \"system\",\n Assistant = \"assistant\",\n}\n\n// Message Types\nexport enum MessageType {\n Message = \"message\",\n FunctionCall = \"function_call\",\n FunctionCallOutput = \"function_call_output\",\n Reasoning = \"reasoning\",\n ImageGenerationCall = \"image_generation_call\",\n FunctionCallApprovalResponse = \"function_call_approval_response\",\n}\n\n// Content Types\nexport enum ContentType {\n InputText = \"input_text\",\n OutputText = \"output_text\",\n SummaryText = \"summary_text\",\n InputImage = \"input_image\",\n}\n\n// Chunk Types\nexport enum ChunkType {\n ChunkTypeRunCreated = \"run.created\",\n ChunkTypeRunInProgress = \"run.in_progress\",\n ChunkTypeRunPaused = \"run.paused\",\n ChunkTypeRunCompleted = \"run.completed\",\n ChunkTypeResponseCreated = \"response.created\",\n ChunkTypeResponseInProgress = \"response.in_progress\",\n ChunkTypeResponseCompleted = \"response.completed\",\n ChunkTypeOutputItemAdded = \"response.output_item.added\",\n ChunkTypeOutputItemDone = \"response.output_item.done\",\n ChunkTypeContentPartAdded = \"response.content_part.added\",\n ChunkTypeContentPartDone = \"response.content_part.done\",\n ChunkTypeOutputTextDelta = \"response.output_text.delta\",\n ChunkTypeOutputTextDone = \"response.output_text.done\",\n ChunkTypeFunctionCallArgumentsDelta = \"response.function_call_arguments.delta\",\n ChunkTypeFunctionCallArgumentsDone = \"response.function_call_arguments.done\",\n ChunkTypeReasoningSummaryPartAdded = \"response.reasoning_summary_part.added\",\n ChunkTypeReasoningSummaryPartDone = \"response.reasoning_summary_part.done\",\n ChunkTypeReasoningSummaryTextDelta = \"response.reasoning_summary_text.delta\",\n ChunkTypeReasoningSummaryTextDone = \"response.reasoning_summary_text.done\",\n\n // Image generation\n ChunkTypeImageGenerationCallInProgress = \"response.image_generation_call.in_progress\",\n ChunkTypeImageGenerationCallGenerating = \"response.image_generation_call.generating\",\n ChunkTypeImageGenerationCallPartialImage = \"response.image_generation_call.partial_image\",\n\n // Extra\n ChunkTypeFunctionCallOutput = \"function_call_output\",\n}\n\n/**\n * Represents a conversation container\n */\nexport interface Conversation {\n namespace_id: string;\n conversation_id: string;\n name: string;\n created_at: string;\n last_updated: string;\n}\n\n/**\n * Represents a thread within a conversation\n */\nexport interface Thread {\n conversation_id: string;\n origin_message_id: string;\n thread_id: string;\n meta: Record<string, any>;\n created_at: string;\n last_updated: string;\n}\n\n/**\n * Represents a message within a conversation thread\n */\nexport interface ConversationMessage {\n conversation_id: string;\n thread_id: string;\n message_id: string;\n messages: MessageUnion[];\n meta: Record<string, any>;\n isStreaming?: boolean;\n}\n\n// Message union type - discriminated by 'type' field\nexport type MessageUnion =\n | EasyMessage\n | InputMessage\n | OutputMessage\n | FunctionCallMessage\n | FunctionCallApprovalResponseMessage\n | FunctionCallOutputMessage\n | ReasoningMessage\n | ImageGenerationCallMessage;\n\nexport interface EasyMessage {\n type: MessageType.Message;\n id: string;\n role?: Role;\n content: EasyInputContentUnion;\n}\n\nexport interface InputMessage {\n type: MessageType.Message;\n id?: string;\n role?: Role;\n content?: InputContentUnion[];\n}\n\nexport interface OutputMessage {\n id: string;\n type?: MessageType.Message;\n role?: Role;\n content?: OutputContentUnion[];\n}\n\nexport interface FunctionCallMessage {\n type: MessageType.FunctionCall;\n id: string;\n call_id?: string;\n name: string;\n arguments: string;\n}\n\nexport interface FunctionCallApprovalResponseMessage {\n type: MessageType.FunctionCallApprovalResponse;\n id: string;\n approved_call_ids: string[];\n rejected_call_ids: string[];\n}\n\nexport interface FunctionCallOutputMessage {\n type: MessageType.FunctionCallOutput;\n id: string;\n call_id: string;\n output: FunctionCallOutputContentUnion;\n}\n\nexport interface ReasoningMessage {\n type: MessageType.Reasoning;\n id: string;\n summary?: SummaryTextContent[];\n encrypted_content?: string;\n}\n\nexport interface ImageGenerationCallMessage {\n type: MessageType.ImageGenerationCall;\n id: string;\n status: string;\n background: string;\n output_format: string;\n quality: string;\n size: string;\n result: string;\n}\n\n// Content Unions\nexport type EasyInputContentUnion = string | InputContentUnion;\nexport type InputContentUnion = InputTextContent | OutputTextContent | InputImageContent;\nexport type FunctionCallOutputContentUnion = string | InputContentUnion;\nexport type OutputContentUnion =\n | OutputTextContent\n | FunctionCallMessage\n | SummaryTextContent;\n\n// Content types\nexport interface InputTextContent {\n type: ContentType.InputText;\n text: string;\n}\n\nexport interface OutputTextContent {\n type: ContentType.OutputText;\n text: string;\n}\n\nexport interface SummaryTextContent {\n type: ContentType.SummaryText;\n text: string;\n}\n\nexport interface InputImageContent {\n type: ContentType.InputImage;\n image_url: string;\n detail: string;\n}\n\n/**\n * Configuration for the converse API endpoint\n */\nexport interface ConverseConfig {\n namespace: string;\n agentId: string;\n baseUrl?: string;\n context?: Record<string, unknown>;\n headers?: Record<string, string>;\n}\n\n// Streaming chunk types\nexport interface ResponseChunk {\n type: ChunkType;\n sequence_number: number;\n\n // Only on run items\n run_state?: ChunkRunData;\n\n // Only on response items\n response?: ChunkResponseData;\n\n // On non-run and non-response items\n output_index?: number;\n\n // Only on output_item\n item?: ChunkOutputItemData;\n\n // Only on content_part and delta\n item_id?: string;\n content_index?: number;\n\n // Only on content_part\n part?: OutputContentUnion;\n\n // Only on output_text delta/done\n delta?: string;\n text?: string;\n\n // Only on function_call arguments delta/done\n arguments?: string;\n\n // Only on reasoning summary part/delta/done\n summary_index?: number;\n\n // Only on function_call_output\n output: string;\n\n // Only on image_generation_call.partial_image\n partial_image_index?: number;\n partial_image_b64?: string;\n background?: string;\n output_format?: string;\n quality?: string;\n size?: string;\n status?: string;\n}\n\nexport interface ChunkRunData {\n id: string;\n object: \"run\";\n status: \"created\" | \"in_progress\" | \"paused\" | \"resumed\" | \"completed\" | \"aborted\";\n pending_tool_calls: FunctionCallMessage[];\n usage: ChunkResponseUsage;\n traceid: string;\n}\n\nexport interface ChunkResponseData {\n id: string;\n object: string;\n created_at: number;\n status: string;\n background: boolean;\n error: unknown;\n incomplete_details: unknown;\n output: OutputMessageUnion[];\n usage: ChunkResponseUsage;\n}\n\nexport interface ChunkOutputItemData {\n type: string; // \"function_call\", \"message\", \"reasoning\"\n\n // Common fields\n id: string;\n status: string;\n\n // For output_item of type \"message\"\n content: OutputContentUnion[];\n role: Role;\n\n // For output_item of type \"function_call\"\n call_id?: string;\n name?: string;\n arguments?: string;\n\n // For \"reasoning\"\n encrypted_content?: string;\n summary?: OutputContentUnion[];\n\n // For output_item of type \"image_generation_call\"\n background?: string;\n output_format?: string;\n quality?: string;\n result?: string;\n size?: string;\n}\n\nexport type OutputMessageUnion =\n | (OutputMessage & { id: string })\n | (FunctionCallMessage & { id: string })\n | (ReasoningMessage & { id: string })\n | (ImageGenerationCallMessage & { id: string });\n\nexport interface ChunkResponseUsage {\n input_tokens: number;\n input_tokens_details: {\n cached_tokens: number;\n };\n output_tokens: number;\n output_tokens_details: {\n reasoning_tokens: number;\n };\n total_tokens: number;\n}\n\nexport interface Usage {\n input_tokens: number;\n output_tokens: number;\n total_tokens: number;\n input_tokens_details: {\n cached_tokens: number;\n };\n output_tokens_details: {\n reasoning_tokens: number;\n };\n}\n\n// Type guards\nexport function isEasyMessage(msg: MessageUnion): msg is EasyMessage {\n return msg.type === MessageType.Message && 'content' in msg && (typeof msg.content === 'string' || Array.isArray(msg.content));\n}\n\nexport function isInputMessage(msg: MessageUnion): msg is InputMessage {\n return msg.type === MessageType.Message && 'content' in msg && Array.isArray(msg.content);\n}\n\nexport function isFunctionCallMessage(msg: MessageUnion): msg is FunctionCallMessage {\n return msg.type === MessageType.FunctionCall;\n}\n\nexport function isFunctionCallOutputMessage(msg: MessageUnion): msg is FunctionCallOutputMessage {\n return msg.type === MessageType.FunctionCallOutput;\n}\n\nexport function isReasoningMessage(msg: MessageUnion): msg is ReasoningMessage {\n return msg.type === MessageType.Reasoning;\n}\n\nexport function isImageGenerationCallMessage(msg: MessageUnion): msg is ImageGenerationCallMessage {\n return msg.type === MessageType.ImageGenerationCall;\n}\n","import {\n ChunkType,\n ContentType,\n ConversationMessage,\n FunctionCallMessage,\n FunctionCallOutputMessage,\n ImageGenerationCallMessage,\n InputMessage,\n MessageUnion,\n ReasoningMessage,\n ResponseChunk,\n} from '../types';\n\n/**\n * Callback invoked when the conversation state changes\n */\nexport type OnChangeCallback = (conversation: ConversationMessage) => void;\n\n/**\n * Processes streaming chunks from the LLM response.\n * Builds up messages incrementally as chunks arrive.\n *\n * @example\n * ```ts\n * const processor = new ChunkProcessor(\n * 'conv-123',\n * 'thread-456',\n * (conversation) => {\n * // Update UI with new conversation state\n * setConversation(conversation);\n * }\n * );\n *\n * // Process incoming chunks\n * processor.processChunk(jsonData);\n *\n * // Get final conversation when done\n * const finalConversation = processor.getConversation();\n * ```\n */\nexport class ChunkProcessor {\n private messages: MessageUnion[] = [];\n private currentOutputItem: MessageUnion | null = null;\n private _onChange: OnChangeCallback;\n private conversation: ConversationMessage;\n\n constructor(\n conversationId: string,\n threadId: string,\n onChange: OnChangeCallback\n ) {\n this.conversation = {\n conversation_id: conversationId,\n thread_id: threadId,\n message_id: '',\n messages: [],\n meta: {},\n };\n this._onChange = onChange;\n }\n\n /**\n * Get all processed messages\n */\n getMessages(): MessageUnion[] {\n return this.messages;\n }\n\n /**\n * Get the current conversation state\n */\n getConversation(): ConversationMessage {\n return this.conversation;\n }\n\n private emitChange(): void {\n this.conversation.messages = [...this.messages];\n this._onChange({ ...this.conversation });\n }\n\n /**\n * Process a raw JSON chunk from the SSE stream\n */\n processChunk(data: string): void {\n try {\n const chunk: ResponseChunk = JSON.parse(data);\n this.handleChunk(chunk);\n } catch (e) {\n console.error('Failed to parse chunk:', e, data);\n }\n }\n\n private handleChunk(chunk: ResponseChunk): void {\n switch (chunk.type) {\n // Run lifecycle\n case ChunkType.ChunkTypeRunCreated:\n case ChunkType.ChunkTypeRunInProgress:\n case ChunkType.ChunkTypeRunCompleted:\n case ChunkType.ChunkTypeRunPaused:\n this.conversation.meta.run_state = chunk.run_state;\n this.conversation.message_id = chunk.run_state!.id;\n if (chunk.type !== ChunkType.ChunkTypeRunCreated && chunk.type !== ChunkType.ChunkTypeRunInProgress) {\n this.emitChange();\n }\n break;\n\n // Response lifecycle\n case ChunkType.ChunkTypeResponseCreated:\n case ChunkType.ChunkTypeResponseInProgress:\n break;\n\n case ChunkType.ChunkTypeResponseCompleted:\n if (chunk.response?.usage) {\n this.conversation.meta.usage = chunk.response.usage;\n this.emitChange();\n }\n break;\n\n // Output item lifecycle\n case ChunkType.ChunkTypeOutputItemAdded:\n this.handleOutputItemAdded(chunk);\n break;\n\n case ChunkType.ChunkTypeOutputItemDone:\n break;\n\n // Content parts\n case ChunkType.ChunkTypeContentPartAdded:\n this.handleContentPartAdded(chunk);\n break;\n\n case ChunkType.ChunkTypeContentPartDone:\n break;\n\n // Text deltas\n case ChunkType.ChunkTypeOutputTextDelta:\n this.handleOutputTextDelta(chunk);\n break;\n\n case ChunkType.ChunkTypeOutputTextDone:\n break;\n\n // Reasoning summary\n case ChunkType.ChunkTypeReasoningSummaryPartAdded:\n this.handleReasoningSummaryPartAdded(chunk);\n break;\n\n case ChunkType.ChunkTypeReasoningSummaryPartDone:\n break;\n\n case ChunkType.ChunkTypeReasoningSummaryTextDelta:\n this.handleReasoningSummaryTextDelta(chunk);\n break;\n\n case ChunkType.ChunkTypeReasoningSummaryTextDone:\n break;\n\n // Function calls\n case ChunkType.ChunkTypeFunctionCallArgumentsDelta:\n this.handleFunctionCallArgumentsDelta(chunk);\n break;\n\n case ChunkType.ChunkTypeFunctionCallArgumentsDone:\n break;\n\n case ChunkType.ChunkTypeFunctionCallOutput:\n this.handleFunctionCallOutput(chunk);\n break;\n\n // Image Generation Calls\n case ChunkType.ChunkTypeImageGenerationCallInProgress:\n break;\n\n case ChunkType.ChunkTypeImageGenerationCallGenerating:\n break;\n\n case ChunkType.ChunkTypeImageGenerationCallPartialImage:\n this.handleImageGenerationCallPartialImage(chunk);\n break;\n }\n }\n\n private handleOutputItemAdded(chunk: ResponseChunk): void {\n if (!chunk.item) return;\n\n switch (chunk.item.type) {\n case \"message\":\n this.currentOutputItem = {\n id: chunk.item.id,\n type: \"message\",\n role: chunk.item.role || \"assistant\",\n content: [],\n } as InputMessage;\n break;\n\n case \"function_call\":\n this.currentOutputItem = {\n id: chunk.item.id,\n type: \"function_call\",\n name: chunk.item.name || \"\",\n call_id: chunk.item.call_id || \"\",\n arguments: \"\",\n } as FunctionCallMessage;\n break;\n\n case \"reasoning\":\n this.currentOutputItem = {\n id: chunk.item.id,\n type: \"reasoning\",\n summary: [],\n } as ReasoningMessage;\n break;\n\n case \"image_generation_call\":\n this.currentOutputItem = {\n id: chunk.item.id,\n type: \"image_generation_call\",\n status: chunk.item.status,\n } as ImageGenerationCallMessage;\n break;\n }\n\n if (this.currentOutputItem) {\n this.messages.push(this.currentOutputItem);\n this.emitChange();\n }\n }\n\n private handleContentPartAdded(chunk: ResponseChunk): void {\n if (!this.currentOutputItem || this.currentOutputItem.type !== \"message\") return;\n\n const message = this.currentOutputItem as InputMessage;\n if (chunk.part?.type === ContentType.OutputText) {\n message.content = message.content || [];\n message.content.push({\n type: ContentType.OutputText,\n text: \"\",\n });\n this.emitChange();\n }\n }\n\n private handleOutputTextDelta(chunk: ResponseChunk): void {\n if (!this.currentOutputItem || this.currentOutputItem.type !== \"message\") return;\n\n const message = this.currentOutputItem as InputMessage;\n const contents = message.content;\n if (!contents?.length || !chunk.delta) return;\n\n const lastContent = contents[contents.length - 1];\n if (lastContent && 'text' in lastContent) {\n lastContent.text += chunk.delta;\n this.emitChange();\n }\n }\n\n private handleReasoningSummaryPartAdded(chunk: ResponseChunk): void {\n if (!this.currentOutputItem || this.currentOutputItem.type !== \"reasoning\") return;\n\n const reasoning = this.currentOutputItem as ReasoningMessage;\n if (chunk.part?.type === ContentType.SummaryText) {\n reasoning.summary = reasoning.summary || [];\n reasoning.summary.push({\n type: ContentType.SummaryText,\n text: \"\",\n });\n this.emitChange();\n }\n }\n\n private handleReasoningSummaryTextDelta(chunk: ResponseChunk): void {\n if (!this.currentOutputItem || this.currentOutputItem.type !== \"reasoning\") return;\n\n const reasoning = this.currentOutputItem as ReasoningMessage;\n const summaries = reasoning.summary;\n if (!summaries?.length || !chunk.delta) return;\n\n const lastSummary = summaries[summaries.length - 1];\n if (lastSummary) {\n lastSummary.text += chunk.delta;\n this.emitChange();\n }\n }\n\n private handleFunctionCallArgumentsDelta(chunk: ResponseChunk): void {\n if (!this.currentOutputItem || this.currentOutputItem.type !== \"function_call\") return;\n\n const functionCall = this.currentOutputItem as FunctionCallMessage;\n functionCall.arguments += chunk.delta || \"\";\n this.emitChange();\n }\n\n private handleFunctionCallOutput(chunk: ResponseChunk): void {\n this.currentOutputItem = chunk as unknown as FunctionCallOutputMessage;\n this.messages.push(this.currentOutputItem);\n this.emitChange();\n }\n\n private handleImageGenerationCallPartialImage(chunk: ResponseChunk): void {\n if (!this.currentOutputItem || this.currentOutputItem.type !== \"image_generation_call\") return;\n\n const image = this.currentOutputItem as ImageGenerationCallMessage;\n image.result = chunk.partial_image_b64!;\n image.quality = chunk.quality!;\n image.size = chunk.size!;\n image.output_format = chunk.output_format!;\n image.background = chunk.background!;\n\n this.emitChange();\n }\n}\n\n","/**\n * Options for the SSE stream callbacks\n */\nexport interface SSEStreamOptions {\n /** Called for each data chunk received */\n onChunk: (data: string) => void;\n /** Called when an error occurs */\n onError?: (error: Error) => void;\n /** Called when the stream completes */\n onComplete?: () => void;\n}\n\n/**\n * Streams Server-Sent Events (SSE) from a URL.\n * Parses SSE frames and calls onChunk for each data payload.\n *\n * @param url - The URL to stream from\n * @param requestOptions - Fetch request options\n * @param callbacks - SSE event callbacks\n * @param abortSignal - Optional signal to abort the stream\n *\n * @example\n * ```ts\n * await streamSSE(\n * 'https://api.example.com/stream',\n * { method: 'POST', body: JSON.stringify({ message: 'Hello' }) },\n * {\n * onChunk: (data) => console.log('Received:', data),\n * onComplete: () => console.log('Done'),\n * onError: (err) => console.error('Error:', err),\n * }\n * );\n * ```\n */\nexport async function streamSSE(\n url: string,\n requestOptions: RequestInit,\n callbacks: SSEStreamOptions,\n abortSignal?: AbortSignal\n): Promise<void> {\n try {\n const response = await fetch(url, {\n ...requestOptions,\n signal: abortSignal,\n });\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n if (!response.body) {\n throw new Error('Response body is null');\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n while (true) {\n const { value, done } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n\n // Parse SSE frames: split on double newline\n let idx;\n while ((idx = buffer.indexOf('\\n\\n')) !== -1) {\n const frame = buffer.slice(0, idx);\n buffer = buffer.slice(idx + 2);\n\n // Join all data: lines in the frame\n const data = frame\n .split('\\n')\n .filter(line => line.startsWith('data:'))\n .map(line => line.slice(5).trim())\n .join('\\n');\n\n if (data) {\n callbacks.onChunk(data);\n }\n }\n }\n\n // Final flush of decoder state\n decoder.decode();\n callbacks.onComplete?.();\n } catch (error) {\n if ((error as Error).name === 'AbortError') {\n return;\n }\n callbacks.onError?.(error as Error);\n }\n}\n\n","import axios, { AxiosInstance } from 'axios';\nimport {useCallback, useEffect, useMemo, useRef, useState} from \"react\";\nimport {Agent} from \"../types\";\nimport {GetHeadersFn} from \"./useConversation\";\n\n/**\n * Options for the useProject hook\n */\nexport interface UseProjectOptions {\n /** Base URL of the Uno Agent Server (e.g., 'https://api.example.com/api/agent-server') */\n baseUrl: string;\n /** Project Name used to fetch the project ID */\n projectName: string;\n /** Optional function to get custom headers for requests (e.g., for authentication) */\n getHeaders?: GetHeadersFn;\n /** Auto-load conversations on mount (default: true) */\n autoLoad?: boolean;\n}\n\n/**\n * Return type for the useProject hook\n */\nexport interface UseProjectReturn {\n // Project state\n /** The fetched project ID */\n projectId: string;\n /** Whether the project ID is being fetched */\n projectLoading: boolean;\n /** Axios instance configured with baseUrl and custom headers */\n axiosInstance: AxiosInstance;\n /** Function to build query params with project_id automatically added */\n buildParams: (params?: Record<string, string>) => Record<string, string>;\n /** Function to get request headers (combines default + custom headers) */\n getRequestHeaders: () => Promise<Record<string, string>>;\n /** Base URL used for the axios instance */\n baseUrl: string;\n}\n\nexport function useProject(options: UseProjectOptions): UseProjectReturn {\n const { projectName, baseUrl, getHeaders, autoLoad = true } = options;\n\n // Project state\n const [projectId, setProjectId] = useState<string>('');\n const [projectLoading, setProjectLoading] = useState(false);\n \n // Use ref to store current projectId for interceptor access\n const projectIdRef = useRef<string>('');\n \n // Update ref whenever projectId changes\n useEffect(() => {\n projectIdRef.current = projectId;\n }, [projectId]);\n\n // Create axios instance with request interceptor for custom headers and project_id\n const axiosInstance = useMemo(() => {\n const instance = axios.create({\n baseURL: baseUrl,\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n // Add request interceptor to inject custom headers and project_id\n instance.interceptors.request.use(async (config) => {\n // Add custom headers if getHeaders function is provided\n if (getHeaders) {\n const customHeaders = await getHeaders();\n Object.assign(config.headers, customHeaders);\n }\n \n // Automatically add project_id to query params if available\n const currentProjectId = projectIdRef.current;\n if (currentProjectId) {\n if (config.params) {\n config.params = {\n ...config.params,\n project_id: currentProjectId,\n };\n } else {\n config.params = { project_id: currentProjectId };\n }\n }\n \n return config;\n });\n\n return instance;\n }, [baseUrl, getHeaders]);\n\n\n // ============================================\n // API Helper Functions\n // ============================================\n\n /**\n * Build query params (project_id is automatically added by axios interceptor)\n */\n const buildParams = useCallback((params?: Record<string, string>) => {\n return params || {};\n }, []);\n\n /**\n * Get headers for streaming requests (combines default + custom headers)\n */\n const getRequestHeaders = useCallback(async (): Promise<Record<string, string>> => {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n // Add custom headers if getHeaders function is provided\n if (getHeaders) {\n const customHeaders = await getHeaders();\n Object.assign(headers, customHeaders);\n }\n\n return headers;\n }, [getHeaders]);\n\n // ============================================\n // Project Management\n // ============================================\n\n /**\n * Fetch the project ID using the project name\n */\n const fetchProjectId = useCallback(async () => {\n if (!projectName) {\n return;\n }\n\n setProjectLoading(true);\n try {\n const response = await axiosInstance.get<{ data: string } | string>('/project/id', {\n params: { name: projectName },\n });\n const id = typeof response.data === 'string' ? response.data : response.data.data;\n setProjectId(id || '');\n } catch (error) {\n console.error('Failed to fetch project ID:', error);\n throw error;\n } finally {\n setProjectLoading(false);\n }\n }, [axiosInstance, projectName]);\n\n // ============================================\n // Effects for auto-loading\n // ============================================\n\n // Fetch project ID on mount\n useEffect(() => {\n if (autoLoad && projectName) {\n fetchProjectId();\n }\n }, [autoLoad, projectName, fetchProjectId]);\n\n return {\n // Project state\n projectId,\n projectLoading,\n // API client\n axiosInstance,\n buildParams,\n getRequestHeaders,\n baseUrl,\n }\n}","import React, {createContext, useContext, useMemo} from 'react';\nimport type { ReactNode, ReactElement } from \"react\";\nimport { useProject, UseProjectOptions, UseProjectReturn } from '../hooks/useProject';\n\n/**\n * Context value for ProjectProvider\n */\nexport interface ProjectContextValue extends UseProjectReturn {}\n\n/**\n * Props for ProjectProvider component\n */\nexport interface ProjectProviderProps {\n /** Base URL of the Uno Agent Server (e.g., 'https://api.example.com/api/agent-server') */\n baseUrl: string;\n /** Project Name used to fetch the project ID */\n projectName: string;\n /** Optional function to get custom headers for requests (e.g., for authentication) */\n getHeaders?: UseProjectOptions['getHeaders'];\n /** Auto-load project on mount (default: true) */\n autoLoad?: boolean;\n /** Child components */\n children: ReactNode;\n}\n\n// Create the context with undefined as default to ensure it's used within provider\nconst ProjectContext = createContext<ProjectContextValue | undefined>(undefined);\n\n/**\n * ProjectProvider component that manages project state using React Context.\n * \n * This provider wraps the useProject hook and makes the project state available\n * to all child components through context.\n * \n * @example\n * ```tsx\n * import { ProjectProvider, useProjectContext } from '@praveen001/uno-converse';\n * \n * function App() {\n * return (\n * <ProjectProvider\n * baseUrl=\"https://api.example.com/api/agent-server\"\n * projectName=\"my-project\"\n * getHeaders={() => ({\n * 'Authorization': `Bearer ${getToken()}`,\n * })}\n * >\n * <YourApp />\n * </ProjectProvider>\n * );\n * }\n * \n * function YourApp() {\n * const { projectId, projectLoading } = useProjectContext();\n * \n * if (projectLoading) {\n * return <div>Loading project...</div>;\n * }\n * \n * return <div>Project ID: {projectId}</div>;\n * }\n * ```\n */\nexport const ProjectProvider = ({\n baseUrl,\n projectName,\n getHeaders,\n autoLoad = true,\n children,\n}: ProjectProviderProps): ReactElement => {\n // Use the useProject hook to manage project state\n const projectState = useProject({\n baseUrl,\n projectName,\n getHeaders,\n autoLoad,\n });\n\n // Memoize the context value to prevent unnecessary re-renders\n const contextValue = useMemo<ProjectContextValue>(\n () => projectState,\n [\n projectState.projectId,\n projectState.projectLoading,\n projectState.axiosInstance,\n projectState.buildParams,\n projectState.getRequestHeaders,\n projectState.baseUrl,\n ]\n );\n\n return (\n <ProjectContext.Provider value={contextValue}>\n {children}\n </ProjectContext.Provider>\n );\n};\n\n/**\n * Hook to access the project context.\n * \n * Must be used within a ProjectProvider component.\n * \n * @throws {Error} If used outside of ProjectProvider\n * \n * @example\n * ```tsx\n * function MyComponent() {\n * const { projectId, projectLoading } = useProjectContext();\n * \n * return (\n * <div>\n * {projectLoading ? 'Loading...' : `Project ID: ${projectId}`}\n * </div>\n * );\n * }\n * ```\n */\nexport const useProjectContext = (): ProjectContextValue => {\n const context = useContext(ProjectContext);\n \n if (context === undefined) {\n throw new Error('useProjectContext must be used within a ProjectProvider');\n }\n \n return context;\n};\n\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { ChunkProcessor } from '../streaming/ChunkProcessor';\nimport { streamSSE } from '../streaming/streamSSE';\nimport {\n Agent,\n Conversation,\n ConversationMessage,\n ConverseConfig,\n MessageType,\n MessageUnion,\n Thread,\n} from '../types';\nimport { useProjectContext } from '../ProjectProvider';\n\n/**\n * Simple ID generator for message IDs\n */\nfunction generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).substring(2, 11)}`;\n}\n\n/**\n * Function type for providing custom headers.\n * Called before each request to get headers (useful for dynamic auth tokens).\n *\n * @example\n * ```ts\n * const getHeaders: GetHeadersFn = () => ({\n * 'Authorization': `Bearer ${getToken()}`,\n * 'X-Custom-Header': 'value',\n * });\n * ```\n */\nexport type GetHeadersFn = () => Record<string, string> | Promise<Record<string, string>>;\n\n/**\n * Options for the useConversation hook\n */\nexport interface UseConversationOptions {\n /** The namespace for conversations */\n namespace: string;\n /** Auto-load conversations on mount (default: true) */\n autoLoad?: boolean;\n}\n\n/**\n * Return type for the useConversation hook\n */\nexport interface UseConversationReturn {\n // Conversation list state\n /** List of all conversations */\n conversations: Conversation[];\n /** Whether conversations are being loaded */\n conversationsLoading: boolean;\n\n // Thread state\n /** List of threads in the current conversation */\n threads: Thread[];\n /** Whether threads are being loaded */\n threadsLoading: boolean;\n /** Currently selected thread */\n currentThread: Thread | null;\n\n // Message state\n /** List of messages in the current thread */\n messages: ConversationMessage[];\n /** Message currently being streamed */\n streamingMessage: ConversationMessage | null;\n /** Whether messages are being loaded */\n messagesLoading: boolean;\n /** Whether a response is currently streaming */\n isStreaming: boolean;\n /** Whether waiting for a response */\n isThinking: boolean;\n\n // Current selection\n /** ID of the currently selected conversation */\n currentConversationId: string | null;\n /** ID of the currently selected thread */\n currentThreadId: string | null;\n\n // Actions - Conversations\n /** Load all conversations */\n loadConversations: () => Promise<void>;\n /** Select a conversation by ID */\n selectConversation: (conversationId: string) => void;\n\n // Actions - Threads\n /** Load threads for a conversation */\n loadThreads: (conversationId: string) => Promise<void>;\n /** Select a thread by ID */\n selectThread: (threadId: string) => void;\n\n // Actions - Messages\n /** Send a message and stream the response */\n sendMessage: (userMessages: MessageUnion[], config: ConverseConfig) => Promise<void>;\n\n // Actions - Utility\n /** Start a new chat (clears current state) */\n startNewChat: () => void;\n\n // Combined messages (loaded + streaming)\n /** All messages including the currently streaming one */\n allMessages: ConversationMessage[];\n}\n\n/**\n * A comprehensive hook for managing conversations, threads, messages, and streaming\n * with Uno Agent Server.\n *\n * @example\n * ```tsx\n * import { useConversation } from '@praveen001/uno-converse';\n *\n * function ChatComponent() {\n * const {\n * allMessages,\n * isStreaming,\n * sendMessage,\n * startNewChat,\n * } = useConversation({\n * namespace: 'my-app',\n * });\n *\n * const handleSend = async (text: string) => {\n * await sendMessage(\n * [{ type: 'message', id: '1', content: text }],\n * {\n * namespace: 'my-app',\n * agentName: 'my-agent',\n * }\n * );\n * };\n *\n * return (\n * <div>\n * {allMessages.map(msg => (\n * <MessageComponent key={msg.message_id} message={msg} />\n * ))}\n * {isStreaming && <LoadingIndicator />}\n * </div>\n * );\n * }\n * ```\n */\nexport function useConversation(options: UseConversationOptions): UseConversationReturn {\n const { namespace, autoLoad = true } = options;\n\n // Get project context (axios instance, projectId, etc.)\n const {\n axiosInstance,\n projectId,\n projectLoading,\n buildParams,\n getRequestHeaders,\n baseUrl,\n } = useProjectContext();\n\n // Conversation list state\n const [conversations, setConversations] = useState<Conversation[]>([]);\n const [conversationsLoading, setConversationsLoading] = useState(false);\n\n // Thread state\n const [threads, setThreads] = useState<Thread[]>([]);\n const [threadsLoading, setThreadsLoading] = useState(false);\n\n // Message state\n const [messages, setMessages] = useState<ConversationMessage[]>([]);\n const [streamingMessage, setStreamingMessage] = useState<ConversationMessage | null>(null);\n const [messagesLoading, setMessagesLoading] = useState(false);\n const [isStreaming, setIsStreaming] = useState(false);\n const [isThinking, setIsThinking] = useState(false);\n\n // Current selection\n const [currentConversationId, setCurrentConversationId] = useState<string | null>(null);\n const [currentThreadId, setCurrentThreadId] = useState<string | null>(null);\n const [previousMessageId, setPreviousMessageId] = useState<string>('');\n\n // Refs\n const processorRef = useRef<ChunkProcessor | null>(null);\n const abortControllerRef = useRef<AbortController | null>(null);\n\n // ============================================\n // API Helper Functions\n // ============================================\n // Note: buildParams and getRequestHeaders are now provided by ProjectProvider\n\n // ============================================\n // Conversation Management\n // ============================================\n\n /**\n * Load all conversations for the namespace\n */\n const loadConversations = useCallback(async () => {\n setConversationsLoading(true);\n try {\n const response = await axiosInstance.get<{ data: Conversation[] } | Conversation[]>('/conversations', {\n params: buildParams({ namespace }),\n });\n const data = 'data' in response.data ? response.data.data : response.data;\n setConversations(data || []);\n } catch (error) {\n console.error('Failed to load conversations:', error);\n throw error;\n } finally {\n setConversationsLoading(false);\n }\n }, [axiosInstance, buildParams, namespace]);\n\n /**\n * Select a conversation and load its threads\n */\n const selectConversation = useCallback((conversationId: string) => {\n setCurrentConversationId(conversationId);\n // Threads will be loaded via useEffect\n }, []);\n\n // ============================================\n // Thread Management\n // ============================================\n\n /**\n * Load threads for a conversation\n */\n const loadThreads = useCallback(async (conversationId: string) => {\n setThreadsLoading(true);\n try {\n const response = await axiosInstance.get<{ data: Thread[] } | Thread[]>('/threads', {\n params: buildParams({ conversation_id: conversationId, namespace }),\n });\n const loadedThreads = 'data' in response.data ? response.data.data : response.data;\n\n // Sort by created_at descending\n loadedThreads.sort(\n (a, b) => new Date(b.created_at).getTime() - new Date(a.created_at).getTime()\n );\n\n setThreads(loadedThreads);\n\n // Auto-select the latest thread\n if (loadedThreads.length > 0) {\n setCurrentThreadId(loadedThreads[0].thread_id);\n }\n } catch (error) {\n console.error('Failed to load threads:', error);\n throw error;\n } finally {\n setThreadsLoading(false);\n }\n }, [axiosInstance, buildParams, namespace]);\n\n /**\n * Select a thread and load its messages\n */\n const selectThread = useCallback((threadId: string) => {\n setCurrentThreadId(threadId);\n // Messages will be loaded via useEffect\n }, []);\n\n // ============================================\n // Message Management\n // ============================================\n\n /**\n * Load messages for a thread\n */\n const loadMessages = useCallback(async (threadId: string) => {\n setMessagesLoading(true);\n try {\n const response = await axiosInstance.get<{ data: ConversationMessage[] } | ConversationMessage[]>('/messages', {\n params: buildParams({ thread_id: threadId, namespace }),\n });\n const loadedMessages = 'data' in response.data ? response.data.data : response.data;\n\n // Extract last message ID for continuation\n if (loadedMessages.length > 0) {\n const lastMsgId = loadedMessages[loadedMessages.length - 1].message_id;\n setPreviousMessageId(lastMsgId);\n } else {\n setPreviousMessageId('');\n }\n\n setMessages(loadedMessages);\n } catch (error) {\n console.error('Failed to load messages:', error);\n throw error;\n } finally {\n setMessagesLoading(false);\n }\n }, [axiosInstance, buildParams, namespace]);\n\n /**\n * Send a user message and stream the response\n */\n const sendMessage = useCallback(async (userMessages: MessageUnion[], config: ConverseConfig) => {\n const messageId = generateId();\n\n // Check if this is a tool approval response (resuming a run)\n const isToolApproval = userMessages.length === 1 &&\n userMessages[0].type === MessageType.FunctionCallApprovalResponse;\n\n // Only add user message for regular messages, not for tool approvals\n if (!isToolApproval) {\n const userConversation: ConversationMessage = {\n conversation_id: currentConversationId || '',\n thread_id: currentThreadId || '',\n message_id: messageId + '-user',\n messages: userMessages,\n meta: {},\n };\n setMessages(prev => [...prev, userConversation]);\n }\n\n // Initialize the chunk processor for the assistant response\n processorRef.current = new ChunkProcessor(\n currentConversationId || '',\n currentThreadId || '',\n (conversation) => {\n setIsThinking(isThinking);\n setStreamingMessage({ ...conversation, isStreaming: true });\n }\n );\n\n setIsStreaming(true);\n setIsThinking(true);\n\n // Build URL with query parameters\n const params = new URLSearchParams();\n if (projectId) {\n params.append('project_id', projectId);\n }\n params.append('agent_id', config.agentId);\n\n let url = `${baseUrl}/converse?${params.toString()}`;\n if (!!config.baseUrl) {\n url = config.baseUrl;\n }\n\n // Prepare request body\n const body = JSON.stringify({\n namespace: config.namespace,\n previous_message_id: previousMessageId,\n message: userMessages[0],\n context: config.context || {},\n });\n\n // Abort any existing stream\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n abortControllerRef.current = new AbortController();\n\n try {\n // Get headers (supports async getHeaders function)\n const requestHeaders = await getRequestHeaders();\n\n await streamSSE(\n url,\n {\n method: 'POST',\n body,\n headers: {\n ...requestHeaders,\n ...(config.headers || {}),\n },\n },\n {\n onChunk: (data) => {\n processorRef.current?.processChunk(data);\n },\n onComplete: () => {\n // Move streaming message to messages list\n if (processorRef.current) {\n const finalConversation = processorRef.current.getConversation();\n\n if (isToolApproval) {\n // For tool approvals, update the last message instead of appending\n setMessages(prev => {\n const newMessages = [...prev];\n if (newMessages.length > 0) {\n const lastMsg = newMessages[newMessages.length - 1];\n newMessages[newMessages.length - 1] = {\n ...lastMsg,\n messages: [...lastMsg.messages, ...finalConversation.messages],\n meta: finalConversation.meta,\n isStreaming: false,\n };\n }\n return newMessages;\n });\n } else {\n setMessages(prev => [...prev, { ...finalConversation, isStreaming: false }]);\n }\n\n setStreamingMessage(null);\n setPreviousMessageId(finalConversation.message_id);\n }\n },\n onError: (error) => {\n console.error('Streaming error:', error);\n setStreamingMessage(null);\n },\n },\n abortControllerRef.current.signal\n );\n\n // If this was a new conversation, fetch the conversation info\n if (previousMessageId === '' && processorRef.current) {\n try {\n const response = await axiosInstance.get<{ data: ConversationMessage } | ConversationMessage>(\n `/messages/${processorRef.current.getConversation().message_id}`,\n { params: buildParams({ namespace }) }\n );\n const messageData = 'data' in response.data ? response.data.data : response.data;\n const newConversationId = messageData?.conversation_id;\n if (newConversationId) {\n // Add new conversation to list\n setConversations(prev => [{\n conversation_id: newConversationId,\n name: \"New Conversation\",\n namespace_id: namespace,\n created_at: new Date().toISOString(),\n last_updated: new Date().toISOString(),\n } as Conversation, ...prev.filter(c => c.conversation_id !== newConversationId)]);\n\n setCurrentConversationId(newConversationId);\n }\n } catch (e) {\n console.error('Failed to get conversation ID:', e);\n }\n }\n } finally {\n setIsStreaming(false);\n abortControllerRef.current = null;\n }\n }, [currentConversationId, currentThreadId, previousMessageId, namespace, baseUrl, projectId, axiosInstance, buildParams, getRequestHeaders]);\n\n // ============================================\n // Utility Actions\n // ============================================\n\n /**\n * Start a new chat (reset all state)\n */\n const startNewChat = useCallback(() => {\n // Abort any ongoing stream\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n abortControllerRef.current = null;\n }\n\n setCurrentConversationId(null);\n setCurrentThreadId(null);\n setThreads([]);\n setMessages([]);\n setStreamingMessage(null);\n setPreviousMessageId('');\n setIsStreaming(false);\n setIsThinking(false);\n processorRef.current = null;\n }, []);\n\n // ============================================\n // Effects for auto-loading\n // ============================================\n\n // Load conversations after project ID is fetched\n useEffect(() => {\n if (autoLoad && projectId) {\n loadConversations();\n }\n }, [autoLoad, projectId, loadConversations]);\n\n // Load threads when conversation changes\n useEffect(() => {\n if (currentConversationId) {\n loadThreads(currentConversationId);\n }\n }, [currentConversationId, loadThreads]);\n\n // Load messages when thread changes\n useEffect(() => {\n if (currentThreadId) {\n loadMessages(currentThreadId);\n }\n }, [currentThreadId, loadMessages]);\n\n // ============================================\n // Computed values\n // ============================================\n\n const currentThread = threads.find(t => t.thread_id === currentThreadId) || null;\n\n const allMessages = streamingMessage\n ? [...messages, streamingMessage]\n : messages;\n\n return {\n // Conversation list state\n conversations,\n conversationsLoading,\n\n // Thread state\n threads,\n threadsLoading,\n currentThread,\n\n // Message state\n messages,\n streamingMessage,\n messagesLoading,\n isStreaming,\n isThinking,\n\n // Current selection\n currentConversationId,\n currentThreadId,\n\n // Actions - Conversations\n loadConversations,\n selectConversation,\n\n // Actions - Threads\n loadThreads,\n selectThread,\n\n // Actions - Messages\n sendMessage,\n\n // Actions - Utility\n startNewChat,\n\n // Combined messages\n allMessages,\n };\n}\n\n","import axios from 'axios';\nimport {useCallback, useEffect, useMemo, useState} from \"react\";\nimport {Agent} from \"../types\";\nimport {GetHeadersFn} from \"./useConversation\";\nimport { useProjectContext } from '../ProjectProvider';\n\n/**\n * Options for the useAgent hook\n */\nexport interface UseAgentOptions {\n /** The name of the agent */\n name: string;\n}\n\n/**\n * Return type for the useAgent hook\n */\nexport interface UseAgentReturn {\n // Agent\n agent: Agent | null;\n /** Whether the agent is being loaded */\n agentLoading: boolean;\n}\n\nexport function useAgent(options: UseAgentOptions): UseAgentReturn {\n const { name } = options;\n\n // Get project context (axios instance, projectId, etc.)\n const {\n axiosInstance,\n projectId,\n buildParams,\n } = useProjectContext();\n\n // Agents state\n const [agent, setAgent] = useState<Agent | null>(null);\n const [agentLoading, setAgentLoading] = useState(false);\n\n // ============================================\n // Agent Management\n // ============================================\n\n /**\n * Fetch the agent\n */\n const loadAgent = useCallback(async (): Promise<void> => {\n setAgentLoading(true);\n try {\n const response = await axiosInstance.get<{data: Agent}>('/agent-configs/by-name', {\n params: buildParams({ name }),\n });\n setAgent(response.data.data);\n } catch (error) {\n console.error('Failed to load agent:', error)\n throw error;\n } finally {\n setAgentLoading(false);\n }\n }, [axiosInstance, name]);\n\n // Fetch agent after project is fetched\n useEffect(() => {\n if (projectId) {\n loadAgent();\n }\n }, [projectId, loadAgent]);\n\n return { agent, agentLoading };\n}"],"names":["Role","MessageType","ContentType","ChunkType","useState","useRef","useEffect","useMemo","useCallback","createContext","_jsx","useContext"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../src/types.ts","../src/streaming/ChunkProcessor.ts","../src/streaming/streamSSE.ts","../src/hooks/useProject.tsx","../src/ProjectProvider/index.tsx","../src/hooks/useConversation.ts","../src/hooks/useAgent.ts"],"sourcesContent":["export interface Agent {\n id: string;\n agent_id: string;\n name: string;\n version: number;\n}\n\n// Message Roles\nexport enum Role {\n User = \"user\",\n Developer = \"developer\",\n System = \"system\",\n Assistant = \"assistant\",\n}\n\n// Message Types\nexport enum MessageType {\n Message = \"message\",\n FunctionCall = \"function_call\",\n FunctionCallOutput = \"function_call_output\",\n Reasoning = \"reasoning\",\n ImageGenerationCall = \"image_generation_call\",\n FunctionCallApprovalResponse = \"function_call_approval_response\",\n}\n\n// Content Types\nexport enum ContentType {\n InputText = \"input_text\",\n OutputText = \"output_text\",\n SummaryText = \"summary_text\",\n InputImage = \"input_image\",\n}\n\n// Chunk Types\nexport enum ChunkType {\n ChunkTypeRunCreated = \"run.created\",\n ChunkTypeRunInProgress = \"run.in_progress\",\n ChunkTypeRunPaused = \"run.paused\",\n ChunkTypeRunCompleted = \"run.completed\",\n ChunkTypeResponseCreated = \"response.created\",\n ChunkTypeResponseInProgress = \"response.in_progress\",\n ChunkTypeResponseCompleted = \"response.completed\",\n ChunkTypeOutputItemAdded = \"response.output_item.added\",\n ChunkTypeOutputItemDone = \"response.output_item.done\",\n ChunkTypeContentPartAdded = \"response.content_part.added\",\n ChunkTypeContentPartDone = \"response.content_part.done\",\n ChunkTypeOutputTextDelta = \"response.output_text.delta\",\n ChunkTypeOutputTextDone = \"response.output_text.done\",\n ChunkTypeFunctionCallArgumentsDelta = \"response.function_call_arguments.delta\",\n ChunkTypeFunctionCallArgumentsDone = \"response.function_call_arguments.done\",\n ChunkTypeReasoningSummaryPartAdded = \"response.reasoning_summary_part.added\",\n ChunkTypeReasoningSummaryPartDone = \"response.reasoning_summary_part.done\",\n ChunkTypeReasoningSummaryTextDelta = \"response.reasoning_summary_text.delta\",\n ChunkTypeReasoningSummaryTextDone = \"response.reasoning_summary_text.done\",\n\n // Image generation\n ChunkTypeImageGenerationCallInProgress = \"response.image_generation_call.in_progress\",\n ChunkTypeImageGenerationCallGenerating = \"response.image_generation_call.generating\",\n ChunkTypeImageGenerationCallPartialImage = \"response.image_generation_call.partial_image\",\n\n // Extra\n ChunkTypeFunctionCallOutput = \"function_call_output\",\n}\n\n/**\n * Represents a conversation container\n */\nexport interface Conversation {\n namespace_id: string;\n conversation_id: string;\n name: string;\n created_at: string;\n last_updated: string;\n}\n\n/**\n * Represents a thread within a conversation\n */\nexport interface Thread {\n conversation_id: string;\n origin_message_id: string;\n thread_id: string;\n meta: Record<string, any>;\n created_at: string;\n last_updated: string;\n}\n\n/**\n * Represents a message within a conversation thread\n */\nexport interface ConversationMessage {\n conversation_id: string;\n thread_id: string;\n message_id: string;\n messages: MessageUnion[];\n meta: Record<string, any>;\n isStreaming?: boolean;\n}\n\n// Message union type - discriminated by 'type' field\nexport type MessageUnion =\n | EasyMessage\n | InputMessage\n | OutputMessage\n | FunctionCallMessage\n | FunctionCallApprovalResponseMessage\n | FunctionCallOutputMessage\n | ReasoningMessage\n | ImageGenerationCallMessage;\n\nexport interface EasyMessage {\n type: MessageType.Message;\n id: string;\n role?: Role;\n content: EasyInputContentUnion;\n}\n\nexport interface InputMessage {\n type: MessageType.Message;\n id?: string;\n role?: Role;\n content?: InputContentUnion[];\n}\n\nexport interface OutputMessage {\n id: string;\n type?: MessageType.Message;\n role?: Role;\n content?: OutputContentUnion[];\n}\n\nexport interface FunctionCallMessage {\n type: MessageType.FunctionCall;\n id: string;\n call_id?: string;\n name: string;\n arguments: string;\n}\n\nexport interface FunctionCallApprovalResponseMessage {\n type: MessageType.FunctionCallApprovalResponse;\n id: string;\n approved_call_ids: string[];\n rejected_call_ids: string[];\n}\n\nexport interface FunctionCallOutputMessage {\n type: MessageType.FunctionCallOutput;\n id: string;\n call_id: string;\n output: FunctionCallOutputContentUnion;\n}\n\nexport interface ReasoningMessage {\n type: MessageType.Reasoning;\n id: string;\n summary?: SummaryTextContent[];\n encrypted_content?: string;\n}\n\nexport interface ImageGenerationCallMessage {\n type: MessageType.ImageGenerationCall;\n id: string;\n status: string;\n background: string;\n output_format: string;\n quality: string;\n size: string;\n result: string;\n}\n\n// Content Unions\nexport type EasyInputContentUnion = string | InputContentUnion;\nexport type InputContentUnion = InputTextContent | OutputTextContent | InputImageContent;\nexport type FunctionCallOutputContentUnion = string | InputContentUnion;\nexport type OutputContentUnion =\n | OutputTextContent\n | FunctionCallMessage\n | SummaryTextContent;\n\n// Content types\nexport interface InputTextContent {\n type: ContentType.InputText;\n text: string;\n}\n\nexport interface OutputTextContent {\n type: ContentType.OutputText;\n text: string;\n}\n\nexport interface SummaryTextContent {\n type: ContentType.SummaryText;\n text: string;\n}\n\nexport interface InputImageContent {\n type: ContentType.InputImage;\n image_url: string;\n detail: string;\n}\n\n/**\n * Configuration for the converse API endpoint\n */\nexport interface ConverseConfig {\n namespace: string;\n agentId: string;\n baseUrl?: string;\n context?: Record<string, unknown>;\n headers?: Record<string, string>;\n}\n\n// Streaming chunk types\nexport interface ResponseChunk {\n type: ChunkType;\n sequence_number: number;\n\n // Only on run items\n run_state?: ChunkRunData;\n\n // Only on response items\n response?: ChunkResponseData;\n\n // On non-run and non-response items\n output_index?: number;\n\n // Only on output_item\n item?: ChunkOutputItemData;\n\n // Only on content_part and delta\n item_id?: string;\n content_index?: number;\n\n // Only on content_part\n part?: OutputContentUnion;\n\n // Only on output_text delta/done\n delta?: string;\n text?: string;\n\n // Only on function_call arguments delta/done\n arguments?: string;\n\n // Only on reasoning summary part/delta/done\n summary_index?: number;\n\n // Only on function_call_output\n output: string;\n\n // Only on image_generation_call.partial_image\n partial_image_index?: number;\n partial_image_b64?: string;\n background?: string;\n output_format?: string;\n quality?: string;\n size?: string;\n status?: string;\n}\n\nexport interface ChunkRunData {\n id: string;\n object: \"run\";\n status: \"created\" | \"in_progress\" | \"paused\" | \"resumed\" | \"completed\" | \"aborted\";\n pending_tool_calls: FunctionCallMessage[];\n usage: ChunkResponseUsage;\n traceid: string;\n}\n\nexport interface ChunkResponseData {\n id: string;\n object: string;\n created_at: number;\n status: string;\n background: boolean;\n error: unknown;\n incomplete_details: unknown;\n output: OutputMessageUnion[];\n usage: ChunkResponseUsage;\n}\n\nexport interface ChunkOutputItemData {\n type: string; // \"function_call\", \"message\", \"reasoning\"\n\n // Common fields\n id: string;\n status: string;\n\n // For output_item of type \"message\"\n content: OutputContentUnion[];\n role: Role;\n\n // For output_item of type \"function_call\"\n call_id?: string;\n name?: string;\n arguments?: string;\n\n // For \"reasoning\"\n encrypted_content?: string;\n summary?: OutputContentUnion[];\n\n // For output_item of type \"image_generation_call\"\n background?: string;\n output_format?: string;\n quality?: string;\n result?: string;\n size?: string;\n}\n\nexport type OutputMessageUnion =\n | (OutputMessage & { id: string })\n | (FunctionCallMessage & { id: string })\n | (ReasoningMessage & { id: string })\n | (ImageGenerationCallMessage & { id: string });\n\nexport interface ChunkResponseUsage {\n input_tokens: number;\n input_tokens_details: {\n cached_tokens: number;\n };\n output_tokens: number;\n output_tokens_details: {\n reasoning_tokens: number;\n };\n total_tokens: number;\n}\n\nexport interface Usage {\n input_tokens: number;\n output_tokens: number;\n total_tokens: number;\n input_tokens_details: {\n cached_tokens: number;\n };\n output_tokens_details: {\n reasoning_tokens: number;\n };\n}\n\n// Type guards\nexport function isEasyMessage(msg: MessageUnion): msg is EasyMessage {\n return msg.type === MessageType.Message && 'content' in msg && (typeof msg.content === 'string' || Array.isArray(msg.content));\n}\n\nexport function isInputMessage(msg: MessageUnion): msg is InputMessage {\n return msg.type === MessageType.Message && 'content' in msg && Array.isArray(msg.content);\n}\n\nexport function isFunctionCallMessage(msg: MessageUnion): msg is FunctionCallMessage {\n return msg.type === MessageType.FunctionCall;\n}\n\nexport function isFunctionCallOutputMessage(msg: MessageUnion): msg is FunctionCallOutputMessage {\n return msg.type === MessageType.FunctionCallOutput;\n}\n\nexport function isReasoningMessage(msg: MessageUnion): msg is ReasoningMessage {\n return msg.type === MessageType.Reasoning;\n}\n\nexport function isImageGenerationCallMessage(msg: MessageUnion): msg is ImageGenerationCallMessage {\n return msg.type === MessageType.ImageGenerationCall;\n}\n","import {\n ChunkType,\n ContentType,\n ConversationMessage,\n FunctionCallMessage,\n FunctionCallOutputMessage,\n ImageGenerationCallMessage,\n InputMessage,\n MessageUnion,\n ReasoningMessage,\n ResponseChunk,\n} from '../types';\n\n/**\n * Callback invoked when the conversation state changes\n */\nexport type OnChangeCallback = (conversation: ConversationMessage) => void;\n\n/**\n * Processes streaming chunks from the LLM response.\n * Builds up messages incrementally as chunks arrive.\n *\n * @example\n * ```ts\n * const processor = new ChunkProcessor(\n * 'conv-123',\n * 'thread-456',\n * (conversation) => {\n * // Update UI with new conversation state\n * setConversation(conversation);\n * }\n * );\n *\n * // Process incoming chunks\n * processor.processChunk(jsonData);\n *\n * // Get final conversation when done\n * const finalConversation = processor.getConversation();\n * ```\n */\nexport class ChunkProcessor {\n private messages: MessageUnion[] = [];\n private currentOutputItem: MessageUnion | null = null;\n private _onChange: OnChangeCallback;\n private conversation: ConversationMessage;\n\n constructor(\n conversationId: string,\n threadId: string,\n onChange: OnChangeCallback\n ) {\n this.conversation = {\n conversation_id: conversationId,\n thread_id: threadId,\n message_id: '',\n messages: [],\n meta: {},\n };\n this._onChange = onChange;\n }\n\n /**\n * Get all processed messages\n */\n getMessages(): MessageUnion[] {\n return this.messages;\n }\n\n /**\n * Get the current conversation state\n */\n getConversation(): ConversationMessage {\n return this.conversation;\n }\n\n private emitChange(): void {\n this.conversation.messages = [...this.messages];\n this._onChange({ ...this.conversation });\n }\n\n /**\n * Process a raw JSON chunk from the SSE stream\n */\n processChunk(data: string): void {\n try {\n const chunk: ResponseChunk = JSON.parse(data);\n this.handleChunk(chunk);\n } catch (e) {\n console.error('Failed to parse chunk:', e, data);\n }\n }\n\n private handleChunk(chunk: ResponseChunk): void {\n switch (chunk.type) {\n // Run lifecycle\n case ChunkType.ChunkTypeRunCreated:\n case ChunkType.ChunkTypeRunInProgress:\n case ChunkType.ChunkTypeRunCompleted:\n case ChunkType.ChunkTypeRunPaused:\n this.conversation.meta.run_state = chunk.run_state;\n this.conversation.message_id = chunk.run_state!.id;\n if (chunk.type !== ChunkType.ChunkTypeRunCreated && chunk.type !== ChunkType.ChunkTypeRunInProgress) {\n this.emitChange();\n }\n break;\n\n // Response lifecycle\n case ChunkType.ChunkTypeResponseCreated:\n case ChunkType.ChunkTypeResponseInProgress:\n break;\n\n case ChunkType.ChunkTypeResponseCompleted:\n if (chunk.response?.usage) {\n this.conversation.meta.usage = chunk.response.usage;\n this.emitChange();\n }\n break;\n\n // Output item lifecycle\n case ChunkType.ChunkTypeOutputItemAdded:\n this.handleOutputItemAdded(chunk);\n break;\n\n case ChunkType.ChunkTypeOutputItemDone:\n break;\n\n // Content parts\n case ChunkType.ChunkTypeContentPartAdded:\n this.handleContentPartAdded(chunk);\n break;\n\n case ChunkType.ChunkTypeContentPartDone:\n break;\n\n // Text deltas\n case ChunkType.ChunkTypeOutputTextDelta:\n this.handleOutputTextDelta(chunk);\n break;\n\n case ChunkType.ChunkTypeOutputTextDone:\n break;\n\n // Reasoning summary\n case ChunkType.ChunkTypeReasoningSummaryPartAdded:\n this.handleReasoningSummaryPartAdded(chunk);\n break;\n\n case ChunkType.ChunkTypeReasoningSummaryPartDone:\n break;\n\n case ChunkType.ChunkTypeReasoningSummaryTextDelta:\n this.handleReasoningSummaryTextDelta(chunk);\n break;\n\n case ChunkType.ChunkTypeReasoningSummaryTextDone:\n break;\n\n // Function calls\n case ChunkType.ChunkTypeFunctionCallArgumentsDelta:\n this.handleFunctionCallArgumentsDelta(chunk);\n break;\n\n case ChunkType.ChunkTypeFunctionCallArgumentsDone:\n break;\n\n case ChunkType.ChunkTypeFunctionCallOutput:\n this.handleFunctionCallOutput(chunk);\n break;\n\n // Image Generation Calls\n case ChunkType.ChunkTypeImageGenerationCallInProgress:\n break;\n\n case ChunkType.ChunkTypeImageGenerationCallGenerating:\n break;\n\n case ChunkType.ChunkTypeImageGenerationCallPartialImage:\n this.handleImageGenerationCallPartialImage(chunk);\n break;\n }\n }\n\n private handleOutputItemAdded(chunk: ResponseChunk): void {\n if (!chunk.item) return;\n\n switch (chunk.item.type) {\n case \"message\":\n this.currentOutputItem = {\n id: chunk.item.id,\n type: \"message\",\n role: chunk.item.role || \"assistant\",\n content: [],\n } as InputMessage;\n break;\n\n case \"function_call\":\n this.currentOutputItem = {\n id: chunk.item.id,\n type: \"function_call\",\n name: chunk.item.name || \"\",\n call_id: chunk.item.call_id || \"\",\n arguments: \"\",\n } as FunctionCallMessage;\n break;\n\n case \"reasoning\":\n this.currentOutputItem = {\n id: chunk.item.id,\n type: \"reasoning\",\n summary: [],\n } as ReasoningMessage;\n break;\n\n case \"image_generation_call\":\n this.currentOutputItem = {\n id: chunk.item.id,\n type: \"image_generation_call\",\n status: chunk.item.status,\n } as ImageGenerationCallMessage;\n break;\n }\n\n if (this.currentOutputItem) {\n this.messages.push(this.currentOutputItem);\n this.emitChange();\n }\n }\n\n private handleContentPartAdded(chunk: ResponseChunk): void {\n if (!this.currentOutputItem || this.currentOutputItem.type !== \"message\") return;\n\n const message = this.currentOutputItem as InputMessage;\n if (chunk.part?.type === ContentType.OutputText) {\n message.content = message.content || [];\n message.content.push({\n type: ContentType.OutputText,\n text: \"\",\n });\n this.emitChange();\n }\n }\n\n private handleOutputTextDelta(chunk: ResponseChunk): void {\n if (!this.currentOutputItem || this.currentOutputItem.type !== \"message\") return;\n\n const message = this.currentOutputItem as InputMessage;\n const contents = message.content;\n if (!contents?.length || !chunk.delta) return;\n\n const lastContent = contents[contents.length - 1];\n if (lastContent && 'text' in lastContent) {\n lastContent.text += chunk.delta;\n this.emitChange();\n }\n }\n\n private handleReasoningSummaryPartAdded(chunk: ResponseChunk): void {\n if (!this.currentOutputItem || this.currentOutputItem.type !== \"reasoning\") return;\n\n const reasoning = this.currentOutputItem as ReasoningMessage;\n if (chunk.part?.type === ContentType.SummaryText) {\n reasoning.summary = reasoning.summary || [];\n reasoning.summary.push({\n type: ContentType.SummaryText,\n text: \"\",\n });\n this.emitChange();\n }\n }\n\n private handleReasoningSummaryTextDelta(chunk: ResponseChunk): void {\n if (!this.currentOutputItem || this.currentOutputItem.type !== \"reasoning\") return;\n\n const reasoning = this.currentOutputItem as ReasoningMessage;\n reasoning.summary = reasoning.summary || [];\n\n const summaries = reasoning.summary;\n if (summaries.length === 0) {\n reasoning.summary.push({\n type: ContentType.SummaryText,\n text: \"\",\n });\n }\n\n if (!chunk.delta) return;\n\n const lastSummary = summaries[summaries.length - 1];\n if (lastSummary) {\n lastSummary.text += chunk.delta;\n this.emitChange();\n }\n }\n\n private handleFunctionCallArgumentsDelta(chunk: ResponseChunk): void {\n if (!this.currentOutputItem || this.currentOutputItem.type !== \"function_call\") return;\n\n const functionCall = this.currentOutputItem as FunctionCallMessage;\n functionCall.arguments += chunk.delta || \"\";\n this.emitChange();\n }\n\n private handleFunctionCallOutput(chunk: ResponseChunk): void {\n this.currentOutputItem = chunk as unknown as FunctionCallOutputMessage;\n this.messages.push(this.currentOutputItem);\n this.emitChange();\n }\n\n private handleImageGenerationCallPartialImage(chunk: ResponseChunk): void {\n if (!this.currentOutputItem || this.currentOutputItem.type !== \"image_generation_call\") return;\n\n const image = this.currentOutputItem as ImageGenerationCallMessage;\n image.result = chunk.partial_image_b64!;\n image.quality = chunk.quality!;\n image.size = chunk.size!;\n image.output_format = chunk.output_format!;\n image.background = chunk.background!;\n\n this.emitChange();\n }\n}\n\n","/**\n * Options for the SSE stream callbacks\n */\nexport interface SSEStreamOptions {\n /** Called for each data chunk received */\n onChunk: (data: string) => void;\n /** Called when an error occurs */\n onError?: (error: Error) => void;\n /** Called when the stream completes */\n onComplete?: () => void;\n}\n\n/**\n * Streams Server-Sent Events (SSE) from a URL.\n * Parses SSE frames and calls onChunk for each data payload.\n *\n * @param url - The URL to stream from\n * @param requestOptions - Fetch request options\n * @param callbacks - SSE event callbacks\n * @param abortSignal - Optional signal to abort the stream\n *\n * @example\n * ```ts\n * await streamSSE(\n * 'https://api.example.com/stream',\n * { method: 'POST', body: JSON.stringify({ message: 'Hello' }) },\n * {\n * onChunk: (data) => console.log('Received:', data),\n * onComplete: () => console.log('Done'),\n * onError: (err) => console.error('Error:', err),\n * }\n * );\n * ```\n */\nexport async function streamSSE(\n url: string,\n requestOptions: RequestInit,\n callbacks: SSEStreamOptions,\n abortSignal?: AbortSignal\n): Promise<void> {\n try {\n const response = await fetch(url, {\n ...requestOptions,\n signal: abortSignal,\n });\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n if (!response.body) {\n throw new Error('Response body is null');\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n while (true) {\n const { value, done } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n\n // Parse SSE frames: split on double newline\n let idx;\n while ((idx = buffer.indexOf('\\n\\n')) !== -1) {\n const frame = buffer.slice(0, idx);\n buffer = buffer.slice(idx + 2);\n\n // Join all data: lines in the frame\n const data = frame\n .split('\\n')\n .filter(line => line.startsWith('data:'))\n .map(line => line.slice(5).trim())\n .join('\\n');\n\n if (data) {\n callbacks.onChunk(data);\n }\n }\n }\n\n // Final flush of decoder state\n decoder.decode();\n callbacks.onComplete?.();\n } catch (error) {\n if ((error as Error).name === 'AbortError') {\n return;\n }\n callbacks.onError?.(error as Error);\n }\n}\n\n","import axios, { AxiosInstance } from 'axios';\nimport {useCallback, useEffect, useMemo, useRef, useState} from \"react\";\nimport {Agent} from \"../types\";\nimport {GetHeadersFn} from \"./useConversation\";\n\n/**\n * Options for the useProject hook\n */\nexport interface UseProjectOptions {\n /** Base URL of the Uno Agent Server (e.g., 'https://api.example.com/api/agent-server') */\n baseUrl: string;\n /** Project Name used to fetch the project ID */\n projectName: string;\n /** Optional organisation ID to scope all requests (sent as X-Org-ID header) */\n orgId?: string;\n /** Optional function to get custom headers for requests (e.g., for authentication) */\n getHeaders?: GetHeadersFn;\n /** Auto-load conversations on mount (default: true) */\n autoLoad?: boolean;\n}\n\n/**\n * Return type for the useProject hook\n */\nexport interface UseProjectReturn {\n // Project state\n /** The fetched project ID */\n projectId: string;\n /** Whether the project ID is being fetched */\n projectLoading: boolean;\n /** Axios instance configured with baseUrl and custom headers */\n axiosInstance: AxiosInstance;\n /** Function to build query params with project_id automatically added */\n buildParams: (params?: Record<string, string>) => Record<string, string>;\n /** Function to get request headers (combines default + custom headers) */\n getRequestHeaders: () => Promise<Record<string, string>>;\n /** Base URL used for the axios instance */\n baseUrl: string;\n}\n\nexport function useProject(options: UseProjectOptions): UseProjectReturn {\n const { projectName, baseUrl, orgId, getHeaders, autoLoad = true } = options;\n\n // Project state\n const [projectId, setProjectId] = useState<string>('');\n const [projectLoading, setProjectLoading] = useState(false);\n\n // Use ref to store current projectId for interceptor access\n const projectIdRef = useRef<string>('');\n\n // Update ref whenever projectId changes\n useEffect(() => {\n projectIdRef.current = projectId;\n }, [projectId]);\n\n // ── Clear stale projectId synchronously during render when projectName changes ──\n // When the org switches, ProjectContext clears selectedProject (during render),\n // causing projectName to become ''. Without this guard, downstream consumers\n // (useConversation, ChatPage, etc.) would still see the OLD projectId in their\n // effects, firing API calls with a stale project_id or without one entirely.\n const prevProjectNameRef = useRef<string | undefined>(undefined);\n if (prevProjectNameRef.current !== undefined && projectName !== prevProjectNameRef.current) {\n setProjectId('');\n projectIdRef.current = '';\n }\n prevProjectNameRef.current = projectName;\n\n // Create axios instance with request interceptor for custom headers and project_id\n const axiosInstance = useMemo(() => {\n const instance = axios.create({\n baseURL: baseUrl,\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n // Add request interceptor to inject custom headers, org_id, and project_id\n instance.interceptors.request.use(async (config) => {\n // Add org ID header if provided\n if (orgId) {\n config.headers.set('X-Org-ID', orgId);\n }\n\n // Add custom headers if getHeaders function is provided\n if (getHeaders) {\n const customHeaders = await getHeaders();\n Object.assign(config.headers, customHeaders);\n }\n\n // Automatically add project_id to query params if available\n const currentProjectId = projectIdRef.current;\n if (currentProjectId) {\n if (config.params) {\n config.params = {\n ...config.params,\n project_id: currentProjectId,\n };\n } else {\n config.params = { project_id: currentProjectId };\n }\n }\n \n return config;\n });\n\n return instance;\n }, [baseUrl, orgId, getHeaders]);\n\n\n // ============================================\n // API Helper Functions\n // ============================================\n\n /**\n * Build query params (project_id is automatically added by axios interceptor)\n */\n const buildParams = useCallback((params?: Record<string, string>) => {\n return params || {};\n }, []);\n\n /**\n * Get headers for streaming requests (combines default + custom + org headers)\n */\n const getRequestHeaders = useCallback(async (): Promise<Record<string, string>> => {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n // Add org ID header if provided\n if (orgId) {\n headers['X-Org-ID'] = orgId;\n }\n\n // Add custom headers if getHeaders function is provided\n if (getHeaders) {\n const customHeaders = await getHeaders();\n Object.assign(headers, customHeaders);\n }\n\n return headers;\n }, [orgId, getHeaders]);\n\n // ============================================\n // Project Management\n // ============================================\n\n /**\n * Fetch the project ID using the project name\n */\n const fetchProjectId = useCallback(async () => {\n if (!projectName) {\n return;\n }\n\n setProjectLoading(true);\n try {\n const response = await axiosInstance.get<{ data: string } | string>('/project/id', {\n params: { name: projectName },\n });\n const id = typeof response.data === 'string' ? response.data : response.data.data;\n setProjectId(id || '');\n } catch (error) {\n console.error('Failed to fetch project ID:', error);\n throw error;\n } finally {\n setProjectLoading(false);\n }\n }, [axiosInstance, projectName]);\n\n // ============================================\n // Effects for auto-loading\n // ============================================\n\n // Fetch project ID when projectName changes (or on mount)\n useEffect(() => {\n if (autoLoad && projectName) {\n fetchProjectId();\n }\n }, [autoLoad, projectName, fetchProjectId]);\n\n return {\n // Project state\n projectId,\n projectLoading,\n // API client\n axiosInstance,\n buildParams,\n getRequestHeaders,\n baseUrl,\n }\n}","import React, {createContext, useContext, useMemo} from 'react';\nimport type { ReactNode, ReactElement } from \"react\";\nimport { useProject, UseProjectOptions, UseProjectReturn } from '../hooks/useProject';\n\n/**\n * Context value for ProjectProvider\n */\nexport interface ProjectContextValue extends UseProjectReturn {}\n\n/**\n * Props for ProjectProvider component\n */\nexport interface ProjectProviderProps {\n /** Base URL of the Uno Agent Server (e.g., 'https://api.example.com/api/agent-server') */\n baseUrl: string;\n /** Project Name used to fetch the project ID */\n projectName: string;\n /** Optional organisation ID to scope all requests (sent as X-Org-ID header) */\n orgId?: string;\n /** Optional function to get custom headers for requests (e.g., for authentication) */\n getHeaders?: UseProjectOptions['getHeaders'];\n /** Auto-load project on mount (default: true) */\n autoLoad?: boolean;\n /** Child components */\n children: ReactNode;\n}\n\n// Create the context with undefined as default to ensure it's used within provider\nconst ProjectContext = createContext<ProjectContextValue | undefined>(undefined);\n\n/**\n * ProjectProvider component that manages project state using React Context.\n * \n * This provider wraps the useProject hook and makes the project state available\n * to all child components through context.\n * \n * @example\n * ```tsx\n * import { ProjectProvider, useProjectContext } from '@praveen001/uno-converse';\n * \n * function App() {\n * return (\n * <ProjectProvider\n * baseUrl=\"https://api.example.com/api/agent-server\"\n * projectName=\"my-project\"\n * getHeaders={() => ({\n * 'Authorization': `Bearer ${getToken()}`,\n * })}\n * >\n * <YourApp />\n * </ProjectProvider>\n * );\n * }\n * \n * function YourApp() {\n * const { projectId, projectLoading } = useProjectContext();\n * \n * if (projectLoading) {\n * return <div>Loading project...</div>;\n * }\n * \n * return <div>Project ID: {projectId}</div>;\n * }\n * ```\n */\nexport const ProjectProvider = ({\n baseUrl,\n projectName,\n orgId,\n getHeaders,\n autoLoad = true,\n children,\n}: ProjectProviderProps): ReactElement => {\n // Use the useProject hook to manage project state\n const projectState = useProject({\n baseUrl,\n projectName,\n orgId,\n getHeaders,\n autoLoad,\n });\n\n // Memoize the context value to prevent unnecessary re-renders\n const contextValue = useMemo<ProjectContextValue>(\n () => projectState,\n [\n projectState.projectId,\n projectState.projectLoading,\n projectState.axiosInstance,\n projectState.buildParams,\n projectState.getRequestHeaders,\n projectState.baseUrl,\n ]\n );\n\n return (\n <ProjectContext.Provider value={contextValue}>\n {children}\n </ProjectContext.Provider>\n );\n};\n\n/**\n * Hook to access the project context.\n * \n * Must be used within a ProjectProvider component.\n * \n * @throws {Error} If used outside of ProjectProvider\n * \n * @example\n * ```tsx\n * function MyComponent() {\n * const { projectId, projectLoading } = useProjectContext();\n * \n * return (\n * <div>\n * {projectLoading ? 'Loading...' : `Project ID: ${projectId}`}\n * </div>\n * );\n * }\n * ```\n */\nexport const useProjectContext = (): ProjectContextValue => {\n const context = useContext(ProjectContext);\n \n if (context === undefined) {\n throw new Error('useProjectContext must be used within a ProjectProvider');\n }\n \n return context;\n};\n\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { ChunkProcessor } from '../streaming/ChunkProcessor';\nimport { streamSSE } from '../streaming/streamSSE';\nimport {\n Agent,\n Conversation,\n ConversationMessage,\n ConverseConfig,\n MessageType,\n MessageUnion,\n Thread,\n} from '../types';\nimport { useProjectContext } from '../ProjectProvider';\n\n/**\n * Simple ID generator for message IDs\n */\nfunction generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).substring(2, 11)}`;\n}\n\n/**\n * Function type for providing custom headers.\n * Called before each request to get headers (useful for dynamic auth tokens).\n *\n * @example\n * ```ts\n * const getHeaders: GetHeadersFn = () => ({\n * 'Authorization': `Bearer ${getToken()}`,\n * 'X-Custom-Header': 'value',\n * });\n * ```\n */\nexport type GetHeadersFn = () => Record<string, string> | Promise<Record<string, string>>;\n\n/**\n * Options for the useConversation hook\n */\nexport interface UseConversationOptions {\n /** The namespace for conversations */\n namespace: string;\n /** Auto-load conversations on mount (default: true) */\n autoLoad?: boolean;\n}\n\n/**\n * Return type for the useConversation hook\n */\nexport interface UseConversationReturn {\n // Conversation list state\n /** List of all conversations */\n conversations: Conversation[];\n /** Whether conversations are being loaded */\n conversationsLoading: boolean;\n\n // Thread state\n /** List of threads in the current conversation */\n threads: Thread[];\n /** Whether threads are being loaded */\n threadsLoading: boolean;\n /** Currently selected thread */\n currentThread: Thread | null;\n\n // Message state\n /** List of messages in the current thread */\n messages: ConversationMessage[];\n /** Message currently being streamed */\n streamingMessage: ConversationMessage | null;\n /** Whether messages are being loaded */\n messagesLoading: boolean;\n /** Whether a response is currently streaming */\n isStreaming: boolean;\n /** Whether waiting for a response */\n isThinking: boolean;\n\n // Current selection\n /** ID of the currently selected conversation */\n currentConversationId: string | null;\n /** ID of the currently selected thread */\n currentThreadId: string | null;\n\n // Actions - Conversations\n /** Load all conversations */\n loadConversations: () => Promise<void>;\n /** Select a conversation by ID */\n selectConversation: (conversationId: string) => void;\n\n // Actions - Threads\n /** Load threads for a conversation */\n loadThreads: (conversationId: string) => Promise<void>;\n /** Select a thread by ID */\n selectThread: (threadId: string) => void;\n\n // Actions - Messages\n /** Send a message and stream the response */\n sendMessage: (userMessages: MessageUnion[], config: ConverseConfig) => Promise<void>;\n\n // Actions - Utility\n /** Start a new chat (clears current state) */\n startNewChat: () => void;\n\n // Combined messages (loaded + streaming)\n /** All messages including the currently streaming one */\n allMessages: ConversationMessage[];\n}\n\n/**\n * A comprehensive hook for managing conversations, threads, messages, and streaming\n * with Uno Agent Server.\n *\n * @example\n * ```tsx\n * import { useConversation } from '@praveen001/uno-converse';\n *\n * function ChatComponent() {\n * const {\n * allMessages,\n * isStreaming,\n * sendMessage,\n * startNewChat,\n * } = useConversation({\n * namespace: 'my-app',\n * });\n *\n * const handleSend = async (text: string) => {\n * await sendMessage(\n * [{ type: 'message', id: '1', content: text }],\n * {\n * namespace: 'my-app',\n * agentName: 'my-agent',\n * }\n * );\n * };\n *\n * return (\n * <div>\n * {allMessages.map(msg => (\n * <MessageComponent key={msg.message_id} message={msg} />\n * ))}\n * {isStreaming && <LoadingIndicator />}\n * </div>\n * );\n * }\n * ```\n */\nexport function useConversation(options: UseConversationOptions): UseConversationReturn {\n const { namespace, autoLoad = true } = options;\n\n // Get project context (axios instance, projectId, etc.)\n const {\n axiosInstance,\n projectId,\n projectLoading,\n buildParams,\n getRequestHeaders,\n baseUrl,\n } = useProjectContext();\n\n // Conversation list state\n const [conversations, setConversations] = useState<Conversation[]>([]);\n const [conversationsLoading, setConversationsLoading] = useState(false);\n\n // Thread state\n const [threads, setThreads] = useState<Thread[]>([]);\n const [threadsLoading, setThreadsLoading] = useState(false);\n\n // Message state\n const [messages, setMessages] = useState<ConversationMessage[]>([]);\n const [streamingMessage, setStreamingMessage] = useState<ConversationMessage | null>(null);\n const [messagesLoading, setMessagesLoading] = useState(false);\n const [isStreaming, setIsStreaming] = useState(false);\n const [isThinking, setIsThinking] = useState(false);\n\n // Current selection\n const [currentConversationId, setCurrentConversationId] = useState<string | null>(null);\n const [currentThreadId, setCurrentThreadId] = useState<string | null>(null);\n\n // Refs\n const processorRef = useRef<ChunkProcessor | null>(null);\n const abortControllerRef = useRef<AbortController | null>(null);\n\n // ============================================\n // API Helper Functions\n // ============================================\n // Note: buildParams and getRequestHeaders are now provided by ProjectProvider\n\n // ============================================\n // Conversation Management\n // ============================================\n\n /**\n * Load all conversations for the namespace\n */\n const loadConversations = useCallback(async () => {\n setConversationsLoading(true);\n try {\n const response = await axiosInstance.get<{ data: Conversation[] } | Conversation[]>('/conversations', {\n params: buildParams({ namespace }),\n });\n const data = 'data' in response.data ? response.data.data : response.data;\n setConversations(data || []);\n } catch (error) {\n console.error('Failed to load conversations:', error);\n throw error;\n } finally {\n setConversationsLoading(false);\n }\n }, [axiosInstance, buildParams, namespace]);\n\n /**\n * Select a conversation and load its threads\n */\n const selectConversation = useCallback((conversationId: string) => {\n setCurrentConversationId(conversationId);\n // Threads will be loaded via useEffect\n }, []);\n\n // ============================================\n // Thread Management\n // ============================================\n\n /**\n * Load threads for a conversation\n */\n const loadThreads = useCallback(async (conversationId: string) => {\n setThreadsLoading(true);\n try {\n const response = await axiosInstance.get<{ data: Thread[] } | Thread[]>('/threads', {\n params: buildParams({ conversation_id: conversationId, namespace }),\n });\n const loadedThreads = 'data' in response.data ? response.data.data : response.data;\n\n // Sort by created_at descending\n loadedThreads.sort(\n (a, b) => new Date(b.created_at).getTime() - new Date(a.created_at).getTime()\n );\n\n setThreads(loadedThreads);\n\n // Auto-select the latest thread\n if (loadedThreads.length > 0) {\n setCurrentThreadId(loadedThreads[0].thread_id);\n }\n } catch (error) {\n console.error('Failed to load threads:', error);\n throw error;\n } finally {\n setThreadsLoading(false);\n }\n }, [axiosInstance, buildParams, namespace]);\n\n /**\n * Select a thread and load its messages\n */\n const selectThread = useCallback((threadId: string) => {\n setCurrentThreadId(threadId);\n // Messages will be loaded via useEffect\n }, []);\n\n // ============================================\n // Message Management\n // ============================================\n\n /**\n * Load messages for a thread\n */\n const loadMessages = useCallback(async (threadId: string) => {\n setMessagesLoading(true);\n try {\n const response = await axiosInstance.get<{ data: ConversationMessage[] } | ConversationMessage[]>('/messages', {\n params: buildParams({ thread_id: threadId, namespace }),\n });\n const loadedMessages = 'data' in response.data ? response.data.data : response.data;\n\n // // Extract last message ID for continuation\n // if (loadedMessages.length > 0) {\n // const lastMsgId = loadedMessages[loadedMessages.length - 1].message_id;\n // setPreviousMessageId(lastMsgId);\n // } else {\n // setPreviousMessageId('');\n // }\n\n setMessages(loadedMessages);\n } catch (error) {\n console.error('Failed to load messages:', error);\n throw error;\n } finally {\n setMessagesLoading(false);\n }\n }, [axiosInstance, buildParams, namespace]);\n\n /**\n * Send a user message and stream the response\n */\n const sendMessage = useCallback(async (userMessages: MessageUnion[], config: ConverseConfig) => {\n const messageId = generateId();\n\n // Check if this is a tool approval response (resuming a run)\n const isToolApproval = userMessages.length === 1 &&\n userMessages[0].type === MessageType.FunctionCallApprovalResponse;\n\n // Only add user message for regular messages, not for tool approvals\n if (!isToolApproval) {\n const userConversation: ConversationMessage = {\n conversation_id: currentConversationId || '',\n thread_id: currentThreadId || '',\n message_id: messageId + '-user',\n messages: userMessages,\n meta: {},\n };\n setMessages(prev => [...prev, userConversation]);\n }\n\n // Initialize the chunk processor for the assistant response\n processorRef.current = new ChunkProcessor(\n currentConversationId || '',\n currentThreadId || '',\n (conversation) => {\n setIsThinking(isThinking);\n setStreamingMessage({ ...conversation, isStreaming: true });\n }\n );\n\n setIsStreaming(true);\n setIsThinking(true);\n\n // Build URL with query parameters\n const params = new URLSearchParams();\n if (projectId) {\n params.append('project_id', projectId);\n }\n params.append('agent_id', config.agentId);\n\n let url = `${baseUrl}/converse?${params.toString()}`;\n if (!!config.baseUrl) {\n url = config.baseUrl;\n }\n\n // Prepare request body\n const body = JSON.stringify({\n namespace: config.namespace,\n thread_id: currentThreadId,\n message: userMessages[0],\n context: config.context || {},\n });\n\n // Abort any existing stream\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n abortControllerRef.current = new AbortController();\n\n try {\n // Get headers (supports async getHeaders function)\n const requestHeaders = await getRequestHeaders();\n\n await streamSSE(\n url,\n {\n method: 'POST',\n body,\n headers: {\n ...requestHeaders,\n ...(config.headers || {}),\n },\n },\n {\n onChunk: (data) => {\n processorRef.current?.processChunk(data);\n },\n onComplete: () => {\n // Move streaming message to messages list\n if (processorRef.current) {\n const finalConversation = processorRef.current.getConversation();\n\n if (isToolApproval) {\n // For tool approvals, update the last message instead of appending\n setMessages(prev => {\n const newMessages = [...prev];\n if (newMessages.length > 0) {\n const lastMsg = newMessages[newMessages.length - 1];\n newMessages[newMessages.length - 1] = {\n ...lastMsg,\n messages: [...lastMsg.messages, ...finalConversation.messages],\n meta: finalConversation.meta,\n isStreaming: false,\n };\n }\n return newMessages;\n });\n } else {\n setMessages(prev => [...prev, { ...finalConversation, isStreaming: false }]);\n }\n\n setStreamingMessage(null);\n // setPreviousMessageId(finalConversation.message_id);\n }\n },\n onError: (error) => {\n console.error('Streaming error:', error);\n setStreamingMessage(null);\n },\n },\n abortControllerRef.current.signal\n );\n\n // If this was a new conversation, fetch the conversation info\n if (!currentThreadId || currentThreadId === '' && processorRef.current) {\n try {\n const response = await axiosInstance.get<{ data: ConversationMessage } | ConversationMessage>(\n `/messages/${processorRef.current.getConversation().message_id}`,\n { params: buildParams({ namespace }) }\n );\n const messageData = 'data' in response.data ? response.data.data : response.data;\n const newConversationId = messageData?.conversation_id;\n if (newConversationId) {\n // Add new conversation to list\n setConversations(prev => [{\n conversation_id: newConversationId,\n name: \"New Conversation\",\n namespace_id: namespace,\n created_at: new Date().toISOString(),\n last_updated: new Date().toISOString(),\n } as Conversation, ...prev.filter(c => c.conversation_id !== newConversationId)]);\n\n setCurrentConversationId(newConversationId);\n }\n } catch (e) {\n console.error('Failed to get conversation ID:', e);\n }\n }\n } finally {\n setIsStreaming(false);\n abortControllerRef.current = null;\n }\n }, [currentConversationId, currentThreadId, namespace, baseUrl, projectId, axiosInstance, buildParams, getRequestHeaders]);\n\n // ============================================\n // Utility Actions\n // ============================================\n\n /**\n * Start a new chat (reset all state)\n */\n const startNewChat = useCallback(() => {\n // Abort any ongoing stream\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n abortControllerRef.current = null;\n }\n\n setCurrentConversationId(null);\n setCurrentThreadId(null);\n setThreads([]);\n setMessages([]);\n setStreamingMessage(null);\n setIsStreaming(false);\n setIsThinking(false);\n processorRef.current = null;\n }, []);\n\n // ============================================\n // Effects for auto-loading\n // ============================================\n\n // Clear stale conversation state when project changes (e.g., org switch).\n // This runs before the loading effect below (effects execute in declaration\n // order) and ensures we never show data from a previous project/org.\n useEffect(() => {\n setConversations([]);\n setThreads([]);\n setMessages([]);\n setStreamingMessage(null);\n setCurrentConversationId(null);\n setCurrentThreadId(null);\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n abortControllerRef.current = null;\n }\n processorRef.current = null;\n }, [projectId]);\n\n // Load conversations after project ID is fetched\n useEffect(() => {\n if (autoLoad && projectId) {\n loadConversations();\n }\n }, [autoLoad, projectId, loadConversations]);\n\n // Load threads when conversation changes\n useEffect(() => {\n if (currentConversationId) {\n loadThreads(currentConversationId);\n }\n }, [currentConversationId, loadThreads]);\n\n // Load messages when thread changes\n useEffect(() => {\n if (currentThreadId) {\n loadMessages(currentThreadId);\n }\n }, [currentThreadId, loadMessages]);\n\n // ============================================\n // Computed values\n // ============================================\n\n const currentThread = threads.find(t => t.thread_id === currentThreadId) || null;\n\n const allMessages = streamingMessage\n ? [...messages, streamingMessage]\n : messages;\n\n return {\n // Conversation list state\n conversations,\n conversationsLoading,\n\n // Thread state\n threads,\n threadsLoading,\n currentThread,\n\n // Message state\n messages,\n streamingMessage,\n messagesLoading,\n isStreaming,\n isThinking,\n\n // Current selection\n currentConversationId,\n currentThreadId,\n\n // Actions - Conversations\n loadConversations,\n selectConversation,\n\n // Actions - Threads\n loadThreads,\n selectThread,\n\n // Actions - Messages\n sendMessage,\n\n // Actions - Utility\n startNewChat,\n\n // Combined messages\n allMessages,\n };\n}\n\n","import axios from 'axios';\nimport {useCallback, useEffect, useMemo, useState} from \"react\";\nimport {Agent} from \"../types\";\nimport {GetHeadersFn} from \"./useConversation\";\nimport { useProjectContext } from '../ProjectProvider';\n\n/**\n * Options for the useAgent hook\n */\nexport interface UseAgentOptions {\n /** The name of the agent */\n name: string;\n}\n\n/**\n * Return type for the useAgent hook\n */\nexport interface UseAgentReturn {\n // Agent\n agent: Agent | null;\n /** Whether the agent is being loaded */\n agentLoading: boolean;\n}\n\nexport function useAgent(options: UseAgentOptions): UseAgentReturn {\n const { name } = options;\n\n // Get project context (axios instance, projectId, etc.)\n const {\n axiosInstance,\n projectId,\n buildParams,\n } = useProjectContext();\n\n // Agents state\n const [agent, setAgent] = useState<Agent | null>(null);\n const [agentLoading, setAgentLoading] = useState(false);\n\n // ============================================\n // Agent Management\n // ============================================\n\n /**\n * Fetch the agent\n */\n const loadAgent = useCallback(async (): Promise<void> => {\n setAgentLoading(true);\n try {\n const response = await axiosInstance.get<{data: Agent}>('/agent-configs/by-name', {\n params: buildParams({ name }),\n });\n setAgent(response.data.data);\n } catch (error) {\n console.error('Failed to load agent:', error)\n throw error;\n } finally {\n setAgentLoading(false);\n }\n }, [axiosInstance, name]);\n\n // Fetch agent after project is fetched\n useEffect(() => {\n if (projectId) {\n loadAgent();\n }\n }, [projectId, loadAgent]);\n\n return { agent, agentLoading };\n}"],"names":["Role","MessageType","ContentType","ChunkType","useState","useRef","useEffect","useMemo","useCallback","createContext","_jsx","useContext"],"mappings":";;;;;;AAOA;AACYA;AAAZ,CAAA,UAAY,IAAI,EAAA;AACd,IAAA,IAAA,CAAA,MAAA,CAAA,GAAA,MAAa;AACb,IAAA,IAAA,CAAA,WAAA,CAAA,GAAA,WAAuB;AACvB,IAAA,IAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AACjB,IAAA,IAAA,CAAA,WAAA,CAAA,GAAA,WAAuB;AACzB,CAAC,EALWA,YAAI,KAAJA,YAAI,GAAA,EAAA,CAAA,CAAA;AAOhB;AACYC;AAAZ,CAAA,UAAY,WAAW,EAAA;AACrB,IAAA,WAAA,CAAA,SAAA,CAAA,GAAA,SAAmB;AACnB,IAAA,WAAA,CAAA,cAAA,CAAA,GAAA,eAA8B;AAC9B,IAAA,WAAA,CAAA,oBAAA,CAAA,GAAA,sBAA2C;AAC3C,IAAA,WAAA,CAAA,WAAA,CAAA,GAAA,WAAuB;AACvB,IAAA,WAAA,CAAA,qBAAA,CAAA,GAAA,uBAA6C;AAC7C,IAAA,WAAA,CAAA,8BAAA,CAAA,GAAA,iCAAgE;AAClE,CAAC,EAPWA,mBAAW,KAAXA,mBAAW,GAAA,EAAA,CAAA,CAAA;AASvB;AACYC;AAAZ,CAAA,UAAY,WAAW,EAAA;AACrB,IAAA,WAAA,CAAA,WAAA,CAAA,GAAA,YAAwB;AACxB,IAAA,WAAA,CAAA,YAAA,CAAA,GAAA,aAA0B;AAC1B,IAAA,WAAA,CAAA,aAAA,CAAA,GAAA,cAA4B;AAC5B,IAAA,WAAA,CAAA,YAAA,CAAA,GAAA,aAA0B;AAC5B,CAAC,EALWA,mBAAW,KAAXA,mBAAW,GAAA,EAAA,CAAA,CAAA;AAOvB;AACYC;AAAZ,CAAA,UAAY,SAAS,EAAA;AACnB,IAAA,SAAA,CAAA,qBAAA,CAAA,GAAA,aAAmC;AACnC,IAAA,SAAA,CAAA,wBAAA,CAAA,GAAA,iBAA0C;AAC1C,IAAA,SAAA,CAAA,oBAAA,CAAA,GAAA,YAAiC;AACjC,IAAA,SAAA,CAAA,uBAAA,CAAA,GAAA,eAAuC;AACvC,IAAA,SAAA,CAAA,0BAAA,CAAA,GAAA,kBAA6C;AAC7C,IAAA,SAAA,CAAA,6BAAA,CAAA,GAAA,sBAAoD;AACpD,IAAA,SAAA,CAAA,4BAAA,CAAA,GAAA,oBAAiD;AACjD,IAAA,SAAA,CAAA,0BAAA,CAAA,GAAA,4BAAuD;AACvD,IAAA,SAAA,CAAA,yBAAA,CAAA,GAAA,2BAAqD;AACrD,IAAA,SAAA,CAAA,2BAAA,CAAA,GAAA,6BAAyD;AACzD,IAAA,SAAA,CAAA,0BAAA,CAAA,GAAA,4BAAuD;AACvD,IAAA,SAAA,CAAA,0BAAA,CAAA,GAAA,4BAAuD;AACvD,IAAA,SAAA,CAAA,yBAAA,CAAA,GAAA,2BAAqD;AACrD,IAAA,SAAA,CAAA,qCAAA,CAAA,GAAA,wCAA8E;AAC9E,IAAA,SAAA,CAAA,oCAAA,CAAA,GAAA,uCAA4E;AAC5E,IAAA,SAAA,CAAA,oCAAA,CAAA,GAAA,uCAA4E;AAC5E,IAAA,SAAA,CAAA,mCAAA,CAAA,GAAA,sCAA0E;AAC1E,IAAA,SAAA,CAAA,oCAAA,CAAA,GAAA,uCAA4E;AAC5E,IAAA,SAAA,CAAA,mCAAA,CAAA,GAAA,sCAA0E;;AAG1E,IAAA,SAAA,CAAA,wCAAA,CAAA,GAAA,4CAAqF;AACrF,IAAA,SAAA,CAAA,wCAAA,CAAA,GAAA,2CAAoF;AACpF,IAAA,SAAA,CAAA,0CAAA,CAAA,GAAA,8CAAyF;;AAGzF,IAAA,SAAA,CAAA,6BAAA,CAAA,GAAA,sBAAoD;AACtD,CAAC,EA5BWA,iBAAS,KAATA,iBAAS,GAAA,EAAA,CAAA,CAAA;AAiTrB;AACM,SAAU,aAAa,CAAC,GAAiB,EAAA;AAC7C,IAAA,OAAO,GAAG,CAAC,IAAI,KAAKF,mBAAW,CAAC,OAAO,IAAI,SAAS,IAAI,GAAG,KAAK,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAChI;AAEM,SAAU,cAAc,CAAC,GAAiB,EAAA;IAC9C,OAAO,GAAG,CAAC,IAAI,KAAKA,mBAAW,CAAC,OAAO,IAAI,SAAS,IAAI,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;AAC3F;AAEM,SAAU,qBAAqB,CAAC,GAAiB,EAAA;AACrD,IAAA,OAAO,GAAG,CAAC,IAAI,KAAKA,mBAAW,CAAC,YAAY;AAC9C;AAEM,SAAU,2BAA2B,CAAC,GAAiB,EAAA;AAC3D,IAAA,OAAO,GAAG,CAAC,IAAI,KAAKA,mBAAW,CAAC,kBAAkB;AACpD;AAEM,SAAU,kBAAkB,CAAC,GAAiB,EAAA;AAClD,IAAA,OAAO,GAAG,CAAC,IAAI,KAAKA,mBAAW,CAAC,SAAS;AAC3C;AAEM,SAAU,4BAA4B,CAAC,GAAiB,EAAA;AAC5D,IAAA,OAAO,GAAG,CAAC,IAAI,KAAKA,mBAAW,CAAC,mBAAmB;AACrD;;ACxVA;;;;;;;;;;;;;;;;;;;;;AAqBG;MACU,cAAc,CAAA;AAMzB,IAAA,WAAA,CACE,cAAsB,EACtB,QAAgB,EAChB,QAA0B,EAAA;QARpB,IAAA,CAAA,QAAQ,GAAmB,EAAE;QAC7B,IAAA,CAAA,iBAAiB,GAAwB,IAAI;QASnD,IAAI,CAAC,YAAY,GAAG;AAClB,YAAA,eAAe,EAAE,cAAc;AAC/B,YAAA,SAAS,EAAE,QAAQ;AACnB,YAAA,UAAU,EAAE,EAAE;AACd,YAAA,QAAQ,EAAE,EAAE;AACZ,YAAA,IAAI,EAAE,EAAE;SACT;AACD,QAAA,IAAI,CAAC,SAAS,GAAG,QAAQ;IAC3B;AAEA;;AAEG;IACH,WAAW,GAAA;QACT,OAAO,IAAI,CAAC,QAAQ;IACtB;AAEA;;AAEG;IACH,eAAe,GAAA;QACb,OAAO,IAAI,CAAC,YAAY;IAC1B;IAEQ,UAAU,GAAA;QAChB,IAAI,CAAC,YAAY,CAAC,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC/C,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;IAC1C;AAEA;;AAEG;AACH,IAAA,YAAY,CAAC,IAAY,EAAA;AACvB,QAAA,IAAI;YACF,MAAM,KAAK,GAAkB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;AAC7C,YAAA,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;QACzB;QAAE,OAAO,CAAC,EAAE;YACV,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,CAAC,EAAE,IAAI,CAAC;QAClD;IACF;AAEQ,IAAA,WAAW,CAAC,KAAoB,EAAA;AACtC,QAAA,QAAQ,KAAK,CAAC,IAAI;;YAEhB,KAAKE,iBAAS,CAAC,mBAAmB;YAClC,KAAKA,iBAAS,CAAC,sBAAsB;YACrC,KAAKA,iBAAS,CAAC,qBAAqB;YACpC,KAAKA,iBAAS,CAAC,kBAAkB;gBAC/B,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS;gBAClD,IAAI,CAAC,YAAY,CAAC,UAAU,GAAG,KAAK,CAAC,SAAU,CAAC,EAAE;AAClD,gBAAA,IAAI,KAAK,CAAC,IAAI,KAAKA,iBAAS,CAAC,mBAAmB,IAAI,KAAK,CAAC,IAAI,KAAKA,iBAAS,CAAC,sBAAsB,EAAE;oBACnG,IAAI,CAAC,UAAU,EAAE;gBACnB;gBACA;;YAGF,KAAKA,iBAAS,CAAC,wBAAwB;YACvC,KAAKA,iBAAS,CAAC,2BAA2B;gBACxC;YAEF,KAAKA,iBAAS,CAAC,0BAA0B;AACvC,gBAAA,IAAI,KAAK,CAAC,QAAQ,EAAE,KAAK,EAAE;AACzB,oBAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK;oBACnD,IAAI,CAAC,UAAU,EAAE;gBACnB;gBACA;;YAGF,KAAKA,iBAAS,CAAC,wBAAwB;AACrC,gBAAA,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC;gBACjC;YAEF,KAAKA,iBAAS,CAAC,uBAAuB;gBACpC;;YAGF,KAAKA,iBAAS,CAAC,yBAAyB;AACtC,gBAAA,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC;gBAClC;YAEF,KAAKA,iBAAS,CAAC,wBAAwB;gBACrC;;YAGF,KAAKA,iBAAS,CAAC,wBAAwB;AACrC,gBAAA,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC;gBACjC;YAEF,KAAKA,iBAAS,CAAC,uBAAuB;gBACpC;;YAGF,KAAKA,iBAAS,CAAC,kCAAkC;AAC/C,gBAAA,IAAI,CAAC,+BAA+B,CAAC,KAAK,CAAC;gBAC3C;YAEF,KAAKA,iBAAS,CAAC,iCAAiC;gBAC9C;YAEF,KAAKA,iBAAS,CAAC,kCAAkC;AAC/C,gBAAA,IAAI,CAAC,+BAA+B,CAAC,KAAK,CAAC;gBAC3C;YAEF,KAAKA,iBAAS,CAAC,iCAAiC;gBAC9C;;YAGF,KAAKA,iBAAS,CAAC,mCAAmC;AAChD,gBAAA,IAAI,CAAC,gCAAgC,CAAC,KAAK,CAAC;gBAC5C;YAEF,KAAKA,iBAAS,CAAC,kCAAkC;gBAC/C;YAEF,KAAKA,iBAAS,CAAC,2BAA2B;AACxC,gBAAA,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC;gBACpC;;YAGF,KAAKA,iBAAS,CAAC,sCAAsC;gBACnD;YAEF,KAAKA,iBAAS,CAAC,sCAAsC;gBACnD;YAEF,KAAKA,iBAAS,CAAC,wCAAwC;AACrD,gBAAA,IAAI,CAAC,qCAAqC,CAAC,KAAK,CAAC;gBACjD;;IAEN;AAEQ,IAAA,qBAAqB,CAAC,KAAoB,EAAA;QAChD,IAAI,CAAC,KAAK,CAAC,IAAI;YAAE;AAEjB,QAAA,QAAQ,KAAK,CAAC,IAAI,CAAC,IAAI;AACrB,YAAA,KAAK,SAAS;gBACZ,IAAI,CAAC,iBAAiB,GAAG;AACvB,oBAAA,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE;AACjB,oBAAA,IAAI,EAAE,SAAS;AACf,oBAAA,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,WAAW;AACpC,oBAAA,OAAO,EAAE,EAAE;iBACI;gBACjB;AAEF,YAAA,KAAK,eAAe;gBAClB,IAAI,CAAC,iBAAiB,GAAG;AACvB,oBAAA,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE;AACjB,oBAAA,IAAI,EAAE,eAAe;AACrB,oBAAA,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE;AAC3B,oBAAA,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE;AACjC,oBAAA,SAAS,EAAE,EAAE;iBACS;gBACxB;AAEF,YAAA,KAAK,WAAW;gBACd,IAAI,CAAC,iBAAiB,GAAG;AACvB,oBAAA,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE;AACjB,oBAAA,IAAI,EAAE,WAAW;AACjB,oBAAA,OAAO,EAAE,EAAE;iBACQ;gBACrB;AAEF,YAAA,KAAK,uBAAuB;gBAC1B,IAAI,CAAC,iBAAiB,GAAG;AACvB,oBAAA,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE;AACjB,oBAAA,IAAI,EAAE,uBAAuB;AAC7B,oBAAA,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM;iBACI;gBAC/B;;AAGJ,QAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE;YAC1B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC;YAC1C,IAAI,CAAC,UAAU,EAAE;QACnB;IACF;AAEQ,IAAA,sBAAsB,CAAC,KAAoB,EAAA;QACjD,IAAI,CAAC,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,iBAAiB,CAAC,IAAI,KAAK,SAAS;YAAE;AAE1E,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiC;QACtD,IAAI,KAAK,CAAC,IAAI,EAAE,IAAI,KAAKD,mBAAW,CAAC,UAAU,EAAE;YAC/C,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE;AACvC,YAAA,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;gBACnB,IAAI,EAAEA,mBAAW,CAAC,UAAU;AAC5B,gBAAA,IAAI,EAAE,EAAE;AACT,aAAA,CAAC;YACF,IAAI,CAAC,UAAU,EAAE;QACnB;IACF;AAEQ,IAAA,qBAAqB,CAAC,KAAoB,EAAA;QAChD,IAAI,CAAC,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,iBAAiB,CAAC,IAAI,KAAK,SAAS;YAAE;AAE1E,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiC;AACtD,QAAA,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO;QAChC,IAAI,CAAC,QAAQ,EAAE,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK;YAAE;QAEvC,MAAM,WAAW,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;AACjD,QAAA,IAAI,WAAW,IAAI,MAAM,IAAI,WAAW,EAAE;AACxC,YAAA,WAAW,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK;YAC/B,IAAI,CAAC,UAAU,EAAE;QACnB;IACF;AAEQ,IAAA,+BAA+B,CAAC,KAAoB,EAAA;QAC1D,IAAI,CAAC,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,iBAAiB,CAAC,IAAI,KAAK,WAAW;YAAE;AAE5E,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,iBAAqC;QAC5D,IAAI,KAAK,CAAC,IAAI,EAAE,IAAI,KAAKA,mBAAW,CAAC,WAAW,EAAE;YAChD,SAAS,CAAC,OAAO,GAAG,SAAS,CAAC,OAAO,IAAI,EAAE;AAC3C,YAAA,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC;gBACrB,IAAI,EAAEA,mBAAW,CAAC,WAAW;AAC7B,gBAAA,IAAI,EAAE,EAAE;AACT,aAAA,CAAC;YACF,IAAI,CAAC,UAAU,EAAE;QACnB;IACF;AAEQ,IAAA,+BAA+B,CAAC,KAAoB,EAAA;QAC1D,IAAI,CAAC,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,iBAAiB,CAAC,IAAI,KAAK,WAAW;YAAE;AAE5E,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,iBAAqC;QAC5D,SAAS,CAAC,OAAO,GAAG,SAAS,CAAC,OAAO,IAAI,EAAE;AAE3C,QAAA,MAAM,SAAS,GAAG,SAAS,CAAC,OAAO;AACnC,QAAA,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE;AAC1B,YAAA,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC;gBACrB,IAAI,EAAEA,mBAAW,CAAC,WAAW;AAC7B,gBAAA,IAAI,EAAE,EAAE;AACT,aAAA,CAAC;QACJ;QAEA,IAAI,CAAC,KAAK,CAAC,KAAK;YAAE;QAElB,MAAM,WAAW,GAAG,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;QACnD,IAAI,WAAW,EAAE;AACf,YAAA,WAAW,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK;YAC/B,IAAI,CAAC,UAAU,EAAE;QACnB;IACF;AAEQ,IAAA,gCAAgC,CAAC,KAAoB,EAAA;QAC3D,IAAI,CAAC,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,iBAAiB,CAAC,IAAI,KAAK,eAAe;YAAE;AAEhF,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,iBAAwC;QAClE,YAAY,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,IAAI,EAAE;QAC3C,IAAI,CAAC,UAAU,EAAE;IACnB;AAEQ,IAAA,wBAAwB,CAAC,KAAoB,EAAA;AACnD,QAAA,IAAI,CAAC,iBAAiB,GAAG,KAA6C;QACtE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC;QAC1C,IAAI,CAAC,UAAU,EAAE;IACnB;AAEQ,IAAA,qCAAqC,CAAC,KAAoB,EAAA;QAChE,IAAI,CAAC,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,iBAAiB,CAAC,IAAI,KAAK,uBAAuB;YAAE;AAExF,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,iBAA+C;AAClE,QAAA,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,iBAAkB;AACvC,QAAA,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,OAAQ;AAC9B,QAAA,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,IAAK;AACxB,QAAA,KAAK,CAAC,aAAa,GAAG,KAAK,CAAC,aAAc;AAC1C,QAAA,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,UAAW;QAEpC,IAAI,CAAC,UAAU,EAAE;IACnB;AACD;;ACnTD;;;;;;;;;;;;;;;;;;;;;AAqBG;AACI,eAAe,SAAS,CAC7B,GAAW,EACX,cAA2B,EAC3B,SAA2B,EAC3B,WAAyB,EAAA;AAEzB,IAAA,IAAI;AACF,QAAA,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;AAChC,YAAA,GAAG,cAAc;AACjB,YAAA,MAAM,EAAE,WAAW;AACpB,SAAA,CAAC;AAEF,QAAA,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE;YAChB,MAAM,IAAI,KAAK,CAAC,CAAA,oBAAA,EAAuB,QAAQ,CAAC,MAAM,CAAA,CAAE,CAAC;QAC3D;AAEA,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;AAClB,YAAA,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC;QAC1C;QAEA,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE;AACxC,QAAA,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE;QACjC,IAAI,MAAM,GAAG,EAAE;QAEf,OAAO,IAAI,EAAE;YACX,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE;AAC3C,YAAA,IAAI,IAAI;gBAAE;AAEV,YAAA,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;;AAGjD,YAAA,IAAI,GAAG;AACP,YAAA,OAAO,CAAC,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE;gBAC5C,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;gBAClC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC;;gBAG9B,MAAM,IAAI,GAAG;qBACV,KAAK,CAAC,IAAI;qBACV,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;AACvC,qBAAA,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;qBAChC,IAAI,CAAC,IAAI,CAAC;gBAEb,IAAI,IAAI,EAAE;AACR,oBAAA,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC;gBACzB;YACF;QACF;;QAGA,OAAO,CAAC,MAAM,EAAE;AAChB,QAAA,SAAS,CAAC,UAAU,IAAI;IAC1B;IAAE,OAAO,KAAK,EAAE;AACd,QAAA,IAAK,KAAe,CAAC,IAAI,KAAK,YAAY,EAAE;YAC1C;QACF;AACA,QAAA,SAAS,CAAC,OAAO,GAAG,KAAc,CAAC;IACrC;AACF;;ACpDM,SAAU,UAAU,CAAC,OAA0B,EAAA;AACnD,IAAA,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,GAAG,IAAI,EAAE,GAAG,OAAO;;IAG5E,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAGE,cAAQ,CAAS,EAAE,CAAC;IACtD,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAGA,cAAQ,CAAC,KAAK,CAAC;;AAG3D,IAAA,MAAM,YAAY,GAAGC,YAAM,CAAS,EAAE,CAAC;;IAGvCC,eAAS,CAAC,MAAK;AACb,QAAA,YAAY,CAAC,OAAO,GAAG,SAAS;AAClC,IAAA,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;;;;;;AAOf,IAAA,MAAM,kBAAkB,GAAGD,YAAM,CAAqB,SAAS,CAAC;AAChE,IAAA,IAAI,kBAAkB,CAAC,OAAO,KAAK,SAAS,IAAI,WAAW,KAAK,kBAAkB,CAAC,OAAO,EAAE;QAC1F,YAAY,CAAC,EAAE,CAAC;AAChB,QAAA,YAAY,CAAC,OAAO,GAAG,EAAE;IAC3B;AACA,IAAA,kBAAkB,CAAC,OAAO,GAAG,WAAW;;AAGxC,IAAA,MAAM,aAAa,GAAGE,aAAO,CAAC,MAAK;AACjC,QAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC;AAC5B,YAAA,OAAO,EAAE,OAAO;AAChB,YAAA,OAAO,EAAE;AACP,gBAAA,cAAc,EAAE,kBAAkB;AACnC,aAAA;AACF,SAAA,CAAC;;QAGF,QAAQ,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,MAAM,KAAI;;YAEjD,IAAI,KAAK,EAAE;gBACT,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,CAAC;YACvC;;YAGA,IAAI,UAAU,EAAE;AACd,gBAAA,MAAM,aAAa,GAAG,MAAM,UAAU,EAAE;gBACxC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,aAAa,CAAC;YAC9C;;AAGA,YAAA,MAAM,gBAAgB,GAAG,YAAY,CAAC,OAAO;YAC7C,IAAI,gBAAgB,EAAE;AACpB,gBAAA,IAAI,MAAM,CAAC,MAAM,EAAE;oBACjB,MAAM,CAAC,MAAM,GAAG;wBACd,GAAG,MAAM,CAAC,MAAM;AAChB,wBAAA,UAAU,EAAE,gBAAgB;qBAC7B;gBACH;qBAAO;oBACL,MAAM,CAAC,MAAM,GAAG,EAAE,UAAU,EAAE,gBAAgB,EAAE;gBAClD;YACF;AAEA,YAAA,OAAO,MAAM;AACf,QAAA,CAAC,CAAC;AAEF,QAAA,OAAO,QAAQ;IACjB,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;;;;AAOhC;;AAEG;AACH,IAAA,MAAM,WAAW,GAAGC,iBAAW,CAAC,CAAC,MAA+B,KAAI;QAClE,OAAO,MAAM,IAAI,EAAE;IACrB,CAAC,EAAE,EAAE,CAAC;AAEN;;AAEG;AACH,IAAA,MAAM,iBAAiB,GAAGA,iBAAW,CAAC,YAA4C;AAChF,QAAA,MAAM,OAAO,GAA2B;AACtC,YAAA,cAAc,EAAE,kBAAkB;SACnC;;QAGD,IAAI,KAAK,EAAE;AACT,YAAA,OAAO,CAAC,UAAU,CAAC,GAAG,KAAK;QAC7B;;QAGA,IAAI,UAAU,EAAE;AACd,YAAA,MAAM,aAAa,GAAG,MAAM,UAAU,EAAE;AACxC,YAAA,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,aAAa,CAAC;QACvC;AAEA,QAAA,OAAO,OAAO;AAChB,IAAA,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;;;;AAMvB;;AAEG;AACH,IAAA,MAAM,cAAc,GAAGA,iBAAW,CAAC,YAAW;QAC5C,IAAI,CAAC,WAAW,EAAE;YAChB;QACF;QAEA,iBAAiB,CAAC,IAAI,CAAC;AACvB,QAAA,IAAI;YACF,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,GAAG,CAA4B,aAAa,EAAE;AACjF,gBAAA,MAAM,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE;AAC9B,aAAA,CAAC;YACF,MAAM,EAAE,GAAG,OAAO,QAAQ,CAAC,IAAI,KAAK,QAAQ,GAAG,QAAQ,CAAC,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI;AACjF,YAAA,YAAY,CAAC,EAAE,IAAI,EAAE,CAAC;QACxB;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC;AACnD,YAAA,MAAM,KAAK;QACb;gBAAU;YACR,iBAAiB,CAAC,KAAK,CAAC;QAC1B;AACF,IAAA,CAAC,EAAE,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;;;;;IAOhCF,eAAS,CAAC,MAAK;AACb,QAAA,IAAI,QAAQ,IAAI,WAAW,EAAE;AAC3B,YAAA,cAAc,EAAE;QAClB;IACF,CAAC,EAAE,CAAC,QAAQ,EAAE,WAAW,EAAE,cAAc,CAAC,CAAC;IAE3C,OAAO;;QAEL,SAAS;QACT,cAAc;;QAEd,aAAa;QACb,WAAW;QACX,iBAAiB;QACjB,OAAO;KACR;AACH;;ACnKA;AACA,MAAM,cAAc,GAAGG,mBAAa,CAAkC,SAAS,CAAC;AAEhF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkCG;MACU,eAAe,GAAG,CAAC,EAC9B,OAAO,EACP,WAAW,EACX,KAAK,EACL,UAAU,EACV,QAAQ,GAAG,IAAI,EACf,QAAQ,GACa,KAAkB;;IAEvC,MAAM,YAAY,GAAG,UAAU,CAAC;QAC9B,OAAO;QACP,WAAW;QACX,KAAK;QACL,UAAU;QACV,QAAQ;AACT,KAAA,CAAC;;IAGF,MAAM,YAAY,GAAGF,aAAO,CAC1B,MAAM,YAAY,EAClB;AACE,QAAA,YAAY,CAAC,SAAS;AACtB,QAAA,YAAY,CAAC,cAAc;AAC3B,QAAA,YAAY,CAAC,aAAa;AAC1B,QAAA,YAAY,CAAC,WAAW;AACxB,QAAA,YAAY,CAAC,iBAAiB;AAC9B,QAAA,YAAY,CAAC,OAAO;AACrB,KAAA,CACF;AAED,IAAA,QACEG,cAAA,CAAC,cAAc,CAAC,QAAQ,EAAA,EAAC,KAAK,EAAE,YAAY,EAAA,QAAA,EACzC,QAAQ,EAAA,CACe;AAE9B;AAEA;;;;;;;;;;;;;;;;;;;AAmBG;AACI,MAAM,iBAAiB,GAAG,MAA0B;AACzD,IAAA,MAAM,OAAO,GAAGC,gBAAU,CAAC,cAAc,CAAC;AAE1C,IAAA,IAAI,OAAO,KAAK,SAAS,EAAE;AACzB,QAAA,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC;IAC5E;AAEA,IAAA,OAAO,OAAO;AAChB;;ACpHA;;AAEG;AACH,SAAS,UAAU,GAAA;IACjB,OAAO,CAAA,EAAG,IAAI,CAAC,GAAG,EAAE,CAAA,CAAA,EAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA,CAAE;AACvE;AAuFA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsCG;AACG,SAAU,eAAe,CAAC,OAA+B,EAAA;IAC7D,MAAM,EAAE,SAAS,EAAE,QAAQ,GAAG,IAAI,EAAE,GAAG,OAAO;;AAG9C,IAAA,MAAM,EACJ,aAAa,EACb,SAAS,EACT,cAAc,EACd,WAAW,EACX,iBAAiB,EACjB,OAAO,GACR,GAAG,iBAAiB,EAAE;;IAGvB,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAGP,cAAQ,CAAiB,EAAE,CAAC;IACtE,MAAM,CAAC,oBAAoB,EAAE,uBAAuB,CAAC,GAAGA,cAAQ,CAAC,KAAK,CAAC;;IAGvE,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAGA,cAAQ,CAAW,EAAE,CAAC;IACpD,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAGA,cAAQ,CAAC,KAAK,CAAC;;IAG3D,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAGA,cAAQ,CAAwB,EAAE,CAAC;IACnE,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,GAAGA,cAAQ,CAA6B,IAAI,CAAC;IAC1F,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAGA,cAAQ,CAAC,KAAK,CAAC;IAC7D,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAGA,cAAQ,CAAC,KAAK,CAAC;IACrD,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAGA,cAAQ,CAAC,KAAK,CAAC;;IAGnD,MAAM,CAAC,qBAAqB,EAAE,wBAAwB,CAAC,GAAGA,cAAQ,CAAgB,IAAI,CAAC;IACvF,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAGA,cAAQ,CAAgB,IAAI,CAAC;;AAG3E,IAAA,MAAM,YAAY,GAAGC,YAAM,CAAwB,IAAI,CAAC;AACxD,IAAA,MAAM,kBAAkB,GAAGA,YAAM,CAAyB,IAAI,CAAC;;;;;;;;AAW/D;;AAEG;AACH,IAAA,MAAM,iBAAiB,GAAGG,iBAAW,CAAC,YAAW;QAC/C,uBAAuB,CAAC,IAAI,CAAC;AAC7B,QAAA,IAAI;YACF,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,GAAG,CAA4C,gBAAgB,EAAE;AACpG,gBAAA,MAAM,EAAE,WAAW,CAAC,EAAE,SAAS,EAAE,CAAC;AACnC,aAAA,CAAC;YACF,MAAM,IAAI,GAAG,MAAM,IAAI,QAAQ,CAAC,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC,IAAI;AACzE,YAAA,gBAAgB,CAAC,IAAI,IAAI,EAAE,CAAC;QAC9B;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,KAAK,CAAC;AACrD,YAAA,MAAM,KAAK;QACb;gBAAU;YACR,uBAAuB,CAAC,KAAK,CAAC;QAChC;IACF,CAAC,EAAE,CAAC,aAAa,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;AAE3C;;AAEG;AACH,IAAA,MAAM,kBAAkB,GAAGA,iBAAW,CAAC,CAAC,cAAsB,KAAI;QAChE,wBAAwB,CAAC,cAAc,CAAC;;IAE1C,CAAC,EAAE,EAAE,CAAC;;;;AAMN;;AAEG;IACH,MAAM,WAAW,GAAGA,iBAAW,CAAC,OAAO,cAAsB,KAAI;QAC/D,iBAAiB,CAAC,IAAI,CAAC;AACvB,QAAA,IAAI;YACF,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,GAAG,CAAgC,UAAU,EAAE;gBAClF,MAAM,EAAE,WAAW,CAAC,EAAE,eAAe,EAAE,cAAc,EAAE,SAAS,EAAE,CAAC;AACpE,aAAA,CAAC;YACF,MAAM,aAAa,GAAG,MAAM,IAAI,QAAQ,CAAC,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC,IAAI;;AAGlF,YAAA,aAAa,CAAC,IAAI,CAChB,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,CAC9E;YAED,UAAU,CAAC,aAAa,CAAC;;AAGzB,YAAA,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE;gBAC5B,kBAAkB,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAChD;QACF;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC;AAC/C,YAAA,MAAM,KAAK;QACb;gBAAU;YACR,iBAAiB,CAAC,KAAK,CAAC;QAC1B;IACF,CAAC,EAAE,CAAC,aAAa,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;AAE3C;;AAEG;AACH,IAAA,MAAM,YAAY,GAAGA,iBAAW,CAAC,CAAC,QAAgB,KAAI;QACpD,kBAAkB,CAAC,QAAQ,CAAC;;IAE9B,CAAC,EAAE,EAAE,CAAC;;;;AAMN;;AAEG;IACH,MAAM,YAAY,GAAGA,iBAAW,CAAC,OAAO,QAAgB,KAAI;QAC1D,kBAAkB,CAAC,IAAI,CAAC;AACxB,QAAA,IAAI;YACF,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,GAAG,CAA0D,WAAW,EAAE;gBAC7G,MAAM,EAAE,WAAW,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;AACxD,aAAA,CAAC;YACF,MAAM,cAAc,GAAG,MAAM,IAAI,QAAQ,CAAC,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC,IAAI;;;;;;;;YAUnF,WAAW,CAAC,cAAc,CAAC;QAC7B;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,KAAK,CAAC;AAChD,YAAA,MAAM,KAAK;QACb;gBAAU;YACR,kBAAkB,CAAC,KAAK,CAAC;QAC3B;IACF,CAAC,EAAE,CAAC,aAAa,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;AAE3C;;AAEG;IACH,MAAM,WAAW,GAAGA,iBAAW,CAAC,OAAO,YAA4B,EAAE,MAAsB,KAAI;AAC7F,QAAA,MAAM,SAAS,GAAG,UAAU,EAAE;;AAG9B,QAAA,MAAM,cAAc,GAAG,YAAY,CAAC,MAAM,KAAK,CAAC;YAC9C,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,KAAKP,mBAAW,CAAC,4BAA4B;;QAGnE,IAAI,CAAC,cAAc,EAAE;AACnB,YAAA,MAAM,gBAAgB,GAAwB;gBAC5C,eAAe,EAAE,qBAAqB,IAAI,EAAE;gBAC5C,SAAS,EAAE,eAAe,IAAI,EAAE;gBAChC,UAAU,EAAE,SAAS,GAAG,OAAO;AAC/B,gBAAA,QAAQ,EAAE,YAAY;AACtB,gBAAA,IAAI,EAAE,EAAE;aACT;AACD,YAAA,WAAW,CAAC,IAAI,IAAI,CAAC,GAAG,IAAI,EAAE,gBAAgB,CAAC,CAAC;QAClD;;AAGA,QAAA,YAAY,CAAC,OAAO,GAAG,IAAI,cAAc,CACvC,qBAAqB,IAAI,EAAE,EAC3B,eAAe,IAAI,EAAE,EACrB,CAAC,YAAY,KAAI;YACf,aAAa,CAAC,UAAU,CAAC;YACzB,mBAAmB,CAAC,EAAE,GAAG,YAAY,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;AAC7D,QAAA,CAAC,CACF;QAED,cAAc,CAAC,IAAI,CAAC;QACpB,aAAa,CAAC,IAAI,CAAC;;AAGnB,QAAA,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE;QACpC,IAAI,SAAS,EAAE;AACb,YAAA,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,SAAS,CAAC;QACxC;QACA,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC;QAEzC,IAAI,GAAG,GAAG,CAAA,EAAG,OAAO,CAAA,UAAA,EAAa,MAAM,CAAC,QAAQ,EAAE,CAAA,CAAE;AACpD,QAAA,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE;AACpB,YAAA,GAAG,GAAG,MAAM,CAAC,OAAO;QACtB;;AAGA,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC;YAC1B,SAAS,EAAE,MAAM,CAAC,SAAS;AAC3B,YAAA,SAAS,EAAE,eAAe;AAC1B,YAAA,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC;AACxB,YAAA,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,EAAE;AAC9B,SAAA,CAAC;;AAGF,QAAA,IAAI,kBAAkB,CAAC,OAAO,EAAE;AAC9B,YAAA,kBAAkB,CAAC,OAAO,CAAC,KAAK,EAAE;QACpC;AACA,QAAA,kBAAkB,CAAC,OAAO,GAAG,IAAI,eAAe,EAAE;AAElD,QAAA,IAAI;;AAEF,YAAA,MAAM,cAAc,GAAG,MAAM,iBAAiB,EAAE;YAEhD,MAAM,SAAS,CACb,GAAG,EACH;AACE,gBAAA,MAAM,EAAE,MAAM;gBACd,IAAI;AACJ,gBAAA,OAAO,EAAE;AACP,oBAAA,GAAG,cAAc;AACjB,oBAAA,IAAI,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;AAC1B,iBAAA;aACF,EACD;AACE,gBAAA,OAAO,EAAE,CAAC,IAAI,KAAI;AAChB,oBAAA,YAAY,CAAC,OAAO,EAAE,YAAY,CAAC,IAAI,CAAC;gBAC1C,CAAC;gBACD,UAAU,EAAE,MAAK;;AAEf,oBAAA,IAAI,YAAY,CAAC,OAAO,EAAE;wBACxB,MAAM,iBAAiB,GAAG,YAAY,CAAC,OAAO,CAAC,eAAe,EAAE;wBAEhE,IAAI,cAAc,EAAE;;4BAElB,WAAW,CAAC,IAAI,IAAG;AACjB,gCAAA,MAAM,WAAW,GAAG,CAAC,GAAG,IAAI,CAAC;AAC7B,gCAAA,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;oCAC1B,MAAM,OAAO,GAAG,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;AACnD,oCAAA,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG;AACpC,wCAAA,GAAG,OAAO;wCACV,QAAQ,EAAE,CAAC,GAAG,OAAO,CAAC,QAAQ,EAAE,GAAG,iBAAiB,CAAC,QAAQ,CAAC;wCAC9D,IAAI,EAAE,iBAAiB,CAAC,IAAI;AAC5B,wCAAA,WAAW,EAAE,KAAK;qCACnB;gCACH;AACA,gCAAA,OAAO,WAAW;AACpB,4BAAA,CAAC,CAAC;wBACJ;6BAAO;AACL,4BAAA,WAAW,CAAC,IAAI,IAAI,CAAC,GAAG,IAAI,EAAE,EAAE,GAAG,iBAAiB,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;wBAC9E;wBAEA,mBAAmB,CAAC,IAAI,CAAC;;oBAE3B;gBACF,CAAC;AACD,gBAAA,OAAO,EAAE,CAAC,KAAK,KAAI;AACjB,oBAAA,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE,KAAK,CAAC;oBACxC,mBAAmB,CAAC,IAAI,CAAC;gBAC3B,CAAC;AACF,aAAA,EACD,kBAAkB,CAAC,OAAO,CAAC,MAAM,CAClC;;YAGD,IAAI,CAAC,eAAe,IAAI,eAAe,KAAK,EAAE,IAAI,YAAY,CAAC,OAAO,EAAE;AACtE,gBAAA,IAAI;AACF,oBAAA,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,GAAG,CACtC,CAAA,UAAA,EAAa,YAAY,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC,UAAU,CAAA,CAAE,EAChE,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CACvC;oBACD,MAAM,WAAW,GAAG,MAAM,IAAI,QAAQ,CAAC,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC,IAAI;AAChF,oBAAA,MAAM,iBAAiB,GAAG,WAAW,EAAE,eAAe;oBACtD,IAAI,iBAAiB,EAAE;;AAErB,wBAAA,gBAAgB,CAAC,IAAI,IAAI,CAAC;AACxB,gCAAA,eAAe,EAAE,iBAAiB;AAClC,gCAAA,IAAI,EAAE,kBAAkB;AACxB,gCAAA,YAAY,EAAE,SAAS;AACvB,gCAAA,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;AACpC,gCAAA,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;AACvB,6BAAA,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,eAAe,KAAK,iBAAiB,CAAC,CAAC,CAAC;wBAEjF,wBAAwB,CAAC,iBAAiB,CAAC;oBAC7C;gBACF;gBAAE,OAAO,CAAC,EAAE;AACV,oBAAA,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,CAAC,CAAC;gBACpD;YACF;QACF;gBAAU;YACR,cAAc,CAAC,KAAK,CAAC;AACrB,YAAA,kBAAkB,CAAC,OAAO,GAAG,IAAI;QACnC;AACF,IAAA,CAAC,EAAE,CAAC,qBAAqB,EAAE,eAAe,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,WAAW,EAAE,iBAAiB,CAAC,CAAC;;;;AAM1H;;AAEG;AACH,IAAA,MAAM,YAAY,GAAGO,iBAAW,CAAC,MAAK;;AAEpC,QAAA,IAAI,kBAAkB,CAAC,OAAO,EAAE;AAC9B,YAAA,kBAAkB,CAAC,OAAO,CAAC,KAAK,EAAE;AAClC,YAAA,kBAAkB,CAAC,OAAO,GAAG,IAAI;QACnC;QAEA,wBAAwB,CAAC,IAAI,CAAC;QAC9B,kBAAkB,CAAC,IAAI,CAAC;QACxB,UAAU,CAAC,EAAE,CAAC;QACd,WAAW,CAAC,EAAE,CAAC;QACf,mBAAmB,CAAC,IAAI,CAAC;QACzB,cAAc,CAAC,KAAK,CAAC;QACrB,aAAa,CAAC,KAAK,CAAC;AACpB,QAAA,YAAY,CAAC,OAAO,GAAG,IAAI;IAC7B,CAAC,EAAE,EAAE,CAAC;;;;;;;IASNF,eAAS,CAAC,MAAK;QACb,gBAAgB,CAAC,EAAE,CAAC;QACpB,UAAU,CAAC,EAAE,CAAC;QACd,WAAW,CAAC,EAAE,CAAC;QACf,mBAAmB,CAAC,IAAI,CAAC;QACzB,wBAAwB,CAAC,IAAI,CAAC;QAC9B,kBAAkB,CAAC,IAAI,CAAC;AACxB,QAAA,IAAI,kBAAkB,CAAC,OAAO,EAAE;AAC9B,YAAA,kBAAkB,CAAC,OAAO,CAAC,KAAK,EAAE;AAClC,YAAA,kBAAkB,CAAC,OAAO,GAAG,IAAI;QACnC;AACA,QAAA,YAAY,CAAC,OAAO,GAAG,IAAI;AAC7B,IAAA,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;;IAGfA,eAAS,CAAC,MAAK;AACb,QAAA,IAAI,QAAQ,IAAI,SAAS,EAAE;AACzB,YAAA,iBAAiB,EAAE;QACrB;IACF,CAAC,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,iBAAiB,CAAC,CAAC;;IAG5CA,eAAS,CAAC,MAAK;QACb,IAAI,qBAAqB,EAAE;YACzB,WAAW,CAAC,qBAAqB,CAAC;QACpC;AACF,IAAA,CAAC,EAAE,CAAC,qBAAqB,EAAE,WAAW,CAAC,CAAC;;IAGxCA,eAAS,CAAC,MAAK;QACb,IAAI,eAAe,EAAE;YACnB,YAAY,CAAC,eAAe,CAAC;QAC/B;AACF,IAAA,CAAC,EAAE,CAAC,eAAe,EAAE,YAAY,CAAC,CAAC;;;;AAMnC,IAAA,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,KAAK,eAAe,CAAC,IAAI,IAAI;IAEhF,MAAM,WAAW,GAAG;AAClB,UAAE,CAAC,GAAG,QAAQ,EAAE,gBAAgB;UAC9B,QAAQ;IAEZ,OAAO;;QAEL,aAAa;QACb,oBAAoB;;QAGpB,OAAO;QACP,cAAc;QACd,aAAa;;QAGb,QAAQ;QACR,gBAAgB;QAChB,eAAe;QACf,WAAW;QACX,UAAU;;QAGV,qBAAqB;QACrB,eAAe;;QAGf,iBAAiB;QACjB,kBAAkB;;QAGlB,WAAW;QACX,YAAY;;QAGZ,WAAW;;QAGX,YAAY;;QAGZ,WAAW;KACZ;AACH;;AC/gBM,SAAU,QAAQ,CAAC,OAAwB,EAAA;AAC/C,IAAA,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO;;IAGxB,MAAM,EACJ,aAAa,EACb,SAAS,EACT,WAAW,GACZ,GAAG,iBAAiB,EAAE;;IAGvB,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAGF,cAAQ,CAAe,IAAI,CAAC;IACtD,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAGA,cAAQ,CAAC,KAAK,CAAC;;;;AAMvD;;AAEG;AACH,IAAA,MAAM,SAAS,GAAGI,iBAAW,CAAC,YAA0B;QACtD,eAAe,CAAC,IAAI,CAAC;AACrB,QAAA,IAAI;YACF,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,GAAG,CAAgB,wBAAwB,EAAE;AAChF,gBAAA,MAAM,EAAE,WAAW,CAAC,EAAE,IAAI,EAAE,CAAC;AAC9B,aAAA,CAAC;AACF,YAAA,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;QAC9B;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC;AAC7C,YAAA,MAAM,KAAK;QACb;gBAAU;YACR,eAAe,CAAC,KAAK,CAAC;QACxB;AACF,IAAA,CAAC,EAAE,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;;IAGzBF,eAAS,CAAC,MAAK;QACb,IAAI,SAAS,EAAE;AACb,YAAA,SAAS,EAAE;QACb;AACF,IAAA,CAAC,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;AAE1B,IAAA,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE;AAChC;;;;;;;;;;;;;;;"}
package/dist/index.d.cts CHANGED
@@ -397,6 +397,8 @@ interface UseProjectOptions {
397
397
  baseUrl: string;
398
398
  /** Project Name used to fetch the project ID */
399
399
  projectName: string;
400
+ /** Optional organisation ID to scope all requests (sent as X-Org-ID header) */
401
+ orgId?: string;
400
402
  /** Optional function to get custom headers for requests (e.g., for authentication) */
401
403
  getHeaders?: GetHeadersFn;
402
404
  /** Auto-load conversations on mount (default: true) */
@@ -433,6 +435,8 @@ interface ProjectProviderProps {
433
435
  baseUrl: string;
434
436
  /** Project Name used to fetch the project ID */
435
437
  projectName: string;
438
+ /** Optional organisation ID to scope all requests (sent as X-Org-ID header) */
439
+ orgId?: string;
436
440
  /** Optional function to get custom headers for requests (e.g., for authentication) */
437
441
  getHeaders?: UseProjectOptions['getHeaders'];
438
442
  /** Auto-load project on mount (default: true) */
@@ -475,7 +479,7 @@ interface ProjectProviderProps {
475
479
  * }
476
480
  * ```
477
481
  */
478
- declare const ProjectProvider: ({ baseUrl, projectName, getHeaders, autoLoad, children, }: ProjectProviderProps) => ReactElement;
482
+ declare const ProjectProvider: ({ baseUrl, projectName, orgId, getHeaders, autoLoad, children, }: ProjectProviderProps) => ReactElement;
479
483
  /**
480
484
  * Hook to access the project context.
481
485
  *
package/dist/index.d.ts CHANGED
@@ -397,6 +397,8 @@ interface UseProjectOptions {
397
397
  baseUrl: string;
398
398
  /** Project Name used to fetch the project ID */
399
399
  projectName: string;
400
+ /** Optional organisation ID to scope all requests (sent as X-Org-ID header) */
401
+ orgId?: string;
400
402
  /** Optional function to get custom headers for requests (e.g., for authentication) */
401
403
  getHeaders?: GetHeadersFn;
402
404
  /** Auto-load conversations on mount (default: true) */
@@ -433,6 +435,8 @@ interface ProjectProviderProps {
433
435
  baseUrl: string;
434
436
  /** Project Name used to fetch the project ID */
435
437
  projectName: string;
438
+ /** Optional organisation ID to scope all requests (sent as X-Org-ID header) */
439
+ orgId?: string;
436
440
  /** Optional function to get custom headers for requests (e.g., for authentication) */
437
441
  getHeaders?: UseProjectOptions['getHeaders'];
438
442
  /** Auto-load project on mount (default: true) */
@@ -475,7 +479,7 @@ interface ProjectProviderProps {
475
479
  * }
476
480
  * ```
477
481
  */
478
- declare const ProjectProvider: ({ baseUrl, projectName, getHeaders, autoLoad, children, }: ProjectProviderProps) => ReactElement;
482
+ declare const ProjectProvider: ({ baseUrl, projectName, orgId, getHeaders, autoLoad, children, }: ProjectProviderProps) => ReactElement;
479
483
  /**
480
484
  * Hook to access the project context.
481
485
  *
package/dist/index.js CHANGED
@@ -295,8 +295,15 @@ class ChunkProcessor {
295
295
  if (!this.currentOutputItem || this.currentOutputItem.type !== "reasoning")
296
296
  return;
297
297
  const reasoning = this.currentOutputItem;
298
+ reasoning.summary = reasoning.summary || [];
298
299
  const summaries = reasoning.summary;
299
- if (!summaries?.length || !chunk.delta)
300
+ if (summaries.length === 0) {
301
+ reasoning.summary.push({
302
+ type: ContentType.SummaryText,
303
+ text: "",
304
+ });
305
+ }
306
+ if (!chunk.delta)
300
307
  return;
301
308
  const lastSummary = summaries[summaries.length - 1];
302
309
  if (lastSummary) {
@@ -400,7 +407,7 @@ async function streamSSE(url, requestOptions, callbacks, abortSignal) {
400
407
  }
401
408
 
402
409
  function useProject(options) {
403
- const { projectName, baseUrl, getHeaders, autoLoad = true } = options;
410
+ const { projectName, baseUrl, orgId, getHeaders, autoLoad = true } = options;
404
411
  // Project state
405
412
  const [projectId, setProjectId] = useState('');
406
413
  const [projectLoading, setProjectLoading] = useState(false);
@@ -410,6 +417,17 @@ function useProject(options) {
410
417
  useEffect(() => {
411
418
  projectIdRef.current = projectId;
412
419
  }, [projectId]);
420
+ // ── Clear stale projectId synchronously during render when projectName changes ──
421
+ // When the org switches, ProjectContext clears selectedProject (during render),
422
+ // causing projectName to become ''. Without this guard, downstream consumers
423
+ // (useConversation, ChatPage, etc.) would still see the OLD projectId in their
424
+ // effects, firing API calls with a stale project_id or without one entirely.
425
+ const prevProjectNameRef = useRef(undefined);
426
+ if (prevProjectNameRef.current !== undefined && projectName !== prevProjectNameRef.current) {
427
+ setProjectId('');
428
+ projectIdRef.current = '';
429
+ }
430
+ prevProjectNameRef.current = projectName;
413
431
  // Create axios instance with request interceptor for custom headers and project_id
414
432
  const axiosInstance = useMemo(() => {
415
433
  const instance = axios.create({
@@ -418,8 +436,12 @@ function useProject(options) {
418
436
  'Content-Type': 'application/json',
419
437
  },
420
438
  });
421
- // Add request interceptor to inject custom headers and project_id
439
+ // Add request interceptor to inject custom headers, org_id, and project_id
422
440
  instance.interceptors.request.use(async (config) => {
441
+ // Add org ID header if provided
442
+ if (orgId) {
443
+ config.headers.set('X-Org-ID', orgId);
444
+ }
423
445
  // Add custom headers if getHeaders function is provided
424
446
  if (getHeaders) {
425
447
  const customHeaders = await getHeaders();
@@ -441,7 +463,7 @@ function useProject(options) {
441
463
  return config;
442
464
  });
443
465
  return instance;
444
- }, [baseUrl, getHeaders]);
466
+ }, [baseUrl, orgId, getHeaders]);
445
467
  // ============================================
446
468
  // API Helper Functions
447
469
  // ============================================
@@ -452,19 +474,23 @@ function useProject(options) {
452
474
  return params || {};
453
475
  }, []);
454
476
  /**
455
- * Get headers for streaming requests (combines default + custom headers)
477
+ * Get headers for streaming requests (combines default + custom + org headers)
456
478
  */
457
479
  const getRequestHeaders = useCallback(async () => {
458
480
  const headers = {
459
481
  'Content-Type': 'application/json',
460
482
  };
483
+ // Add org ID header if provided
484
+ if (orgId) {
485
+ headers['X-Org-ID'] = orgId;
486
+ }
461
487
  // Add custom headers if getHeaders function is provided
462
488
  if (getHeaders) {
463
489
  const customHeaders = await getHeaders();
464
490
  Object.assign(headers, customHeaders);
465
491
  }
466
492
  return headers;
467
- }, [getHeaders]);
493
+ }, [orgId, getHeaders]);
468
494
  // ============================================
469
495
  // Project Management
470
496
  // ============================================
@@ -494,7 +520,7 @@ function useProject(options) {
494
520
  // ============================================
495
521
  // Effects for auto-loading
496
522
  // ============================================
497
- // Fetch project ID on mount
523
+ // Fetch project ID when projectName changes (or on mount)
498
524
  useEffect(() => {
499
525
  if (autoLoad && projectName) {
500
526
  fetchProjectId();
@@ -549,11 +575,12 @@ const ProjectContext = createContext(undefined);
549
575
  * }
550
576
  * ```
551
577
  */
552
- const ProjectProvider = ({ baseUrl, projectName, getHeaders, autoLoad = true, children, }) => {
578
+ const ProjectProvider = ({ baseUrl, projectName, orgId, getHeaders, autoLoad = true, children, }) => {
553
579
  // Use the useProject hook to manage project state
554
580
  const projectState = useProject({
555
581
  baseUrl,
556
582
  projectName,
583
+ orgId,
557
584
  getHeaders,
558
585
  autoLoad,
559
586
  });
@@ -660,7 +687,6 @@ function useConversation(options) {
660
687
  // Current selection
661
688
  const [currentConversationId, setCurrentConversationId] = useState(null);
662
689
  const [currentThreadId, setCurrentThreadId] = useState(null);
663
- const [previousMessageId, setPreviousMessageId] = useState('');
664
690
  // Refs
665
691
  const processorRef = useRef(null);
666
692
  const abortControllerRef = useRef(null);
@@ -747,14 +773,13 @@ function useConversation(options) {
747
773
  params: buildParams({ thread_id: threadId, namespace }),
748
774
  });
749
775
  const loadedMessages = 'data' in response.data ? response.data.data : response.data;
750
- // Extract last message ID for continuation
751
- if (loadedMessages.length > 0) {
752
- const lastMsgId = loadedMessages[loadedMessages.length - 1].message_id;
753
- setPreviousMessageId(lastMsgId);
754
- }
755
- else {
756
- setPreviousMessageId('');
757
- }
776
+ // // Extract last message ID for continuation
777
+ // if (loadedMessages.length > 0) {
778
+ // const lastMsgId = loadedMessages[loadedMessages.length - 1].message_id;
779
+ // setPreviousMessageId(lastMsgId);
780
+ // } else {
781
+ // setPreviousMessageId('');
782
+ // }
758
783
  setMessages(loadedMessages);
759
784
  }
760
785
  catch (error) {
@@ -804,7 +829,7 @@ function useConversation(options) {
804
829
  // Prepare request body
805
830
  const body = JSON.stringify({
806
831
  namespace: config.namespace,
807
- previous_message_id: previousMessageId,
832
+ thread_id: currentThreadId,
808
833
  message: userMessages[0],
809
834
  context: config.context || {},
810
835
  });
@@ -851,7 +876,7 @@ function useConversation(options) {
851
876
  setMessages(prev => [...prev, { ...finalConversation, isStreaming: false }]);
852
877
  }
853
878
  setStreamingMessage(null);
854
- setPreviousMessageId(finalConversation.message_id);
879
+ // setPreviousMessageId(finalConversation.message_id);
855
880
  }
856
881
  },
857
882
  onError: (error) => {
@@ -860,7 +885,7 @@ function useConversation(options) {
860
885
  },
861
886
  }, abortControllerRef.current.signal);
862
887
  // If this was a new conversation, fetch the conversation info
863
- if (previousMessageId === '' && processorRef.current) {
888
+ if (!currentThreadId || currentThreadId === '' && processorRef.current) {
864
889
  try {
865
890
  const response = await axiosInstance.get(`/messages/${processorRef.current.getConversation().message_id}`, { params: buildParams({ namespace }) });
866
891
  const messageData = 'data' in response.data ? response.data.data : response.data;
@@ -886,7 +911,7 @@ function useConversation(options) {
886
911
  setIsStreaming(false);
887
912
  abortControllerRef.current = null;
888
913
  }
889
- }, [currentConversationId, currentThreadId, previousMessageId, namespace, baseUrl, projectId, axiosInstance, buildParams, getRequestHeaders]);
914
+ }, [currentConversationId, currentThreadId, namespace, baseUrl, projectId, axiosInstance, buildParams, getRequestHeaders]);
890
915
  // ============================================
891
916
  // Utility Actions
892
917
  // ============================================
@@ -904,7 +929,6 @@ function useConversation(options) {
904
929
  setThreads([]);
905
930
  setMessages([]);
906
931
  setStreamingMessage(null);
907
- setPreviousMessageId('');
908
932
  setIsStreaming(false);
909
933
  setIsThinking(false);
910
934
  processorRef.current = null;
@@ -912,6 +936,22 @@ function useConversation(options) {
912
936
  // ============================================
913
937
  // Effects for auto-loading
914
938
  // ============================================
939
+ // Clear stale conversation state when project changes (e.g., org switch).
940
+ // This runs before the loading effect below (effects execute in declaration
941
+ // order) and ensures we never show data from a previous project/org.
942
+ useEffect(() => {
943
+ setConversations([]);
944
+ setThreads([]);
945
+ setMessages([]);
946
+ setStreamingMessage(null);
947
+ setCurrentConversationId(null);
948
+ setCurrentThreadId(null);
949
+ if (abortControllerRef.current) {
950
+ abortControllerRef.current.abort();
951
+ abortControllerRef.current = null;
952
+ }
953
+ processorRef.current = null;
954
+ }, [projectId]);
915
955
  // Load conversations after project ID is fetched
916
956
  useEffect(() => {
917
957
  if (autoLoad && projectId) {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/types.ts","../src/streaming/ChunkProcessor.ts","../src/streaming/streamSSE.ts","../src/hooks/useProject.tsx","../src/ProjectProvider/index.tsx","../src/hooks/useConversation.ts","../src/hooks/useAgent.ts"],"sourcesContent":["export interface Agent {\n id: string;\n agent_id: string;\n name: string;\n version: number;\n}\n\n// Message Roles\nexport enum Role {\n User = \"user\",\n Developer = \"developer\",\n System = \"system\",\n Assistant = \"assistant\",\n}\n\n// Message Types\nexport enum MessageType {\n Message = \"message\",\n FunctionCall = \"function_call\",\n FunctionCallOutput = \"function_call_output\",\n Reasoning = \"reasoning\",\n ImageGenerationCall = \"image_generation_call\",\n FunctionCallApprovalResponse = \"function_call_approval_response\",\n}\n\n// Content Types\nexport enum ContentType {\n InputText = \"input_text\",\n OutputText = \"output_text\",\n SummaryText = \"summary_text\",\n InputImage = \"input_image\",\n}\n\n// Chunk Types\nexport enum ChunkType {\n ChunkTypeRunCreated = \"run.created\",\n ChunkTypeRunInProgress = \"run.in_progress\",\n ChunkTypeRunPaused = \"run.paused\",\n ChunkTypeRunCompleted = \"run.completed\",\n ChunkTypeResponseCreated = \"response.created\",\n ChunkTypeResponseInProgress = \"response.in_progress\",\n ChunkTypeResponseCompleted = \"response.completed\",\n ChunkTypeOutputItemAdded = \"response.output_item.added\",\n ChunkTypeOutputItemDone = \"response.output_item.done\",\n ChunkTypeContentPartAdded = \"response.content_part.added\",\n ChunkTypeContentPartDone = \"response.content_part.done\",\n ChunkTypeOutputTextDelta = \"response.output_text.delta\",\n ChunkTypeOutputTextDone = \"response.output_text.done\",\n ChunkTypeFunctionCallArgumentsDelta = \"response.function_call_arguments.delta\",\n ChunkTypeFunctionCallArgumentsDone = \"response.function_call_arguments.done\",\n ChunkTypeReasoningSummaryPartAdded = \"response.reasoning_summary_part.added\",\n ChunkTypeReasoningSummaryPartDone = \"response.reasoning_summary_part.done\",\n ChunkTypeReasoningSummaryTextDelta = \"response.reasoning_summary_text.delta\",\n ChunkTypeReasoningSummaryTextDone = \"response.reasoning_summary_text.done\",\n\n // Image generation\n ChunkTypeImageGenerationCallInProgress = \"response.image_generation_call.in_progress\",\n ChunkTypeImageGenerationCallGenerating = \"response.image_generation_call.generating\",\n ChunkTypeImageGenerationCallPartialImage = \"response.image_generation_call.partial_image\",\n\n // Extra\n ChunkTypeFunctionCallOutput = \"function_call_output\",\n}\n\n/**\n * Represents a conversation container\n */\nexport interface Conversation {\n namespace_id: string;\n conversation_id: string;\n name: string;\n created_at: string;\n last_updated: string;\n}\n\n/**\n * Represents a thread within a conversation\n */\nexport interface Thread {\n conversation_id: string;\n origin_message_id: string;\n thread_id: string;\n meta: Record<string, any>;\n created_at: string;\n last_updated: string;\n}\n\n/**\n * Represents a message within a conversation thread\n */\nexport interface ConversationMessage {\n conversation_id: string;\n thread_id: string;\n message_id: string;\n messages: MessageUnion[];\n meta: Record<string, any>;\n isStreaming?: boolean;\n}\n\n// Message union type - discriminated by 'type' field\nexport type MessageUnion =\n | EasyMessage\n | InputMessage\n | OutputMessage\n | FunctionCallMessage\n | FunctionCallApprovalResponseMessage\n | FunctionCallOutputMessage\n | ReasoningMessage\n | ImageGenerationCallMessage;\n\nexport interface EasyMessage {\n type: MessageType.Message;\n id: string;\n role?: Role;\n content: EasyInputContentUnion;\n}\n\nexport interface InputMessage {\n type: MessageType.Message;\n id?: string;\n role?: Role;\n content?: InputContentUnion[];\n}\n\nexport interface OutputMessage {\n id: string;\n type?: MessageType.Message;\n role?: Role;\n content?: OutputContentUnion[];\n}\n\nexport interface FunctionCallMessage {\n type: MessageType.FunctionCall;\n id: string;\n call_id?: string;\n name: string;\n arguments: string;\n}\n\nexport interface FunctionCallApprovalResponseMessage {\n type: MessageType.FunctionCallApprovalResponse;\n id: string;\n approved_call_ids: string[];\n rejected_call_ids: string[];\n}\n\nexport interface FunctionCallOutputMessage {\n type: MessageType.FunctionCallOutput;\n id: string;\n call_id: string;\n output: FunctionCallOutputContentUnion;\n}\n\nexport interface ReasoningMessage {\n type: MessageType.Reasoning;\n id: string;\n summary?: SummaryTextContent[];\n encrypted_content?: string;\n}\n\nexport interface ImageGenerationCallMessage {\n type: MessageType.ImageGenerationCall;\n id: string;\n status: string;\n background: string;\n output_format: string;\n quality: string;\n size: string;\n result: string;\n}\n\n// Content Unions\nexport type EasyInputContentUnion = string | InputContentUnion;\nexport type InputContentUnion = InputTextContent | OutputTextContent | InputImageContent;\nexport type FunctionCallOutputContentUnion = string | InputContentUnion;\nexport type OutputContentUnion =\n | OutputTextContent\n | FunctionCallMessage\n | SummaryTextContent;\n\n// Content types\nexport interface InputTextContent {\n type: ContentType.InputText;\n text: string;\n}\n\nexport interface OutputTextContent {\n type: ContentType.OutputText;\n text: string;\n}\n\nexport interface SummaryTextContent {\n type: ContentType.SummaryText;\n text: string;\n}\n\nexport interface InputImageContent {\n type: ContentType.InputImage;\n image_url: string;\n detail: string;\n}\n\n/**\n * Configuration for the converse API endpoint\n */\nexport interface ConverseConfig {\n namespace: string;\n agentId: string;\n baseUrl?: string;\n context?: Record<string, unknown>;\n headers?: Record<string, string>;\n}\n\n// Streaming chunk types\nexport interface ResponseChunk {\n type: ChunkType;\n sequence_number: number;\n\n // Only on run items\n run_state?: ChunkRunData;\n\n // Only on response items\n response?: ChunkResponseData;\n\n // On non-run and non-response items\n output_index?: number;\n\n // Only on output_item\n item?: ChunkOutputItemData;\n\n // Only on content_part and delta\n item_id?: string;\n content_index?: number;\n\n // Only on content_part\n part?: OutputContentUnion;\n\n // Only on output_text delta/done\n delta?: string;\n text?: string;\n\n // Only on function_call arguments delta/done\n arguments?: string;\n\n // Only on reasoning summary part/delta/done\n summary_index?: number;\n\n // Only on function_call_output\n output: string;\n\n // Only on image_generation_call.partial_image\n partial_image_index?: number;\n partial_image_b64?: string;\n background?: string;\n output_format?: string;\n quality?: string;\n size?: string;\n status?: string;\n}\n\nexport interface ChunkRunData {\n id: string;\n object: \"run\";\n status: \"created\" | \"in_progress\" | \"paused\" | \"resumed\" | \"completed\" | \"aborted\";\n pending_tool_calls: FunctionCallMessage[];\n usage: ChunkResponseUsage;\n traceid: string;\n}\n\nexport interface ChunkResponseData {\n id: string;\n object: string;\n created_at: number;\n status: string;\n background: boolean;\n error: unknown;\n incomplete_details: unknown;\n output: OutputMessageUnion[];\n usage: ChunkResponseUsage;\n}\n\nexport interface ChunkOutputItemData {\n type: string; // \"function_call\", \"message\", \"reasoning\"\n\n // Common fields\n id: string;\n status: string;\n\n // For output_item of type \"message\"\n content: OutputContentUnion[];\n role: Role;\n\n // For output_item of type \"function_call\"\n call_id?: string;\n name?: string;\n arguments?: string;\n\n // For \"reasoning\"\n encrypted_content?: string;\n summary?: OutputContentUnion[];\n\n // For output_item of type \"image_generation_call\"\n background?: string;\n output_format?: string;\n quality?: string;\n result?: string;\n size?: string;\n}\n\nexport type OutputMessageUnion =\n | (OutputMessage & { id: string })\n | (FunctionCallMessage & { id: string })\n | (ReasoningMessage & { id: string })\n | (ImageGenerationCallMessage & { id: string });\n\nexport interface ChunkResponseUsage {\n input_tokens: number;\n input_tokens_details: {\n cached_tokens: number;\n };\n output_tokens: number;\n output_tokens_details: {\n reasoning_tokens: number;\n };\n total_tokens: number;\n}\n\nexport interface Usage {\n input_tokens: number;\n output_tokens: number;\n total_tokens: number;\n input_tokens_details: {\n cached_tokens: number;\n };\n output_tokens_details: {\n reasoning_tokens: number;\n };\n}\n\n// Type guards\nexport function isEasyMessage(msg: MessageUnion): msg is EasyMessage {\n return msg.type === MessageType.Message && 'content' in msg && (typeof msg.content === 'string' || Array.isArray(msg.content));\n}\n\nexport function isInputMessage(msg: MessageUnion): msg is InputMessage {\n return msg.type === MessageType.Message && 'content' in msg && Array.isArray(msg.content);\n}\n\nexport function isFunctionCallMessage(msg: MessageUnion): msg is FunctionCallMessage {\n return msg.type === MessageType.FunctionCall;\n}\n\nexport function isFunctionCallOutputMessage(msg: MessageUnion): msg is FunctionCallOutputMessage {\n return msg.type === MessageType.FunctionCallOutput;\n}\n\nexport function isReasoningMessage(msg: MessageUnion): msg is ReasoningMessage {\n return msg.type === MessageType.Reasoning;\n}\n\nexport function isImageGenerationCallMessage(msg: MessageUnion): msg is ImageGenerationCallMessage {\n return msg.type === MessageType.ImageGenerationCall;\n}\n","import {\n ChunkType,\n ContentType,\n ConversationMessage,\n FunctionCallMessage,\n FunctionCallOutputMessage,\n ImageGenerationCallMessage,\n InputMessage,\n MessageUnion,\n ReasoningMessage,\n ResponseChunk,\n} from '../types';\n\n/**\n * Callback invoked when the conversation state changes\n */\nexport type OnChangeCallback = (conversation: ConversationMessage) => void;\n\n/**\n * Processes streaming chunks from the LLM response.\n * Builds up messages incrementally as chunks arrive.\n *\n * @example\n * ```ts\n * const processor = new ChunkProcessor(\n * 'conv-123',\n * 'thread-456',\n * (conversation) => {\n * // Update UI with new conversation state\n * setConversation(conversation);\n * }\n * );\n *\n * // Process incoming chunks\n * processor.processChunk(jsonData);\n *\n * // Get final conversation when done\n * const finalConversation = processor.getConversation();\n * ```\n */\nexport class ChunkProcessor {\n private messages: MessageUnion[] = [];\n private currentOutputItem: MessageUnion | null = null;\n private _onChange: OnChangeCallback;\n private conversation: ConversationMessage;\n\n constructor(\n conversationId: string,\n threadId: string,\n onChange: OnChangeCallback\n ) {\n this.conversation = {\n conversation_id: conversationId,\n thread_id: threadId,\n message_id: '',\n messages: [],\n meta: {},\n };\n this._onChange = onChange;\n }\n\n /**\n * Get all processed messages\n */\n getMessages(): MessageUnion[] {\n return this.messages;\n }\n\n /**\n * Get the current conversation state\n */\n getConversation(): ConversationMessage {\n return this.conversation;\n }\n\n private emitChange(): void {\n this.conversation.messages = [...this.messages];\n this._onChange({ ...this.conversation });\n }\n\n /**\n * Process a raw JSON chunk from the SSE stream\n */\n processChunk(data: string): void {\n try {\n const chunk: ResponseChunk = JSON.parse(data);\n this.handleChunk(chunk);\n } catch (e) {\n console.error('Failed to parse chunk:', e, data);\n }\n }\n\n private handleChunk(chunk: ResponseChunk): void {\n switch (chunk.type) {\n // Run lifecycle\n case ChunkType.ChunkTypeRunCreated:\n case ChunkType.ChunkTypeRunInProgress:\n case ChunkType.ChunkTypeRunCompleted:\n case ChunkType.ChunkTypeRunPaused:\n this.conversation.meta.run_state = chunk.run_state;\n this.conversation.message_id = chunk.run_state!.id;\n if (chunk.type !== ChunkType.ChunkTypeRunCreated && chunk.type !== ChunkType.ChunkTypeRunInProgress) {\n this.emitChange();\n }\n break;\n\n // Response lifecycle\n case ChunkType.ChunkTypeResponseCreated:\n case ChunkType.ChunkTypeResponseInProgress:\n break;\n\n case ChunkType.ChunkTypeResponseCompleted:\n if (chunk.response?.usage) {\n this.conversation.meta.usage = chunk.response.usage;\n this.emitChange();\n }\n break;\n\n // Output item lifecycle\n case ChunkType.ChunkTypeOutputItemAdded:\n this.handleOutputItemAdded(chunk);\n break;\n\n case ChunkType.ChunkTypeOutputItemDone:\n break;\n\n // Content parts\n case ChunkType.ChunkTypeContentPartAdded:\n this.handleContentPartAdded(chunk);\n break;\n\n case ChunkType.ChunkTypeContentPartDone:\n break;\n\n // Text deltas\n case ChunkType.ChunkTypeOutputTextDelta:\n this.handleOutputTextDelta(chunk);\n break;\n\n case ChunkType.ChunkTypeOutputTextDone:\n break;\n\n // Reasoning summary\n case ChunkType.ChunkTypeReasoningSummaryPartAdded:\n this.handleReasoningSummaryPartAdded(chunk);\n break;\n\n case ChunkType.ChunkTypeReasoningSummaryPartDone:\n break;\n\n case ChunkType.ChunkTypeReasoningSummaryTextDelta:\n this.handleReasoningSummaryTextDelta(chunk);\n break;\n\n case ChunkType.ChunkTypeReasoningSummaryTextDone:\n break;\n\n // Function calls\n case ChunkType.ChunkTypeFunctionCallArgumentsDelta:\n this.handleFunctionCallArgumentsDelta(chunk);\n break;\n\n case ChunkType.ChunkTypeFunctionCallArgumentsDone:\n break;\n\n case ChunkType.ChunkTypeFunctionCallOutput:\n this.handleFunctionCallOutput(chunk);\n break;\n\n // Image Generation Calls\n case ChunkType.ChunkTypeImageGenerationCallInProgress:\n break;\n\n case ChunkType.ChunkTypeImageGenerationCallGenerating:\n break;\n\n case ChunkType.ChunkTypeImageGenerationCallPartialImage:\n this.handleImageGenerationCallPartialImage(chunk);\n break;\n }\n }\n\n private handleOutputItemAdded(chunk: ResponseChunk): void {\n if (!chunk.item) return;\n\n switch (chunk.item.type) {\n case \"message\":\n this.currentOutputItem = {\n id: chunk.item.id,\n type: \"message\",\n role: chunk.item.role || \"assistant\",\n content: [],\n } as InputMessage;\n break;\n\n case \"function_call\":\n this.currentOutputItem = {\n id: chunk.item.id,\n type: \"function_call\",\n name: chunk.item.name || \"\",\n call_id: chunk.item.call_id || \"\",\n arguments: \"\",\n } as FunctionCallMessage;\n break;\n\n case \"reasoning\":\n this.currentOutputItem = {\n id: chunk.item.id,\n type: \"reasoning\",\n summary: [],\n } as ReasoningMessage;\n break;\n\n case \"image_generation_call\":\n this.currentOutputItem = {\n id: chunk.item.id,\n type: \"image_generation_call\",\n status: chunk.item.status,\n } as ImageGenerationCallMessage;\n break;\n }\n\n if (this.currentOutputItem) {\n this.messages.push(this.currentOutputItem);\n this.emitChange();\n }\n }\n\n private handleContentPartAdded(chunk: ResponseChunk): void {\n if (!this.currentOutputItem || this.currentOutputItem.type !== \"message\") return;\n\n const message = this.currentOutputItem as InputMessage;\n if (chunk.part?.type === ContentType.OutputText) {\n message.content = message.content || [];\n message.content.push({\n type: ContentType.OutputText,\n text: \"\",\n });\n this.emitChange();\n }\n }\n\n private handleOutputTextDelta(chunk: ResponseChunk): void {\n if (!this.currentOutputItem || this.currentOutputItem.type !== \"message\") return;\n\n const message = this.currentOutputItem as InputMessage;\n const contents = message.content;\n if (!contents?.length || !chunk.delta) return;\n\n const lastContent = contents[contents.length - 1];\n if (lastContent && 'text' in lastContent) {\n lastContent.text += chunk.delta;\n this.emitChange();\n }\n }\n\n private handleReasoningSummaryPartAdded(chunk: ResponseChunk): void {\n if (!this.currentOutputItem || this.currentOutputItem.type !== \"reasoning\") return;\n\n const reasoning = this.currentOutputItem as ReasoningMessage;\n if (chunk.part?.type === ContentType.SummaryText) {\n reasoning.summary = reasoning.summary || [];\n reasoning.summary.push({\n type: ContentType.SummaryText,\n text: \"\",\n });\n this.emitChange();\n }\n }\n\n private handleReasoningSummaryTextDelta(chunk: ResponseChunk): void {\n if (!this.currentOutputItem || this.currentOutputItem.type !== \"reasoning\") return;\n\n const reasoning = this.currentOutputItem as ReasoningMessage;\n const summaries = reasoning.summary;\n if (!summaries?.length || !chunk.delta) return;\n\n const lastSummary = summaries[summaries.length - 1];\n if (lastSummary) {\n lastSummary.text += chunk.delta;\n this.emitChange();\n }\n }\n\n private handleFunctionCallArgumentsDelta(chunk: ResponseChunk): void {\n if (!this.currentOutputItem || this.currentOutputItem.type !== \"function_call\") return;\n\n const functionCall = this.currentOutputItem as FunctionCallMessage;\n functionCall.arguments += chunk.delta || \"\";\n this.emitChange();\n }\n\n private handleFunctionCallOutput(chunk: ResponseChunk): void {\n this.currentOutputItem = chunk as unknown as FunctionCallOutputMessage;\n this.messages.push(this.currentOutputItem);\n this.emitChange();\n }\n\n private handleImageGenerationCallPartialImage(chunk: ResponseChunk): void {\n if (!this.currentOutputItem || this.currentOutputItem.type !== \"image_generation_call\") return;\n\n const image = this.currentOutputItem as ImageGenerationCallMessage;\n image.result = chunk.partial_image_b64!;\n image.quality = chunk.quality!;\n image.size = chunk.size!;\n image.output_format = chunk.output_format!;\n image.background = chunk.background!;\n\n this.emitChange();\n }\n}\n\n","/**\n * Options for the SSE stream callbacks\n */\nexport interface SSEStreamOptions {\n /** Called for each data chunk received */\n onChunk: (data: string) => void;\n /** Called when an error occurs */\n onError?: (error: Error) => void;\n /** Called when the stream completes */\n onComplete?: () => void;\n}\n\n/**\n * Streams Server-Sent Events (SSE) from a URL.\n * Parses SSE frames and calls onChunk for each data payload.\n *\n * @param url - The URL to stream from\n * @param requestOptions - Fetch request options\n * @param callbacks - SSE event callbacks\n * @param abortSignal - Optional signal to abort the stream\n *\n * @example\n * ```ts\n * await streamSSE(\n * 'https://api.example.com/stream',\n * { method: 'POST', body: JSON.stringify({ message: 'Hello' }) },\n * {\n * onChunk: (data) => console.log('Received:', data),\n * onComplete: () => console.log('Done'),\n * onError: (err) => console.error('Error:', err),\n * }\n * );\n * ```\n */\nexport async function streamSSE(\n url: string,\n requestOptions: RequestInit,\n callbacks: SSEStreamOptions,\n abortSignal?: AbortSignal\n): Promise<void> {\n try {\n const response = await fetch(url, {\n ...requestOptions,\n signal: abortSignal,\n });\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n if (!response.body) {\n throw new Error('Response body is null');\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n while (true) {\n const { value, done } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n\n // Parse SSE frames: split on double newline\n let idx;\n while ((idx = buffer.indexOf('\\n\\n')) !== -1) {\n const frame = buffer.slice(0, idx);\n buffer = buffer.slice(idx + 2);\n\n // Join all data: lines in the frame\n const data = frame\n .split('\\n')\n .filter(line => line.startsWith('data:'))\n .map(line => line.slice(5).trim())\n .join('\\n');\n\n if (data) {\n callbacks.onChunk(data);\n }\n }\n }\n\n // Final flush of decoder state\n decoder.decode();\n callbacks.onComplete?.();\n } catch (error) {\n if ((error as Error).name === 'AbortError') {\n return;\n }\n callbacks.onError?.(error as Error);\n }\n}\n\n","import axios, { AxiosInstance } from 'axios';\nimport {useCallback, useEffect, useMemo, useRef, useState} from \"react\";\nimport {Agent} from \"../types\";\nimport {GetHeadersFn} from \"./useConversation\";\n\n/**\n * Options for the useProject hook\n */\nexport interface UseProjectOptions {\n /** Base URL of the Uno Agent Server (e.g., 'https://api.example.com/api/agent-server') */\n baseUrl: string;\n /** Project Name used to fetch the project ID */\n projectName: string;\n /** Optional function to get custom headers for requests (e.g., for authentication) */\n getHeaders?: GetHeadersFn;\n /** Auto-load conversations on mount (default: true) */\n autoLoad?: boolean;\n}\n\n/**\n * Return type for the useProject hook\n */\nexport interface UseProjectReturn {\n // Project state\n /** The fetched project ID */\n projectId: string;\n /** Whether the project ID is being fetched */\n projectLoading: boolean;\n /** Axios instance configured with baseUrl and custom headers */\n axiosInstance: AxiosInstance;\n /** Function to build query params with project_id automatically added */\n buildParams: (params?: Record<string, string>) => Record<string, string>;\n /** Function to get request headers (combines default + custom headers) */\n getRequestHeaders: () => Promise<Record<string, string>>;\n /** Base URL used for the axios instance */\n baseUrl: string;\n}\n\nexport function useProject(options: UseProjectOptions): UseProjectReturn {\n const { projectName, baseUrl, getHeaders, autoLoad = true } = options;\n\n // Project state\n const [projectId, setProjectId] = useState<string>('');\n const [projectLoading, setProjectLoading] = useState(false);\n \n // Use ref to store current projectId for interceptor access\n const projectIdRef = useRef<string>('');\n \n // Update ref whenever projectId changes\n useEffect(() => {\n projectIdRef.current = projectId;\n }, [projectId]);\n\n // Create axios instance with request interceptor for custom headers and project_id\n const axiosInstance = useMemo(() => {\n const instance = axios.create({\n baseURL: baseUrl,\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n // Add request interceptor to inject custom headers and project_id\n instance.interceptors.request.use(async (config) => {\n // Add custom headers if getHeaders function is provided\n if (getHeaders) {\n const customHeaders = await getHeaders();\n Object.assign(config.headers, customHeaders);\n }\n \n // Automatically add project_id to query params if available\n const currentProjectId = projectIdRef.current;\n if (currentProjectId) {\n if (config.params) {\n config.params = {\n ...config.params,\n project_id: currentProjectId,\n };\n } else {\n config.params = { project_id: currentProjectId };\n }\n }\n \n return config;\n });\n\n return instance;\n }, [baseUrl, getHeaders]);\n\n\n // ============================================\n // API Helper Functions\n // ============================================\n\n /**\n * Build query params (project_id is automatically added by axios interceptor)\n */\n const buildParams = useCallback((params?: Record<string, string>) => {\n return params || {};\n }, []);\n\n /**\n * Get headers for streaming requests (combines default + custom headers)\n */\n const getRequestHeaders = useCallback(async (): Promise<Record<string, string>> => {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n // Add custom headers if getHeaders function is provided\n if (getHeaders) {\n const customHeaders = await getHeaders();\n Object.assign(headers, customHeaders);\n }\n\n return headers;\n }, [getHeaders]);\n\n // ============================================\n // Project Management\n // ============================================\n\n /**\n * Fetch the project ID using the project name\n */\n const fetchProjectId = useCallback(async () => {\n if (!projectName) {\n return;\n }\n\n setProjectLoading(true);\n try {\n const response = await axiosInstance.get<{ data: string } | string>('/project/id', {\n params: { name: projectName },\n });\n const id = typeof response.data === 'string' ? response.data : response.data.data;\n setProjectId(id || '');\n } catch (error) {\n console.error('Failed to fetch project ID:', error);\n throw error;\n } finally {\n setProjectLoading(false);\n }\n }, [axiosInstance, projectName]);\n\n // ============================================\n // Effects for auto-loading\n // ============================================\n\n // Fetch project ID on mount\n useEffect(() => {\n if (autoLoad && projectName) {\n fetchProjectId();\n }\n }, [autoLoad, projectName, fetchProjectId]);\n\n return {\n // Project state\n projectId,\n projectLoading,\n // API client\n axiosInstance,\n buildParams,\n getRequestHeaders,\n baseUrl,\n }\n}","import React, {createContext, useContext, useMemo} from 'react';\nimport type { ReactNode, ReactElement } from \"react\";\nimport { useProject, UseProjectOptions, UseProjectReturn } from '../hooks/useProject';\n\n/**\n * Context value for ProjectProvider\n */\nexport interface ProjectContextValue extends UseProjectReturn {}\n\n/**\n * Props for ProjectProvider component\n */\nexport interface ProjectProviderProps {\n /** Base URL of the Uno Agent Server (e.g., 'https://api.example.com/api/agent-server') */\n baseUrl: string;\n /** Project Name used to fetch the project ID */\n projectName: string;\n /** Optional function to get custom headers for requests (e.g., for authentication) */\n getHeaders?: UseProjectOptions['getHeaders'];\n /** Auto-load project on mount (default: true) */\n autoLoad?: boolean;\n /** Child components */\n children: ReactNode;\n}\n\n// Create the context with undefined as default to ensure it's used within provider\nconst ProjectContext = createContext<ProjectContextValue | undefined>(undefined);\n\n/**\n * ProjectProvider component that manages project state using React Context.\n * \n * This provider wraps the useProject hook and makes the project state available\n * to all child components through context.\n * \n * @example\n * ```tsx\n * import { ProjectProvider, useProjectContext } from '@praveen001/uno-converse';\n * \n * function App() {\n * return (\n * <ProjectProvider\n * baseUrl=\"https://api.example.com/api/agent-server\"\n * projectName=\"my-project\"\n * getHeaders={() => ({\n * 'Authorization': `Bearer ${getToken()}`,\n * })}\n * >\n * <YourApp />\n * </ProjectProvider>\n * );\n * }\n * \n * function YourApp() {\n * const { projectId, projectLoading } = useProjectContext();\n * \n * if (projectLoading) {\n * return <div>Loading project...</div>;\n * }\n * \n * return <div>Project ID: {projectId}</div>;\n * }\n * ```\n */\nexport const ProjectProvider = ({\n baseUrl,\n projectName,\n getHeaders,\n autoLoad = true,\n children,\n}: ProjectProviderProps): ReactElement => {\n // Use the useProject hook to manage project state\n const projectState = useProject({\n baseUrl,\n projectName,\n getHeaders,\n autoLoad,\n });\n\n // Memoize the context value to prevent unnecessary re-renders\n const contextValue = useMemo<ProjectContextValue>(\n () => projectState,\n [\n projectState.projectId,\n projectState.projectLoading,\n projectState.axiosInstance,\n projectState.buildParams,\n projectState.getRequestHeaders,\n projectState.baseUrl,\n ]\n );\n\n return (\n <ProjectContext.Provider value={contextValue}>\n {children}\n </ProjectContext.Provider>\n );\n};\n\n/**\n * Hook to access the project context.\n * \n * Must be used within a ProjectProvider component.\n * \n * @throws {Error} If used outside of ProjectProvider\n * \n * @example\n * ```tsx\n * function MyComponent() {\n * const { projectId, projectLoading } = useProjectContext();\n * \n * return (\n * <div>\n * {projectLoading ? 'Loading...' : `Project ID: ${projectId}`}\n * </div>\n * );\n * }\n * ```\n */\nexport const useProjectContext = (): ProjectContextValue => {\n const context = useContext(ProjectContext);\n \n if (context === undefined) {\n throw new Error('useProjectContext must be used within a ProjectProvider');\n }\n \n return context;\n};\n\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { ChunkProcessor } from '../streaming/ChunkProcessor';\nimport { streamSSE } from '../streaming/streamSSE';\nimport {\n Agent,\n Conversation,\n ConversationMessage,\n ConverseConfig,\n MessageType,\n MessageUnion,\n Thread,\n} from '../types';\nimport { useProjectContext } from '../ProjectProvider';\n\n/**\n * Simple ID generator for message IDs\n */\nfunction generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).substring(2, 11)}`;\n}\n\n/**\n * Function type for providing custom headers.\n * Called before each request to get headers (useful for dynamic auth tokens).\n *\n * @example\n * ```ts\n * const getHeaders: GetHeadersFn = () => ({\n * 'Authorization': `Bearer ${getToken()}`,\n * 'X-Custom-Header': 'value',\n * });\n * ```\n */\nexport type GetHeadersFn = () => Record<string, string> | Promise<Record<string, string>>;\n\n/**\n * Options for the useConversation hook\n */\nexport interface UseConversationOptions {\n /** The namespace for conversations */\n namespace: string;\n /** Auto-load conversations on mount (default: true) */\n autoLoad?: boolean;\n}\n\n/**\n * Return type for the useConversation hook\n */\nexport interface UseConversationReturn {\n // Conversation list state\n /** List of all conversations */\n conversations: Conversation[];\n /** Whether conversations are being loaded */\n conversationsLoading: boolean;\n\n // Thread state\n /** List of threads in the current conversation */\n threads: Thread[];\n /** Whether threads are being loaded */\n threadsLoading: boolean;\n /** Currently selected thread */\n currentThread: Thread | null;\n\n // Message state\n /** List of messages in the current thread */\n messages: ConversationMessage[];\n /** Message currently being streamed */\n streamingMessage: ConversationMessage | null;\n /** Whether messages are being loaded */\n messagesLoading: boolean;\n /** Whether a response is currently streaming */\n isStreaming: boolean;\n /** Whether waiting for a response */\n isThinking: boolean;\n\n // Current selection\n /** ID of the currently selected conversation */\n currentConversationId: string | null;\n /** ID of the currently selected thread */\n currentThreadId: string | null;\n\n // Actions - Conversations\n /** Load all conversations */\n loadConversations: () => Promise<void>;\n /** Select a conversation by ID */\n selectConversation: (conversationId: string) => void;\n\n // Actions - Threads\n /** Load threads for a conversation */\n loadThreads: (conversationId: string) => Promise<void>;\n /** Select a thread by ID */\n selectThread: (threadId: string) => void;\n\n // Actions - Messages\n /** Send a message and stream the response */\n sendMessage: (userMessages: MessageUnion[], config: ConverseConfig) => Promise<void>;\n\n // Actions - Utility\n /** Start a new chat (clears current state) */\n startNewChat: () => void;\n\n // Combined messages (loaded + streaming)\n /** All messages including the currently streaming one */\n allMessages: ConversationMessage[];\n}\n\n/**\n * A comprehensive hook for managing conversations, threads, messages, and streaming\n * with Uno Agent Server.\n *\n * @example\n * ```tsx\n * import { useConversation } from '@praveen001/uno-converse';\n *\n * function ChatComponent() {\n * const {\n * allMessages,\n * isStreaming,\n * sendMessage,\n * startNewChat,\n * } = useConversation({\n * namespace: 'my-app',\n * });\n *\n * const handleSend = async (text: string) => {\n * await sendMessage(\n * [{ type: 'message', id: '1', content: text }],\n * {\n * namespace: 'my-app',\n * agentName: 'my-agent',\n * }\n * );\n * };\n *\n * return (\n * <div>\n * {allMessages.map(msg => (\n * <MessageComponent key={msg.message_id} message={msg} />\n * ))}\n * {isStreaming && <LoadingIndicator />}\n * </div>\n * );\n * }\n * ```\n */\nexport function useConversation(options: UseConversationOptions): UseConversationReturn {\n const { namespace, autoLoad = true } = options;\n\n // Get project context (axios instance, projectId, etc.)\n const {\n axiosInstance,\n projectId,\n projectLoading,\n buildParams,\n getRequestHeaders,\n baseUrl,\n } = useProjectContext();\n\n // Conversation list state\n const [conversations, setConversations] = useState<Conversation[]>([]);\n const [conversationsLoading, setConversationsLoading] = useState(false);\n\n // Thread state\n const [threads, setThreads] = useState<Thread[]>([]);\n const [threadsLoading, setThreadsLoading] = useState(false);\n\n // Message state\n const [messages, setMessages] = useState<ConversationMessage[]>([]);\n const [streamingMessage, setStreamingMessage] = useState<ConversationMessage | null>(null);\n const [messagesLoading, setMessagesLoading] = useState(false);\n const [isStreaming, setIsStreaming] = useState(false);\n const [isThinking, setIsThinking] = useState(false);\n\n // Current selection\n const [currentConversationId, setCurrentConversationId] = useState<string | null>(null);\n const [currentThreadId, setCurrentThreadId] = useState<string | null>(null);\n const [previousMessageId, setPreviousMessageId] = useState<string>('');\n\n // Refs\n const processorRef = useRef<ChunkProcessor | null>(null);\n const abortControllerRef = useRef<AbortController | null>(null);\n\n // ============================================\n // API Helper Functions\n // ============================================\n // Note: buildParams and getRequestHeaders are now provided by ProjectProvider\n\n // ============================================\n // Conversation Management\n // ============================================\n\n /**\n * Load all conversations for the namespace\n */\n const loadConversations = useCallback(async () => {\n setConversationsLoading(true);\n try {\n const response = await axiosInstance.get<{ data: Conversation[] } | Conversation[]>('/conversations', {\n params: buildParams({ namespace }),\n });\n const data = 'data' in response.data ? response.data.data : response.data;\n setConversations(data || []);\n } catch (error) {\n console.error('Failed to load conversations:', error);\n throw error;\n } finally {\n setConversationsLoading(false);\n }\n }, [axiosInstance, buildParams, namespace]);\n\n /**\n * Select a conversation and load its threads\n */\n const selectConversation = useCallback((conversationId: string) => {\n setCurrentConversationId(conversationId);\n // Threads will be loaded via useEffect\n }, []);\n\n // ============================================\n // Thread Management\n // ============================================\n\n /**\n * Load threads for a conversation\n */\n const loadThreads = useCallback(async (conversationId: string) => {\n setThreadsLoading(true);\n try {\n const response = await axiosInstance.get<{ data: Thread[] } | Thread[]>('/threads', {\n params: buildParams({ conversation_id: conversationId, namespace }),\n });\n const loadedThreads = 'data' in response.data ? response.data.data : response.data;\n\n // Sort by created_at descending\n loadedThreads.sort(\n (a, b) => new Date(b.created_at).getTime() - new Date(a.created_at).getTime()\n );\n\n setThreads(loadedThreads);\n\n // Auto-select the latest thread\n if (loadedThreads.length > 0) {\n setCurrentThreadId(loadedThreads[0].thread_id);\n }\n } catch (error) {\n console.error('Failed to load threads:', error);\n throw error;\n } finally {\n setThreadsLoading(false);\n }\n }, [axiosInstance, buildParams, namespace]);\n\n /**\n * Select a thread and load its messages\n */\n const selectThread = useCallback((threadId: string) => {\n setCurrentThreadId(threadId);\n // Messages will be loaded via useEffect\n }, []);\n\n // ============================================\n // Message Management\n // ============================================\n\n /**\n * Load messages for a thread\n */\n const loadMessages = useCallback(async (threadId: string) => {\n setMessagesLoading(true);\n try {\n const response = await axiosInstance.get<{ data: ConversationMessage[] } | ConversationMessage[]>('/messages', {\n params: buildParams({ thread_id: threadId, namespace }),\n });\n const loadedMessages = 'data' in response.data ? response.data.data : response.data;\n\n // Extract last message ID for continuation\n if (loadedMessages.length > 0) {\n const lastMsgId = loadedMessages[loadedMessages.length - 1].message_id;\n setPreviousMessageId(lastMsgId);\n } else {\n setPreviousMessageId('');\n }\n\n setMessages(loadedMessages);\n } catch (error) {\n console.error('Failed to load messages:', error);\n throw error;\n } finally {\n setMessagesLoading(false);\n }\n }, [axiosInstance, buildParams, namespace]);\n\n /**\n * Send a user message and stream the response\n */\n const sendMessage = useCallback(async (userMessages: MessageUnion[], config: ConverseConfig) => {\n const messageId = generateId();\n\n // Check if this is a tool approval response (resuming a run)\n const isToolApproval = userMessages.length === 1 &&\n userMessages[0].type === MessageType.FunctionCallApprovalResponse;\n\n // Only add user message for regular messages, not for tool approvals\n if (!isToolApproval) {\n const userConversation: ConversationMessage = {\n conversation_id: currentConversationId || '',\n thread_id: currentThreadId || '',\n message_id: messageId + '-user',\n messages: userMessages,\n meta: {},\n };\n setMessages(prev => [...prev, userConversation]);\n }\n\n // Initialize the chunk processor for the assistant response\n processorRef.current = new ChunkProcessor(\n currentConversationId || '',\n currentThreadId || '',\n (conversation) => {\n setIsThinking(isThinking);\n setStreamingMessage({ ...conversation, isStreaming: true });\n }\n );\n\n setIsStreaming(true);\n setIsThinking(true);\n\n // Build URL with query parameters\n const params = new URLSearchParams();\n if (projectId) {\n params.append('project_id', projectId);\n }\n params.append('agent_id', config.agentId);\n\n let url = `${baseUrl}/converse?${params.toString()}`;\n if (!!config.baseUrl) {\n url = config.baseUrl;\n }\n\n // Prepare request body\n const body = JSON.stringify({\n namespace: config.namespace,\n previous_message_id: previousMessageId,\n message: userMessages[0],\n context: config.context || {},\n });\n\n // Abort any existing stream\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n abortControllerRef.current = new AbortController();\n\n try {\n // Get headers (supports async getHeaders function)\n const requestHeaders = await getRequestHeaders();\n\n await streamSSE(\n url,\n {\n method: 'POST',\n body,\n headers: {\n ...requestHeaders,\n ...(config.headers || {}),\n },\n },\n {\n onChunk: (data) => {\n processorRef.current?.processChunk(data);\n },\n onComplete: () => {\n // Move streaming message to messages list\n if (processorRef.current) {\n const finalConversation = processorRef.current.getConversation();\n\n if (isToolApproval) {\n // For tool approvals, update the last message instead of appending\n setMessages(prev => {\n const newMessages = [...prev];\n if (newMessages.length > 0) {\n const lastMsg = newMessages[newMessages.length - 1];\n newMessages[newMessages.length - 1] = {\n ...lastMsg,\n messages: [...lastMsg.messages, ...finalConversation.messages],\n meta: finalConversation.meta,\n isStreaming: false,\n };\n }\n return newMessages;\n });\n } else {\n setMessages(prev => [...prev, { ...finalConversation, isStreaming: false }]);\n }\n\n setStreamingMessage(null);\n setPreviousMessageId(finalConversation.message_id);\n }\n },\n onError: (error) => {\n console.error('Streaming error:', error);\n setStreamingMessage(null);\n },\n },\n abortControllerRef.current.signal\n );\n\n // If this was a new conversation, fetch the conversation info\n if (previousMessageId === '' && processorRef.current) {\n try {\n const response = await axiosInstance.get<{ data: ConversationMessage } | ConversationMessage>(\n `/messages/${processorRef.current.getConversation().message_id}`,\n { params: buildParams({ namespace }) }\n );\n const messageData = 'data' in response.data ? response.data.data : response.data;\n const newConversationId = messageData?.conversation_id;\n if (newConversationId) {\n // Add new conversation to list\n setConversations(prev => [{\n conversation_id: newConversationId,\n name: \"New Conversation\",\n namespace_id: namespace,\n created_at: new Date().toISOString(),\n last_updated: new Date().toISOString(),\n } as Conversation, ...prev.filter(c => c.conversation_id !== newConversationId)]);\n\n setCurrentConversationId(newConversationId);\n }\n } catch (e) {\n console.error('Failed to get conversation ID:', e);\n }\n }\n } finally {\n setIsStreaming(false);\n abortControllerRef.current = null;\n }\n }, [currentConversationId, currentThreadId, previousMessageId, namespace, baseUrl, projectId, axiosInstance, buildParams, getRequestHeaders]);\n\n // ============================================\n // Utility Actions\n // ============================================\n\n /**\n * Start a new chat (reset all state)\n */\n const startNewChat = useCallback(() => {\n // Abort any ongoing stream\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n abortControllerRef.current = null;\n }\n\n setCurrentConversationId(null);\n setCurrentThreadId(null);\n setThreads([]);\n setMessages([]);\n setStreamingMessage(null);\n setPreviousMessageId('');\n setIsStreaming(false);\n setIsThinking(false);\n processorRef.current = null;\n }, []);\n\n // ============================================\n // Effects for auto-loading\n // ============================================\n\n // Load conversations after project ID is fetched\n useEffect(() => {\n if (autoLoad && projectId) {\n loadConversations();\n }\n }, [autoLoad, projectId, loadConversations]);\n\n // Load threads when conversation changes\n useEffect(() => {\n if (currentConversationId) {\n loadThreads(currentConversationId);\n }\n }, [currentConversationId, loadThreads]);\n\n // Load messages when thread changes\n useEffect(() => {\n if (currentThreadId) {\n loadMessages(currentThreadId);\n }\n }, [currentThreadId, loadMessages]);\n\n // ============================================\n // Computed values\n // ============================================\n\n const currentThread = threads.find(t => t.thread_id === currentThreadId) || null;\n\n const allMessages = streamingMessage\n ? [...messages, streamingMessage]\n : messages;\n\n return {\n // Conversation list state\n conversations,\n conversationsLoading,\n\n // Thread state\n threads,\n threadsLoading,\n currentThread,\n\n // Message state\n messages,\n streamingMessage,\n messagesLoading,\n isStreaming,\n isThinking,\n\n // Current selection\n currentConversationId,\n currentThreadId,\n\n // Actions - Conversations\n loadConversations,\n selectConversation,\n\n // Actions - Threads\n loadThreads,\n selectThread,\n\n // Actions - Messages\n sendMessage,\n\n // Actions - Utility\n startNewChat,\n\n // Combined messages\n allMessages,\n };\n}\n\n","import axios from 'axios';\nimport {useCallback, useEffect, useMemo, useState} from \"react\";\nimport {Agent} from \"../types\";\nimport {GetHeadersFn} from \"./useConversation\";\nimport { useProjectContext } from '../ProjectProvider';\n\n/**\n * Options for the useAgent hook\n */\nexport interface UseAgentOptions {\n /** The name of the agent */\n name: string;\n}\n\n/**\n * Return type for the useAgent hook\n */\nexport interface UseAgentReturn {\n // Agent\n agent: Agent | null;\n /** Whether the agent is being loaded */\n agentLoading: boolean;\n}\n\nexport function useAgent(options: UseAgentOptions): UseAgentReturn {\n const { name } = options;\n\n // Get project context (axios instance, projectId, etc.)\n const {\n axiosInstance,\n projectId,\n buildParams,\n } = useProjectContext();\n\n // Agents state\n const [agent, setAgent] = useState<Agent | null>(null);\n const [agentLoading, setAgentLoading] = useState(false);\n\n // ============================================\n // Agent Management\n // ============================================\n\n /**\n * Fetch the agent\n */\n const loadAgent = useCallback(async (): Promise<void> => {\n setAgentLoading(true);\n try {\n const response = await axiosInstance.get<{data: Agent}>('/agent-configs/by-name', {\n params: buildParams({ name }),\n });\n setAgent(response.data.data);\n } catch (error) {\n console.error('Failed to load agent:', error)\n throw error;\n } finally {\n setAgentLoading(false);\n }\n }, [axiosInstance, name]);\n\n // Fetch agent after project is fetched\n useEffect(() => {\n if (projectId) {\n loadAgent();\n }\n }, [projectId, loadAgent]);\n\n return { agent, agentLoading };\n}"],"names":["_jsx"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/types.ts","../src/streaming/ChunkProcessor.ts","../src/streaming/streamSSE.ts","../src/hooks/useProject.tsx","../src/ProjectProvider/index.tsx","../src/hooks/useConversation.ts","../src/hooks/useAgent.ts"],"sourcesContent":["export interface Agent {\n id: string;\n agent_id: string;\n name: string;\n version: number;\n}\n\n// Message Roles\nexport enum Role {\n User = \"user\",\n Developer = \"developer\",\n System = \"system\",\n Assistant = \"assistant\",\n}\n\n// Message Types\nexport enum MessageType {\n Message = \"message\",\n FunctionCall = \"function_call\",\n FunctionCallOutput = \"function_call_output\",\n Reasoning = \"reasoning\",\n ImageGenerationCall = \"image_generation_call\",\n FunctionCallApprovalResponse = \"function_call_approval_response\",\n}\n\n// Content Types\nexport enum ContentType {\n InputText = \"input_text\",\n OutputText = \"output_text\",\n SummaryText = \"summary_text\",\n InputImage = \"input_image\",\n}\n\n// Chunk Types\nexport enum ChunkType {\n ChunkTypeRunCreated = \"run.created\",\n ChunkTypeRunInProgress = \"run.in_progress\",\n ChunkTypeRunPaused = \"run.paused\",\n ChunkTypeRunCompleted = \"run.completed\",\n ChunkTypeResponseCreated = \"response.created\",\n ChunkTypeResponseInProgress = \"response.in_progress\",\n ChunkTypeResponseCompleted = \"response.completed\",\n ChunkTypeOutputItemAdded = \"response.output_item.added\",\n ChunkTypeOutputItemDone = \"response.output_item.done\",\n ChunkTypeContentPartAdded = \"response.content_part.added\",\n ChunkTypeContentPartDone = \"response.content_part.done\",\n ChunkTypeOutputTextDelta = \"response.output_text.delta\",\n ChunkTypeOutputTextDone = \"response.output_text.done\",\n ChunkTypeFunctionCallArgumentsDelta = \"response.function_call_arguments.delta\",\n ChunkTypeFunctionCallArgumentsDone = \"response.function_call_arguments.done\",\n ChunkTypeReasoningSummaryPartAdded = \"response.reasoning_summary_part.added\",\n ChunkTypeReasoningSummaryPartDone = \"response.reasoning_summary_part.done\",\n ChunkTypeReasoningSummaryTextDelta = \"response.reasoning_summary_text.delta\",\n ChunkTypeReasoningSummaryTextDone = \"response.reasoning_summary_text.done\",\n\n // Image generation\n ChunkTypeImageGenerationCallInProgress = \"response.image_generation_call.in_progress\",\n ChunkTypeImageGenerationCallGenerating = \"response.image_generation_call.generating\",\n ChunkTypeImageGenerationCallPartialImage = \"response.image_generation_call.partial_image\",\n\n // Extra\n ChunkTypeFunctionCallOutput = \"function_call_output\",\n}\n\n/**\n * Represents a conversation container\n */\nexport interface Conversation {\n namespace_id: string;\n conversation_id: string;\n name: string;\n created_at: string;\n last_updated: string;\n}\n\n/**\n * Represents a thread within a conversation\n */\nexport interface Thread {\n conversation_id: string;\n origin_message_id: string;\n thread_id: string;\n meta: Record<string, any>;\n created_at: string;\n last_updated: string;\n}\n\n/**\n * Represents a message within a conversation thread\n */\nexport interface ConversationMessage {\n conversation_id: string;\n thread_id: string;\n message_id: string;\n messages: MessageUnion[];\n meta: Record<string, any>;\n isStreaming?: boolean;\n}\n\n// Message union type - discriminated by 'type' field\nexport type MessageUnion =\n | EasyMessage\n | InputMessage\n | OutputMessage\n | FunctionCallMessage\n | FunctionCallApprovalResponseMessage\n | FunctionCallOutputMessage\n | ReasoningMessage\n | ImageGenerationCallMessage;\n\nexport interface EasyMessage {\n type: MessageType.Message;\n id: string;\n role?: Role;\n content: EasyInputContentUnion;\n}\n\nexport interface InputMessage {\n type: MessageType.Message;\n id?: string;\n role?: Role;\n content?: InputContentUnion[];\n}\n\nexport interface OutputMessage {\n id: string;\n type?: MessageType.Message;\n role?: Role;\n content?: OutputContentUnion[];\n}\n\nexport interface FunctionCallMessage {\n type: MessageType.FunctionCall;\n id: string;\n call_id?: string;\n name: string;\n arguments: string;\n}\n\nexport interface FunctionCallApprovalResponseMessage {\n type: MessageType.FunctionCallApprovalResponse;\n id: string;\n approved_call_ids: string[];\n rejected_call_ids: string[];\n}\n\nexport interface FunctionCallOutputMessage {\n type: MessageType.FunctionCallOutput;\n id: string;\n call_id: string;\n output: FunctionCallOutputContentUnion;\n}\n\nexport interface ReasoningMessage {\n type: MessageType.Reasoning;\n id: string;\n summary?: SummaryTextContent[];\n encrypted_content?: string;\n}\n\nexport interface ImageGenerationCallMessage {\n type: MessageType.ImageGenerationCall;\n id: string;\n status: string;\n background: string;\n output_format: string;\n quality: string;\n size: string;\n result: string;\n}\n\n// Content Unions\nexport type EasyInputContentUnion = string | InputContentUnion;\nexport type InputContentUnion = InputTextContent | OutputTextContent | InputImageContent;\nexport type FunctionCallOutputContentUnion = string | InputContentUnion;\nexport type OutputContentUnion =\n | OutputTextContent\n | FunctionCallMessage\n | SummaryTextContent;\n\n// Content types\nexport interface InputTextContent {\n type: ContentType.InputText;\n text: string;\n}\n\nexport interface OutputTextContent {\n type: ContentType.OutputText;\n text: string;\n}\n\nexport interface SummaryTextContent {\n type: ContentType.SummaryText;\n text: string;\n}\n\nexport interface InputImageContent {\n type: ContentType.InputImage;\n image_url: string;\n detail: string;\n}\n\n/**\n * Configuration for the converse API endpoint\n */\nexport interface ConverseConfig {\n namespace: string;\n agentId: string;\n baseUrl?: string;\n context?: Record<string, unknown>;\n headers?: Record<string, string>;\n}\n\n// Streaming chunk types\nexport interface ResponseChunk {\n type: ChunkType;\n sequence_number: number;\n\n // Only on run items\n run_state?: ChunkRunData;\n\n // Only on response items\n response?: ChunkResponseData;\n\n // On non-run and non-response items\n output_index?: number;\n\n // Only on output_item\n item?: ChunkOutputItemData;\n\n // Only on content_part and delta\n item_id?: string;\n content_index?: number;\n\n // Only on content_part\n part?: OutputContentUnion;\n\n // Only on output_text delta/done\n delta?: string;\n text?: string;\n\n // Only on function_call arguments delta/done\n arguments?: string;\n\n // Only on reasoning summary part/delta/done\n summary_index?: number;\n\n // Only on function_call_output\n output: string;\n\n // Only on image_generation_call.partial_image\n partial_image_index?: number;\n partial_image_b64?: string;\n background?: string;\n output_format?: string;\n quality?: string;\n size?: string;\n status?: string;\n}\n\nexport interface ChunkRunData {\n id: string;\n object: \"run\";\n status: \"created\" | \"in_progress\" | \"paused\" | \"resumed\" | \"completed\" | \"aborted\";\n pending_tool_calls: FunctionCallMessage[];\n usage: ChunkResponseUsage;\n traceid: string;\n}\n\nexport interface ChunkResponseData {\n id: string;\n object: string;\n created_at: number;\n status: string;\n background: boolean;\n error: unknown;\n incomplete_details: unknown;\n output: OutputMessageUnion[];\n usage: ChunkResponseUsage;\n}\n\nexport interface ChunkOutputItemData {\n type: string; // \"function_call\", \"message\", \"reasoning\"\n\n // Common fields\n id: string;\n status: string;\n\n // For output_item of type \"message\"\n content: OutputContentUnion[];\n role: Role;\n\n // For output_item of type \"function_call\"\n call_id?: string;\n name?: string;\n arguments?: string;\n\n // For \"reasoning\"\n encrypted_content?: string;\n summary?: OutputContentUnion[];\n\n // For output_item of type \"image_generation_call\"\n background?: string;\n output_format?: string;\n quality?: string;\n result?: string;\n size?: string;\n}\n\nexport type OutputMessageUnion =\n | (OutputMessage & { id: string })\n | (FunctionCallMessage & { id: string })\n | (ReasoningMessage & { id: string })\n | (ImageGenerationCallMessage & { id: string });\n\nexport interface ChunkResponseUsage {\n input_tokens: number;\n input_tokens_details: {\n cached_tokens: number;\n };\n output_tokens: number;\n output_tokens_details: {\n reasoning_tokens: number;\n };\n total_tokens: number;\n}\n\nexport interface Usage {\n input_tokens: number;\n output_tokens: number;\n total_tokens: number;\n input_tokens_details: {\n cached_tokens: number;\n };\n output_tokens_details: {\n reasoning_tokens: number;\n };\n}\n\n// Type guards\nexport function isEasyMessage(msg: MessageUnion): msg is EasyMessage {\n return msg.type === MessageType.Message && 'content' in msg && (typeof msg.content === 'string' || Array.isArray(msg.content));\n}\n\nexport function isInputMessage(msg: MessageUnion): msg is InputMessage {\n return msg.type === MessageType.Message && 'content' in msg && Array.isArray(msg.content);\n}\n\nexport function isFunctionCallMessage(msg: MessageUnion): msg is FunctionCallMessage {\n return msg.type === MessageType.FunctionCall;\n}\n\nexport function isFunctionCallOutputMessage(msg: MessageUnion): msg is FunctionCallOutputMessage {\n return msg.type === MessageType.FunctionCallOutput;\n}\n\nexport function isReasoningMessage(msg: MessageUnion): msg is ReasoningMessage {\n return msg.type === MessageType.Reasoning;\n}\n\nexport function isImageGenerationCallMessage(msg: MessageUnion): msg is ImageGenerationCallMessage {\n return msg.type === MessageType.ImageGenerationCall;\n}\n","import {\n ChunkType,\n ContentType,\n ConversationMessage,\n FunctionCallMessage,\n FunctionCallOutputMessage,\n ImageGenerationCallMessage,\n InputMessage,\n MessageUnion,\n ReasoningMessage,\n ResponseChunk,\n} from '../types';\n\n/**\n * Callback invoked when the conversation state changes\n */\nexport type OnChangeCallback = (conversation: ConversationMessage) => void;\n\n/**\n * Processes streaming chunks from the LLM response.\n * Builds up messages incrementally as chunks arrive.\n *\n * @example\n * ```ts\n * const processor = new ChunkProcessor(\n * 'conv-123',\n * 'thread-456',\n * (conversation) => {\n * // Update UI with new conversation state\n * setConversation(conversation);\n * }\n * );\n *\n * // Process incoming chunks\n * processor.processChunk(jsonData);\n *\n * // Get final conversation when done\n * const finalConversation = processor.getConversation();\n * ```\n */\nexport class ChunkProcessor {\n private messages: MessageUnion[] = [];\n private currentOutputItem: MessageUnion | null = null;\n private _onChange: OnChangeCallback;\n private conversation: ConversationMessage;\n\n constructor(\n conversationId: string,\n threadId: string,\n onChange: OnChangeCallback\n ) {\n this.conversation = {\n conversation_id: conversationId,\n thread_id: threadId,\n message_id: '',\n messages: [],\n meta: {},\n };\n this._onChange = onChange;\n }\n\n /**\n * Get all processed messages\n */\n getMessages(): MessageUnion[] {\n return this.messages;\n }\n\n /**\n * Get the current conversation state\n */\n getConversation(): ConversationMessage {\n return this.conversation;\n }\n\n private emitChange(): void {\n this.conversation.messages = [...this.messages];\n this._onChange({ ...this.conversation });\n }\n\n /**\n * Process a raw JSON chunk from the SSE stream\n */\n processChunk(data: string): void {\n try {\n const chunk: ResponseChunk = JSON.parse(data);\n this.handleChunk(chunk);\n } catch (e) {\n console.error('Failed to parse chunk:', e, data);\n }\n }\n\n private handleChunk(chunk: ResponseChunk): void {\n switch (chunk.type) {\n // Run lifecycle\n case ChunkType.ChunkTypeRunCreated:\n case ChunkType.ChunkTypeRunInProgress:\n case ChunkType.ChunkTypeRunCompleted:\n case ChunkType.ChunkTypeRunPaused:\n this.conversation.meta.run_state = chunk.run_state;\n this.conversation.message_id = chunk.run_state!.id;\n if (chunk.type !== ChunkType.ChunkTypeRunCreated && chunk.type !== ChunkType.ChunkTypeRunInProgress) {\n this.emitChange();\n }\n break;\n\n // Response lifecycle\n case ChunkType.ChunkTypeResponseCreated:\n case ChunkType.ChunkTypeResponseInProgress:\n break;\n\n case ChunkType.ChunkTypeResponseCompleted:\n if (chunk.response?.usage) {\n this.conversation.meta.usage = chunk.response.usage;\n this.emitChange();\n }\n break;\n\n // Output item lifecycle\n case ChunkType.ChunkTypeOutputItemAdded:\n this.handleOutputItemAdded(chunk);\n break;\n\n case ChunkType.ChunkTypeOutputItemDone:\n break;\n\n // Content parts\n case ChunkType.ChunkTypeContentPartAdded:\n this.handleContentPartAdded(chunk);\n break;\n\n case ChunkType.ChunkTypeContentPartDone:\n break;\n\n // Text deltas\n case ChunkType.ChunkTypeOutputTextDelta:\n this.handleOutputTextDelta(chunk);\n break;\n\n case ChunkType.ChunkTypeOutputTextDone:\n break;\n\n // Reasoning summary\n case ChunkType.ChunkTypeReasoningSummaryPartAdded:\n this.handleReasoningSummaryPartAdded(chunk);\n break;\n\n case ChunkType.ChunkTypeReasoningSummaryPartDone:\n break;\n\n case ChunkType.ChunkTypeReasoningSummaryTextDelta:\n this.handleReasoningSummaryTextDelta(chunk);\n break;\n\n case ChunkType.ChunkTypeReasoningSummaryTextDone:\n break;\n\n // Function calls\n case ChunkType.ChunkTypeFunctionCallArgumentsDelta:\n this.handleFunctionCallArgumentsDelta(chunk);\n break;\n\n case ChunkType.ChunkTypeFunctionCallArgumentsDone:\n break;\n\n case ChunkType.ChunkTypeFunctionCallOutput:\n this.handleFunctionCallOutput(chunk);\n break;\n\n // Image Generation Calls\n case ChunkType.ChunkTypeImageGenerationCallInProgress:\n break;\n\n case ChunkType.ChunkTypeImageGenerationCallGenerating:\n break;\n\n case ChunkType.ChunkTypeImageGenerationCallPartialImage:\n this.handleImageGenerationCallPartialImage(chunk);\n break;\n }\n }\n\n private handleOutputItemAdded(chunk: ResponseChunk): void {\n if (!chunk.item) return;\n\n switch (chunk.item.type) {\n case \"message\":\n this.currentOutputItem = {\n id: chunk.item.id,\n type: \"message\",\n role: chunk.item.role || \"assistant\",\n content: [],\n } as InputMessage;\n break;\n\n case \"function_call\":\n this.currentOutputItem = {\n id: chunk.item.id,\n type: \"function_call\",\n name: chunk.item.name || \"\",\n call_id: chunk.item.call_id || \"\",\n arguments: \"\",\n } as FunctionCallMessage;\n break;\n\n case \"reasoning\":\n this.currentOutputItem = {\n id: chunk.item.id,\n type: \"reasoning\",\n summary: [],\n } as ReasoningMessage;\n break;\n\n case \"image_generation_call\":\n this.currentOutputItem = {\n id: chunk.item.id,\n type: \"image_generation_call\",\n status: chunk.item.status,\n } as ImageGenerationCallMessage;\n break;\n }\n\n if (this.currentOutputItem) {\n this.messages.push(this.currentOutputItem);\n this.emitChange();\n }\n }\n\n private handleContentPartAdded(chunk: ResponseChunk): void {\n if (!this.currentOutputItem || this.currentOutputItem.type !== \"message\") return;\n\n const message = this.currentOutputItem as InputMessage;\n if (chunk.part?.type === ContentType.OutputText) {\n message.content = message.content || [];\n message.content.push({\n type: ContentType.OutputText,\n text: \"\",\n });\n this.emitChange();\n }\n }\n\n private handleOutputTextDelta(chunk: ResponseChunk): void {\n if (!this.currentOutputItem || this.currentOutputItem.type !== \"message\") return;\n\n const message = this.currentOutputItem as InputMessage;\n const contents = message.content;\n if (!contents?.length || !chunk.delta) return;\n\n const lastContent = contents[contents.length - 1];\n if (lastContent && 'text' in lastContent) {\n lastContent.text += chunk.delta;\n this.emitChange();\n }\n }\n\n private handleReasoningSummaryPartAdded(chunk: ResponseChunk): void {\n if (!this.currentOutputItem || this.currentOutputItem.type !== \"reasoning\") return;\n\n const reasoning = this.currentOutputItem as ReasoningMessage;\n if (chunk.part?.type === ContentType.SummaryText) {\n reasoning.summary = reasoning.summary || [];\n reasoning.summary.push({\n type: ContentType.SummaryText,\n text: \"\",\n });\n this.emitChange();\n }\n }\n\n private handleReasoningSummaryTextDelta(chunk: ResponseChunk): void {\n if (!this.currentOutputItem || this.currentOutputItem.type !== \"reasoning\") return;\n\n const reasoning = this.currentOutputItem as ReasoningMessage;\n reasoning.summary = reasoning.summary || [];\n\n const summaries = reasoning.summary;\n if (summaries.length === 0) {\n reasoning.summary.push({\n type: ContentType.SummaryText,\n text: \"\",\n });\n }\n\n if (!chunk.delta) return;\n\n const lastSummary = summaries[summaries.length - 1];\n if (lastSummary) {\n lastSummary.text += chunk.delta;\n this.emitChange();\n }\n }\n\n private handleFunctionCallArgumentsDelta(chunk: ResponseChunk): void {\n if (!this.currentOutputItem || this.currentOutputItem.type !== \"function_call\") return;\n\n const functionCall = this.currentOutputItem as FunctionCallMessage;\n functionCall.arguments += chunk.delta || \"\";\n this.emitChange();\n }\n\n private handleFunctionCallOutput(chunk: ResponseChunk): void {\n this.currentOutputItem = chunk as unknown as FunctionCallOutputMessage;\n this.messages.push(this.currentOutputItem);\n this.emitChange();\n }\n\n private handleImageGenerationCallPartialImage(chunk: ResponseChunk): void {\n if (!this.currentOutputItem || this.currentOutputItem.type !== \"image_generation_call\") return;\n\n const image = this.currentOutputItem as ImageGenerationCallMessage;\n image.result = chunk.partial_image_b64!;\n image.quality = chunk.quality!;\n image.size = chunk.size!;\n image.output_format = chunk.output_format!;\n image.background = chunk.background!;\n\n this.emitChange();\n }\n}\n\n","/**\n * Options for the SSE stream callbacks\n */\nexport interface SSEStreamOptions {\n /** Called for each data chunk received */\n onChunk: (data: string) => void;\n /** Called when an error occurs */\n onError?: (error: Error) => void;\n /** Called when the stream completes */\n onComplete?: () => void;\n}\n\n/**\n * Streams Server-Sent Events (SSE) from a URL.\n * Parses SSE frames and calls onChunk for each data payload.\n *\n * @param url - The URL to stream from\n * @param requestOptions - Fetch request options\n * @param callbacks - SSE event callbacks\n * @param abortSignal - Optional signal to abort the stream\n *\n * @example\n * ```ts\n * await streamSSE(\n * 'https://api.example.com/stream',\n * { method: 'POST', body: JSON.stringify({ message: 'Hello' }) },\n * {\n * onChunk: (data) => console.log('Received:', data),\n * onComplete: () => console.log('Done'),\n * onError: (err) => console.error('Error:', err),\n * }\n * );\n * ```\n */\nexport async function streamSSE(\n url: string,\n requestOptions: RequestInit,\n callbacks: SSEStreamOptions,\n abortSignal?: AbortSignal\n): Promise<void> {\n try {\n const response = await fetch(url, {\n ...requestOptions,\n signal: abortSignal,\n });\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n if (!response.body) {\n throw new Error('Response body is null');\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n while (true) {\n const { value, done } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n\n // Parse SSE frames: split on double newline\n let idx;\n while ((idx = buffer.indexOf('\\n\\n')) !== -1) {\n const frame = buffer.slice(0, idx);\n buffer = buffer.slice(idx + 2);\n\n // Join all data: lines in the frame\n const data = frame\n .split('\\n')\n .filter(line => line.startsWith('data:'))\n .map(line => line.slice(5).trim())\n .join('\\n');\n\n if (data) {\n callbacks.onChunk(data);\n }\n }\n }\n\n // Final flush of decoder state\n decoder.decode();\n callbacks.onComplete?.();\n } catch (error) {\n if ((error as Error).name === 'AbortError') {\n return;\n }\n callbacks.onError?.(error as Error);\n }\n}\n\n","import axios, { AxiosInstance } from 'axios';\nimport {useCallback, useEffect, useMemo, useRef, useState} from \"react\";\nimport {Agent} from \"../types\";\nimport {GetHeadersFn} from \"./useConversation\";\n\n/**\n * Options for the useProject hook\n */\nexport interface UseProjectOptions {\n /** Base URL of the Uno Agent Server (e.g., 'https://api.example.com/api/agent-server') */\n baseUrl: string;\n /** Project Name used to fetch the project ID */\n projectName: string;\n /** Optional organisation ID to scope all requests (sent as X-Org-ID header) */\n orgId?: string;\n /** Optional function to get custom headers for requests (e.g., for authentication) */\n getHeaders?: GetHeadersFn;\n /** Auto-load conversations on mount (default: true) */\n autoLoad?: boolean;\n}\n\n/**\n * Return type for the useProject hook\n */\nexport interface UseProjectReturn {\n // Project state\n /** The fetched project ID */\n projectId: string;\n /** Whether the project ID is being fetched */\n projectLoading: boolean;\n /** Axios instance configured with baseUrl and custom headers */\n axiosInstance: AxiosInstance;\n /** Function to build query params with project_id automatically added */\n buildParams: (params?: Record<string, string>) => Record<string, string>;\n /** Function to get request headers (combines default + custom headers) */\n getRequestHeaders: () => Promise<Record<string, string>>;\n /** Base URL used for the axios instance */\n baseUrl: string;\n}\n\nexport function useProject(options: UseProjectOptions): UseProjectReturn {\n const { projectName, baseUrl, orgId, getHeaders, autoLoad = true } = options;\n\n // Project state\n const [projectId, setProjectId] = useState<string>('');\n const [projectLoading, setProjectLoading] = useState(false);\n\n // Use ref to store current projectId for interceptor access\n const projectIdRef = useRef<string>('');\n\n // Update ref whenever projectId changes\n useEffect(() => {\n projectIdRef.current = projectId;\n }, [projectId]);\n\n // ── Clear stale projectId synchronously during render when projectName changes ──\n // When the org switches, ProjectContext clears selectedProject (during render),\n // causing projectName to become ''. Without this guard, downstream consumers\n // (useConversation, ChatPage, etc.) would still see the OLD projectId in their\n // effects, firing API calls with a stale project_id or without one entirely.\n const prevProjectNameRef = useRef<string | undefined>(undefined);\n if (prevProjectNameRef.current !== undefined && projectName !== prevProjectNameRef.current) {\n setProjectId('');\n projectIdRef.current = '';\n }\n prevProjectNameRef.current = projectName;\n\n // Create axios instance with request interceptor for custom headers and project_id\n const axiosInstance = useMemo(() => {\n const instance = axios.create({\n baseURL: baseUrl,\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n // Add request interceptor to inject custom headers, org_id, and project_id\n instance.interceptors.request.use(async (config) => {\n // Add org ID header if provided\n if (orgId) {\n config.headers.set('X-Org-ID', orgId);\n }\n\n // Add custom headers if getHeaders function is provided\n if (getHeaders) {\n const customHeaders = await getHeaders();\n Object.assign(config.headers, customHeaders);\n }\n\n // Automatically add project_id to query params if available\n const currentProjectId = projectIdRef.current;\n if (currentProjectId) {\n if (config.params) {\n config.params = {\n ...config.params,\n project_id: currentProjectId,\n };\n } else {\n config.params = { project_id: currentProjectId };\n }\n }\n \n return config;\n });\n\n return instance;\n }, [baseUrl, orgId, getHeaders]);\n\n\n // ============================================\n // API Helper Functions\n // ============================================\n\n /**\n * Build query params (project_id is automatically added by axios interceptor)\n */\n const buildParams = useCallback((params?: Record<string, string>) => {\n return params || {};\n }, []);\n\n /**\n * Get headers for streaming requests (combines default + custom + org headers)\n */\n const getRequestHeaders = useCallback(async (): Promise<Record<string, string>> => {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n // Add org ID header if provided\n if (orgId) {\n headers['X-Org-ID'] = orgId;\n }\n\n // Add custom headers if getHeaders function is provided\n if (getHeaders) {\n const customHeaders = await getHeaders();\n Object.assign(headers, customHeaders);\n }\n\n return headers;\n }, [orgId, getHeaders]);\n\n // ============================================\n // Project Management\n // ============================================\n\n /**\n * Fetch the project ID using the project name\n */\n const fetchProjectId = useCallback(async () => {\n if (!projectName) {\n return;\n }\n\n setProjectLoading(true);\n try {\n const response = await axiosInstance.get<{ data: string } | string>('/project/id', {\n params: { name: projectName },\n });\n const id = typeof response.data === 'string' ? response.data : response.data.data;\n setProjectId(id || '');\n } catch (error) {\n console.error('Failed to fetch project ID:', error);\n throw error;\n } finally {\n setProjectLoading(false);\n }\n }, [axiosInstance, projectName]);\n\n // ============================================\n // Effects for auto-loading\n // ============================================\n\n // Fetch project ID when projectName changes (or on mount)\n useEffect(() => {\n if (autoLoad && projectName) {\n fetchProjectId();\n }\n }, [autoLoad, projectName, fetchProjectId]);\n\n return {\n // Project state\n projectId,\n projectLoading,\n // API client\n axiosInstance,\n buildParams,\n getRequestHeaders,\n baseUrl,\n }\n}","import React, {createContext, useContext, useMemo} from 'react';\nimport type { ReactNode, ReactElement } from \"react\";\nimport { useProject, UseProjectOptions, UseProjectReturn } from '../hooks/useProject';\n\n/**\n * Context value for ProjectProvider\n */\nexport interface ProjectContextValue extends UseProjectReturn {}\n\n/**\n * Props for ProjectProvider component\n */\nexport interface ProjectProviderProps {\n /** Base URL of the Uno Agent Server (e.g., 'https://api.example.com/api/agent-server') */\n baseUrl: string;\n /** Project Name used to fetch the project ID */\n projectName: string;\n /** Optional organisation ID to scope all requests (sent as X-Org-ID header) */\n orgId?: string;\n /** Optional function to get custom headers for requests (e.g., for authentication) */\n getHeaders?: UseProjectOptions['getHeaders'];\n /** Auto-load project on mount (default: true) */\n autoLoad?: boolean;\n /** Child components */\n children: ReactNode;\n}\n\n// Create the context with undefined as default to ensure it's used within provider\nconst ProjectContext = createContext<ProjectContextValue | undefined>(undefined);\n\n/**\n * ProjectProvider component that manages project state using React Context.\n * \n * This provider wraps the useProject hook and makes the project state available\n * to all child components through context.\n * \n * @example\n * ```tsx\n * import { ProjectProvider, useProjectContext } from '@praveen001/uno-converse';\n * \n * function App() {\n * return (\n * <ProjectProvider\n * baseUrl=\"https://api.example.com/api/agent-server\"\n * projectName=\"my-project\"\n * getHeaders={() => ({\n * 'Authorization': `Bearer ${getToken()}`,\n * })}\n * >\n * <YourApp />\n * </ProjectProvider>\n * );\n * }\n * \n * function YourApp() {\n * const { projectId, projectLoading } = useProjectContext();\n * \n * if (projectLoading) {\n * return <div>Loading project...</div>;\n * }\n * \n * return <div>Project ID: {projectId}</div>;\n * }\n * ```\n */\nexport const ProjectProvider = ({\n baseUrl,\n projectName,\n orgId,\n getHeaders,\n autoLoad = true,\n children,\n}: ProjectProviderProps): ReactElement => {\n // Use the useProject hook to manage project state\n const projectState = useProject({\n baseUrl,\n projectName,\n orgId,\n getHeaders,\n autoLoad,\n });\n\n // Memoize the context value to prevent unnecessary re-renders\n const contextValue = useMemo<ProjectContextValue>(\n () => projectState,\n [\n projectState.projectId,\n projectState.projectLoading,\n projectState.axiosInstance,\n projectState.buildParams,\n projectState.getRequestHeaders,\n projectState.baseUrl,\n ]\n );\n\n return (\n <ProjectContext.Provider value={contextValue}>\n {children}\n </ProjectContext.Provider>\n );\n};\n\n/**\n * Hook to access the project context.\n * \n * Must be used within a ProjectProvider component.\n * \n * @throws {Error} If used outside of ProjectProvider\n * \n * @example\n * ```tsx\n * function MyComponent() {\n * const { projectId, projectLoading } = useProjectContext();\n * \n * return (\n * <div>\n * {projectLoading ? 'Loading...' : `Project ID: ${projectId}`}\n * </div>\n * );\n * }\n * ```\n */\nexport const useProjectContext = (): ProjectContextValue => {\n const context = useContext(ProjectContext);\n \n if (context === undefined) {\n throw new Error('useProjectContext must be used within a ProjectProvider');\n }\n \n return context;\n};\n\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { ChunkProcessor } from '../streaming/ChunkProcessor';\nimport { streamSSE } from '../streaming/streamSSE';\nimport {\n Agent,\n Conversation,\n ConversationMessage,\n ConverseConfig,\n MessageType,\n MessageUnion,\n Thread,\n} from '../types';\nimport { useProjectContext } from '../ProjectProvider';\n\n/**\n * Simple ID generator for message IDs\n */\nfunction generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).substring(2, 11)}`;\n}\n\n/**\n * Function type for providing custom headers.\n * Called before each request to get headers (useful for dynamic auth tokens).\n *\n * @example\n * ```ts\n * const getHeaders: GetHeadersFn = () => ({\n * 'Authorization': `Bearer ${getToken()}`,\n * 'X-Custom-Header': 'value',\n * });\n * ```\n */\nexport type GetHeadersFn = () => Record<string, string> | Promise<Record<string, string>>;\n\n/**\n * Options for the useConversation hook\n */\nexport interface UseConversationOptions {\n /** The namespace for conversations */\n namespace: string;\n /** Auto-load conversations on mount (default: true) */\n autoLoad?: boolean;\n}\n\n/**\n * Return type for the useConversation hook\n */\nexport interface UseConversationReturn {\n // Conversation list state\n /** List of all conversations */\n conversations: Conversation[];\n /** Whether conversations are being loaded */\n conversationsLoading: boolean;\n\n // Thread state\n /** List of threads in the current conversation */\n threads: Thread[];\n /** Whether threads are being loaded */\n threadsLoading: boolean;\n /** Currently selected thread */\n currentThread: Thread | null;\n\n // Message state\n /** List of messages in the current thread */\n messages: ConversationMessage[];\n /** Message currently being streamed */\n streamingMessage: ConversationMessage | null;\n /** Whether messages are being loaded */\n messagesLoading: boolean;\n /** Whether a response is currently streaming */\n isStreaming: boolean;\n /** Whether waiting for a response */\n isThinking: boolean;\n\n // Current selection\n /** ID of the currently selected conversation */\n currentConversationId: string | null;\n /** ID of the currently selected thread */\n currentThreadId: string | null;\n\n // Actions - Conversations\n /** Load all conversations */\n loadConversations: () => Promise<void>;\n /** Select a conversation by ID */\n selectConversation: (conversationId: string) => void;\n\n // Actions - Threads\n /** Load threads for a conversation */\n loadThreads: (conversationId: string) => Promise<void>;\n /** Select a thread by ID */\n selectThread: (threadId: string) => void;\n\n // Actions - Messages\n /** Send a message and stream the response */\n sendMessage: (userMessages: MessageUnion[], config: ConverseConfig) => Promise<void>;\n\n // Actions - Utility\n /** Start a new chat (clears current state) */\n startNewChat: () => void;\n\n // Combined messages (loaded + streaming)\n /** All messages including the currently streaming one */\n allMessages: ConversationMessage[];\n}\n\n/**\n * A comprehensive hook for managing conversations, threads, messages, and streaming\n * with Uno Agent Server.\n *\n * @example\n * ```tsx\n * import { useConversation } from '@praveen001/uno-converse';\n *\n * function ChatComponent() {\n * const {\n * allMessages,\n * isStreaming,\n * sendMessage,\n * startNewChat,\n * } = useConversation({\n * namespace: 'my-app',\n * });\n *\n * const handleSend = async (text: string) => {\n * await sendMessage(\n * [{ type: 'message', id: '1', content: text }],\n * {\n * namespace: 'my-app',\n * agentName: 'my-agent',\n * }\n * );\n * };\n *\n * return (\n * <div>\n * {allMessages.map(msg => (\n * <MessageComponent key={msg.message_id} message={msg} />\n * ))}\n * {isStreaming && <LoadingIndicator />}\n * </div>\n * );\n * }\n * ```\n */\nexport function useConversation(options: UseConversationOptions): UseConversationReturn {\n const { namespace, autoLoad = true } = options;\n\n // Get project context (axios instance, projectId, etc.)\n const {\n axiosInstance,\n projectId,\n projectLoading,\n buildParams,\n getRequestHeaders,\n baseUrl,\n } = useProjectContext();\n\n // Conversation list state\n const [conversations, setConversations] = useState<Conversation[]>([]);\n const [conversationsLoading, setConversationsLoading] = useState(false);\n\n // Thread state\n const [threads, setThreads] = useState<Thread[]>([]);\n const [threadsLoading, setThreadsLoading] = useState(false);\n\n // Message state\n const [messages, setMessages] = useState<ConversationMessage[]>([]);\n const [streamingMessage, setStreamingMessage] = useState<ConversationMessage | null>(null);\n const [messagesLoading, setMessagesLoading] = useState(false);\n const [isStreaming, setIsStreaming] = useState(false);\n const [isThinking, setIsThinking] = useState(false);\n\n // Current selection\n const [currentConversationId, setCurrentConversationId] = useState<string | null>(null);\n const [currentThreadId, setCurrentThreadId] = useState<string | null>(null);\n\n // Refs\n const processorRef = useRef<ChunkProcessor | null>(null);\n const abortControllerRef = useRef<AbortController | null>(null);\n\n // ============================================\n // API Helper Functions\n // ============================================\n // Note: buildParams and getRequestHeaders are now provided by ProjectProvider\n\n // ============================================\n // Conversation Management\n // ============================================\n\n /**\n * Load all conversations for the namespace\n */\n const loadConversations = useCallback(async () => {\n setConversationsLoading(true);\n try {\n const response = await axiosInstance.get<{ data: Conversation[] } | Conversation[]>('/conversations', {\n params: buildParams({ namespace }),\n });\n const data = 'data' in response.data ? response.data.data : response.data;\n setConversations(data || []);\n } catch (error) {\n console.error('Failed to load conversations:', error);\n throw error;\n } finally {\n setConversationsLoading(false);\n }\n }, [axiosInstance, buildParams, namespace]);\n\n /**\n * Select a conversation and load its threads\n */\n const selectConversation = useCallback((conversationId: string) => {\n setCurrentConversationId(conversationId);\n // Threads will be loaded via useEffect\n }, []);\n\n // ============================================\n // Thread Management\n // ============================================\n\n /**\n * Load threads for a conversation\n */\n const loadThreads = useCallback(async (conversationId: string) => {\n setThreadsLoading(true);\n try {\n const response = await axiosInstance.get<{ data: Thread[] } | Thread[]>('/threads', {\n params: buildParams({ conversation_id: conversationId, namespace }),\n });\n const loadedThreads = 'data' in response.data ? response.data.data : response.data;\n\n // Sort by created_at descending\n loadedThreads.sort(\n (a, b) => new Date(b.created_at).getTime() - new Date(a.created_at).getTime()\n );\n\n setThreads(loadedThreads);\n\n // Auto-select the latest thread\n if (loadedThreads.length > 0) {\n setCurrentThreadId(loadedThreads[0].thread_id);\n }\n } catch (error) {\n console.error('Failed to load threads:', error);\n throw error;\n } finally {\n setThreadsLoading(false);\n }\n }, [axiosInstance, buildParams, namespace]);\n\n /**\n * Select a thread and load its messages\n */\n const selectThread = useCallback((threadId: string) => {\n setCurrentThreadId(threadId);\n // Messages will be loaded via useEffect\n }, []);\n\n // ============================================\n // Message Management\n // ============================================\n\n /**\n * Load messages for a thread\n */\n const loadMessages = useCallback(async (threadId: string) => {\n setMessagesLoading(true);\n try {\n const response = await axiosInstance.get<{ data: ConversationMessage[] } | ConversationMessage[]>('/messages', {\n params: buildParams({ thread_id: threadId, namespace }),\n });\n const loadedMessages = 'data' in response.data ? response.data.data : response.data;\n\n // // Extract last message ID for continuation\n // if (loadedMessages.length > 0) {\n // const lastMsgId = loadedMessages[loadedMessages.length - 1].message_id;\n // setPreviousMessageId(lastMsgId);\n // } else {\n // setPreviousMessageId('');\n // }\n\n setMessages(loadedMessages);\n } catch (error) {\n console.error('Failed to load messages:', error);\n throw error;\n } finally {\n setMessagesLoading(false);\n }\n }, [axiosInstance, buildParams, namespace]);\n\n /**\n * Send a user message and stream the response\n */\n const sendMessage = useCallback(async (userMessages: MessageUnion[], config: ConverseConfig) => {\n const messageId = generateId();\n\n // Check if this is a tool approval response (resuming a run)\n const isToolApproval = userMessages.length === 1 &&\n userMessages[0].type === MessageType.FunctionCallApprovalResponse;\n\n // Only add user message for regular messages, not for tool approvals\n if (!isToolApproval) {\n const userConversation: ConversationMessage = {\n conversation_id: currentConversationId || '',\n thread_id: currentThreadId || '',\n message_id: messageId + '-user',\n messages: userMessages,\n meta: {},\n };\n setMessages(prev => [...prev, userConversation]);\n }\n\n // Initialize the chunk processor for the assistant response\n processorRef.current = new ChunkProcessor(\n currentConversationId || '',\n currentThreadId || '',\n (conversation) => {\n setIsThinking(isThinking);\n setStreamingMessage({ ...conversation, isStreaming: true });\n }\n );\n\n setIsStreaming(true);\n setIsThinking(true);\n\n // Build URL with query parameters\n const params = new URLSearchParams();\n if (projectId) {\n params.append('project_id', projectId);\n }\n params.append('agent_id', config.agentId);\n\n let url = `${baseUrl}/converse?${params.toString()}`;\n if (!!config.baseUrl) {\n url = config.baseUrl;\n }\n\n // Prepare request body\n const body = JSON.stringify({\n namespace: config.namespace,\n thread_id: currentThreadId,\n message: userMessages[0],\n context: config.context || {},\n });\n\n // Abort any existing stream\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n abortControllerRef.current = new AbortController();\n\n try {\n // Get headers (supports async getHeaders function)\n const requestHeaders = await getRequestHeaders();\n\n await streamSSE(\n url,\n {\n method: 'POST',\n body,\n headers: {\n ...requestHeaders,\n ...(config.headers || {}),\n },\n },\n {\n onChunk: (data) => {\n processorRef.current?.processChunk(data);\n },\n onComplete: () => {\n // Move streaming message to messages list\n if (processorRef.current) {\n const finalConversation = processorRef.current.getConversation();\n\n if (isToolApproval) {\n // For tool approvals, update the last message instead of appending\n setMessages(prev => {\n const newMessages = [...prev];\n if (newMessages.length > 0) {\n const lastMsg = newMessages[newMessages.length - 1];\n newMessages[newMessages.length - 1] = {\n ...lastMsg,\n messages: [...lastMsg.messages, ...finalConversation.messages],\n meta: finalConversation.meta,\n isStreaming: false,\n };\n }\n return newMessages;\n });\n } else {\n setMessages(prev => [...prev, { ...finalConversation, isStreaming: false }]);\n }\n\n setStreamingMessage(null);\n // setPreviousMessageId(finalConversation.message_id);\n }\n },\n onError: (error) => {\n console.error('Streaming error:', error);\n setStreamingMessage(null);\n },\n },\n abortControllerRef.current.signal\n );\n\n // If this was a new conversation, fetch the conversation info\n if (!currentThreadId || currentThreadId === '' && processorRef.current) {\n try {\n const response = await axiosInstance.get<{ data: ConversationMessage } | ConversationMessage>(\n `/messages/${processorRef.current.getConversation().message_id}`,\n { params: buildParams({ namespace }) }\n );\n const messageData = 'data' in response.data ? response.data.data : response.data;\n const newConversationId = messageData?.conversation_id;\n if (newConversationId) {\n // Add new conversation to list\n setConversations(prev => [{\n conversation_id: newConversationId,\n name: \"New Conversation\",\n namespace_id: namespace,\n created_at: new Date().toISOString(),\n last_updated: new Date().toISOString(),\n } as Conversation, ...prev.filter(c => c.conversation_id !== newConversationId)]);\n\n setCurrentConversationId(newConversationId);\n }\n } catch (e) {\n console.error('Failed to get conversation ID:', e);\n }\n }\n } finally {\n setIsStreaming(false);\n abortControllerRef.current = null;\n }\n }, [currentConversationId, currentThreadId, namespace, baseUrl, projectId, axiosInstance, buildParams, getRequestHeaders]);\n\n // ============================================\n // Utility Actions\n // ============================================\n\n /**\n * Start a new chat (reset all state)\n */\n const startNewChat = useCallback(() => {\n // Abort any ongoing stream\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n abortControllerRef.current = null;\n }\n\n setCurrentConversationId(null);\n setCurrentThreadId(null);\n setThreads([]);\n setMessages([]);\n setStreamingMessage(null);\n setIsStreaming(false);\n setIsThinking(false);\n processorRef.current = null;\n }, []);\n\n // ============================================\n // Effects for auto-loading\n // ============================================\n\n // Clear stale conversation state when project changes (e.g., org switch).\n // This runs before the loading effect below (effects execute in declaration\n // order) and ensures we never show data from a previous project/org.\n useEffect(() => {\n setConversations([]);\n setThreads([]);\n setMessages([]);\n setStreamingMessage(null);\n setCurrentConversationId(null);\n setCurrentThreadId(null);\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n abortControllerRef.current = null;\n }\n processorRef.current = null;\n }, [projectId]);\n\n // Load conversations after project ID is fetched\n useEffect(() => {\n if (autoLoad && projectId) {\n loadConversations();\n }\n }, [autoLoad, projectId, loadConversations]);\n\n // Load threads when conversation changes\n useEffect(() => {\n if (currentConversationId) {\n loadThreads(currentConversationId);\n }\n }, [currentConversationId, loadThreads]);\n\n // Load messages when thread changes\n useEffect(() => {\n if (currentThreadId) {\n loadMessages(currentThreadId);\n }\n }, [currentThreadId, loadMessages]);\n\n // ============================================\n // Computed values\n // ============================================\n\n const currentThread = threads.find(t => t.thread_id === currentThreadId) || null;\n\n const allMessages = streamingMessage\n ? [...messages, streamingMessage]\n : messages;\n\n return {\n // Conversation list state\n conversations,\n conversationsLoading,\n\n // Thread state\n threads,\n threadsLoading,\n currentThread,\n\n // Message state\n messages,\n streamingMessage,\n messagesLoading,\n isStreaming,\n isThinking,\n\n // Current selection\n currentConversationId,\n currentThreadId,\n\n // Actions - Conversations\n loadConversations,\n selectConversation,\n\n // Actions - Threads\n loadThreads,\n selectThread,\n\n // Actions - Messages\n sendMessage,\n\n // Actions - Utility\n startNewChat,\n\n // Combined messages\n allMessages,\n };\n}\n\n","import axios from 'axios';\nimport {useCallback, useEffect, useMemo, useState} from \"react\";\nimport {Agent} from \"../types\";\nimport {GetHeadersFn} from \"./useConversation\";\nimport { useProjectContext } from '../ProjectProvider';\n\n/**\n * Options for the useAgent hook\n */\nexport interface UseAgentOptions {\n /** The name of the agent */\n name: string;\n}\n\n/**\n * Return type for the useAgent hook\n */\nexport interface UseAgentReturn {\n // Agent\n agent: Agent | null;\n /** Whether the agent is being loaded */\n agentLoading: boolean;\n}\n\nexport function useAgent(options: UseAgentOptions): UseAgentReturn {\n const { name } = options;\n\n // Get project context (axios instance, projectId, etc.)\n const {\n axiosInstance,\n projectId,\n buildParams,\n } = useProjectContext();\n\n // Agents state\n const [agent, setAgent] = useState<Agent | null>(null);\n const [agentLoading, setAgentLoading] = useState(false);\n\n // ============================================\n // Agent Management\n // ============================================\n\n /**\n * Fetch the agent\n */\n const loadAgent = useCallback(async (): Promise<void> => {\n setAgentLoading(true);\n try {\n const response = await axiosInstance.get<{data: Agent}>('/agent-configs/by-name', {\n params: buildParams({ name }),\n });\n setAgent(response.data.data);\n } catch (error) {\n console.error('Failed to load agent:', error)\n throw error;\n } finally {\n setAgentLoading(false);\n }\n }, [axiosInstance, name]);\n\n // Fetch agent after project is fetched\n useEffect(() => {\n if (projectId) {\n loadAgent();\n }\n }, [projectId, loadAgent]);\n\n return { agent, agentLoading };\n}"],"names":["_jsx"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hastekit/hastekit-converse",
3
- "version": "0.0.17",
3
+ "version": "0.0.18",
4
4
  "type": "module",
5
5
  "description": "React hooks and utilities for building conversation UIs with HasteKit AI Gateway",
6
6
  "keywords": [