flowdit-chatbot-library 1.0.0

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.
Files changed (80) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +218 -0
  3. package/dist/assets/data/types/index.d.ts +2 -0
  4. package/dist/assets/data/types/index.d.ts.map +1 -0
  5. package/dist/assets/data/types/index.js +2 -0
  6. package/dist/assets/data/types/index.js.map +1 -0
  7. package/dist/assets/data/types/redux/action.d.ts +8 -0
  8. package/dist/assets/data/types/redux/action.d.ts.map +1 -0
  9. package/dist/assets/data/types/redux/action.js +9 -0
  10. package/dist/assets/data/types/redux/action.js.map +1 -0
  11. package/dist/assets/data/types/redux/index.d.ts +2 -0
  12. package/dist/assets/data/types/redux/index.d.ts.map +1 -0
  13. package/dist/assets/data/types/redux/index.js +2 -0
  14. package/dist/assets/data/types/redux/index.js.map +1 -0
  15. package/dist/assets/data/types/vm/chatbot.d.ts +5 -0
  16. package/dist/assets/data/types/vm/chatbot.d.ts.map +1 -0
  17. package/dist/assets/data/types/vm/chatbot.js +8 -0
  18. package/dist/assets/data/types/vm/chatbot.js.map +1 -0
  19. package/dist/assets/data/types/vm/index.d.ts +2 -0
  20. package/dist/assets/data/types/vm/index.d.ts.map +1 -0
  21. package/dist/assets/data/types/vm/index.js +2 -0
  22. package/dist/assets/data/types/vm/index.js.map +1 -0
  23. package/dist/index.d.ts +14 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +20 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/redux/Provider.d.ts +11 -0
  28. package/dist/redux/Provider.d.ts.map +1 -0
  29. package/dist/redux/Provider.js +12 -0
  30. package/dist/redux/Provider.js.map +1 -0
  31. package/dist/redux/actions/index.d.ts +8 -0
  32. package/dist/redux/actions/index.d.ts.map +1 -0
  33. package/dist/redux/actions/index.js +73 -0
  34. package/dist/redux/actions/index.js.map +1 -0
  35. package/dist/redux/hooks.d.ts +6 -0
  36. package/dist/redux/hooks.d.ts.map +1 -0
  37. package/dist/redux/hooks.js +27 -0
  38. package/dist/redux/hooks.js.map +1 -0
  39. package/dist/redux/reducers/actions/general.d.ts +7 -0
  40. package/dist/redux/reducers/actions/general.d.ts.map +1 -0
  41. package/dist/redux/reducers/actions/general.js +16 -0
  42. package/dist/redux/reducers/actions/general.js.map +1 -0
  43. package/dist/redux/reducers/actions/index.d.ts +5 -0
  44. package/dist/redux/reducers/actions/index.d.ts.map +1 -0
  45. package/dist/redux/reducers/actions/index.js +8 -0
  46. package/dist/redux/reducers/actions/index.js.map +1 -0
  47. package/dist/redux/reducers/index.d.ts +4 -0
  48. package/dist/redux/reducers/index.d.ts.map +1 -0
  49. package/dist/redux/reducers/index.js +15 -0
  50. package/dist/redux/reducers/index.js.map +1 -0
  51. package/dist/redux/store.d.ts +11 -0
  52. package/dist/redux/store.d.ts.map +1 -0
  53. package/dist/redux/store.js +20 -0
  54. package/dist/redux/store.js.map +1 -0
  55. package/dist/styles.css +434 -0
  56. package/dist/utilities/API.d.ts +17 -0
  57. package/dist/utilities/API.d.ts.map +1 -0
  58. package/dist/utilities/API.js +71 -0
  59. package/dist/utilities/API.js.map +1 -0
  60. package/dist/utilities/external-tools.d.ts +19 -0
  61. package/dist/utilities/external-tools.d.ts.map +1 -0
  62. package/dist/utilities/external-tools.js +27 -0
  63. package/dist/utilities/external-tools.js.map +1 -0
  64. package/dist/views/fullscreen/index.d.ts +20 -0
  65. package/dist/views/fullscreen/index.d.ts.map +1 -0
  66. package/dist/views/fullscreen/index.functions.d.ts +38 -0
  67. package/dist/views/fullscreen/index.functions.d.ts.map +1 -0
  68. package/dist/views/fullscreen/index.functions.js +484 -0
  69. package/dist/views/fullscreen/index.functions.js.map +1 -0
  70. package/dist/views/fullscreen/index.js +569 -0
  71. package/dist/views/fullscreen/index.js.map +1 -0
  72. package/dist/views/tools/ChecklistPreview.d.ts +4 -0
  73. package/dist/views/tools/ChecklistPreview.d.ts.map +1 -0
  74. package/dist/views/tools/ChecklistPreview.js +29 -0
  75. package/dist/views/tools/ChecklistPreview.js.map +1 -0
  76. package/dist/views/tools/index.d.ts +6 -0
  77. package/dist/views/tools/index.d.ts.map +1 -0
  78. package/dist/views/tools/index.js +8 -0
  79. package/dist/views/tools/index.js.map +1 -0
  80. package/package.json +74 -0
@@ -0,0 +1,38 @@
1
+ import React from "react";
2
+ import { ChatMessage } from ".";
3
+ /**
4
+ * Handles the logic for sending a user message to the AI and streaming the response.
5
+ *
6
+ * @param params - Object containing all necessary state setters and refs from the component.
7
+ */
8
+ export declare const sendMessage: ({ input, setInput, isStreaming, setIsStreaming, setMessages, controllerRef, conversationIdRef, charBufferRef, setAnimatingMessageId, animatingMessageId, setDisplayedChars, setStreamingComplete, textFromInput, resetAnimationState }: {
9
+ input: string;
10
+ setInput: React.Dispatch<React.SetStateAction<string>>;
11
+ isStreaming: boolean;
12
+ setIsStreaming: React.Dispatch<React.SetStateAction<boolean>>;
13
+ setMessages: React.Dispatch<React.SetStateAction<ChatMessage[]>>;
14
+ controllerRef: React.MutableRefObject<AbortController | null>;
15
+ conversationIdRef: React.MutableRefObject<string>;
16
+ charBufferRef: React.MutableRefObject<string>;
17
+ setAnimatingMessageId: React.Dispatch<React.SetStateAction<string | null>>;
18
+ animatingMessageId: string | null;
19
+ setDisplayedChars: React.Dispatch<React.SetStateAction<string>>;
20
+ setStreamingComplete: React.Dispatch<React.SetStateAction<boolean>>;
21
+ textFromInput?: string;
22
+ resetAnimationState?: () => void;
23
+ }) => Promise<void>;
24
+ /**
25
+ * Stops the active stream explicitly.
26
+ * Used when the user clicks the "Stop" button.
27
+ */
28
+ export declare const stopStreaming: ({ controllerRef, setIsStreaming, animatingMessageId, charBufferRef, setMessages, setAnimatingMessageId, setDisplayedChars, setStreamingComplete }: {
29
+ controllerRef: React.MutableRefObject<AbortController | null>;
30
+ setIsStreaming: React.Dispatch<React.SetStateAction<boolean>>;
31
+ animatingMessageId: string | null;
32
+ charBufferRef: React.MutableRefObject<string>;
33
+ setMessages: React.Dispatch<React.SetStateAction<ChatMessage[]>>;
34
+ setAnimatingMessageId: React.Dispatch<React.SetStateAction<string | null>>;
35
+ setDisplayedChars: React.Dispatch<React.SetStateAction<string>>;
36
+ setStreamingComplete: React.Dispatch<React.SetStateAction<boolean>>;
37
+ }) => void;
38
+ //# sourceMappingURL=index.functions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.functions.d.ts","sourceRoot":"","sources":["../../../views/fullscreen/index.functions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAGzB,OAAO,EAAE,WAAW,EAAE,MAAM,GAAG,CAAA;AAK/B;;;;GAIG;AACH,eAAO,MAAM,WAAW,GAAU,wOAe/B;IACD,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC;IACvD,WAAW,EAAE,OAAO,CAAC;IACrB,cAAc,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9D,WAAW,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IACjE,aAAa,EAAE,KAAK,CAAC,gBAAgB,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC;IAC9D,iBAAiB,EAAE,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAClD,aAAa,EAAE,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAC9C,qBAAqB,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;IAC3E,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,iBAAiB,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC;IAChE,oBAAoB,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC;IACpE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mBAAmB,CAAC,EAAE,MAAM,IAAI,CAAA;CACjC,kBAkeA,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,aAAa,GAAI,mJAS3B;IACD,aAAa,EAAE,KAAK,CAAC,gBAAgB,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC;IAC9D,cAAc,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9D,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,aAAa,EAAE,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAC9C,WAAW,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IACjE,qBAAqB,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;IAC3E,iBAAiB,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC;IAChE,oBAAoB,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAA;CACpE,SA2BA,CAAA"}
@@ -0,0 +1,484 @@
1
+ import { v4 as uuidv4 } from "uuid";
2
+ import { _connectWithStreaming, _sendMessage } from "../../redux/actions";
3
+ import { getAPI } from "../../utilities/API";
4
+ /**
5
+ * Handles the logic for sending a user message to the AI and streaming the response.
6
+ *
7
+ * @param params - Object containing all necessary state setters and refs from the component.
8
+ */
9
+ export const sendMessage = async ({ input, setInput, isStreaming, setIsStreaming, setMessages, controllerRef, conversationIdRef, charBufferRef, setAnimatingMessageId, animatingMessageId, setDisplayedChars, setStreamingComplete, textFromInput, resetAnimationState }) => {
10
+ const prompt = (textFromInput ?? input).trim();
11
+ if (!prompt || isStreaming)
12
+ return;
13
+ // 1. Reset component-level animation refs if provided
14
+ if (resetAnimationState) {
15
+ resetAnimationState();
16
+ }
17
+ let latestBuffer = "";
18
+ // 2. Prepare Messages
19
+ const userMessage = {
20
+ id: uuidv4(),
21
+ role: "user",
22
+ content: prompt
23
+ };
24
+ const assistantMessageId = uuidv4();
25
+ const assistantMessage = {
26
+ id: assistantMessageId,
27
+ role: "assistant", // "assistant" role triggers the markdown rendering in UI
28
+ content: "", // Starts empty, will be filled by animation
29
+ isStreaming: true // Mark as streaming until done
30
+ };
31
+ // 3. Update UI instantly with user message and empty assistant bubble
32
+ setMessages((prev) => [...prev, userMessage, assistantMessage]);
33
+ setInput("");
34
+ setIsStreaming(true);
35
+ // 4. Initialize animation state
36
+ charBufferRef.current = ""; // Direct synchronous reset
37
+ setDisplayedChars("");
38
+ setStreamingComplete(false);
39
+ setAnimatingMessageId(assistantMessageId); // Triggers the animation loop in the component
40
+ // 5. Setup AbortController for cancellation
41
+ const controller = new AbortController();
42
+ controllerRef.current = controller;
43
+ // Track job finished state (accessible in finally block)
44
+ const jobFinishedRef = { current: false };
45
+ try {
46
+ const API = getAPI();
47
+ const apiBase = API.defaults.baseURL || "";
48
+ console.log("Starting stream to API:", `${apiBase}/chat/stream`);
49
+ console.log("Sending prompt:", prompt);
50
+ const createJobResponse = await _sendMessage(prompt, conversationIdRef.current);
51
+ const createJobData = createJobResponse?.data;
52
+ console.log('----------------------', createJobResponse);
53
+ const response = await _connectWithStreaming(createJobData.job_id, controller.signal);
54
+ if (!response.ok || !response.body || typeof response.body.getReader !== "function") {
55
+ throw new Error("Network error");
56
+ }
57
+ const reader = response.body.getReader();
58
+ const decoder = new TextDecoder("utf-8");
59
+ const responseBody = response.body; // Store for cancellation
60
+ let buffer = "";
61
+ let completeText = ""; // Local source of truth for the accumulation
62
+ let doneReading = false;
63
+ let lastEventId = null; // Track Last-Event-ID for reconnection support
64
+ let jobFinished = false; // Flag to break out of reading loop when job completes/fails
65
+ // Helper to close the connection
66
+ const closeConnection = async () => {
67
+ try {
68
+ // Cancel the response body stream to close the connection
69
+ if (responseBody && typeof responseBody.cancel === 'function') {
70
+ await responseBody.cancel();
71
+ console.log("✅ SSE connection cancelled");
72
+ }
73
+ // Release the reader lock
74
+ if (reader) {
75
+ reader.releaseLock();
76
+ console.log("✅ SSE reader released");
77
+ }
78
+ }
79
+ catch (err) {
80
+ console.warn("Error closing SSE connection:", err);
81
+ // Still try to release the reader lock
82
+ try {
83
+ if (reader) {
84
+ reader.releaseLock();
85
+ }
86
+ }
87
+ catch (releaseErr) {
88
+ // Ignore release errors
89
+ }
90
+ }
91
+ };
92
+ // Track tool calls during streaming
93
+ const toolCallsMap = new Map();
94
+ /**
95
+ * Appends a delta chunk to the local buffer and updates the shared state.
96
+ */
97
+ const applyDelta = (deltaText) => {
98
+ // Accumulate locally
99
+ completeText += deltaText;
100
+ // Update state directly from local source
101
+ // NOTE: We check aborted signal to prevent updating state after user cancelled
102
+ if (!controller.signal.aborted) {
103
+ charBufferRef.current = completeText; // Direct synchronous update to ref
104
+ latestBuffer = completeText; // Keep track for finally block
105
+ }
106
+ };
107
+ /**
108
+ * Processes SSE events in the new format:
109
+ * id: {seq}
110
+ * event: {event_type}
111
+ * data: {json}
112
+ */
113
+ const processSSEEvent = (eventId, eventType, dataStr) => {
114
+ if (!dataStr || dataStr.trim() === "")
115
+ return;
116
+ // Track Last-Event-ID
117
+ if (eventId) {
118
+ const seq = parseInt(eventId, 10);
119
+ if (!isNaN(seq)) {
120
+ lastEventId = seq;
121
+ }
122
+ }
123
+ let payload;
124
+ try {
125
+ payload = JSON.parse(dataStr);
126
+ }
127
+ catch {
128
+ console.warn("Failed to parse SSE data:", dataStr);
129
+ return;
130
+ }
131
+ console.log(`📨 SSE Event: id=${eventId}, event=${eventType}`, payload);
132
+ // Handle different event types from backend
133
+ if (eventType === "agent.delta") {
134
+ // Backend format: payload = {"text": "..."}
135
+ const deltaText = payload.text || "";
136
+ if (deltaText) {
137
+ applyDelta(deltaText);
138
+ }
139
+ }
140
+ else if (eventType === "agent.message") {
141
+ // Backend format: payload = {"role": "assistant", "content": "..."}
142
+ // This is the complete message - use it if we don't have deltas
143
+ const content = payload.content || "";
144
+ if (content && !completeText) {
145
+ // If we haven't received deltas, use the complete message
146
+ completeText = content;
147
+ if (!controller.signal.aborted) {
148
+ charBufferRef.current = completeText;
149
+ latestBuffer = completeText;
150
+ }
151
+ }
152
+ }
153
+ else if (eventType === "tool.requested") {
154
+ // Backend format: payload = {"name": "...", "arguments": {...}, "call_id": "..."}
155
+ const toolName = payload.name || "tool";
156
+ const callId = payload.call_id || uuidv4();
157
+ const statusMsg = `Using ${toolName}...`;
158
+ // Track this tool call
159
+ toolCallsMap.set(callId, {
160
+ tool: toolName,
161
+ call_id: callId,
162
+ status: "executing",
163
+ data: undefined
164
+ });
165
+ // Update message with status and pending tool call
166
+ setMessages(prev => prev.map(m => {
167
+ if (m.id === assistantMessageId) {
168
+ const pendingToolCalls = Array.from(toolCallsMap.values())
169
+ .filter(tc => !tc.data) // Only pending (not completed)
170
+ .map(tc => ({
171
+ tool: tc.tool,
172
+ status: tc.status,
173
+ data: tc.data
174
+ }));
175
+ return {
176
+ ...m,
177
+ status: statusMsg,
178
+ pendingToolCalls: pendingToolCalls.length > 0 ? pendingToolCalls : undefined
179
+ };
180
+ }
181
+ return m;
182
+ }));
183
+ }
184
+ else if (eventType === "tool.completed") {
185
+ // Backend format: payload = {"call_id": "...", "result": {...}, "tool_name": "..."}
186
+ const callId = payload.call_id;
187
+ const toolResult = payload.result || {};
188
+ const toolName = payload.tool_name || null;
189
+ if (callId && toolCallsMap.has(callId)) {
190
+ // Update existing tool call with result
191
+ const toolCall = toolCallsMap.get(callId);
192
+ toolCall.status = "completed";
193
+ toolCall.data = toolResult;
194
+ // Update tool name if provided
195
+ if (toolName) {
196
+ toolCall.tool = toolName;
197
+ }
198
+ toolCallsMap.set(callId, toolCall);
199
+ }
200
+ else if (callId) {
201
+ // Tool call not tracked (tool.requested was missed or async tool)
202
+ // Use tool_name from payload, or infer from result structure
203
+ let finalToolName = toolName || "unknown";
204
+ if (!toolName && toolResult && typeof toolResult === 'object') {
205
+ // Infer tool name from result structure as fallback
206
+ if (toolResult.title || toolResult.items) {
207
+ finalToolName = "generate_checklist";
208
+ }
209
+ else if (toolResult.translated_text) {
210
+ finalToolName = "translate_text";
211
+ }
212
+ }
213
+ toolCallsMap.set(callId, {
214
+ tool: finalToolName,
215
+ call_id: callId,
216
+ status: "completed",
217
+ data: toolResult
218
+ });
219
+ }
220
+ // Update message: clear status, update pending/completed tool calls
221
+ setMessages(prev => prev.map(m => {
222
+ if (m.id === assistantMessageId) {
223
+ const pendingToolCalls = Array.from(toolCallsMap.values())
224
+ .filter(tc => !tc.data) // Only pending (not completed)
225
+ .map(tc => ({
226
+ tool: tc.tool,
227
+ status: tc.status,
228
+ data: tc.data
229
+ }));
230
+ const completedToolCalls = Array.from(toolCallsMap.values())
231
+ .filter(tc => tc.data) // Only completed (has data)
232
+ .map(tc => ({
233
+ tool: tc.tool,
234
+ status: tc.status,
235
+ data: tc.data
236
+ }));
237
+ console.log("🔧 tool.completed event - updating message:", {
238
+ callId,
239
+ toolName,
240
+ toolResult,
241
+ completedToolCallsCount: completedToolCalls.length,
242
+ completedToolCalls,
243
+ toolCallsMapSize: toolCallsMap.size,
244
+ toolCallsMapEntries: Array.from(toolCallsMap.entries()),
245
+ currentAnimationComplete: m.animationComplete,
246
+ animatingMessageId
247
+ });
248
+ // Don't set animationComplete here - it should only be set when animation actually finishes
249
+ // The useEffect watching animatingMessageId will set it when animation completes
250
+ return {
251
+ ...m,
252
+ status: pendingToolCalls.length > 0 ? `Using ${pendingToolCalls[0].tool}...` : undefined,
253
+ pendingToolCalls: pendingToolCalls.length > 0 ? pendingToolCalls : undefined,
254
+ toolCalls: completedToolCalls.length > 0 ? completedToolCalls : (m.toolCalls || undefined) // Preserve existing toolCalls if no new ones
255
+ // animationComplete is only set by the useEffect when animatingMessageId becomes null
256
+ };
257
+ }
258
+ return m;
259
+ }));
260
+ }
261
+ else if (eventType === "job.paused") {
262
+ // Backend format: payload = {"reason": "..."}
263
+ const reason = payload.reason || "Paused for tool execution";
264
+ setMessages(prev => prev.map(m => {
265
+ if (m.id === assistantMessageId) {
266
+ return { ...m, status: reason };
267
+ }
268
+ return m;
269
+ }));
270
+ }
271
+ else if (eventType === "job.resumed") {
272
+ // Backend format: payload = {"reason": "..."}
273
+ const reason = payload.reason || "Resuming...";
274
+ setMessages(prev => prev.map(m => {
275
+ if (m.id === assistantMessageId) {
276
+ // Clear status or show resuming message briefly
277
+ return { ...m, status: undefined };
278
+ }
279
+ return m;
280
+ }));
281
+ }
282
+ else if (eventType === "job.completed") {
283
+ console.log("✅ Job completed. Total content:", completeText);
284
+ // Mark job as finished - will break out of reading loop
285
+ jobFinished = true;
286
+ jobFinishedRef.current = true;
287
+ // Mark message as no longer streaming
288
+ // Move all pending tool calls to completed tool calls
289
+ // Set animationComplete if we have tool calls and message is not currently animating
290
+ setMessages(prev => prev.map(m => {
291
+ if (m.id === assistantMessageId) {
292
+ const allToolCalls = Array.from(toolCallsMap.values())
293
+ .filter(tc => tc.data) // Only completed tool calls
294
+ .map(tc => ({
295
+ tool: tc.tool,
296
+ status: tc.status,
297
+ data: tc.data
298
+ }));
299
+ console.log("✅ job.completed - updating message with toolCalls:", {
300
+ allToolCallsCount: allToolCalls.length,
301
+ allToolCalls,
302
+ existingToolCalls: m.toolCalls,
303
+ toolCallsMapSize: toolCallsMap.size,
304
+ toolCallsMapEntries: Array.from(toolCallsMap.entries()),
305
+ currentAnimationComplete: m.animationComplete,
306
+ animatingMessageId
307
+ });
308
+ // Don't set animationComplete here - it should only be set when animation actually finishes
309
+ // The useEffect watching animatingMessageId will set it when animation completes
310
+ const finalToolCalls = allToolCalls.length > 0 ? allToolCalls : (m.toolCalls || undefined);
311
+ return {
312
+ ...m,
313
+ isStreaming: false,
314
+ status: undefined, // Clear any status
315
+ toolCalls: finalToolCalls,
316
+ pendingToolCalls: undefined // Clear pending
317
+ // animationComplete is only set by the useEffect when animatingMessageId becomes null
318
+ };
319
+ }
320
+ return m;
321
+ }));
322
+ // Set streaming state to false to hide stop button
323
+ setIsStreaming(false);
324
+ setStreamingComplete(true);
325
+ }
326
+ else if (eventType === "job.failed") {
327
+ console.error("❌ Job failed:", payload);
328
+ // Mark job as finished - will break out of reading loop
329
+ jobFinished = true;
330
+ jobFinishedRef.current = true;
331
+ const errorMsg = payload.error?.message || "Job failed";
332
+ setMessages(prev => prev.map(m => {
333
+ if (m.id === assistantMessageId) {
334
+ return { ...m, content: completeText || errorMsg, isStreaming: false };
335
+ }
336
+ return m;
337
+ }));
338
+ setIsStreaming(false);
339
+ setStreamingComplete(true);
340
+ }
341
+ else if (eventType === "job.started") {
342
+ console.log("🚀 Job started");
343
+ }
344
+ else {
345
+ // Unknown event type - log for debugging
346
+ console.log(`⚠️ Unknown event type: ${eventType}`, payload);
347
+ }
348
+ };
349
+ /**
350
+ * Parses SSE format and processes events.
351
+ * SSE format:
352
+ * id: {seq}
353
+ * event: {event_type}
354
+ * data: {json}
355
+ *
356
+ * (empty line separates events)
357
+ */
358
+ const parseSSE = (text) => {
359
+ const lines = text.split("\n");
360
+ let currentEvent = {
361
+ id: null,
362
+ event: null,
363
+ data: []
364
+ };
365
+ for (const line of lines) {
366
+ const trimmed = line.trim();
367
+ if (!trimmed) {
368
+ // Empty line = end of event, process it
369
+ if (currentEvent.data.length > 0) {
370
+ processSSEEvent(currentEvent.id, currentEvent.event, currentEvent.data.join("\n"));
371
+ }
372
+ // Reset for next event
373
+ currentEvent = { id: null, event: null, data: [] };
374
+ continue;
375
+ }
376
+ // Parse SSE fields
377
+ if (trimmed.startsWith("id:")) {
378
+ currentEvent.id = trimmed.slice(3).trim();
379
+ }
380
+ else if (trimmed.startsWith("event:")) {
381
+ currentEvent.event = trimmed.slice(6).trim();
382
+ }
383
+ else if (trimmed.startsWith("data:")) {
384
+ currentEvent.data.push(trimmed.slice(5).trim());
385
+ }
386
+ else if (trimmed.startsWith(":")) {
387
+ // Comment/control line (e.g., ": connected", ": ping")
388
+ if (trimmed.includes("connected")) {
389
+ console.log("✅ SSE connection established");
390
+ }
391
+ else if (trimmed.includes("ping")) {
392
+ // Heartbeat - no action needed
393
+ }
394
+ }
395
+ }
396
+ // Process any remaining event in buffer
397
+ if (currentEvent.data.length > 0) {
398
+ processSSEEvent(currentEvent.id, currentEvent.event, currentEvent.data.join("\n"));
399
+ }
400
+ };
401
+ // 6. Stream Reading Loop
402
+ while (!doneReading && !jobFinished) {
403
+ const { done, value } = await reader.read();
404
+ doneReading = done;
405
+ const chunk = decoder.decode(value || new Uint8Array(), { stream: !done });
406
+ buffer += chunk;
407
+ // Process complete SSE events (separated by double newlines)
408
+ // But also handle single newlines for line-by-line processing
409
+ let doubleNewlineIndex = buffer.indexOf("\n\n");
410
+ while (doubleNewlineIndex !== -1 && !jobFinished) {
411
+ const eventText = buffer.slice(0, doubleNewlineIndex);
412
+ parseSSE(eventText);
413
+ buffer = buffer.slice(doubleNewlineIndex + 2);
414
+ doubleNewlineIndex = buffer.indexOf("\n\n");
415
+ }
416
+ // Also handle single newlines for partial events
417
+ if (done && buffer.trim() && !jobFinished) {
418
+ parseSSE(buffer);
419
+ buffer = "";
420
+ }
421
+ // Break out of loop if job finished (job.completed or job.failed received)
422
+ if (jobFinished) {
423
+ console.log("🛑 Job finished, closing SSE connection");
424
+ await closeConnection();
425
+ break;
426
+ }
427
+ }
428
+ // If loop ended normally (doneReading), still close the connection
429
+ if (!jobFinished) {
430
+ await closeConnection();
431
+ }
432
+ }
433
+ catch (err) {
434
+ if (controller.signal.aborted) {
435
+ console.log("Stream aborted by user");
436
+ }
437
+ else {
438
+ console.error("Streaming error:", err);
439
+ }
440
+ }
441
+ finally {
442
+ // 7. Cleanup
443
+ if (!controller.signal.aborted) {
444
+ // Only update if not aborted to avoid overwriting state
445
+ charBufferRef.current = latestBuffer;
446
+ setIsStreaming(false);
447
+ setStreamingComplete(true); // Signals animation loop to finish up
448
+ // Don't set animationComplete here - it should only be set when animation actually finishes
449
+ // The useEffect watching animatingMessageId will set it when animation completes
450
+ }
451
+ if (controllerRef.current === controller) {
452
+ controllerRef.current = null;
453
+ }
454
+ }
455
+ };
456
+ /**
457
+ * Stops the active stream explicitly.
458
+ * Used when the user clicks the "Stop" button.
459
+ */
460
+ export const stopStreaming = ({ controllerRef, setIsStreaming, animatingMessageId, charBufferRef, setMessages, setAnimatingMessageId, setDisplayedChars, setStreamingComplete }) => {
461
+ if (controllerRef.current) {
462
+ controllerRef.current.abort();
463
+ controllerRef.current = null;
464
+ }
465
+ setIsStreaming(false);
466
+ const finalContent = charBufferRef.current;
467
+ // Force-complete the animation: show all buffered content immediately
468
+ if (animatingMessageId) {
469
+ setMessages((msgs) => {
470
+ return msgs.map((m) => {
471
+ if (m.id === animatingMessageId) {
472
+ return { ...m, content: finalContent };
473
+ }
474
+ return m;
475
+ });
476
+ });
477
+ setAnimatingMessageId(null);
478
+ setDisplayedChars(finalContent);
479
+ // Explicitly clear ref
480
+ charBufferRef.current = "";
481
+ setStreamingComplete(false);
482
+ }
483
+ };
484
+ //# sourceMappingURL=index.functions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.functions.js","sourceRoot":"","sources":["../../../views/fullscreen/index.functions.ts"],"names":[],"mappings":"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"}