@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.
Files changed (153) hide show
  1. package/dist/components/debug/DebugContext.d.ts +1 -0
  2. package/dist/components/debug/DebugContext.d.ts.map +1 -0
  3. package/dist/components/debug/DebugContext.js +9 -0
  4. package/dist/components/debug/DebugContext.js.map +1 -0
  5. package/dist/components/debug/DebugNavigation.d.ts +1 -0
  6. package/dist/components/debug/DebugNavigation.d.ts.map +1 -0
  7. package/dist/components/debug/DebugNavigation.js +36 -0
  8. package/dist/components/debug/DebugNavigation.js.map +1 -0
  9. package/dist/components/debug/DebugShell.d.ts +1 -0
  10. package/dist/components/debug/DebugShell.d.ts.map +1 -0
  11. package/dist/components/debug/DebugShell.js +103 -0
  12. package/dist/components/debug/DebugShell.js.map +1 -0
  13. package/dist/components/debug/LLMCallDetail.d.ts +1 -0
  14. package/dist/components/debug/LLMCallDetail.d.ts.map +1 -0
  15. package/dist/components/debug/LLMCallDetail.js +204 -0
  16. package/dist/components/debug/LLMCallDetail.js.map +1 -0
  17. package/dist/components/debug/TimelineDetailInspector.d.ts +1 -0
  18. package/dist/components/debug/TimelineDetailInspector.d.ts.map +1 -0
  19. package/dist/components/debug/TimelineDetailInspector.js +48 -0
  20. package/dist/components/debug/TimelineDetailInspector.js.map +1 -0
  21. package/dist/components/debug/communication/CommunicationDiagram.d.ts +1 -0
  22. package/dist/components/debug/communication/CommunicationDiagram.d.ts.map +1 -0
  23. package/dist/components/debug/communication/CommunicationDiagram.js +67 -0
  24. package/dist/components/debug/communication/CommunicationDiagram.js.map +1 -0
  25. package/dist/components/debug/communication/DiagramHeader.d.ts +1 -0
  26. package/dist/components/debug/communication/DiagramHeader.d.ts.map +1 -0
  27. package/dist/components/debug/communication/DiagramHeader.js +44 -0
  28. package/dist/components/debug/communication/DiagramHeader.js.map +1 -0
  29. package/dist/components/debug/communication/ParticipantLane.d.ts +1 -0
  30. package/dist/components/debug/communication/ParticipantLane.d.ts.map +1 -0
  31. package/dist/components/debug/communication/ParticipantLane.js +10 -0
  32. package/dist/components/debug/communication/ParticipantLane.js.map +1 -0
  33. package/dist/components/debug/communication/TimeAxis.d.ts +1 -0
  34. package/dist/components/debug/communication/TimeAxis.d.ts.map +1 -0
  35. package/dist/components/debug/communication/TimeAxis.js +49 -0
  36. package/dist/components/debug/communication/TimeAxis.js.map +1 -0
  37. package/dist/components/debug/communication/elements/IdleGap.d.ts +1 -0
  38. package/dist/components/debug/communication/elements/IdleGap.d.ts.map +1 -0
  39. package/dist/components/debug/communication/elements/IdleGap.js +12 -0
  40. package/dist/components/debug/communication/elements/IdleGap.js.map +1 -0
  41. package/dist/components/debug/communication/elements/LLMBlock.d.ts +1 -0
  42. package/dist/components/debug/communication/elements/LLMBlock.d.ts.map +1 -0
  43. package/dist/components/debug/communication/elements/LLMBlock.js +30 -0
  44. package/dist/components/debug/communication/elements/LLMBlock.js.map +1 -0
  45. package/dist/components/debug/communication/elements/MessageArrow.d.ts +1 -0
  46. package/dist/components/debug/communication/elements/MessageArrow.d.ts.map +1 -0
  47. package/dist/components/debug/communication/elements/MessageArrow.js +34 -0
  48. package/dist/components/debug/communication/elements/MessageArrow.js.map +1 -0
  49. package/dist/components/debug/communication/elements/ToolBlock.d.ts +1 -0
  50. package/dist/components/debug/communication/elements/ToolBlock.d.ts.map +1 -0
  51. package/dist/components/debug/communication/elements/ToolBlock.js +27 -0
  52. package/dist/components/debug/communication/elements/ToolBlock.js.map +1 -0
  53. package/dist/components/debug/communication/hooks/useDiagramData.d.ts +1 -0
  54. package/dist/components/debug/communication/hooks/useDiagramData.d.ts.map +1 -0
  55. package/dist/components/debug/communication/hooks/useDiagramData.js +252 -0
  56. package/dist/components/debug/communication/hooks/useDiagramData.js.map +1 -0
  57. package/dist/components/debug/communication/hooks/useTimeCompression.d.ts +1 -0
  58. package/dist/components/debug/communication/hooks/useTimeCompression.d.ts.map +1 -0
  59. package/dist/components/debug/communication/hooks/useTimeCompression.js +109 -0
  60. package/dist/components/debug/communication/hooks/useTimeCompression.js.map +1 -0
  61. package/dist/components/debug/communication/hooks/useZoomPan.d.ts +1 -0
  62. package/dist/components/debug/communication/hooks/useZoomPan.d.ts.map +1 -0
  63. package/dist/components/debug/communication/hooks/useZoomPan.js +75 -0
  64. package/dist/components/debug/communication/hooks/useZoomPan.js.map +1 -0
  65. package/dist/components/debug/communication/popovers/ElementPopover.d.ts +1 -0
  66. package/dist/components/debug/communication/popovers/ElementPopover.d.ts.map +1 -0
  67. package/dist/components/debug/communication/popovers/ElementPopover.js +39 -0
  68. package/dist/components/debug/communication/popovers/ElementPopover.js.map +1 -0
  69. package/dist/components/debug/communication/types.d.ts +1 -0
  70. package/dist/components/debug/communication/types.d.ts.map +1 -0
  71. package/dist/components/debug/communication/types.js +52 -0
  72. package/dist/components/debug/communication/types.js.map +1 -0
  73. package/dist/components/debug/index.d.ts +1 -0
  74. package/dist/components/debug/index.d.ts.map +1 -0
  75. package/dist/components/debug/index.js +18 -0
  76. package/dist/components/debug/index.js.map +1 -0
  77. package/dist/components/debug/pages/AgentDetailPage.d.ts +1 -0
  78. package/dist/components/debug/pages/AgentDetailPage.d.ts.map +1 -0
  79. package/dist/components/debug/pages/AgentDetailPage.js +365 -0
  80. package/dist/components/debug/pages/AgentDetailPage.js.map +1 -0
  81. package/dist/components/debug/pages/AgentsPage.d.ts +1 -0
  82. package/dist/components/debug/pages/AgentsPage.d.ts.map +1 -0
  83. package/dist/components/debug/pages/AgentsPage.js +111 -0
  84. package/dist/components/debug/pages/AgentsPage.js.map +1 -0
  85. package/dist/components/debug/pages/CommunicationPage.d.ts +1 -0
  86. package/dist/components/debug/pages/CommunicationPage.d.ts.map +1 -0
  87. package/dist/components/debug/pages/CommunicationPage.js +19 -0
  88. package/dist/components/debug/pages/CommunicationPage.js.map +1 -0
  89. package/dist/components/debug/pages/DashboardPage.d.ts +1 -0
  90. package/dist/components/debug/pages/DashboardPage.d.ts.map +1 -0
  91. package/dist/components/debug/pages/DashboardPage.js +430 -0
  92. package/dist/components/debug/pages/DashboardPage.js.map +1 -0
  93. package/dist/components/debug/pages/EventsPage.d.ts +1 -0
  94. package/dist/components/debug/pages/EventsPage.d.ts.map +1 -0
  95. package/dist/components/debug/pages/EventsPage.js +137 -0
  96. package/dist/components/debug/pages/EventsPage.js.map +1 -0
  97. package/dist/components/debug/pages/FilesPage.d.ts +1 -0
  98. package/dist/components/debug/pages/FilesPage.d.ts.map +1 -0
  99. package/dist/components/debug/pages/FilesPage.js +187 -0
  100. package/dist/components/debug/pages/FilesPage.js.map +1 -0
  101. package/dist/components/debug/pages/LLMCallPage.d.ts +1 -0
  102. package/dist/components/debug/pages/LLMCallPage.d.ts.map +1 -0
  103. package/dist/components/debug/pages/LLMCallPage.js +12 -0
  104. package/dist/components/debug/pages/LLMCallPage.js.map +1 -0
  105. package/dist/components/debug/pages/LLMCallsPage.d.ts +1 -0
  106. package/dist/components/debug/pages/LLMCallsPage.d.ts.map +1 -0
  107. package/dist/components/debug/pages/LLMCallsPage.js +200 -0
  108. package/dist/components/debug/pages/LLMCallsPage.js.map +1 -0
  109. package/dist/components/debug/pages/LogsPage.d.ts +1 -0
  110. package/dist/components/debug/pages/LogsPage.d.ts.map +1 -0
  111. package/dist/components/debug/pages/LogsPage.js +107 -0
  112. package/dist/components/debug/pages/LogsPage.js.map +1 -0
  113. package/dist/components/debug/pages/MailboxPage.d.ts +1 -0
  114. package/dist/components/debug/pages/MailboxPage.d.ts.map +1 -0
  115. package/dist/components/debug/pages/MailboxPage.js +60 -0
  116. package/dist/components/debug/pages/MailboxPage.js.map +1 -0
  117. package/dist/components/debug/pages/ServicesPage.d.ts +1 -0
  118. package/dist/components/debug/pages/ServicesPage.d.ts.map +1 -0
  119. package/dist/components/debug/pages/ServicesPage.js +91 -0
  120. package/dist/components/debug/pages/ServicesPage.js.map +1 -0
  121. package/dist/components/debug/pages/TimelinePage.d.ts +1 -0
  122. package/dist/components/debug/pages/TimelinePage.d.ts.map +1 -0
  123. package/dist/components/debug/pages/TimelinePage.js +101 -0
  124. package/dist/components/debug/pages/TimelinePage.js.map +1 -0
  125. package/dist/components/debug/pages/UserChatPage.d.ts +1 -0
  126. package/dist/components/debug/pages/UserChatPage.d.ts.map +1 -0
  127. package/dist/components/debug/pages/UserChatPage.js +56 -0
  128. package/dist/components/debug/pages/UserChatPage.js.map +1 -0
  129. package/dist/components/debug/pages/index.d.ts +1 -0
  130. package/dist/components/debug/pages/index.d.ts.map +1 -0
  131. package/dist/components/debug/pages/index.js +14 -0
  132. package/dist/components/debug/pages/index.js.map +1 -0
  133. package/dist/index.d.ts +1 -0
  134. package/dist/index.d.ts.map +1 -0
  135. package/dist/index.js +12 -0
  136. package/dist/index.js.map +1 -0
  137. package/dist/lib/domain-utils.d.ts +1 -0
  138. package/dist/lib/domain-utils.d.ts.map +1 -0
  139. package/dist/lib/domain-utils.js +11 -0
  140. package/dist/lib/domain-utils.js.map +1 -0
  141. package/dist/providers/EventPollingProvider.d.ts +1 -0
  142. package/dist/providers/EventPollingProvider.d.ts.map +1 -0
  143. package/dist/providers/EventPollingProvider.js +49 -0
  144. package/dist/providers/EventPollingProvider.js.map +1 -0
  145. package/dist/stores/event-store.d.ts +1 -0
  146. package/dist/stores/event-store.d.ts.map +1 -0
  147. package/dist/stores/event-store.js +341 -0
  148. package/dist/stores/event-store.js.map +1 -0
  149. package/dist/utils/format.d.ts +1 -0
  150. package/dist/utils/format.d.ts.map +1 -0
  151. package/dist/utils/format.js +11 -0
  152. package/dist/utils/format.js.map +1 -0
  153. package/package.json +7 -7
@@ -1 +1,2 @@
1
1
  export declare function EventsPage(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=EventsPage.d.ts.map
@@ -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":";AACA,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AACtD,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AACjE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAC5C,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAEtE,MAAM,WAAW,GAAG;IACnB,KAAK;IACL,iBAAiB;IACjB,gBAAgB;IAChB,eAAe;IACf,qBAAqB;IACrB,iBAAiB;IACjB,kBAAkB;IAClB,mBAAmB;IACnB,qBAAqB;IACrB,kBAAkB;IAClB,cAAc;IACd,gBAAgB;IAChB,aAAa;IACb,mBAAmB;IACnB,qBAAqB;IACrB,mBAAmB;IACnB,qBAAqB;IACrB,mBAAmB;CACV,CAAA;AAEV,MAAM,SAAS,GAAG,EAAE,CAAA;AAEpB,MAAM,UAAU,UAAU;IACzB,MAAM,SAAS,GAAG,iBAAiB,EAAE,CAAA;IAErC,8DAA8D;IAC9D,MAAM,SAAS,GAAG,SAAS,EAAE,CAAA;IAC7B,MAAM,SAAS,GAAG,aAAa,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;IACnD,MAAM,KAAK,GAAG,aAAa,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;IAE3C,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAS,KAAK,CAAC,CAAA;IAC3D,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;IAEvC,+CAA+C;IAC/C,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,aAAa,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAA;IAErH,wBAAwB;IACxB,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,EAAE;QACnC,IAAI,UAAU,KAAK,KAAK;YAAE,OAAO,aAAa,CAAA;QAC9C,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,UAAU,CAAC,CAAA;IAChE,CAAC,EAAE,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC,CAAA;IAE/B,mBAAmB;IACnB,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,EAAE;QACpC,OAAO,cAAc,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAA;IACxD,CAAC,EAAE,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,CAAA;IAE5B,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,EAAE,UAAkB,EAAE,EAAE;QAC3D,IAAI,CAAC,SAAS;YAAE,OAAM;QACtB,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,CAAC,CAAA;QACjF,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,CAAA;QAC5E,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;IAC9B,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAA;IAEf,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,CAAA;IACnC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC,CAAA;IAC/C,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,CAAA;IAEtD,OAAO,CACN,eAAK,SAAS,EAAC,WAAW,aAEzB,eAAK,SAAS,EAAC,yBAAyB,aACvC,iBAAO,SAAS,EAAC,wBAAwB,gCAExC,iBACC,KAAK,EAAE,UAAU,EACjB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;oCACf,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;oCAC7B,SAAS,CAAC,CAAC,CAAC,CAAA,CAAC,uCAAuC;gCACrD,CAAC,EACD,SAAS,EAAC,wDAAwD,YAEjE,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAC1B,iBAAmB,KAAK,EAAE,IAAI,YAC5B,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,IADzB,IAAI,CAER,CACT,CAAC,GACM,IACF,EACR,gBAAM,SAAS,EAAC,wBAAwB,aAAE,KAAK,qBAAqB,IAC/D,EAGL,KAAK,IAAI,cAAK,SAAS,EAAC,sBAAsB,YAAE,KAAK,GAAO,EAG7D,cAAK,SAAS,EAAC,6DAA6D,YAC1E,SAAS,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;oBACnC,CAAC,CAAC,cAAK,SAAS,EAAC,4BAA4B,2BAAiB;oBAC9D,CAAC,CAAC,eAAe,CAAC,MAAM,KAAK,CAAC;wBAC9B,CAAC,CAAC,cAAK,SAAS,EAAC,4BAA4B,gCAAsB;wBACnE,CAAC,CAAC,CACD,cAAK,SAAS,EAAC,2BAA2B,YACxC,eAAe,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE,EAAE,CAAC,CAClD,KAAC,QAAQ,IAER,KAAK,EAAE,KAAK,EACZ,UAAU,EAAE,aAAa,EACzB,MAAM,EAAE,UAAU,IAHb,GAAG,KAAK,CAAC,SAAS,IAAI,aAAa,EAAE,CAIzC,CACF,CAAC,GACG,CACN,GACG,EAGL,UAAU,GAAG,CAAC,IAAI,CAClB,eAAK,SAAS,EAAC,mCAAmC,aACjD,iBACC,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,EACzD,QAAQ,EAAE,MAAM,KAAK,CAAC,EACtB,SAAS,EAAC,qHAAqH,yBAGvH,EACT,gBAAM,SAAS,EAAC,wBAAwB,sBACjC,WAAW,UAAM,UAAU,IAC3B,EACP,iBACC,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC,EAC5C,QAAQ,EAAE,WAAW,IAAI,UAAU,EACnC,SAAS,EAAC,qHAAqH,qBAGvH,IACJ,CACN,IACI,CACN,CAAA;AACF,CAAC;AAED,SAAS,QAAQ,CAAC,EACjB,KAAK,EACL,UAAU,EACV,MAAM,GAKN;IACA,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC/C,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAE7C,MAAM,UAAU,GAA2B;QAC1C,eAAe,EAAE,6BAA6B;QAC9C,cAAc,EAAE,6BAA6B;QAC7C,aAAa,EAAE,2BAA2B;QAC1C,mBAAmB,EAAE,+BAA+B;QACpD,eAAe,EAAE,+BAA+B;QAChD,gBAAgB,EAAE,8BAA8B;QAChD,iBAAiB,EAAE,+BAA+B;QAClD,mBAAmB,EAAE,6BAA6B;QAClD,gBAAgB,EAAE,yBAAyB;QAC3C,YAAY,EAAE,2BAA2B;QACzC,cAAc,EAAE,6BAA6B;QAC7C,WAAW,EAAE,yBAAyB;QACtC,iBAAiB,EAAE,6BAA6B;QAChD,mBAAmB,EAAE,+BAA+B;QACpD,iBAAiB,EAAE,2BAA2B;KAC9C,CAAA;IAED,MAAM,SAAS,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,qBAAqB,IAAI,KAAK,CAAC,IAAI,KAAK,kBAAkB,CAAC;WACxF,KAAwD,CAAC,SAAS,CAAA;IAEvE,MAAM,OAAO,GAAG,SAAS,IAAI,KAAK,CAAC,CAAC,CAAE,KAA6B,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAA;IAElF,OAAO,CACN,eAAK,SAAS,EAAC,SAAS,aACvB,kBACC,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,EACrC,SAAS,EAAC,gEAAgE,aAE1E,eAAM,SAAS,EAAC,gDAAgD,YAC9D,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,kBAAkB,EAAE,GACzC,EACP,eACC,SAAS,EAAE,yDAAyD,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,cAAc,EAAE,YAE7G,KAAK,CAAC,IAAI,GACL,EACP,eAAM,SAAS,EAAC,gCAAgC,YAC9C,eAAe,CAAC,KAAK,CAAC,GACjB,EAGP,eAAK,SAAS,EAAC,kCAAkC,aAC/C,OAAO,IAAI,CACX,KAAC,SAAS,IACT,EAAE,EAAE,UAAU,OAAO,EAAE,EACvB,SAAS,EAAC,yCAAyC,sBAGxC,CACZ,EACA,SAAS,IAAI,CACb,KAAC,SAAS,IACT,EAAE,EAAE,aAAa,SAAS,EAAE,EAC5B,SAAS,EAAC,yCAAyC,yBAGxC,CACZ,EACD,iBACC,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;oCACpB,CAAC,CAAC,eAAe,EAAE,CAAA;oCACnB,UAAU,CAAC,IAAI,CAAC,CAAA;oCAChB,IAAI,CAAC;wCACJ,MAAM,MAAM,CAAC,UAAU,CAAC,CAAA;oCACzB,CAAC;4CAAS,CAAC;wCACV,UAAU,CAAC,KAAK,CAAC,CAAA;oCAClB,CAAC;gCACF,CAAC,EACD,QAAQ,EAAE,OAAO,EACjB,SAAS,EAAC,6DAA6D,YAEtE,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,GACxB,IACJ,EAEN,eAAM,SAAS,EAAC,yBAAyB,YAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAQ,IAC/D,EACR,QAAQ,IAAI,CACZ,cAAK,SAAS,EAAC,uBAAuB,YACrC,cAAK,SAAS,EAAC,yEAAyE,YAChF,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,GAChC,GACD,CACN,IACI,CACN,CAAA;AACF,CAAC;AAED,SAAS,eAAe,CAAC,KAAkB;IAC1C,MAAM,CAAC,GAAG,KAAqB,CAAA;IAC/B,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;QAChB,KAAK,iBAAiB;YACrB,OAAO,WAAW,CAAC,CAAC,QAAQ,EAAE,CAAA;QAC/B,KAAK,gBAAgB;YACpB,OAAO,gBAAgB,CAAA;QACxB,KAAK,eAAe;YACnB,OAAO,GAAG,CAAC,CAAC,cAAc,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAA;QACxD,KAAK,qBAAqB;YACzB,OAAO,GAAG,CAAC,CAAC,SAAS,MAAM,CAAC,CAAC,OAAO,EAAE,CAAA;QACvC,KAAK,iBAAiB;YACrB,OAAO,OAAO,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAA;QACxC,KAAK,kBAAkB;YACtB,OAAO,GAAG,CAAC,CAAC,UAAU,CAAC,MAAM,WAAW,CAAA;QACzC,KAAK,mBAAmB;YACvB,OAAO,UAAU,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAA;QACzC,KAAK,qBAAqB;YACzB,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,WAAW,YAAY,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,CAAA;QAC7D,KAAK,kBAAkB;YACtB,OAAO,CAAC,CAAC,KAAK,CAAA;QACf,KAAK,cAAc;YAClB,OAAO,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAA;QACvB,KAAK,gBAAgB;YACpB,OAAO,GAAG,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,YAAY,CAAA;QAC/C,KAAK,aAAa;YACjB,OAAO,GAAG,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAA;QACjD,KAAK,mBAAmB;YACvB,OAAO,GAAG,CAAC,CAAC,cAAc,MAAM,CAAC,CAAC,eAAe,SAAS,CAAA;QAC3D,KAAK,qBAAqB;YACzB,OAAO,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QACvE,KAAK,mBAAmB;YACvB,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QACrE;YACC,OAAO,EAAE,CAAA;IACX,CAAC;AACF,CAAC"}
@@ -1 +1,2 @@
1
1
  export declare function FilesPage(): import("react/jsx-runtime").JSX.Element | null;
2
+ //# sourceMappingURL=FilesPage.d.ts.map
@@ -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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"}
@@ -1 +1,2 @@
1
1
  export declare function LLMCallPage(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=LLMCallPage.d.ts.map
@@ -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"}
@@ -1 +1,2 @@
1
1
  export declare function LLMCallsPage(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=LLMCallsPage.d.ts.map
@@ -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