@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 +62 -22
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +5 -1
- package/dist/index.d.ts +5 -1
- package/dist/index.js +62 -22
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
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 (
|
|
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
|
-
|
|
755
|
-
|
|
756
|
-
}
|
|
757
|
-
|
|
758
|
-
|
|
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
|
-
|
|
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 (
|
|
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,
|
|
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) {
|
package/dist/index.cjs.map
CHANGED
|
@@ -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":"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"}
|
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 (
|
|
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
|
-
|
|
753
|
-
|
|
754
|
-
}
|
|
755
|
-
|
|
756
|
-
|
|
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
|
-
|
|
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 (
|
|
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,
|
|
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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"}
|