@roj-ai/debug 0.1.3 → 0.1.4
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/components/debug/DebugContext.d.ts +1 -0
- package/dist/components/debug/DebugContext.d.ts.map +1 -0
- package/dist/components/debug/DebugContext.js +9 -0
- package/dist/components/debug/DebugContext.js.map +1 -0
- package/dist/components/debug/DebugNavigation.d.ts +1 -0
- package/dist/components/debug/DebugNavigation.d.ts.map +1 -0
- package/dist/components/debug/DebugNavigation.js +36 -0
- package/dist/components/debug/DebugNavigation.js.map +1 -0
- package/dist/components/debug/DebugShell.d.ts +1 -0
- package/dist/components/debug/DebugShell.d.ts.map +1 -0
- package/dist/components/debug/DebugShell.js +103 -0
- package/dist/components/debug/DebugShell.js.map +1 -0
- package/dist/components/debug/LLMCallDetail.d.ts +1 -0
- package/dist/components/debug/LLMCallDetail.d.ts.map +1 -0
- package/dist/components/debug/LLMCallDetail.js +204 -0
- package/dist/components/debug/LLMCallDetail.js.map +1 -0
- package/dist/components/debug/TimelineDetailInspector.d.ts +1 -0
- package/dist/components/debug/TimelineDetailInspector.d.ts.map +1 -0
- package/dist/components/debug/TimelineDetailInspector.js +48 -0
- package/dist/components/debug/TimelineDetailInspector.js.map +1 -0
- package/dist/components/debug/communication/CommunicationDiagram.d.ts +1 -0
- package/dist/components/debug/communication/CommunicationDiagram.d.ts.map +1 -0
- package/dist/components/debug/communication/CommunicationDiagram.js +67 -0
- package/dist/components/debug/communication/CommunicationDiagram.js.map +1 -0
- package/dist/components/debug/communication/DiagramHeader.d.ts +1 -0
- package/dist/components/debug/communication/DiagramHeader.d.ts.map +1 -0
- package/dist/components/debug/communication/DiagramHeader.js +44 -0
- package/dist/components/debug/communication/DiagramHeader.js.map +1 -0
- package/dist/components/debug/communication/ParticipantLane.d.ts +1 -0
- package/dist/components/debug/communication/ParticipantLane.d.ts.map +1 -0
- package/dist/components/debug/communication/ParticipantLane.js +10 -0
- package/dist/components/debug/communication/ParticipantLane.js.map +1 -0
- package/dist/components/debug/communication/TimeAxis.d.ts +1 -0
- package/dist/components/debug/communication/TimeAxis.d.ts.map +1 -0
- package/dist/components/debug/communication/TimeAxis.js +49 -0
- package/dist/components/debug/communication/TimeAxis.js.map +1 -0
- package/dist/components/debug/communication/elements/IdleGap.d.ts +1 -0
- package/dist/components/debug/communication/elements/IdleGap.d.ts.map +1 -0
- package/dist/components/debug/communication/elements/IdleGap.js +12 -0
- package/dist/components/debug/communication/elements/IdleGap.js.map +1 -0
- package/dist/components/debug/communication/elements/LLMBlock.d.ts +1 -0
- package/dist/components/debug/communication/elements/LLMBlock.d.ts.map +1 -0
- package/dist/components/debug/communication/elements/LLMBlock.js +30 -0
- package/dist/components/debug/communication/elements/LLMBlock.js.map +1 -0
- package/dist/components/debug/communication/elements/MessageArrow.d.ts +1 -0
- package/dist/components/debug/communication/elements/MessageArrow.d.ts.map +1 -0
- package/dist/components/debug/communication/elements/MessageArrow.js +34 -0
- package/dist/components/debug/communication/elements/MessageArrow.js.map +1 -0
- package/dist/components/debug/communication/elements/ToolBlock.d.ts +1 -0
- package/dist/components/debug/communication/elements/ToolBlock.d.ts.map +1 -0
- package/dist/components/debug/communication/elements/ToolBlock.js +27 -0
- package/dist/components/debug/communication/elements/ToolBlock.js.map +1 -0
- package/dist/components/debug/communication/hooks/useDiagramData.d.ts +1 -0
- package/dist/components/debug/communication/hooks/useDiagramData.d.ts.map +1 -0
- package/dist/components/debug/communication/hooks/useDiagramData.js +252 -0
- package/dist/components/debug/communication/hooks/useDiagramData.js.map +1 -0
- package/dist/components/debug/communication/hooks/useTimeCompression.d.ts +1 -0
- package/dist/components/debug/communication/hooks/useTimeCompression.d.ts.map +1 -0
- package/dist/components/debug/communication/hooks/useTimeCompression.js +109 -0
- package/dist/components/debug/communication/hooks/useTimeCompression.js.map +1 -0
- package/dist/components/debug/communication/hooks/useZoomPan.d.ts +1 -0
- package/dist/components/debug/communication/hooks/useZoomPan.d.ts.map +1 -0
- package/dist/components/debug/communication/hooks/useZoomPan.js +75 -0
- package/dist/components/debug/communication/hooks/useZoomPan.js.map +1 -0
- package/dist/components/debug/communication/popovers/ElementPopover.d.ts +1 -0
- package/dist/components/debug/communication/popovers/ElementPopover.d.ts.map +1 -0
- package/dist/components/debug/communication/popovers/ElementPopover.js +39 -0
- package/dist/components/debug/communication/popovers/ElementPopover.js.map +1 -0
- package/dist/components/debug/communication/types.d.ts +1 -0
- package/dist/components/debug/communication/types.d.ts.map +1 -0
- package/dist/components/debug/communication/types.js +52 -0
- package/dist/components/debug/communication/types.js.map +1 -0
- package/dist/components/debug/index.d.ts +1 -0
- package/dist/components/debug/index.d.ts.map +1 -0
- package/dist/components/debug/index.js +18 -0
- package/dist/components/debug/index.js.map +1 -0
- package/dist/components/debug/pages/AgentDetailPage.d.ts +1 -0
- package/dist/components/debug/pages/AgentDetailPage.d.ts.map +1 -0
- package/dist/components/debug/pages/AgentDetailPage.js +365 -0
- package/dist/components/debug/pages/AgentDetailPage.js.map +1 -0
- package/dist/components/debug/pages/AgentsPage.d.ts +1 -0
- package/dist/components/debug/pages/AgentsPage.d.ts.map +1 -0
- package/dist/components/debug/pages/AgentsPage.js +111 -0
- package/dist/components/debug/pages/AgentsPage.js.map +1 -0
- package/dist/components/debug/pages/CommunicationPage.d.ts +1 -0
- package/dist/components/debug/pages/CommunicationPage.d.ts.map +1 -0
- package/dist/components/debug/pages/CommunicationPage.js +19 -0
- package/dist/components/debug/pages/CommunicationPage.js.map +1 -0
- package/dist/components/debug/pages/DashboardPage.d.ts +1 -0
- package/dist/components/debug/pages/DashboardPage.d.ts.map +1 -0
- package/dist/components/debug/pages/DashboardPage.js +430 -0
- package/dist/components/debug/pages/DashboardPage.js.map +1 -0
- package/dist/components/debug/pages/EventsPage.d.ts +1 -0
- package/dist/components/debug/pages/EventsPage.d.ts.map +1 -0
- package/dist/components/debug/pages/EventsPage.js +137 -0
- package/dist/components/debug/pages/EventsPage.js.map +1 -0
- package/dist/components/debug/pages/FilesPage.d.ts +1 -0
- package/dist/components/debug/pages/FilesPage.d.ts.map +1 -0
- package/dist/components/debug/pages/FilesPage.js +187 -0
- package/dist/components/debug/pages/FilesPage.js.map +1 -0
- package/dist/components/debug/pages/LLMCallPage.d.ts +1 -0
- package/dist/components/debug/pages/LLMCallPage.d.ts.map +1 -0
- package/dist/components/debug/pages/LLMCallPage.js +12 -0
- package/dist/components/debug/pages/LLMCallPage.js.map +1 -0
- package/dist/components/debug/pages/LLMCallsPage.d.ts +1 -0
- package/dist/components/debug/pages/LLMCallsPage.d.ts.map +1 -0
- package/dist/components/debug/pages/LLMCallsPage.js +200 -0
- package/dist/components/debug/pages/LLMCallsPage.js.map +1 -0
- package/dist/components/debug/pages/LogsPage.d.ts +1 -0
- package/dist/components/debug/pages/LogsPage.d.ts.map +1 -0
- package/dist/components/debug/pages/LogsPage.js +107 -0
- package/dist/components/debug/pages/LogsPage.js.map +1 -0
- package/dist/components/debug/pages/MailboxPage.d.ts +1 -0
- package/dist/components/debug/pages/MailboxPage.d.ts.map +1 -0
- package/dist/components/debug/pages/MailboxPage.js +60 -0
- package/dist/components/debug/pages/MailboxPage.js.map +1 -0
- package/dist/components/debug/pages/ServicesPage.d.ts +1 -0
- package/dist/components/debug/pages/ServicesPage.d.ts.map +1 -0
- package/dist/components/debug/pages/ServicesPage.js +91 -0
- package/dist/components/debug/pages/ServicesPage.js.map +1 -0
- package/dist/components/debug/pages/TimelinePage.d.ts +1 -0
- package/dist/components/debug/pages/TimelinePage.d.ts.map +1 -0
- package/dist/components/debug/pages/TimelinePage.js +101 -0
- package/dist/components/debug/pages/TimelinePage.js.map +1 -0
- package/dist/components/debug/pages/UserChatPage.d.ts +1 -0
- package/dist/components/debug/pages/UserChatPage.d.ts.map +1 -0
- package/dist/components/debug/pages/UserChatPage.js +56 -0
- package/dist/components/debug/pages/UserChatPage.js.map +1 -0
- package/dist/components/debug/pages/index.d.ts +1 -0
- package/dist/components/debug/pages/index.d.ts.map +1 -0
- package/dist/components/debug/pages/index.js +14 -0
- package/dist/components/debug/pages/index.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/domain-utils.d.ts +1 -0
- package/dist/lib/domain-utils.d.ts.map +1 -0
- package/dist/lib/domain-utils.js +11 -0
- package/dist/lib/domain-utils.js.map +1 -0
- package/dist/providers/EventPollingProvider.d.ts +1 -0
- package/dist/providers/EventPollingProvider.d.ts.map +1 -0
- package/dist/providers/EventPollingProvider.js +49 -0
- package/dist/providers/EventPollingProvider.js.map +1 -0
- package/dist/stores/event-store.d.ts +1 -0
- package/dist/stores/event-store.d.ts.map +1 -0
- package/dist/stores/event-store.js +341 -0
- package/dist/stores/event-store.js.map +1 -0
- package/dist/utils/format.d.ts +1 -0
- package/dist/utils/format.d.ts.map +1 -0
- package/dist/utils/format.js +11 -0
- package/dist/utils/format.js.map +1 -0
- package/package.json +7 -7
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EventsPage.d.ts","sourceRoot":"","sources":["../../../../src/components/debug/pages/EventsPage.tsx"],"names":[],"mappings":"AA6BA,wBAAgB,UAAU,4CA2GzB"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useCallback, useMemo, useState } from 'react';
|
|
3
|
+
import { DebugLink, useDebugSessionId } from '../DebugNavigation';
|
|
4
|
+
import { api, unwrap } from '@roj-ai/client';
|
|
5
|
+
import { useEvents, useEventStore } from '../../../stores/event-store';
|
|
6
|
+
const EVENT_TYPES = [
|
|
7
|
+
'all',
|
|
8
|
+
'session_created',
|
|
9
|
+
'session_closed',
|
|
10
|
+
'agent_spawned',
|
|
11
|
+
'agent_state_changed',
|
|
12
|
+
'mailbox_message',
|
|
13
|
+
'mailbox_consumed',
|
|
14
|
+
'inference_started',
|
|
15
|
+
'inference_completed',
|
|
16
|
+
'inference_failed',
|
|
17
|
+
'tool_started',
|
|
18
|
+
'tool_completed',
|
|
19
|
+
'tool_failed',
|
|
20
|
+
'context_compacted',
|
|
21
|
+
'user_question_asked',
|
|
22
|
+
'user_message_sent',
|
|
23
|
+
'communicator_linked',
|
|
24
|
+
'session_restarted',
|
|
25
|
+
];
|
|
26
|
+
const PAGE_SIZE = 50;
|
|
27
|
+
export function EventsPage() {
|
|
28
|
+
const sessionId = useDebugSessionId();
|
|
29
|
+
// Get events from event store (already loaded by DebugLayout)
|
|
30
|
+
const allEvents = useEvents();
|
|
31
|
+
const isLoading = useEventStore((s) => s.isLoading);
|
|
32
|
+
const error = useEventStore((s) => s.error);
|
|
33
|
+
const [typeFilter, setTypeFilter] = useState('all');
|
|
34
|
+
const [offset, setOffset] = useState(0);
|
|
35
|
+
// Wrap events with original index for fork API
|
|
36
|
+
const indexedEvents = useMemo(() => allEvents.map((event, originalIndex) => ({ event, originalIndex })), [allEvents]);
|
|
37
|
+
// Filter events locally
|
|
38
|
+
const filteredEvents = useMemo(() => {
|
|
39
|
+
if (typeFilter === 'all')
|
|
40
|
+
return indexedEvents;
|
|
41
|
+
return indexedEvents.filter((e) => e.event.type === typeFilter);
|
|
42
|
+
}, [indexedEvents, typeFilter]);
|
|
43
|
+
// Apply pagination
|
|
44
|
+
const paginatedEvents = useMemo(() => {
|
|
45
|
+
return filteredEvents.slice(offset, offset + PAGE_SIZE);
|
|
46
|
+
}, [filteredEvents, offset]);
|
|
47
|
+
const handleFork = useCallback(async (eventIndex) => {
|
|
48
|
+
if (!sessionId)
|
|
49
|
+
return;
|
|
50
|
+
const result = unwrap(await api.call('sessions.fork', { sessionId, eventIndex }));
|
|
51
|
+
const newUrl = window.location.pathname.replace(sessionId, result.sessionId);
|
|
52
|
+
window.open(newUrl, '_blank');
|
|
53
|
+
}, [sessionId]);
|
|
54
|
+
const total = filteredEvents.length;
|
|
55
|
+
const totalPages = Math.ceil(total / PAGE_SIZE);
|
|
56
|
+
const currentPage = Math.floor(offset / PAGE_SIZE) + 1;
|
|
57
|
+
return (_jsxs("div", { className: "space-y-4", children: [_jsxs("div", { className: "flex items-center gap-4", children: [_jsxs("label", { className: "text-sm text-slate-600", children: ["Filter by type:", _jsx("select", { value: typeFilter, onChange: (e) => {
|
|
58
|
+
setTypeFilter(e.target.value);
|
|
59
|
+
setOffset(0); // Reset pagination when filter changes
|
|
60
|
+
}, className: "ml-2 border border-slate-300 rounded px-2 py-1 text-sm", children: EVENT_TYPES.map((type) => (_jsx("option", { value: type, children: type === 'all' ? 'All Events' : type }, type))) })] }), _jsxs("span", { className: "text-sm text-slate-500", children: [total, " events total"] })] }), error && _jsx("div", { className: "text-red-500 text-sm", children: error }), _jsx("div", { className: "bg-white rounded-md border border-slate-200 overflow-hidden", children: isLoading && allEvents.length === 0
|
|
61
|
+
? _jsx("div", { className: "p-4 text-slate-500 text-sm", children: "Loading..." })
|
|
62
|
+
: paginatedEvents.length === 0
|
|
63
|
+
? _jsx("div", { className: "p-4 text-slate-500 text-sm", children: "No events found" })
|
|
64
|
+
: (_jsx("div", { className: "divide-y divide-slate-200", children: paginatedEvents.map(({ event, originalIndex }) => (_jsx(EventRow, { event: event, eventIndex: originalIndex, onFork: handleFork }, `${event.timestamp}-${originalIndex}`))) })) }), totalPages > 1 && (_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("button", { onClick: () => setOffset(Math.max(0, offset - PAGE_SIZE)), disabled: offset === 0, className: "px-3 py-1 text-sm border border-slate-300 rounded hover:bg-slate-50 disabled:opacity-50 disabled:cursor-not-allowed", children: "Previous" }), _jsxs("span", { className: "text-sm text-slate-600", children: ["Page ", currentPage, " of ", totalPages] }), _jsx("button", { onClick: () => setOffset(offset + PAGE_SIZE), disabled: currentPage >= totalPages, className: "px-3 py-1 text-sm border border-slate-300 rounded hover:bg-slate-50 disabled:opacity-50 disabled:cursor-not-allowed", children: "Next" })] }))] }));
|
|
65
|
+
}
|
|
66
|
+
function EventRow({ event, eventIndex, onFork, }) {
|
|
67
|
+
const [expanded, setExpanded] = useState(false);
|
|
68
|
+
const [forking, setForking] = useState(false);
|
|
69
|
+
const typeColors = {
|
|
70
|
+
session_created: 'bg-green-100 text-green-700',
|
|
71
|
+
session_closed: 'bg-slate-100 text-slate-700',
|
|
72
|
+
agent_spawned: 'bg-blue-100 text-blue-700',
|
|
73
|
+
agent_state_changed: 'bg-yellow-100 text-yellow-700',
|
|
74
|
+
mailbox_message: 'bg-purple-100 text-purple-700',
|
|
75
|
+
mailbox_consumed: 'bg-purple-50 text-purple-600',
|
|
76
|
+
inference_started: 'bg-orange-100 text-orange-700',
|
|
77
|
+
inference_completed: 'bg-green-100 text-green-700',
|
|
78
|
+
inference_failed: 'bg-red-100 text-red-700',
|
|
79
|
+
tool_started: 'bg-cyan-100 text-cyan-700',
|
|
80
|
+
tool_completed: 'bg-green-100 text-green-700',
|
|
81
|
+
tool_failed: 'bg-red-100 text-red-700',
|
|
82
|
+
context_compacted: 'bg-slate-100 text-slate-700',
|
|
83
|
+
user_question_asked: 'bg-yellow-100 text-yellow-700',
|
|
84
|
+
user_message_sent: 'bg-blue-100 text-blue-700',
|
|
85
|
+
};
|
|
86
|
+
const llmCallId = (event.type === 'inference_completed' || event.type === 'inference_failed')
|
|
87
|
+
&& event.llmCallId;
|
|
88
|
+
const agentId = 'agentId' in event ? event.agentId : null;
|
|
89
|
+
return (_jsxs("div", { className: "text-sm", children: [_jsxs("button", { onClick: () => setExpanded(!expanded), className: "w-full p-3 hover:bg-slate-50 flex items-center gap-3 text-left", children: [_jsx("span", { className: "text-xs text-slate-400 font-mono w-20 shrink-0", children: new Date(event.timestamp).toLocaleTimeString() }), _jsx("span", { className: `text-xs px-2 py-0.5 rounded-full font-medium shrink-0 ${typeColors[event.type] || 'bg-slate-100'}`, children: event.type }), _jsx("span", { className: "text-slate-600 truncate flex-1", children: getEventSummary(event) }), _jsxs("div", { className: "flex items-center gap-2 shrink-0", children: [agentId && (_jsx(DebugLink, { to: `agents/${agentId}`, className: "text-xs text-violet-600 hover:underline", children: "Agent" })), llmCallId && (_jsx(DebugLink, { to: `llm-calls/${llmCallId}`, className: "text-xs text-violet-600 hover:underline", children: "LLM Call" })), _jsx("button", { onClick: async (e) => {
|
|
90
|
+
e.stopPropagation();
|
|
91
|
+
setForking(true);
|
|
92
|
+
try {
|
|
93
|
+
await onFork(eventIndex);
|
|
94
|
+
}
|
|
95
|
+
finally {
|
|
96
|
+
setForking(false);
|
|
97
|
+
}
|
|
98
|
+
}, disabled: forking, className: "text-xs text-violet-600 hover:underline disabled:opacity-50", children: forking ? 'Forking...' : 'Fork' })] }), _jsx("span", { className: "text-slate-400 shrink-0", children: expanded ? '▼' : '▶' })] }), expanded && (_jsx("div", { className: "px-3 pb-3 bg-slate-50", children: _jsx("pre", { className: "text-xs overflow-x-auto p-3 bg-white border border-slate-200 rounded-md", children: JSON.stringify(event, null, 2) }) }))] }));
|
|
99
|
+
}
|
|
100
|
+
function getEventSummary(event) {
|
|
101
|
+
const e = event;
|
|
102
|
+
switch (e.type) {
|
|
103
|
+
case 'session_created':
|
|
104
|
+
return `Preset: ${e.presetId}`;
|
|
105
|
+
case 'session_closed':
|
|
106
|
+
return 'Session closed';
|
|
107
|
+
case 'agent_spawned':
|
|
108
|
+
return `${e.definitionName} (${e.agentId.slice(0, 8)})`;
|
|
109
|
+
case 'agent_state_changed':
|
|
110
|
+
return `${e.fromState} → ${e.toState}`;
|
|
111
|
+
case 'mailbox_message':
|
|
112
|
+
return `To: ${e.toAgentId.slice(0, 8)}`;
|
|
113
|
+
case 'mailbox_consumed':
|
|
114
|
+
return `${e.messageIds.length} messages`;
|
|
115
|
+
case 'inference_started':
|
|
116
|
+
return `Agent: ${e.agentId.slice(0, 8)}`;
|
|
117
|
+
case 'inference_completed':
|
|
118
|
+
return `${e.metrics.totalTokens} tokens, ${e.metrics.model}`;
|
|
119
|
+
case 'inference_failed':
|
|
120
|
+
return e.error;
|
|
121
|
+
case 'tool_started':
|
|
122
|
+
return `${e.toolName}`;
|
|
123
|
+
case 'tool_completed':
|
|
124
|
+
return `${e.toolCallId.slice(0, 8)} completed`;
|
|
125
|
+
case 'tool_failed':
|
|
126
|
+
return `${e.toolCallId.slice(0, 8)}: ${e.error}`;
|
|
127
|
+
case 'context_compacted':
|
|
128
|
+
return `${e.originalTokens} → ${e.compactedTokens} tokens`;
|
|
129
|
+
case 'user_question_asked':
|
|
130
|
+
return e.question.slice(0, 50) + (e.question.length > 50 ? '...' : '');
|
|
131
|
+
case 'user_message_sent':
|
|
132
|
+
return e.message.slice(0, 50) + (e.message.length > 50 ? '...' : '');
|
|
133
|
+
default:
|
|
134
|
+
return '';
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=EventsPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EventsPage.js","sourceRoot":"","sources":["../../../../src/components/debug/pages/EventsPage.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FilesPage.d.ts","sourceRoot":"","sources":["../../../../src/components/debug/pages/FilesPage.tsx"],"names":[],"mappings":"AAsCA,wBAAgB,SAAS,mDAgSxB"}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useCallback, useEffect, useState } from 'react';
|
|
3
|
+
import { api, getApiBaseUrl } from '@roj-ai/client';
|
|
4
|
+
import { useDebugSessionId } from '../DebugNavigation';
|
|
5
|
+
function formatFileSize(bytes) {
|
|
6
|
+
if (bytes === 0)
|
|
7
|
+
return '0 B';
|
|
8
|
+
const units = ['B', 'KB', 'MB', 'GB'];
|
|
9
|
+
const i = Math.floor(Math.log(bytes) / Math.log(1024));
|
|
10
|
+
const size = bytes / Math.pow(1024, i);
|
|
11
|
+
return `${size.toFixed(i > 0 ? 1 : 0)} ${units[i]}`;
|
|
12
|
+
}
|
|
13
|
+
function isImageMime(mimeType) {
|
|
14
|
+
return mimeType?.startsWith('image/') ?? false;
|
|
15
|
+
}
|
|
16
|
+
function isTextMime(mimeType) {
|
|
17
|
+
if (!mimeType)
|
|
18
|
+
return false;
|
|
19
|
+
return mimeType.startsWith('text/')
|
|
20
|
+
|| mimeType === 'application/json'
|
|
21
|
+
|| mimeType === 'application/javascript';
|
|
22
|
+
}
|
|
23
|
+
export function FilesPage() {
|
|
24
|
+
const sessionId = useDebugSessionId();
|
|
25
|
+
const [root, setRoot] = useState('session');
|
|
26
|
+
const [currentPath, setCurrentPath] = useState('');
|
|
27
|
+
const [listing, setListing] = useState(null);
|
|
28
|
+
const [listingError, setListingError] = useState(null);
|
|
29
|
+
const [listingLoading, setListingLoading] = useState(false);
|
|
30
|
+
const [selectedFile, setSelectedFile] = useState(null);
|
|
31
|
+
const [fileContent, setFileContent] = useState(null);
|
|
32
|
+
const [fileUrl, setFileUrl] = useState(null);
|
|
33
|
+
const [fileLoading, setFileLoading] = useState(false);
|
|
34
|
+
const [fileError, setFileError] = useState(null);
|
|
35
|
+
const fetchListing = useCallback(async (r, path) => {
|
|
36
|
+
if (!sessionId)
|
|
37
|
+
return;
|
|
38
|
+
setListingLoading(true);
|
|
39
|
+
setListingError(null);
|
|
40
|
+
try {
|
|
41
|
+
const method = r === 'session' ? 'filesystem.listSession' : 'filesystem.listWorkspace';
|
|
42
|
+
const result = await api.call(method, { sessionId, path: path || undefined });
|
|
43
|
+
if (!result.ok) {
|
|
44
|
+
setListingError(result.error.message);
|
|
45
|
+
setListing(null);
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
setListing(result.value);
|
|
49
|
+
}
|
|
50
|
+
catch (e) {
|
|
51
|
+
setListingError(e instanceof Error ? e.message : 'Failed to fetch listing');
|
|
52
|
+
setListing(null);
|
|
53
|
+
}
|
|
54
|
+
finally {
|
|
55
|
+
setListingLoading(false);
|
|
56
|
+
}
|
|
57
|
+
}, [sessionId]);
|
|
58
|
+
// Fetch listing when root or path changes
|
|
59
|
+
useEffect(() => {
|
|
60
|
+
fetchListing(root, currentPath);
|
|
61
|
+
}, [root, currentPath, fetchListing]);
|
|
62
|
+
// Fetch file content when a file is selected
|
|
63
|
+
useEffect(() => {
|
|
64
|
+
if (!selectedFile || !sessionId) {
|
|
65
|
+
setFileContent(null);
|
|
66
|
+
setFileUrl(null);
|
|
67
|
+
setFileError(null);
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
const baseUrl = getApiBaseUrl();
|
|
71
|
+
const routePrefix = root === 'session' ? 'files' : 'workspace';
|
|
72
|
+
const url = `${baseUrl}/sessions/${sessionId}/${routePrefix}/${selectedFile.path}`;
|
|
73
|
+
if (isImageMime(selectedFile.entry.mimeType)) {
|
|
74
|
+
setFileUrl(url);
|
|
75
|
+
setFileContent(null);
|
|
76
|
+
setFileLoading(false);
|
|
77
|
+
setFileError(null);
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
if (isTextMime(selectedFile.entry.mimeType)) {
|
|
81
|
+
setFileLoading(true);
|
|
82
|
+
setFileError(null);
|
|
83
|
+
setFileUrl(null);
|
|
84
|
+
fetch(url)
|
|
85
|
+
.then(async (res) => {
|
|
86
|
+
if (!res.ok)
|
|
87
|
+
throw new Error(`HTTP ${res.status}`);
|
|
88
|
+
return res.text();
|
|
89
|
+
})
|
|
90
|
+
.then((text) => {
|
|
91
|
+
setFileContent(text);
|
|
92
|
+
setFileLoading(false);
|
|
93
|
+
})
|
|
94
|
+
.catch((e) => {
|
|
95
|
+
setFileError(e instanceof Error ? e.message : 'Failed to fetch file');
|
|
96
|
+
setFileLoading(false);
|
|
97
|
+
});
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
// Non-text, non-image: just show info + download link
|
|
101
|
+
setFileUrl(url);
|
|
102
|
+
setFileContent(null);
|
|
103
|
+
setFileLoading(false);
|
|
104
|
+
setFileError(null);
|
|
105
|
+
}, [selectedFile, sessionId, root]);
|
|
106
|
+
const handleNavigate = (entry) => {
|
|
107
|
+
if (entry.type === 'directory') {
|
|
108
|
+
const newPath = currentPath ? `${currentPath}/${entry.name}` : entry.name;
|
|
109
|
+
setCurrentPath(newPath);
|
|
110
|
+
setSelectedFile(null);
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
const filePath = currentPath ? `${currentPath}/${entry.name}` : entry.name;
|
|
114
|
+
setSelectedFile({ path: filePath, entry });
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
const handleRootChange = (newRoot) => {
|
|
118
|
+
setRoot(newRoot);
|
|
119
|
+
setCurrentPath('');
|
|
120
|
+
setSelectedFile(null);
|
|
121
|
+
};
|
|
122
|
+
const handleBreadcrumbClick = (index) => {
|
|
123
|
+
if (index === -1) {
|
|
124
|
+
setCurrentPath('');
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
const parts = currentPath.split('/');
|
|
128
|
+
setCurrentPath(parts.slice(0, index + 1).join('/'));
|
|
129
|
+
}
|
|
130
|
+
setSelectedFile(null);
|
|
131
|
+
};
|
|
132
|
+
if (!sessionId)
|
|
133
|
+
return null;
|
|
134
|
+
const pathParts = currentPath ? currentPath.split('/') : [];
|
|
135
|
+
return (_jsxs("div", { className: "h-full flex gap-4", children: [_jsxs("div", { className: "w-80 shrink-0 bg-white rounded-md border border-slate-200 flex flex-col", children: [_jsxs("div", { className: "flex border-b border-slate-200", children: [_jsx("button", { onClick: () => handleRootChange('session'), className: `flex-1 px-4 py-2 text-sm font-medium transition-colors ${root === 'session'
|
|
136
|
+
? 'text-violet-700 border-b-2 border-violet-600 bg-violet-50'
|
|
137
|
+
: 'text-slate-500 hover:text-slate-700 hover:bg-slate-50'}`, children: "Session" }), _jsx("button", { onClick: () => handleRootChange('workspace'), className: `flex-1 px-4 py-2 text-sm font-medium transition-colors ${root === 'workspace'
|
|
138
|
+
? 'text-violet-700 border-b-2 border-violet-600 bg-violet-50'
|
|
139
|
+
: 'text-slate-500 hover:text-slate-700 hover:bg-slate-50'}`, children: "Workspace" })] }), _jsxs("div", { className: "px-3 py-2 border-b border-slate-100 flex items-center gap-1 text-sm overflow-x-auto", children: [_jsx("button", { onClick: () => handleBreadcrumbClick(-1), className: "text-violet-600 hover:underline shrink-0", children: "/" }), pathParts.map((part, i) => (_jsxs("span", { className: "flex items-center gap-1 shrink-0", children: [_jsx("span", { className: "text-slate-400", children: "/" }), i < pathParts.length - 1
|
|
140
|
+
? (_jsx("button", { onClick: () => handleBreadcrumbClick(i), className: "text-violet-600 hover:underline", children: part }))
|
|
141
|
+
: _jsx("span", { className: "text-slate-700 font-medium", children: part })] }, i)))] }), _jsx("div", { className: "flex-1 overflow-auto", children: listingLoading
|
|
142
|
+
? _jsx("div", { className: "p-3 text-slate-500 text-sm", children: "Loading..." })
|
|
143
|
+
: listingError
|
|
144
|
+
? _jsx("div", { className: "p-3 text-red-500 text-sm", children: listingError })
|
|
145
|
+
: !listing || listing.entries.length === 0
|
|
146
|
+
? _jsx("div", { className: "p-3 text-slate-500 text-sm", children: "Empty directory" })
|
|
147
|
+
: (_jsxs("div", { className: "divide-y divide-slate-100", children: [currentPath && (_jsxs("button", { onClick: () => {
|
|
148
|
+
const parts = currentPath.split('/');
|
|
149
|
+
parts.pop();
|
|
150
|
+
setCurrentPath(parts.join('/'));
|
|
151
|
+
setSelectedFile(null);
|
|
152
|
+
}, className: "w-full flex items-center gap-2 px-3 py-2 text-sm text-slate-500 hover:bg-slate-50 text-left", children: [_jsx(FolderUpIcon, {}), _jsx("span", { children: ".." })] })), listing.entries.map((entry) => {
|
|
153
|
+
const isSelected = selectedFile
|
|
154
|
+
&& entry.type === 'file'
|
|
155
|
+
&& selectedFile.entry.name === entry.name
|
|
156
|
+
&& selectedFile.path === (currentPath ? `${currentPath}/${entry.name}` : entry.name);
|
|
157
|
+
return (_jsxs("button", { onClick: () => handleNavigate(entry), className: `w-full flex items-center gap-2 px-3 py-2 text-sm text-left transition-colors ${isSelected
|
|
158
|
+
? 'bg-violet-50 text-violet-700'
|
|
159
|
+
: 'text-slate-700 hover:bg-slate-50'}`, children: [entry.type === 'directory' ? _jsx(FolderIcon, {}) : _jsx(FileIcon, {}), _jsx("span", { className: "truncate flex-1", children: entry.name }), entry.type === 'file' && (_jsx("span", { className: "text-xs text-slate-400 shrink-0", children: formatFileSize(entry.size) }))] }, entry.name));
|
|
160
|
+
})] })) })] }), _jsxs("div", { className: "flex-1 bg-white rounded-md border border-slate-200 flex flex-col min-w-0", children: [_jsxs("div", { className: "p-3 border-b border-slate-200", children: [_jsx("h2", { className: "font-medium text-slate-900", children: selectedFile ? selectedFile.path : 'File Viewer' }), selectedFile && (_jsxs("div", { className: "flex items-center gap-3 mt-1 text-xs text-slate-500", children: [_jsx("span", { children: selectedFile.entry.mimeType ?? 'unknown type' }), _jsx("span", { children: formatFileSize(selectedFile.entry.size) })] }))] }), _jsx("div", { className: "flex-1 overflow-auto p-4", children: !selectedFile
|
|
161
|
+
? (_jsx("div", { className: "text-slate-500 text-sm", children: "Select a file from the directory browser to view its contents" }))
|
|
162
|
+
: fileLoading
|
|
163
|
+
? _jsx("div", { className: "text-slate-500 text-sm", children: "Loading file..." })
|
|
164
|
+
: fileError
|
|
165
|
+
? _jsx("div", { className: "text-red-500 text-sm", children: fileError })
|
|
166
|
+
: fileContent !== null
|
|
167
|
+
? (_jsx("pre", { className: "text-xs font-mono whitespace-pre-wrap break-words bg-slate-50 p-4 rounded-md border border-slate-200 overflow-auto max-h-full", children: fileContent }))
|
|
168
|
+
: fileUrl && isImageMime(selectedFile.entry.mimeType)
|
|
169
|
+
? (_jsx("div", { className: "flex items-center justify-center", children: _jsx("img", { src: fileUrl, alt: selectedFile.entry.name, className: "max-w-full max-h-[70vh] object-contain rounded border border-slate-200" }) }))
|
|
170
|
+
: fileUrl
|
|
171
|
+
? (_jsxs("div", { className: "space-y-3", children: [_jsx("p", { className: "text-sm text-slate-600", children: "This file type cannot be previewed." }), _jsxs("a", { href: fileUrl, download: selectedFile.entry.name, className: "inline-flex items-center gap-2 px-4 py-2 text-sm font-medium text-violet-700 bg-violet-50 rounded-md hover:bg-violet-100 transition-colors", children: [_jsx(DownloadIcon, {}), "Download ", selectedFile.entry.name] })] }))
|
|
172
|
+
: null })] })] }));
|
|
173
|
+
}
|
|
174
|
+
// Icons
|
|
175
|
+
function FolderIcon() {
|
|
176
|
+
return (_jsx("svg", { className: "w-4 h-4 text-yellow-500 shrink-0", fill: "currentColor", viewBox: "0 0 20 20", children: _jsx("path", { d: "M2 6a2 2 0 012-2h5l2 2h5a2 2 0 012 2v6a2 2 0 01-2 2H4a2 2 0 01-2-2V6z" }) }));
|
|
177
|
+
}
|
|
178
|
+
function FolderUpIcon() {
|
|
179
|
+
return (_jsx("svg", { className: "w-4 h-4 text-slate-400 shrink-0", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M3 10h18M3 10l6-6m-6 6l6 6" }) }));
|
|
180
|
+
}
|
|
181
|
+
function FileIcon() {
|
|
182
|
+
return (_jsx("svg", { className: "w-4 h-4 text-slate-400 shrink-0", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M7 21h10a2 2 0 002-2V9.414a1 1 0 00-.293-.707l-5.414-5.414A1 1 0 0012.586 3H7a2 2 0 00-2 2v14a2 2 0 002 2z" }) }));
|
|
183
|
+
}
|
|
184
|
+
function DownloadIcon() {
|
|
185
|
+
return (_jsx("svg", { className: "w-4 h-4", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M12 10v6m0 0l-3-3m3 3l3-3m2 8H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z" }) }));
|
|
186
|
+
}
|
|
187
|
+
//# sourceMappingURL=FilesPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FilesPage.js","sourceRoot":"","sources":["../../../../src/components/debug/pages/FilesPage.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LLMCallPage.d.ts","sourceRoot":"","sources":["../../../../src/components/debug/pages/LLMCallPage.tsx"],"names":[],"mappings":"AAGA,wBAAgB,WAAW,4CA4B1B"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { DebugLink, useDebugParams, useDebugSessionId } from '../DebugNavigation';
|
|
3
|
+
import { LLMCallDetail } from '../LLMCallDetail';
|
|
4
|
+
export function LLMCallPage() {
|
|
5
|
+
const sessionId = useDebugSessionId();
|
|
6
|
+
const { callId } = useDebugParams();
|
|
7
|
+
if (!callId) {
|
|
8
|
+
return _jsx("div", { className: "text-slate-500", children: "Invalid URL" });
|
|
9
|
+
}
|
|
10
|
+
return (_jsxs("div", { className: "space-y-4", children: [_jsxs("div", { className: "flex items-center gap-2 text-sm", children: [_jsx(DebugLink, { to: "llm-calls", className: "text-violet-600 hover:underline", children: "LLM Calls" }), _jsx("span", { className: "text-slate-400", children: "/" }), _jsxs("span", { className: "text-slate-600 font-mono", children: [callId.slice(0, 12), "..."] })] }), _jsx("div", { className: "bg-white rounded-md border border-slate-200 p-6", children: _jsx(LLMCallDetail, { sessionId: sessionId, callId: callId }) })] }));
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=LLMCallPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LLMCallPage.js","sourceRoot":"","sources":["../../../../src/components/debug/pages/LLMCallPage.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AACjF,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAEhD,MAAM,UAAU,WAAW;IAC1B,MAAM,SAAS,GAAG,iBAAiB,EAAE,CAAA;IACrC,MAAM,EAAE,MAAM,EAAE,GAAG,cAAc,EAAsB,CAAA;IAEvD,IAAI,CAAC,MAAM,EAAE,CAAC;QACb,OAAO,cAAK,SAAS,EAAC,gBAAgB,4BAAkB,CAAA;IACzD,CAAC;IAED,OAAO,CACN,eAAK,SAAS,EAAC,WAAW,aAEzB,eAAK,SAAS,EAAC,iCAAiC,aAC/C,KAAC,SAAS,IACT,EAAE,EAAC,WAAW,EACd,SAAS,EAAC,iCAAiC,0BAGhC,EACZ,eAAM,SAAS,EAAC,gBAAgB,kBAAS,EACzC,gBAAM,SAAS,EAAC,0BAA0B,aAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,IACrE,EAGN,cAAK,SAAS,EAAC,iDAAiD,YAC/D,KAAC,aAAa,IAAC,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAI,GAClD,IACD,CACN,CAAA;AACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LLMCallsPage.d.ts","sourceRoot":"","sources":["../../../../src/components/debug/pages/LLMCallsPage.tsx"],"names":[],"mappings":"AAkBA,wBAAgB,YAAY,4CAiT3B"}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useCallback, useEffect, useMemo, useState } from 'react';
|
|
3
|
+
import { api, unwrap } from '@roj-ai/client';
|
|
4
|
+
import { useEventStore } from '../../../stores/event-store';
|
|
5
|
+
import { DebugLink, useDebugSessionId } from '../DebugNavigation';
|
|
6
|
+
function isLLMCallLogEntry(data) {
|
|
7
|
+
return typeof data === 'object' && data !== null && 'id' in data && 'status' in data && 'request' in data;
|
|
8
|
+
}
|
|
9
|
+
const PAGE_SIZE = 50;
|
|
10
|
+
const FETCH_LIMIT = 1000;
|
|
11
|
+
export function LLMCallsPage() {
|
|
12
|
+
const sessionId = useDebugSessionId();
|
|
13
|
+
const [calls, setCalls] = useState([]);
|
|
14
|
+
const [total, setTotal] = useState(0);
|
|
15
|
+
const [loading, setLoading] = useState(true);
|
|
16
|
+
const [error, setError] = useState(null);
|
|
17
|
+
const [offset, setOffset] = useState(0);
|
|
18
|
+
const [agentFilter, setAgentFilter] = useState('all');
|
|
19
|
+
const [statusFilter, setStatusFilter] = useState('all');
|
|
20
|
+
const [providerFilter, setProviderFilter] = useState('all');
|
|
21
|
+
const [modelFilter, setModelFilter] = useState('all');
|
|
22
|
+
const [sortField, setSortField] = useState('time');
|
|
23
|
+
const [sortDirection, setSortDirection] = useState('desc');
|
|
24
|
+
const agentProjection = useEventStore((s) => s.agentDetailProjectionState);
|
|
25
|
+
const agentNameById = useMemo(() => {
|
|
26
|
+
const map = new Map();
|
|
27
|
+
for (const agent of agentProjection.agents.values()) {
|
|
28
|
+
map.set(agent.id, agent.definitionName);
|
|
29
|
+
}
|
|
30
|
+
return map;
|
|
31
|
+
}, [agentProjection]);
|
|
32
|
+
const resolveAgentName = useCallback((agentId) => agentNameById.get(agentId) ?? agentId, [agentNameById]);
|
|
33
|
+
const load = useCallback(async () => {
|
|
34
|
+
if (!sessionId)
|
|
35
|
+
return;
|
|
36
|
+
try {
|
|
37
|
+
const data = unwrap(await api.call('llm.getCalls', {
|
|
38
|
+
sessionId,
|
|
39
|
+
limit: FETCH_LIMIT,
|
|
40
|
+
offset: 0,
|
|
41
|
+
}));
|
|
42
|
+
setCalls(data.calls.filter(isLLMCallLogEntry));
|
|
43
|
+
setTotal(data.total);
|
|
44
|
+
setError(null);
|
|
45
|
+
}
|
|
46
|
+
catch (err) {
|
|
47
|
+
setError(err instanceof Error ? err.message : 'Failed to load LLM calls');
|
|
48
|
+
}
|
|
49
|
+
finally {
|
|
50
|
+
setLoading(false);
|
|
51
|
+
}
|
|
52
|
+
}, [sessionId]);
|
|
53
|
+
useEffect(() => {
|
|
54
|
+
load();
|
|
55
|
+
const interval = setInterval(load, 5000);
|
|
56
|
+
return () => clearInterval(interval);
|
|
57
|
+
}, [load]);
|
|
58
|
+
const uniqueAgents = useMemo(() => {
|
|
59
|
+
const ids = new Set();
|
|
60
|
+
for (const call of calls)
|
|
61
|
+
ids.add(call.agentId);
|
|
62
|
+
return Array.from(ids)
|
|
63
|
+
.map((id) => ({ id, name: resolveAgentName(id) }))
|
|
64
|
+
.sort((a, b) => a.name.localeCompare(b.name));
|
|
65
|
+
}, [calls, resolveAgentName]);
|
|
66
|
+
const uniqueProviders = useMemo(() => {
|
|
67
|
+
const set = new Set();
|
|
68
|
+
for (const call of calls) {
|
|
69
|
+
const p = call.metrics?.provider;
|
|
70
|
+
if (p)
|
|
71
|
+
set.add(p);
|
|
72
|
+
}
|
|
73
|
+
return Array.from(set).sort();
|
|
74
|
+
}, [calls]);
|
|
75
|
+
const uniqueModels = useMemo(() => {
|
|
76
|
+
const set = new Set();
|
|
77
|
+
for (const call of calls)
|
|
78
|
+
set.add(call.request.model);
|
|
79
|
+
return Array.from(set).sort();
|
|
80
|
+
}, [calls]);
|
|
81
|
+
const filteredCalls = useMemo(() => {
|
|
82
|
+
return calls.filter((call) => {
|
|
83
|
+
if (agentFilter !== 'all' && call.agentId !== agentFilter)
|
|
84
|
+
return false;
|
|
85
|
+
if (statusFilter !== 'all' && call.status !== statusFilter)
|
|
86
|
+
return false;
|
|
87
|
+
if (providerFilter !== 'all' && (call.metrics?.provider ?? '') !== providerFilter)
|
|
88
|
+
return false;
|
|
89
|
+
if (modelFilter !== 'all' && call.request.model !== modelFilter)
|
|
90
|
+
return false;
|
|
91
|
+
return true;
|
|
92
|
+
});
|
|
93
|
+
}, [calls, agentFilter, statusFilter, providerFilter, modelFilter]);
|
|
94
|
+
const sortedCalls = useMemo(() => {
|
|
95
|
+
const sorted = [...filteredCalls];
|
|
96
|
+
const direction = sortDirection === 'asc' ? 1 : -1;
|
|
97
|
+
sorted.sort((a, b) => {
|
|
98
|
+
let aVal;
|
|
99
|
+
let bVal;
|
|
100
|
+
switch (sortField) {
|
|
101
|
+
case 'time':
|
|
102
|
+
aVal = a.createdAt;
|
|
103
|
+
bVal = b.createdAt;
|
|
104
|
+
break;
|
|
105
|
+
case 'duration':
|
|
106
|
+
aVal = a.metrics?.latencyMs ?? a.durationMs ?? 0;
|
|
107
|
+
bVal = b.metrics?.latencyMs ?? b.durationMs ?? 0;
|
|
108
|
+
break;
|
|
109
|
+
case 'tokens':
|
|
110
|
+
aVal = a.metrics?.totalTokens ?? 0;
|
|
111
|
+
bVal = b.metrics?.totalTokens ?? 0;
|
|
112
|
+
break;
|
|
113
|
+
case 'cost':
|
|
114
|
+
aVal = a.metrics?.cost ?? 0;
|
|
115
|
+
bVal = b.metrics?.cost ?? 0;
|
|
116
|
+
break;
|
|
117
|
+
}
|
|
118
|
+
return (aVal - bVal) * direction;
|
|
119
|
+
});
|
|
120
|
+
return sorted;
|
|
121
|
+
}, [filteredCalls, sortField, sortDirection]);
|
|
122
|
+
const paginatedCalls = useMemo(() => sortedCalls.slice(offset, offset + PAGE_SIZE), [sortedCalls, offset]);
|
|
123
|
+
const filteredTotal = sortedCalls.length;
|
|
124
|
+
const totalPages = Math.max(1, Math.ceil(filteredTotal / PAGE_SIZE));
|
|
125
|
+
const currentPage = Math.floor(offset / PAGE_SIZE) + 1;
|
|
126
|
+
useEffect(() => {
|
|
127
|
+
if (offset >= filteredTotal && offset > 0)
|
|
128
|
+
setOffset(0);
|
|
129
|
+
}, [filteredTotal, offset]);
|
|
130
|
+
const totalTokens = sortedCalls.reduce((sum, c) => sum + (c.metrics?.totalTokens ?? 0), 0);
|
|
131
|
+
const totalCost = sortedCalls.reduce((sum, c) => sum + (c.metrics?.cost ?? 0), 0);
|
|
132
|
+
const toggleSort = (field) => {
|
|
133
|
+
if (sortField === field) {
|
|
134
|
+
setSortDirection(sortDirection === 'asc' ? 'desc' : 'asc');
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
setSortField(field);
|
|
138
|
+
setSortDirection('desc');
|
|
139
|
+
}
|
|
140
|
+
setOffset(0);
|
|
141
|
+
};
|
|
142
|
+
const resetPagination = () => setOffset(0);
|
|
143
|
+
return (_jsxs("div", { className: "space-y-4", children: [_jsxs("div", { className: "flex items-center gap-6 text-sm", children: [_jsxs("span", { className: "text-slate-600", children: [_jsx("span", { className: "font-medium text-slate-900", children: filteredTotal }), filteredTotal !== total && _jsxs("span", { className: "text-slate-400", children: [" / ", total] }), " calls"] }), _jsxs("span", { className: "text-slate-600", children: [_jsx("span", { className: "font-medium text-slate-900", children: totalTokens.toLocaleString() }), " tokens"] }), totalCost > 0 && (_jsxs("span", { className: "text-slate-600", children: [_jsxs("span", { className: "font-medium text-green-600", children: ["$", totalCost.toFixed(4)] }), " cost"] }))] }), _jsxs("div", { className: "flex flex-wrap items-center gap-3 text-sm", children: [_jsx(FilterSelect, { label: 'Agent', value: agentFilter, onChange: (v) => {
|
|
144
|
+
setAgentFilter(v);
|
|
145
|
+
resetPagination();
|
|
146
|
+
}, options: [
|
|
147
|
+
{ value: 'all', label: 'All agents' },
|
|
148
|
+
...uniqueAgents.map((a) => ({ value: a.id, label: a.name })),
|
|
149
|
+
] }), _jsx(FilterSelect, { label: 'Status', value: statusFilter, onChange: (v) => {
|
|
150
|
+
setStatusFilter(v);
|
|
151
|
+
resetPagination();
|
|
152
|
+
}, options: [
|
|
153
|
+
{ value: 'all', label: 'All statuses' },
|
|
154
|
+
{ value: 'running', label: 'running' },
|
|
155
|
+
{ value: 'success', label: 'success' },
|
|
156
|
+
{ value: 'error', label: 'error' },
|
|
157
|
+
] }), _jsx(FilterSelect, { label: 'Provider', value: providerFilter, onChange: (v) => {
|
|
158
|
+
setProviderFilter(v);
|
|
159
|
+
resetPagination();
|
|
160
|
+
}, options: [
|
|
161
|
+
{ value: 'all', label: 'All providers' },
|
|
162
|
+
...uniqueProviders.map((p) => ({ value: p, label: p })),
|
|
163
|
+
] }), _jsx(FilterSelect, { label: 'Model', value: modelFilter, onChange: (v) => {
|
|
164
|
+
setModelFilter(v);
|
|
165
|
+
resetPagination();
|
|
166
|
+
}, options: [
|
|
167
|
+
{ value: 'all', label: 'All models' },
|
|
168
|
+
...uniqueModels.map((m) => ({ value: m, label: m })),
|
|
169
|
+
] })] }), error && _jsx("div", { className: "text-red-500 text-sm", children: error }), _jsx("div", { className: "bg-white rounded-md border border-slate-200 overflow-hidden", children: loading && calls.length === 0
|
|
170
|
+
? _jsx("div", { className: "p-4 text-slate-500 text-sm", children: "Loading..." })
|
|
171
|
+
: paginatedCalls.length === 0
|
|
172
|
+
? _jsx("div", { className: "p-4 text-slate-500 text-sm", children: "No LLM calls found" })
|
|
173
|
+
: (_jsx("div", { className: "overflow-x-auto", children: _jsxs("table", { className: "w-full text-sm", children: [_jsx("thead", { className: "bg-slate-50 border-b border-slate-200", children: _jsxs("tr", { children: [_jsx(SortableHeader, { label: 'Time', field: 'time', sortField: sortField, sortDirection: sortDirection, onClick: toggleSort, align: 'left' }), _jsx("th", { className: "px-3 py-2 text-left font-medium text-slate-600", children: "Status" }), _jsx("th", { className: "px-3 py-2 text-left font-medium text-slate-600", children: "Provider" }), _jsx("th", { className: "px-3 py-2 text-left font-medium text-slate-600", children: "Model" }), _jsx(SortableHeader, { label: 'Duration', field: 'duration', sortField: sortField, sortDirection: sortDirection, onClick: toggleSort, align: 'right' }), _jsx(SortableHeader, { label: 'Tokens', field: 'tokens', sortField: sortField, sortDirection: sortDirection, onClick: toggleSort, align: 'right' }), _jsx(SortableHeader, { label: 'Cost', field: 'cost', sortField: sortField, sortDirection: sortDirection, onClick: toggleSort, align: 'right' }), _jsx("th", { className: "px-3 py-2 text-left font-medium text-slate-600", children: "Agent" })] }) }), _jsx("tbody", { className: "divide-y divide-slate-200", children: paginatedCalls.map((call) => (_jsx(CallRow, { call: call, agentName: resolveAgentName(call.agentId) }, call.id))) })] }) })) }), totalPages > 1 && (_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("button", { onClick: () => setOffset(Math.max(0, offset - PAGE_SIZE)), disabled: offset === 0, className: "px-3 py-1 text-sm border border-slate-300 rounded hover:bg-slate-50 disabled:opacity-50 disabled:cursor-not-allowed", children: "Previous" }), _jsxs("span", { className: "text-sm text-slate-600", children: ["Page ", currentPage, " of ", totalPages] }), _jsx("button", { onClick: () => setOffset(offset + PAGE_SIZE), disabled: currentPage >= totalPages, className: "px-3 py-1 text-sm border border-slate-300 rounded hover:bg-slate-50 disabled:opacity-50 disabled:cursor-not-allowed", children: "Next" })] }))] }));
|
|
174
|
+
}
|
|
175
|
+
function FilterSelect({ label, value, onChange, options, }) {
|
|
176
|
+
return (_jsxs("label", { className: "text-slate-600 flex items-center gap-2", children: [_jsxs("span", { children: [label, ":"] }), _jsx("select", { value: value, onChange: (e) => onChange(e.target.value), className: "border border-slate-300 rounded px-2 py-1 text-sm bg-white", children: options.map((opt) => (_jsx("option", { value: opt.value, children: opt.label }, opt.value))) })] }));
|
|
177
|
+
}
|
|
178
|
+
function SortableHeader({ label, field, sortField, sortDirection, onClick, align, }) {
|
|
179
|
+
const active = sortField === field;
|
|
180
|
+
const arrow = active ? (sortDirection === 'asc' ? '▲' : '▼') : '';
|
|
181
|
+
return (_jsx("th", { className: `px-3 py-2 font-medium text-slate-600 ${align === 'right' ? 'text-right' : 'text-left'}`, children: _jsxs("button", { type: 'button', onClick: () => onClick(field), className: `inline-flex items-center gap-1 hover:text-slate-900 ${active ? 'text-slate-900' : ''}`, children: [_jsx("span", { children: label }), arrow && _jsx("span", { className: "text-xs", children: arrow })] }) }));
|
|
182
|
+
}
|
|
183
|
+
function CallRow({ call, agentName }) {
|
|
184
|
+
const metrics = call.metrics;
|
|
185
|
+
const promptTokens = metrics?.promptTokens ?? 0;
|
|
186
|
+
const completionTokens = metrics?.completionTokens ?? 0;
|
|
187
|
+
const totalTokens = promptTokens + completionTokens;
|
|
188
|
+
const cost = metrics?.cost;
|
|
189
|
+
const latency = metrics?.latencyMs ?? call.durationMs;
|
|
190
|
+
return (_jsxs("tr", { className: "hover:bg-slate-50", children: [_jsx("td", { className: "px-3 py-2 font-mono text-xs text-slate-500", children: _jsx(DebugLink, { to: `llm-calls/${call.id}`, className: "hover:text-violet-600", children: new Date(call.createdAt).toLocaleTimeString() }) }), _jsx("td", { className: "px-3 py-2", children: _jsx(StatusBadge, { status: call.status }) }), _jsx("td", { className: "px-3 py-2 text-xs text-slate-500", children: call.metrics?.provider ?? '—' }), _jsx("td", { className: "px-3 py-2", children: _jsx(DebugLink, { to: `llm-calls/${call.id}`, className: "font-mono text-xs hover:text-violet-600", children: call.request.model.split('/').pop() }) }), _jsx("td", { className: "px-3 py-2 text-right font-mono text-xs", children: latency !== undefined ? `${(latency / 1000).toFixed(2)}s` : '—' }), _jsxs("td", { className: "px-3 py-2 text-right", children: [_jsxs("div", { className: "font-mono text-xs", children: [_jsx("span", { className: "text-green-600", children: promptTokens.toLocaleString() }), _jsx("span", { className: "text-slate-400", children: "/" }), _jsx("span", { className: "text-violet-600", children: completionTokens.toLocaleString() })] }), _jsxs("div", { className: "text-xs text-slate-500", children: [totalTokens.toLocaleString(), " total"] })] }), _jsx("td", { className: "px-3 py-2 text-right font-mono text-xs", children: cost !== undefined ? _jsxs("span", { className: "text-green-600", children: ["$", cost.toFixed(5)] }) : _jsx("span", { className: "text-slate-400", children: "\u2014" }) }), _jsx("td", { className: "px-3 py-2", children: _jsx("span", { title: call.agentId, children: _jsx(DebugLink, { to: `agents/${call.agentId}`, className: "text-xs text-slate-600 hover:text-violet-600 whitespace-nowrap", children: agentName }) }) })] }));
|
|
191
|
+
}
|
|
192
|
+
function StatusBadge({ status }) {
|
|
193
|
+
const styles = {
|
|
194
|
+
running: 'bg-yellow-100 text-yellow-700',
|
|
195
|
+
success: 'bg-green-100 text-green-700',
|
|
196
|
+
error: 'bg-red-100 text-red-700',
|
|
197
|
+
};
|
|
198
|
+
return (_jsx("span", { className: `text-xs px-2 py-0.5 rounded-full font-medium ${styles[status]}`, children: status }));
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=LLMCallsPage.js.map
|