@journeyrewards/hive-vercel 1.1.0 → 1.2.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.
- package/dist/index.d.mts +59 -2
- package/dist/index.d.ts +59 -2
- package/dist/index.js +142 -28
- package/dist/index.mjs +137 -28
- package/package.json +1 -1
package/dist/index.d.mts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as react from 'react';
|
|
2
2
|
import { ReactNode } from 'react';
|
|
3
|
-
import { JourneyHiveConfig, CreateResponseParams, Response, Conversation, Message, Agent } from '@journeyrewards/hive-sdk';
|
|
3
|
+
import { JourneyHiveConfig, CreateResponseParams, Response, Conversation, Message, ListResponse, UpdateConversationParams, Agent, ContentPart } from '@journeyrewards/hive-sdk';
|
|
4
4
|
|
|
5
5
|
interface JourneyHiveClient {
|
|
6
6
|
config: JourneyHiveConfig;
|
|
@@ -15,6 +15,13 @@ interface JourneyHiveClient {
|
|
|
15
15
|
messages(id: string): Promise<{
|
|
16
16
|
data: Message[];
|
|
17
17
|
}>;
|
|
18
|
+
list(params?: {
|
|
19
|
+
agent_id?: string;
|
|
20
|
+
status?: string;
|
|
21
|
+
limit?: number;
|
|
22
|
+
cursor?: string;
|
|
23
|
+
}): Promise<ListResponse<Conversation>>;
|
|
24
|
+
update(id: string, params: UpdateConversationParams): Promise<Conversation>;
|
|
18
25
|
};
|
|
19
26
|
agents: {
|
|
20
27
|
get(id: string): Promise<Agent>;
|
|
@@ -61,6 +68,22 @@ interface UseAgentsReturn {
|
|
|
61
68
|
error: Error | null;
|
|
62
69
|
}
|
|
63
70
|
declare function useAgents(): UseAgentsReturn;
|
|
71
|
+
interface UseConversationsReturn {
|
|
72
|
+
conversations: Conversation[];
|
|
73
|
+
isLoading: boolean;
|
|
74
|
+
error: Error | null;
|
|
75
|
+
refetch: () => void;
|
|
76
|
+
}
|
|
77
|
+
declare function useConversations(agentId: string): UseConversationsReturn;
|
|
78
|
+
interface UseConversationActionsReturn {
|
|
79
|
+
star: (id: string, starred: boolean) => Promise<Conversation>;
|
|
80
|
+
rename: (id: string, title: string) => Promise<Conversation>;
|
|
81
|
+
update: (id: string, params: UpdateConversationParams) => Promise<Conversation>;
|
|
82
|
+
isUpdating: boolean;
|
|
83
|
+
error: Error | null;
|
|
84
|
+
}
|
|
85
|
+
declare function useConversationActions(): UseConversationActionsReturn;
|
|
86
|
+
declare function useChartUrl(chartId: string): string;
|
|
64
87
|
|
|
65
88
|
interface ResponseStreamProps {
|
|
66
89
|
agentId: string;
|
|
@@ -85,6 +108,40 @@ declare function MessageBubble({ role, content, timestamp }: MessageBubbleProps)
|
|
|
85
108
|
marginBottom: string;
|
|
86
109
|
};
|
|
87
110
|
}, HTMLElement>;
|
|
111
|
+
interface ChartEmbedProps {
|
|
112
|
+
embedUrl?: string;
|
|
113
|
+
imageUrl?: string;
|
|
114
|
+
title?: string;
|
|
115
|
+
chartId?: string;
|
|
116
|
+
width?: string;
|
|
117
|
+
height?: string;
|
|
118
|
+
className?: string;
|
|
119
|
+
}
|
|
120
|
+
declare function ChartEmbed({ embedUrl, imageUrl, title, chartId, width, height, className }: ChartEmbedProps): react.DetailedReactHTMLElement<{
|
|
121
|
+
className: string;
|
|
122
|
+
style: {
|
|
123
|
+
margin: string;
|
|
124
|
+
borderRadius: string;
|
|
125
|
+
overflow: string;
|
|
126
|
+
border: string;
|
|
127
|
+
maxWidth: string;
|
|
128
|
+
};
|
|
129
|
+
}, HTMLElement> | null;
|
|
130
|
+
interface RichMessageProps {
|
|
131
|
+
role: string;
|
|
132
|
+
content: ContentPart[];
|
|
133
|
+
timestamp?: number;
|
|
134
|
+
className?: string;
|
|
135
|
+
}
|
|
136
|
+
declare function RichMessage({ role, content, timestamp, className }: RichMessageProps): react.DetailedReactHTMLElement<{
|
|
137
|
+
className: string;
|
|
138
|
+
style: {
|
|
139
|
+
display: "flex";
|
|
140
|
+
flexDirection: "column";
|
|
141
|
+
alignItems: "flex-end" | "flex-start";
|
|
142
|
+
marginBottom: string;
|
|
143
|
+
};
|
|
144
|
+
}, HTMLElement>;
|
|
88
145
|
interface ConversationViewProps {
|
|
89
146
|
conversationId: string;
|
|
90
147
|
agentId?: string;
|
|
@@ -111,4 +168,4 @@ declare function AgentStatus({ agent }: AgentStatusProps): react.DetailedReactHT
|
|
|
111
168
|
};
|
|
112
169
|
}, HTMLElement>;
|
|
113
170
|
|
|
114
|
-
export { AgentStatus, ConversationView, JourneyHiveProvider, MessageBubble, ResponseStream, useAgent, useAgents, useConversation, useJourneyHive, useResponse };
|
|
171
|
+
export { AgentStatus, ChartEmbed, ConversationView, JourneyHiveProvider, MessageBubble, ResponseStream, RichMessage, useAgent, useAgents, useChartUrl, useConversation, useConversationActions, useConversations, useJourneyHive, useResponse };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as react from 'react';
|
|
2
2
|
import { ReactNode } from 'react';
|
|
3
|
-
import { JourneyHiveConfig, CreateResponseParams, Response, Conversation, Message, Agent } from '@journeyrewards/hive-sdk';
|
|
3
|
+
import { JourneyHiveConfig, CreateResponseParams, Response, Conversation, Message, ListResponse, UpdateConversationParams, Agent, ContentPart } from '@journeyrewards/hive-sdk';
|
|
4
4
|
|
|
5
5
|
interface JourneyHiveClient {
|
|
6
6
|
config: JourneyHiveConfig;
|
|
@@ -15,6 +15,13 @@ interface JourneyHiveClient {
|
|
|
15
15
|
messages(id: string): Promise<{
|
|
16
16
|
data: Message[];
|
|
17
17
|
}>;
|
|
18
|
+
list(params?: {
|
|
19
|
+
agent_id?: string;
|
|
20
|
+
status?: string;
|
|
21
|
+
limit?: number;
|
|
22
|
+
cursor?: string;
|
|
23
|
+
}): Promise<ListResponse<Conversation>>;
|
|
24
|
+
update(id: string, params: UpdateConversationParams): Promise<Conversation>;
|
|
18
25
|
};
|
|
19
26
|
agents: {
|
|
20
27
|
get(id: string): Promise<Agent>;
|
|
@@ -61,6 +68,22 @@ interface UseAgentsReturn {
|
|
|
61
68
|
error: Error | null;
|
|
62
69
|
}
|
|
63
70
|
declare function useAgents(): UseAgentsReturn;
|
|
71
|
+
interface UseConversationsReturn {
|
|
72
|
+
conversations: Conversation[];
|
|
73
|
+
isLoading: boolean;
|
|
74
|
+
error: Error | null;
|
|
75
|
+
refetch: () => void;
|
|
76
|
+
}
|
|
77
|
+
declare function useConversations(agentId: string): UseConversationsReturn;
|
|
78
|
+
interface UseConversationActionsReturn {
|
|
79
|
+
star: (id: string, starred: boolean) => Promise<Conversation>;
|
|
80
|
+
rename: (id: string, title: string) => Promise<Conversation>;
|
|
81
|
+
update: (id: string, params: UpdateConversationParams) => Promise<Conversation>;
|
|
82
|
+
isUpdating: boolean;
|
|
83
|
+
error: Error | null;
|
|
84
|
+
}
|
|
85
|
+
declare function useConversationActions(): UseConversationActionsReturn;
|
|
86
|
+
declare function useChartUrl(chartId: string): string;
|
|
64
87
|
|
|
65
88
|
interface ResponseStreamProps {
|
|
66
89
|
agentId: string;
|
|
@@ -85,6 +108,40 @@ declare function MessageBubble({ role, content, timestamp }: MessageBubbleProps)
|
|
|
85
108
|
marginBottom: string;
|
|
86
109
|
};
|
|
87
110
|
}, HTMLElement>;
|
|
111
|
+
interface ChartEmbedProps {
|
|
112
|
+
embedUrl?: string;
|
|
113
|
+
imageUrl?: string;
|
|
114
|
+
title?: string;
|
|
115
|
+
chartId?: string;
|
|
116
|
+
width?: string;
|
|
117
|
+
height?: string;
|
|
118
|
+
className?: string;
|
|
119
|
+
}
|
|
120
|
+
declare function ChartEmbed({ embedUrl, imageUrl, title, chartId, width, height, className }: ChartEmbedProps): react.DetailedReactHTMLElement<{
|
|
121
|
+
className: string;
|
|
122
|
+
style: {
|
|
123
|
+
margin: string;
|
|
124
|
+
borderRadius: string;
|
|
125
|
+
overflow: string;
|
|
126
|
+
border: string;
|
|
127
|
+
maxWidth: string;
|
|
128
|
+
};
|
|
129
|
+
}, HTMLElement> | null;
|
|
130
|
+
interface RichMessageProps {
|
|
131
|
+
role: string;
|
|
132
|
+
content: ContentPart[];
|
|
133
|
+
timestamp?: number;
|
|
134
|
+
className?: string;
|
|
135
|
+
}
|
|
136
|
+
declare function RichMessage({ role, content, timestamp, className }: RichMessageProps): react.DetailedReactHTMLElement<{
|
|
137
|
+
className: string;
|
|
138
|
+
style: {
|
|
139
|
+
display: "flex";
|
|
140
|
+
flexDirection: "column";
|
|
141
|
+
alignItems: "flex-end" | "flex-start";
|
|
142
|
+
marginBottom: string;
|
|
143
|
+
};
|
|
144
|
+
}, HTMLElement>;
|
|
88
145
|
interface ConversationViewProps {
|
|
89
146
|
conversationId: string;
|
|
90
147
|
agentId?: string;
|
|
@@ -111,4 +168,4 @@ declare function AgentStatus({ agent }: AgentStatusProps): react.DetailedReactHT
|
|
|
111
168
|
};
|
|
112
169
|
}, HTMLElement>;
|
|
113
170
|
|
|
114
|
-
export { AgentStatus, ConversationView, JourneyHiveProvider, MessageBubble, ResponseStream, useAgent, useAgents, useConversation, useJourneyHive, useResponse };
|
|
171
|
+
export { AgentStatus, ChartEmbed, ConversationView, JourneyHiveProvider, MessageBubble, ResponseStream, RichMessage, useAgent, useAgents, useChartUrl, useConversation, useConversationActions, useConversations, useJourneyHive, useResponse };
|
package/dist/index.js
CHANGED
|
@@ -21,13 +21,18 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
21
21
|
var index_exports = {};
|
|
22
22
|
__export(index_exports, {
|
|
23
23
|
AgentStatus: () => AgentStatus,
|
|
24
|
+
ChartEmbed: () => ChartEmbed,
|
|
24
25
|
ConversationView: () => ConversationView,
|
|
25
26
|
JourneyHiveProvider: () => JourneyHiveProvider,
|
|
26
27
|
MessageBubble: () => MessageBubble,
|
|
27
28
|
ResponseStream: () => ResponseStream,
|
|
29
|
+
RichMessage: () => RichMessage,
|
|
28
30
|
useAgent: () => useAgent,
|
|
29
31
|
useAgents: () => useAgents,
|
|
32
|
+
useChartUrl: () => useChartUrl,
|
|
30
33
|
useConversation: () => useConversation,
|
|
34
|
+
useConversationActions: () => useConversationActions,
|
|
35
|
+
useConversations: () => useConversations,
|
|
31
36
|
useJourneyHive: () => useJourneyHive,
|
|
32
37
|
useResponse: () => useResponse
|
|
33
38
|
});
|
|
@@ -100,7 +105,17 @@ function createClient(config) {
|
|
|
100
105
|
},
|
|
101
106
|
conversations: {
|
|
102
107
|
get: (id) => request("GET", `/v1/conversations/${id}`),
|
|
103
|
-
messages: (id) => request("GET", `/v1/conversations/${id}/messages`)
|
|
108
|
+
messages: (id) => request("GET", `/v1/conversations/${id}/messages`),
|
|
109
|
+
list: (params) => {
|
|
110
|
+
const searchParams = new URLSearchParams();
|
|
111
|
+
if (params?.agent_id) searchParams.set("agent_id", params.agent_id);
|
|
112
|
+
if (params?.status) searchParams.set("status", params.status);
|
|
113
|
+
if (params?.limit) searchParams.set("limit", String(params.limit));
|
|
114
|
+
if (params?.cursor) searchParams.set("cursor", params.cursor);
|
|
115
|
+
const query = searchParams.toString();
|
|
116
|
+
return request("GET", `/v1/conversations${query ? `?${query}` : ""}`);
|
|
117
|
+
},
|
|
118
|
+
update: (id, params) => request("PATCH", `/v1/conversations/${id}`, params)
|
|
104
119
|
},
|
|
105
120
|
agents: {
|
|
106
121
|
get: (id) => request("GET", `/v1/agents/${id}`),
|
|
@@ -262,6 +277,57 @@ function useAgents() {
|
|
|
262
277
|
}, [client]);
|
|
263
278
|
return { agents, isLoading, error };
|
|
264
279
|
}
|
|
280
|
+
function useConversations(agentId) {
|
|
281
|
+
const client = useJourneyHive();
|
|
282
|
+
const [conversations, setConversations] = (0, import_react.useState)([]);
|
|
283
|
+
const [isLoading, setIsLoading] = (0, import_react.useState)(true);
|
|
284
|
+
const [error, setError] = (0, import_react.useState)(null);
|
|
285
|
+
const fetchConversations = (0, import_react.useCallback)(() => {
|
|
286
|
+
if (!agentId) return;
|
|
287
|
+
setIsLoading(true);
|
|
288
|
+
client.conversations.list({ agent_id: agentId }).then((result) => setConversations(result.data)).catch((err) => setError(err instanceof Error ? err : new Error(String(err)))).finally(() => setIsLoading(false));
|
|
289
|
+
}, [agentId, client]);
|
|
290
|
+
(0, import_react.useEffect)(() => {
|
|
291
|
+
fetchConversations();
|
|
292
|
+
}, [fetchConversations]);
|
|
293
|
+
return { conversations, isLoading, error, refetch: fetchConversations };
|
|
294
|
+
}
|
|
295
|
+
function useConversationActions() {
|
|
296
|
+
const client = useJourneyHive();
|
|
297
|
+
const [isUpdating, setIsUpdating] = (0, import_react.useState)(false);
|
|
298
|
+
const [error, setError] = (0, import_react.useState)(null);
|
|
299
|
+
const update = (0, import_react.useCallback)(
|
|
300
|
+
async (id, params) => {
|
|
301
|
+
setIsUpdating(true);
|
|
302
|
+
setError(null);
|
|
303
|
+
try {
|
|
304
|
+
const result = await client.conversations.update(id, params);
|
|
305
|
+
return result;
|
|
306
|
+
} catch (err) {
|
|
307
|
+
const error2 = err instanceof Error ? err : new Error(String(err));
|
|
308
|
+
setError(error2);
|
|
309
|
+
throw error2;
|
|
310
|
+
} finally {
|
|
311
|
+
setIsUpdating(false);
|
|
312
|
+
}
|
|
313
|
+
},
|
|
314
|
+
[client]
|
|
315
|
+
);
|
|
316
|
+
const star = (0, import_react.useCallback)(
|
|
317
|
+
(id, starred) => update(id, { starred }),
|
|
318
|
+
[update]
|
|
319
|
+
);
|
|
320
|
+
const rename = (0, import_react.useCallback)(
|
|
321
|
+
(id, title) => update(id, { title }),
|
|
322
|
+
[update]
|
|
323
|
+
);
|
|
324
|
+
return { star, rename, update, isUpdating, error };
|
|
325
|
+
}
|
|
326
|
+
function useChartUrl(chartId) {
|
|
327
|
+
const client = useJourneyHive();
|
|
328
|
+
const baseUrl = client.config.baseUrl || "https://journey-hive.replit.app";
|
|
329
|
+
return `${baseUrl}/charts/${chartId}.png`;
|
|
330
|
+
}
|
|
265
331
|
|
|
266
332
|
// src/components.tsx
|
|
267
333
|
var import_react2 = require("react");
|
|
@@ -331,6 +397,68 @@ function MessageBubble({ role, content, timestamp }) {
|
|
|
331
397
|
) : null
|
|
332
398
|
);
|
|
333
399
|
}
|
|
400
|
+
function ChartEmbed({ embedUrl, imageUrl, title, chartId, width, height, className }) {
|
|
401
|
+
const containerStyle = {
|
|
402
|
+
margin: "8px 0 16px",
|
|
403
|
+
borderRadius: "12px",
|
|
404
|
+
overflow: "hidden",
|
|
405
|
+
border: "1px solid #e2e2ea",
|
|
406
|
+
maxWidth: width || "640px"
|
|
407
|
+
};
|
|
408
|
+
if (embedUrl) {
|
|
409
|
+
return (0, import_react2.createElement)(
|
|
410
|
+
"div",
|
|
411
|
+
{ className: `jh-chart-embed ${className || ""}`.trim(), style: containerStyle },
|
|
412
|
+
(0, import_react2.createElement)("iframe", {
|
|
413
|
+
src: embedUrl,
|
|
414
|
+
title: title || "Chart",
|
|
415
|
+
style: { width: "100%", height: height || "400px", border: "none" },
|
|
416
|
+
loading: "lazy"
|
|
417
|
+
})
|
|
418
|
+
);
|
|
419
|
+
}
|
|
420
|
+
if (imageUrl) {
|
|
421
|
+
return (0, import_react2.createElement)(
|
|
422
|
+
"div",
|
|
423
|
+
{ className: `jh-chart-embed ${className || ""}`.trim(), style: containerStyle },
|
|
424
|
+
(0, import_react2.createElement)("img", {
|
|
425
|
+
src: imageUrl,
|
|
426
|
+
alt: title || "Chart",
|
|
427
|
+
style: { width: "100%", height: "auto", display: "block" },
|
|
428
|
+
loading: "lazy"
|
|
429
|
+
})
|
|
430
|
+
);
|
|
431
|
+
}
|
|
432
|
+
return null;
|
|
433
|
+
}
|
|
434
|
+
function RichMessage({ role, content, timestamp, className }) {
|
|
435
|
+
const isUser = role === "user";
|
|
436
|
+
const textParts = content.filter((c) => c.type === "output_text");
|
|
437
|
+
const chartParts = content.filter((c) => c.type === "output_chart");
|
|
438
|
+
const text = textParts.map((c) => c.text).join("");
|
|
439
|
+
return (0, import_react2.createElement)(
|
|
440
|
+
"div",
|
|
441
|
+
{
|
|
442
|
+
className: `jh-rich-message ${className || ""}`.trim(),
|
|
443
|
+
style: {
|
|
444
|
+
display: "flex",
|
|
445
|
+
flexDirection: "column",
|
|
446
|
+
alignItems: isUser ? "flex-end" : "flex-start",
|
|
447
|
+
marginBottom: "8px"
|
|
448
|
+
}
|
|
449
|
+
},
|
|
450
|
+
text ? (0, import_react2.createElement)(MessageBubble, { role, content: text, timestamp }) : null,
|
|
451
|
+
...chartParts.map(
|
|
452
|
+
(chart) => (0, import_react2.createElement)(ChartEmbed, {
|
|
453
|
+
key: chart.chart_id,
|
|
454
|
+
embedUrl: chart.embed_url,
|
|
455
|
+
imageUrl: chart.image_url,
|
|
456
|
+
title: chart.title,
|
|
457
|
+
chartId: chart.chart_id
|
|
458
|
+
})
|
|
459
|
+
)
|
|
460
|
+
);
|
|
461
|
+
}
|
|
334
462
|
function ConversationView({ conversationId, agentId, className }) {
|
|
335
463
|
const { messages, isLoading, error, sendMessage } = useConversation(conversationId);
|
|
336
464
|
const [inputValue, setInputValue] = (0, import_react2.useState)("");
|
|
@@ -362,33 +490,14 @@ function ConversationView({ conversationId, agentId, className }) {
|
|
|
362
490
|
className: "jh-messages",
|
|
363
491
|
style: { flex: 1, overflowY: "auto", padding: "16px" }
|
|
364
492
|
},
|
|
365
|
-
isLoading ? (0, import_react2.createElement)("div", { className: "jh-loading" }, "Loading messages...") : messages.map(
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
key: `text-${msg.id}`,
|
|
374
|
-
role: msg.role,
|
|
375
|
-
content: text,
|
|
376
|
-
timestamp: msg.created_at
|
|
377
|
-
}),
|
|
378
|
-
...chartParts.map(
|
|
379
|
-
(chart) => (0, import_react2.createElement)("div", {
|
|
380
|
-
key: `chart-${chart.chart_id}`,
|
|
381
|
-
className: "jh-chart-embed",
|
|
382
|
-
style: { margin: "8px 0 16px", borderRadius: "12px", overflow: "hidden", border: "1px solid #e2e2ea", maxWidth: "640px" }
|
|
383
|
-
}, (0, import_react2.createElement)("iframe", {
|
|
384
|
-
src: chart.embed_url,
|
|
385
|
-
title: chart.title,
|
|
386
|
-
style: { width: "100%", height: "400px", border: "none" },
|
|
387
|
-
loading: "lazy"
|
|
388
|
-
}))
|
|
389
|
-
)
|
|
390
|
-
);
|
|
391
|
-
}),
|
|
493
|
+
isLoading ? (0, import_react2.createElement)("div", { className: "jh-loading" }, "Loading messages...") : messages.map(
|
|
494
|
+
(msg) => (0, import_react2.createElement)(RichMessage, {
|
|
495
|
+
key: msg.id,
|
|
496
|
+
role: msg.role,
|
|
497
|
+
content: msg.content || [],
|
|
498
|
+
timestamp: msg.created_at
|
|
499
|
+
})
|
|
500
|
+
),
|
|
392
501
|
(0, import_react2.createElement)("div", { ref: messagesEndRef })
|
|
393
502
|
),
|
|
394
503
|
(0, import_react2.createElement)(
|
|
@@ -457,13 +566,18 @@ function AgentStatus({ agent }) {
|
|
|
457
566
|
// Annotate the CommonJS export names for ESM import in node:
|
|
458
567
|
0 && (module.exports = {
|
|
459
568
|
AgentStatus,
|
|
569
|
+
ChartEmbed,
|
|
460
570
|
ConversationView,
|
|
461
571
|
JourneyHiveProvider,
|
|
462
572
|
MessageBubble,
|
|
463
573
|
ResponseStream,
|
|
574
|
+
RichMessage,
|
|
464
575
|
useAgent,
|
|
465
576
|
useAgents,
|
|
577
|
+
useChartUrl,
|
|
466
578
|
useConversation,
|
|
579
|
+
useConversationActions,
|
|
580
|
+
useConversations,
|
|
467
581
|
useJourneyHive,
|
|
468
582
|
useResponse
|
|
469
583
|
});
|
package/dist/index.mjs
CHANGED
|
@@ -73,7 +73,17 @@ function createClient(config) {
|
|
|
73
73
|
},
|
|
74
74
|
conversations: {
|
|
75
75
|
get: (id) => request("GET", `/v1/conversations/${id}`),
|
|
76
|
-
messages: (id) => request("GET", `/v1/conversations/${id}/messages`)
|
|
76
|
+
messages: (id) => request("GET", `/v1/conversations/${id}/messages`),
|
|
77
|
+
list: (params) => {
|
|
78
|
+
const searchParams = new URLSearchParams();
|
|
79
|
+
if (params?.agent_id) searchParams.set("agent_id", params.agent_id);
|
|
80
|
+
if (params?.status) searchParams.set("status", params.status);
|
|
81
|
+
if (params?.limit) searchParams.set("limit", String(params.limit));
|
|
82
|
+
if (params?.cursor) searchParams.set("cursor", params.cursor);
|
|
83
|
+
const query = searchParams.toString();
|
|
84
|
+
return request("GET", `/v1/conversations${query ? `?${query}` : ""}`);
|
|
85
|
+
},
|
|
86
|
+
update: (id, params) => request("PATCH", `/v1/conversations/${id}`, params)
|
|
77
87
|
},
|
|
78
88
|
agents: {
|
|
79
89
|
get: (id) => request("GET", `/v1/agents/${id}`),
|
|
@@ -235,6 +245,57 @@ function useAgents() {
|
|
|
235
245
|
}, [client]);
|
|
236
246
|
return { agents, isLoading, error };
|
|
237
247
|
}
|
|
248
|
+
function useConversations(agentId) {
|
|
249
|
+
const client = useJourneyHive();
|
|
250
|
+
const [conversations, setConversations] = useState([]);
|
|
251
|
+
const [isLoading, setIsLoading] = useState(true);
|
|
252
|
+
const [error, setError] = useState(null);
|
|
253
|
+
const fetchConversations = useCallback(() => {
|
|
254
|
+
if (!agentId) return;
|
|
255
|
+
setIsLoading(true);
|
|
256
|
+
client.conversations.list({ agent_id: agentId }).then((result) => setConversations(result.data)).catch((err) => setError(err instanceof Error ? err : new Error(String(err)))).finally(() => setIsLoading(false));
|
|
257
|
+
}, [agentId, client]);
|
|
258
|
+
useEffect(() => {
|
|
259
|
+
fetchConversations();
|
|
260
|
+
}, [fetchConversations]);
|
|
261
|
+
return { conversations, isLoading, error, refetch: fetchConversations };
|
|
262
|
+
}
|
|
263
|
+
function useConversationActions() {
|
|
264
|
+
const client = useJourneyHive();
|
|
265
|
+
const [isUpdating, setIsUpdating] = useState(false);
|
|
266
|
+
const [error, setError] = useState(null);
|
|
267
|
+
const update = useCallback(
|
|
268
|
+
async (id, params) => {
|
|
269
|
+
setIsUpdating(true);
|
|
270
|
+
setError(null);
|
|
271
|
+
try {
|
|
272
|
+
const result = await client.conversations.update(id, params);
|
|
273
|
+
return result;
|
|
274
|
+
} catch (err) {
|
|
275
|
+
const error2 = err instanceof Error ? err : new Error(String(err));
|
|
276
|
+
setError(error2);
|
|
277
|
+
throw error2;
|
|
278
|
+
} finally {
|
|
279
|
+
setIsUpdating(false);
|
|
280
|
+
}
|
|
281
|
+
},
|
|
282
|
+
[client]
|
|
283
|
+
);
|
|
284
|
+
const star = useCallback(
|
|
285
|
+
(id, starred) => update(id, { starred }),
|
|
286
|
+
[update]
|
|
287
|
+
);
|
|
288
|
+
const rename = useCallback(
|
|
289
|
+
(id, title) => update(id, { title }),
|
|
290
|
+
[update]
|
|
291
|
+
);
|
|
292
|
+
return { star, rename, update, isUpdating, error };
|
|
293
|
+
}
|
|
294
|
+
function useChartUrl(chartId) {
|
|
295
|
+
const client = useJourneyHive();
|
|
296
|
+
const baseUrl = client.config.baseUrl || "https://journey-hive.replit.app";
|
|
297
|
+
return `${baseUrl}/charts/${chartId}.png`;
|
|
298
|
+
}
|
|
238
299
|
|
|
239
300
|
// src/components.tsx
|
|
240
301
|
import {
|
|
@@ -310,6 +371,68 @@ function MessageBubble({ role, content, timestamp }) {
|
|
|
310
371
|
) : null
|
|
311
372
|
);
|
|
312
373
|
}
|
|
374
|
+
function ChartEmbed({ embedUrl, imageUrl, title, chartId, width, height, className }) {
|
|
375
|
+
const containerStyle = {
|
|
376
|
+
margin: "8px 0 16px",
|
|
377
|
+
borderRadius: "12px",
|
|
378
|
+
overflow: "hidden",
|
|
379
|
+
border: "1px solid #e2e2ea",
|
|
380
|
+
maxWidth: width || "640px"
|
|
381
|
+
};
|
|
382
|
+
if (embedUrl) {
|
|
383
|
+
return createElement2(
|
|
384
|
+
"div",
|
|
385
|
+
{ className: `jh-chart-embed ${className || ""}`.trim(), style: containerStyle },
|
|
386
|
+
createElement2("iframe", {
|
|
387
|
+
src: embedUrl,
|
|
388
|
+
title: title || "Chart",
|
|
389
|
+
style: { width: "100%", height: height || "400px", border: "none" },
|
|
390
|
+
loading: "lazy"
|
|
391
|
+
})
|
|
392
|
+
);
|
|
393
|
+
}
|
|
394
|
+
if (imageUrl) {
|
|
395
|
+
return createElement2(
|
|
396
|
+
"div",
|
|
397
|
+
{ className: `jh-chart-embed ${className || ""}`.trim(), style: containerStyle },
|
|
398
|
+
createElement2("img", {
|
|
399
|
+
src: imageUrl,
|
|
400
|
+
alt: title || "Chart",
|
|
401
|
+
style: { width: "100%", height: "auto", display: "block" },
|
|
402
|
+
loading: "lazy"
|
|
403
|
+
})
|
|
404
|
+
);
|
|
405
|
+
}
|
|
406
|
+
return null;
|
|
407
|
+
}
|
|
408
|
+
function RichMessage({ role, content, timestamp, className }) {
|
|
409
|
+
const isUser = role === "user";
|
|
410
|
+
const textParts = content.filter((c) => c.type === "output_text");
|
|
411
|
+
const chartParts = content.filter((c) => c.type === "output_chart");
|
|
412
|
+
const text = textParts.map((c) => c.text).join("");
|
|
413
|
+
return createElement2(
|
|
414
|
+
"div",
|
|
415
|
+
{
|
|
416
|
+
className: `jh-rich-message ${className || ""}`.trim(),
|
|
417
|
+
style: {
|
|
418
|
+
display: "flex",
|
|
419
|
+
flexDirection: "column",
|
|
420
|
+
alignItems: isUser ? "flex-end" : "flex-start",
|
|
421
|
+
marginBottom: "8px"
|
|
422
|
+
}
|
|
423
|
+
},
|
|
424
|
+
text ? createElement2(MessageBubble, { role, content: text, timestamp }) : null,
|
|
425
|
+
...chartParts.map(
|
|
426
|
+
(chart) => createElement2(ChartEmbed, {
|
|
427
|
+
key: chart.chart_id,
|
|
428
|
+
embedUrl: chart.embed_url,
|
|
429
|
+
imageUrl: chart.image_url,
|
|
430
|
+
title: chart.title,
|
|
431
|
+
chartId: chart.chart_id
|
|
432
|
+
})
|
|
433
|
+
)
|
|
434
|
+
);
|
|
435
|
+
}
|
|
313
436
|
function ConversationView({ conversationId, agentId, className }) {
|
|
314
437
|
const { messages, isLoading, error, sendMessage } = useConversation(conversationId);
|
|
315
438
|
const [inputValue, setInputValue] = useState2("");
|
|
@@ -341,33 +464,14 @@ function ConversationView({ conversationId, agentId, className }) {
|
|
|
341
464
|
className: "jh-messages",
|
|
342
465
|
style: { flex: 1, overflowY: "auto", padding: "16px" }
|
|
343
466
|
},
|
|
344
|
-
isLoading ? createElement2("div", { className: "jh-loading" }, "Loading messages...") : messages.map(
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
key: `text-${msg.id}`,
|
|
353
|
-
role: msg.role,
|
|
354
|
-
content: text,
|
|
355
|
-
timestamp: msg.created_at
|
|
356
|
-
}),
|
|
357
|
-
...chartParts.map(
|
|
358
|
-
(chart) => createElement2("div", {
|
|
359
|
-
key: `chart-${chart.chart_id}`,
|
|
360
|
-
className: "jh-chart-embed",
|
|
361
|
-
style: { margin: "8px 0 16px", borderRadius: "12px", overflow: "hidden", border: "1px solid #e2e2ea", maxWidth: "640px" }
|
|
362
|
-
}, createElement2("iframe", {
|
|
363
|
-
src: chart.embed_url,
|
|
364
|
-
title: chart.title,
|
|
365
|
-
style: { width: "100%", height: "400px", border: "none" },
|
|
366
|
-
loading: "lazy"
|
|
367
|
-
}))
|
|
368
|
-
)
|
|
369
|
-
);
|
|
370
|
-
}),
|
|
467
|
+
isLoading ? createElement2("div", { className: "jh-loading" }, "Loading messages...") : messages.map(
|
|
468
|
+
(msg) => createElement2(RichMessage, {
|
|
469
|
+
key: msg.id,
|
|
470
|
+
role: msg.role,
|
|
471
|
+
content: msg.content || [],
|
|
472
|
+
timestamp: msg.created_at
|
|
473
|
+
})
|
|
474
|
+
),
|
|
371
475
|
createElement2("div", { ref: messagesEndRef })
|
|
372
476
|
),
|
|
373
477
|
createElement2(
|
|
@@ -435,13 +539,18 @@ function AgentStatus({ agent }) {
|
|
|
435
539
|
}
|
|
436
540
|
export {
|
|
437
541
|
AgentStatus,
|
|
542
|
+
ChartEmbed,
|
|
438
543
|
ConversationView,
|
|
439
544
|
JourneyHiveProvider,
|
|
440
545
|
MessageBubble,
|
|
441
546
|
ResponseStream,
|
|
547
|
+
RichMessage,
|
|
442
548
|
useAgent,
|
|
443
549
|
useAgents,
|
|
550
|
+
useChartUrl,
|
|
444
551
|
useConversation,
|
|
552
|
+
useConversationActions,
|
|
553
|
+
useConversations,
|
|
445
554
|
useJourneyHive,
|
|
446
555
|
useResponse
|
|
447
556
|
};
|