@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 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((msg) => {
366
- const parts = msg.content || [];
367
- const text = parts.map((c) => c.type === "output_text" ? c.text : "").join("") || "";
368
- const chartParts = parts.filter((c) => c.type === "output_chart");
369
- return (0, import_react2.createElement)(
370
- "div",
371
- { key: msg.id },
372
- (0, import_react2.createElement)(MessageBubble, {
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((msg) => {
345
- const parts = msg.content || [];
346
- const text = parts.map((c) => c.type === "output_text" ? c.text : "").join("") || "";
347
- const chartParts = parts.filter((c) => c.type === "output_chart");
348
- return createElement2(
349
- "div",
350
- { key: msg.id },
351
- createElement2(MessageBubble, {
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
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@journeyrewards/hive-vercel",
3
- "version": "1.1.0",
3
+ "version": "1.2.0",
4
4
  "description": "Vercel/Next.js SDK for Journey Hive Agent Orchestration",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",