@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,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Debug Components Index
|
|
3
|
+
*
|
|
4
|
+
* Re-exports all debug-related components for external use.
|
|
5
|
+
*/
|
|
6
|
+
// Context (host app must provide this)
|
|
7
|
+
export { DebugContext, useDebugContext } from './DebugContext';
|
|
8
|
+
// Navigation utilities
|
|
9
|
+
export { DebugLink, useDebugNavigate, useDebugParams, useDebugSessionId } from './DebugNavigation';
|
|
10
|
+
// Shell (layout without router dependency)
|
|
11
|
+
export { BackIcon, DebugShell, getNavItemClassName, navItems } from './DebugShell';
|
|
12
|
+
// Detail components
|
|
13
|
+
export { LLMCallDetail } from './LLMCallDetail';
|
|
14
|
+
// Pages
|
|
15
|
+
export { AgentDetailPage, AgentsPage, CommunicationPage, DashboardPage, EventsPage, FilesPage, LLMCallPage, LLMCallsPage, LogsPage, MailboxPage, ServicesPage, TimelinePage, UserChatPage, } from './pages';
|
|
16
|
+
// Communication diagram components
|
|
17
|
+
export { CommunicationDiagram } from './communication/CommunicationDiagram';
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/debug/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,uCAAuC;AACvC,OAAO,EAAE,YAAY,EAAE,eAAe,EAA0B,MAAM,gBAAgB,CAAA;AAEtF,uBAAuB;AACvB,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAElG,2CAA2C;AAC3C,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,mBAAmB,EAAE,QAAQ,EAAgB,MAAM,cAAc,CAAA;AAEhG,oBAAoB;AACpB,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAE/C,QAAQ;AACR,OAAO,EACN,eAAe,EACf,UAAU,EACV,iBAAiB,EACjB,aAAa,EACb,UAAU,EACV,SAAS,EACT,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,YAAY,GACZ,MAAM,SAAS,CAAA;AAEhB,mCAAmC;AACnC,OAAO,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AgentDetailPage.d.ts","sourceRoot":"","sources":["../../../../src/components/debug/pages/AgentDetailPage.tsx"],"names":[],"mappings":"AA6GA,wBAAgB,eAAe,CAAC,EAC/B,OAAO,EAAE,WAAW,GACpB,GAAE;IACF,OAAO,CAAC,EAAE,MAAM,CAAC;CACZ,2CAiQL"}
|
|
@@ -0,0 +1,365 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { AgentId } from "@roj-ai/shared";
|
|
3
|
+
import { useCallback, useMemo, useState } from "react";
|
|
4
|
+
import { api, unwrap } from "@roj-ai/client";
|
|
5
|
+
import { useAgentDetail, useEventStore } from "../../../stores/event-store";
|
|
6
|
+
import { formatDuration } from "../../../utils/format";
|
|
7
|
+
import { DebugLink, useDebugParams, useDebugSessionId, } from "../DebugNavigation";
|
|
8
|
+
function formatTime(ts) {
|
|
9
|
+
if (ts === undefined)
|
|
10
|
+
return null;
|
|
11
|
+
return new Date(ts).toLocaleTimeString();
|
|
12
|
+
}
|
|
13
|
+
function Timestamp({ value }) {
|
|
14
|
+
const formatted = formatTime(value);
|
|
15
|
+
if (!formatted)
|
|
16
|
+
return null;
|
|
17
|
+
return (_jsx("span", { className: "text-[10px] text-gray-400 tabular-nums ml-auto shrink-0", children: formatted }));
|
|
18
|
+
}
|
|
19
|
+
function CopyButton({ text }) {
|
|
20
|
+
const [copied, setCopied] = useState(false);
|
|
21
|
+
const handleCopy = useCallback((e) => {
|
|
22
|
+
e.stopPropagation();
|
|
23
|
+
navigator.clipboard.writeText(text);
|
|
24
|
+
setCopied(true);
|
|
25
|
+
setTimeout(() => setCopied(false), 1500);
|
|
26
|
+
}, [text]);
|
|
27
|
+
return (_jsx("button", { type: "button", onClick: handleCopy, className: "absolute top-1.5 right-1.5 opacity-0 group-hover/code:opacity-100 transition-opacity p-1 rounded bg-white/80 hover:bg-gray-100 border border-gray-200 cursor-pointer", title: "Copy to clipboard", children: copied ? (_jsx("svg", { className: "w-3.5 h-3.5 text-green-600", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M5 13l4 4L19 7" }) })) : (_jsx("svg", { className: "w-3.5 h-3.5 text-gray-500", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z" }) })) }));
|
|
28
|
+
}
|
|
29
|
+
function CodeBlock({ children, variant = "default", }) {
|
|
30
|
+
const styles = {
|
|
31
|
+
default: "bg-gray-50 border-gray-200 text-gray-800",
|
|
32
|
+
success: "bg-green-50 border-green-200 text-gray-800",
|
|
33
|
+
error: "bg-red-50 border-red-200 text-red-800",
|
|
34
|
+
};
|
|
35
|
+
return (_jsxs("div", { className: "relative group/code", children: [_jsx("pre", { className: `p-2 rounded-lg border overflow-x-auto text-[11px] font-mono whitespace-pre-wrap break-words ${styles[variant]}`, children: children }), _jsx(CopyButton, { text: children })] }));
|
|
36
|
+
}
|
|
37
|
+
export function AgentDetailPage({ agentId: agentIdProp, } = {}) {
|
|
38
|
+
const { agentId: agentIdParam } = useDebugParams();
|
|
39
|
+
const agentId = agentIdProp ?? agentIdParam ?? "";
|
|
40
|
+
const sessionId = useDebugSessionId();
|
|
41
|
+
const detail = useAgentDetail(AgentId(agentId));
|
|
42
|
+
const isLoading = useEventStore((s) => s.isLoading);
|
|
43
|
+
const handleRewind = useCallback(async (messageIndex) => {
|
|
44
|
+
if (!sessionId || !agentId)
|
|
45
|
+
return;
|
|
46
|
+
unwrap(await api.call("agents.rewind", {
|
|
47
|
+
sessionId,
|
|
48
|
+
agentId: AgentId(agentId),
|
|
49
|
+
messageIndex,
|
|
50
|
+
}));
|
|
51
|
+
}, [sessionId, agentId]);
|
|
52
|
+
if (isLoading) {
|
|
53
|
+
return _jsx("div", { className: "text-gray-400 text-sm", children: "Loading..." });
|
|
54
|
+
}
|
|
55
|
+
if (!detail) {
|
|
56
|
+
return _jsx("div", { className: "text-gray-400 text-sm", children: "Agent not found" });
|
|
57
|
+
}
|
|
58
|
+
const { counters } = detail;
|
|
59
|
+
return (_jsx("div", { className: "text-sm", children: _jsxs("div", { className: "flex gap-5 items-start", children: [_jsx("div", { className: "flex-[2] min-w-0 space-y-5", children: _jsx(CollapsibleSection, { title: "Conversation History", count: detail.conversationHistory.length, defaultOpen: true, children: detail.conversationHistory.length === 0 ? (_jsx("div", { className: "text-gray-400", children: "Empty" })) : (_jsx(ConversationGroups, { messages: detail.conversationHistory, onRewind: handleRewind })) }) }), _jsxs("div", { className: "flex-1 min-w-0 space-y-4 sticky top-0", children: [_jsxs("div", { className: "bg-white rounded-2xl shadow-card p-4", children: [_jsxs("div", { className: "flex items-center gap-3 mb-4", children: [_jsx("div", { className: "w-9 h-9 rounded-xl bg-accent-peri/15 flex items-center justify-center shrink-0", children: _jsx("svg", { className: "w-4.5 h-4.5 text-accent-peri", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 1.5, d: "M9.75 17L9 20l-1 1h8l-1-1-.75-3M3 13h18M5 17h14a2 2 0 002-2V5a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z" }) }) }), _jsxs("div", { className: "flex-1 min-w-0", children: [_jsx("div", { className: "font-bold text-gray-900", children: detail.definitionName }), _jsx("div", { className: "text-[11px] text-gray-400 font-mono truncate", children: detail.id })] }), _jsx(StatusBadge, { status: detail.status })] }), detail.parentId && (_jsxs("div", { className: "text-[11px] text-gray-400 mb-3", children: ["Parent:", " ", _jsxs(DebugLink, { to: `agents/${detail.parentId}`, className: "text-accent-peri hover:underline font-mono", children: [detail.parentId.slice(0, 12), "..."] })] })), detail.pauseReason && (_jsxs("div", { className: "bg-red-50 border border-red-200 rounded-xl px-3 py-2 mb-3 flex items-center gap-2", children: [_jsx("div", { className: "w-2 h-2 rounded-full bg-red-500 shrink-0" }), _jsxs("span", { className: "text-[11px] font-semibold text-red-700 flex-1", children: ["Paused", detail.pauseMessage
|
|
60
|
+
? `: ${detail.pauseMessage}`
|
|
61
|
+
: ` (${detail.pauseReason})`] }), _jsx(ResumeAgentButton, { sessionId: sessionId, agentId: agentId })] })), _jsxs("div", { className: "grid grid-cols-2 gap-2", children: [_jsx(CounterItem, { label: "Inferences", value: counters.inferenceCount }), _jsx(CounterItem, { label: "Tool Calls", value: counters.toolCallCount }), _jsx(CounterItem, { label: "Spawned", value: counters.spawnedAgentCount }), _jsx(CounterItem, { label: "Messages", value: counters.messagesSentCount })] }), detail.cost > 0 && (_jsxs("div", { className: "mt-2 bg-emerald-50 rounded-xl px-3 py-2.5 border border-emerald-100 flex items-center gap-2", children: [_jsx("svg", { className: "w-4 h-4 text-emerald-600 shrink-0", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 1.5, d: "M12 6v12m-3-2.818l.879.659c1.171.879 3.07.879 4.242 0 1.172-.879 1.172-2.303 0-3.182C13.536 12.219 12.768 12 12 12c-.725 0-1.45-.22-2.003-.659-1.106-.879-1.106-2.303 0-3.182s2.9-.879 4.006 0l.415.33M21 12a9 9 0 11-18 0 9 9 0 0118 0z" }) }), _jsx("span", { className: "text-[10px] text-emerald-600 uppercase tracking-wider font-medium", children: "Cost" }), _jsxs("span", { className: "ml-auto text-sm font-bold tabular-nums text-emerald-700", children: ["$", detail.cost.toFixed(4)] })] }))] }), _jsx(CollapsibleSection, { title: "Pending Tool Calls", count: detail.pendingToolCalls.length, warnIfPositive: true, defaultOpen: detail.pendingToolCalls.length > 0, children: detail.pendingToolCalls.length === 0 ? (_jsx("div", { className: "text-gray-400", children: "None" })) : (_jsx("div", { className: "space-y-2", children: detail.pendingToolCalls.map((tool) => (_jsx(ToolCallCard, { tool: tool }, tool.id))) })) }), _jsx(CollapsibleSection, { title: "Mailbox", count: detail.mailbox.length, defaultOpen: detail.mailbox.some((m) => !m.consumed), children: detail.mailbox.length === 0 ? (_jsx("div", { className: "text-gray-400", children: "Empty" })) : (_jsx("div", { className: "space-y-2", children: detail.mailbox.map((msg) => (_jsxs("div", { className: `rounded-xl px-3 py-2.5 border ${msg.consumed
|
|
62
|
+
? "bg-gray-50 border-gray-100"
|
|
63
|
+
: "bg-amber-50 border-amber-200"}`, children: [_jsxs("div", { className: "flex items-center gap-2 text-[11px] text-gray-400 mb-1.5 flex-wrap", children: [_jsx("span", { className: "font-medium", children: "From:" }), msg.from !== "user" &&
|
|
64
|
+
msg.from !== "orchestrator" &&
|
|
65
|
+
msg.from !== "communicator" ? (_jsxs(DebugLink, { to: `agents/${msg.from}`, className: "text-accent-peri hover:underline font-mono", children: [msg.from.slice(0, 8), "..."] })) : (_jsx("span", { className: "font-semibold text-gray-500", children: msg.from })), msg.consumed && (_jsx("span", { className: "text-[10px] bg-green-100 text-green-700 px-1.5 py-0.5 rounded-full font-medium", children: "consumed" })), _jsx("span", { className: "text-[10px] text-gray-400 tabular-nums ml-auto", children: new Date(msg.timestamp).toLocaleTimeString() })] }), _jsx("div", { className: "whitespace-pre-wrap break-words text-gray-700 text-[12px] leading-relaxed", children: msg.content })] }, msg.id))) })) }), detail.loadedSkills.length > 0 && (_jsx(CollapsibleSection, { title: "Loaded Skills", count: detail.loadedSkills.length, defaultOpen: false, children: _jsx("div", { className: "flex flex-wrap gap-1.5", children: detail.loadedSkills.map((skill) => (_jsxs("div", { className: "bg-accent-peri/10 text-gray-700 px-2 py-0.5 rounded-full text-[11px] font-medium", children: [skill.name, _jsxs("span", { className: "text-gray-400 ml-1", children: [formatDuration(Date.now() - skill.loadedAt), " ago"] })] }, skill.id))) }) })), detail.typedInput !== undefined && (_jsx(CollapsibleSection, { title: "Typed Input", defaultOpen: false, children: _jsx("pre", { className: "bg-gray-50 rounded-xl px-3 py-2.5 text-[11px] font-mono overflow-x-auto text-gray-700", children: JSON.stringify(detail.typedInput, null, 2) }) })), _jsx(SendMessageForm, { sessionId: sessionId, agentId: agentId })] })] }) }));
|
|
66
|
+
}
|
|
67
|
+
// ============================================================================
|
|
68
|
+
// CollapsibleSection
|
|
69
|
+
// ============================================================================
|
|
70
|
+
function CollapsibleSection({ title, count, warnIfPositive, defaultOpen = true, children, }) {
|
|
71
|
+
const [open, setOpen] = useState(defaultOpen);
|
|
72
|
+
const isWarning = warnIfPositive && count !== undefined && count > 0;
|
|
73
|
+
return (_jsxs("div", { className: "bg-white rounded-2xl shadow-card overflow-hidden", children: [_jsxs("button", { type: "button", onClick: () => setOpen(!open), className: "w-full flex items-center gap-2 px-4 py-3 text-left hover:bg-gray-50 transition-colors cursor-pointer", children: [_jsx("svg", { className: `w-3.5 h-3.5 text-gray-400 transition-transform ${open ? "rotate-90" : ""}`, fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M9 5l7 7-7 7" }) }), _jsx("span", { className: "text-sm font-semibold text-gray-900", children: title }), count !== undefined && (_jsx("span", { className: `text-[11px] px-2 py-0.5 rounded-full font-medium tabular-nums ${isWarning
|
|
74
|
+
? "bg-amber-100 text-amber-700"
|
|
75
|
+
: "bg-gray-100 text-gray-500"}`, children: count }))] }), open && _jsx("div", { className: "px-4 pb-4", children: children })] }));
|
|
76
|
+
}
|
|
77
|
+
// ============================================================================
|
|
78
|
+
// CounterItem
|
|
79
|
+
// ============================================================================
|
|
80
|
+
const counterIcons = {
|
|
81
|
+
Inferences: (_jsx("svg", { className: "w-3.5 h-3.5", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 1.5, d: "M9.813 15.904L9 18.75l-.813-2.846a4.5 4.5 0 00-3.09-3.09L2.25 12l2.846-.813a4.5 4.5 0 003.09-3.09L9 5.25l.813 2.846a4.5 4.5 0 003.09 3.09L15.75 12l-2.846.813a4.5 4.5 0 00-3.09 3.09zM18.259 8.715L18 9.75l-.259-1.035a3.375 3.375 0 00-2.455-2.456L14.25 6l1.036-.259a3.375 3.375 0 002.455-2.456L18 2.25l.259 1.035a3.375 3.375 0 002.455 2.456L21.75 6l-1.036.259a3.375 3.375 0 00-2.455 2.456z" }) })),
|
|
82
|
+
"Tool Calls": (_jsx("svg", { className: "w-3.5 h-3.5", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 1.5, d: "M11.42 15.17l-5.1-5.1a1.5 1.5 0 010-2.12l.88-.88a1.5 1.5 0 012.12 0l2.83 2.83 5.66-5.66a1.5 1.5 0 012.12 0l.88.88a1.5 1.5 0 010 2.12l-7.07 7.07a1.5 1.5 0 01-2.12-.14z" }) })),
|
|
83
|
+
Spawned: (_jsx("svg", { className: "w-3.5 h-3.5", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 1.5, d: "M18 18.72a9.094 9.094 0 003.741-.479 3 3 0 00-4.682-2.72m.94 3.198l.001.031c0 .225-.012.447-.037.666A11.944 11.944 0 0112 21c-2.17 0-4.207-.576-5.963-1.584A6.062 6.062 0 016 18.719m12 0a5.971 5.971 0 00-.941-3.197m0 0A5.995 5.995 0 0012 12.75a5.995 5.995 0 00-5.058 2.772m0 0a3 3 0 00-4.681 2.72 8.986 8.986 0 003.74.477m.94-3.197a5.971 5.971 0 00-.94 3.197M15 6.75a3 3 0 11-6 0 3 3 0 016 0zm6 3a2.25 2.25 0 11-4.5 0 2.25 2.25 0 014.5 0zm-13.5 0a2.25 2.25 0 11-4.5 0 2.25 2.25 0 014.5 0z" }) })),
|
|
84
|
+
Messages: (_jsx("svg", { className: "w-3.5 h-3.5", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 1.5, d: "M8.625 12a.375.375 0 11-.75 0 .375.375 0 01.75 0zm0 0H8.25m4.125 0a.375.375 0 11-.75 0 .375.375 0 01.75 0zm0 0H12m4.125 0a.375.375 0 11-.75 0 .375.375 0 01.75 0zm0 0h-.375M21 12c0 4.556-4.03 8.25-9 8.25a9.764 9.764 0 01-2.555-.337A5.972 5.972 0 015.41 20.97a5.969 5.969 0 01-.474-.065 4.48 4.48 0 00.978-2.025c.09-.457-.133-.901-.467-1.226C3.93 16.178 3 14.189 3 12c0-4.556 4.03-8.25 9-8.25s9 3.694 9 8.25z" }) })),
|
|
85
|
+
};
|
|
86
|
+
function CounterItem({ label, value }) {
|
|
87
|
+
return (_jsxs("div", { className: "bg-gray-50 rounded-xl px-3 py-2.5 border border-gray-100", children: [_jsxs("div", { className: "flex items-center gap-1.5 mb-1", children: [_jsx("span", { className: "text-gray-400", children: counterIcons[label] }), _jsx("span", { className: "text-[10px] text-gray-400 uppercase tracking-wider font-medium", children: label })] }), _jsx("div", { className: "text-lg font-bold tabular-nums text-gray-900", children: value })] }));
|
|
88
|
+
}
|
|
89
|
+
// ============================================================================
|
|
90
|
+
// ToolCallCard
|
|
91
|
+
// ============================================================================
|
|
92
|
+
function ToolCallCard({ tool }) {
|
|
93
|
+
const [expanded, setExpanded] = useState(false);
|
|
94
|
+
return (_jsxs("div", { className: "rounded-xl border border-gray-100 bg-gray-50 overflow-hidden", children: [_jsxs("button", { type: "button", onClick: () => setExpanded(!expanded), className: "w-full flex items-center gap-2 px-3 py-2.5 text-left hover:bg-gray-100 transition-colors cursor-pointer", children: [_jsx(ToolStatusDot, { status: tool.status }), _jsx("span", { className: "font-mono font-medium text-sm text-gray-900", children: tool.name }), _jsx(ToolStatusBadge, { status: tool.status }), _jsx("span", { className: "text-[10px] text-gray-400 font-mono ml-auto", children: tool.id.slice(0, 12) }), _jsx("svg", { className: `w-3 h-3 text-gray-400 transition-transform shrink-0 ${expanded ? "rotate-90" : ""}`, fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M9 5l7 7-7 7" }) })] }), expanded && (_jsxs("div", { className: "px-3 pb-3 space-y-2 border-t border-gray-100", children: [tool.input !== undefined && (_jsxs("div", { className: "mt-2", children: [_jsx("div", { className: "text-[10px] text-gray-500 uppercase tracking-wider font-medium mb-1", children: "Input" }), _jsx(CodeBlock, { children: JSON.stringify(tool.input, null, 2) })] })), tool.result !== undefined && (_jsxs("div", { children: [_jsx("div", { className: "text-[10px] text-green-700 uppercase tracking-wider font-medium mb-1", children: "Result" }), _jsx(CodeBlock, { variant: "success", children: typeof tool.result === "string"
|
|
95
|
+
? tool.result
|
|
96
|
+
: JSON.stringify(tool.result, null, 2) })] })), tool.error && (_jsxs("div", { children: [_jsx("div", { className: "text-[10px] text-red-700 uppercase tracking-wider font-medium mb-1", children: "Error" }), _jsx(CodeBlock, { variant: "error", children: tool.error })] }))] }))] }));
|
|
97
|
+
}
|
|
98
|
+
function groupConversation(messages) {
|
|
99
|
+
const groups = [];
|
|
100
|
+
let i = 0;
|
|
101
|
+
while (i < messages.length) {
|
|
102
|
+
const msg = messages[i];
|
|
103
|
+
if (msg.role === "assistant" && msg.toolCalls && msg.toolCalls.length > 0) {
|
|
104
|
+
const toolResponses = new Map();
|
|
105
|
+
let j = i + 1;
|
|
106
|
+
while (j < messages.length) {
|
|
107
|
+
const nextMsg = messages[j];
|
|
108
|
+
if (nextMsg.role !== "tool")
|
|
109
|
+
break;
|
|
110
|
+
toolResponses.set(nextMsg.toolCallId, nextMsg);
|
|
111
|
+
j++;
|
|
112
|
+
}
|
|
113
|
+
groups.push({
|
|
114
|
+
type: "assistant-with-tools",
|
|
115
|
+
assistantMessage: msg,
|
|
116
|
+
toolInteractions: msg.toolCalls.map((tc) => ({
|
|
117
|
+
call: tc,
|
|
118
|
+
response: toolResponses.get(tc.id),
|
|
119
|
+
})),
|
|
120
|
+
messageIndex: i,
|
|
121
|
+
});
|
|
122
|
+
i = j;
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
groups.push({ type: "message", message: msg, messageIndex: i });
|
|
126
|
+
i++;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return groups;
|
|
130
|
+
}
|
|
131
|
+
function ConversationGroups({ messages, onRewind, }) {
|
|
132
|
+
const groups = useMemo(() => groupConversation(messages), [messages]);
|
|
133
|
+
// Compute previous assistant message's total input for cache validation.
|
|
134
|
+
// promptTokens (= Anthropic input_tokens) is the TOTAL input including cached/cache-write portions.
|
|
135
|
+
const prevTotalInputs = useMemo(() => {
|
|
136
|
+
const result = [];
|
|
137
|
+
let prevTotal;
|
|
138
|
+
for (const group of groups) {
|
|
139
|
+
result.push(prevTotal);
|
|
140
|
+
if (group.type === "assistant-with-tools") {
|
|
141
|
+
const msg = group.assistantMessage;
|
|
142
|
+
if (msg.promptTokens !== undefined) {
|
|
143
|
+
prevTotal = msg.promptTokens;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return result;
|
|
148
|
+
}, [groups]);
|
|
149
|
+
return (_jsx("div", { className: "space-y-3", children: groups.map((group, idx) => {
|
|
150
|
+
if (group.type === "message") {
|
|
151
|
+
return _jsx(ConversationMessage, { msg: group.message }, idx);
|
|
152
|
+
}
|
|
153
|
+
return (_jsx(AssistantToolGroup, { group: group, expectedCacheRead: prevTotalInputs[idx], onRewind: onRewind }, idx));
|
|
154
|
+
}) }));
|
|
155
|
+
}
|
|
156
|
+
// ============================================================================
|
|
157
|
+
// AssistantToolGroup
|
|
158
|
+
// ============================================================================
|
|
159
|
+
function formatTokens(n) {
|
|
160
|
+
if (n >= 1000000)
|
|
161
|
+
return `${(n / 1000000).toFixed(1)}M`;
|
|
162
|
+
if (n >= 1000)
|
|
163
|
+
return `${(n / 1000).toFixed(1)}k`;
|
|
164
|
+
return n.toString();
|
|
165
|
+
}
|
|
166
|
+
function CacheStatsLine({ msg, expectedCacheRead, }) {
|
|
167
|
+
if (msg.promptTokens === undefined)
|
|
168
|
+
return null;
|
|
169
|
+
// promptTokens (= Anthropic input_tokens) is TOTAL input including cached/cache-write.
|
|
170
|
+
// Uncached = total - cached - cache_write (the remainder billed at full price).
|
|
171
|
+
const totalInput = msg.promptTokens ?? 0;
|
|
172
|
+
const cached = msg.cachedTokens ?? 0;
|
|
173
|
+
const cacheWrite = msg.cacheWriteTokens ?? 0;
|
|
174
|
+
const uncached = totalInput - cached - cacheWrite;
|
|
175
|
+
// Cache validation: compare actual cache read with expected (prev call total input)
|
|
176
|
+
let cacheValidation;
|
|
177
|
+
if (expectedCacheRead !== undefined && expectedCacheRead > 0 && cached > 0) {
|
|
178
|
+
const ratio = cached / expectedCacheRead;
|
|
179
|
+
cacheValidation = { ratio, ok: ratio >= 0.9 };
|
|
180
|
+
}
|
|
181
|
+
return (_jsxs("div", { className: "flex items-center gap-1.5 text-[10px] tabular-nums flex-wrap", children: [uncached > 0 && (_jsxs("span", { className: "text-gray-400", children: [formatTokens(uncached), " in"] })), cached > 0 && (_jsxs("span", { className: "text-blue-500", children: [uncached > 0 ? "+ " : "", formatTokens(cached), " cached"] })), cacheWrite > 0 && (_jsxs("span", { className: "text-amber-500", children: ["+ ", formatTokens(cacheWrite), " write"] })), cacheValidation && (_jsxs(_Fragment, { children: [_jsx("span", { className: "text-gray-300", children: "|" }), _jsxs("span", { className: cacheValidation.ok ? "text-green-600" : "text-red-500", children: ["prev ", formatTokens(expectedCacheRead), " \u2192", " ", (cacheValidation.ratio * 100).toFixed(0), "% hit"] })] }))] }));
|
|
182
|
+
}
|
|
183
|
+
function AssistantToolGroup({ group, expectedCacheRead, onRewind, }) {
|
|
184
|
+
const { assistantMessage, toolInteractions } = group;
|
|
185
|
+
const [textExpanded, setTextExpanded] = useState(false);
|
|
186
|
+
const hasText = assistantMessage.content.trim().length > 0;
|
|
187
|
+
const isTextTruncated = assistantMessage.content !== assistantMessage.fullContent;
|
|
188
|
+
const displayText = textExpanded
|
|
189
|
+
? assistantMessage.fullContent
|
|
190
|
+
: assistantMessage.content;
|
|
191
|
+
return (_jsxs("div", { className: "rounded-xl bg-white border border-gray-100 border-l-[3px] border-l-green-500 px-3.5 py-3", children: [_jsxs("div", { className: "flex items-center gap-2 mb-1", children: [_jsx("span", { className: "text-[10px] font-bold uppercase tracking-wider text-green-700", children: "assistant" }), toolInteractions.length > 0 && (_jsxs("span", { className: "text-[10px] bg-green-100 text-green-700 px-1.5 py-0.5 rounded-full font-medium", children: [toolInteractions.length, " tool", toolInteractions.length !== 1 ? "s" : ""] })), assistantMessage.cost !== undefined && assistantMessage.cost > 0 && (_jsxs("span", { className: "text-[10px] text-emerald-600 font-medium tabular-nums", children: ["$", assistantMessage.cost.toFixed(4)] })), assistantMessage.llmCallId && (_jsx(DebugLink, { to: `llm-calls/${assistantMessage.llmCallId}`, className: "text-[10px] text-accent-peri hover:underline font-medium", children: "view llm call \u2192" })), onRewind && (_jsx("button", { type: "button", onClick: () => onRewind(group.messageIndex), className: "text-[10px] text-orange-600 hover:underline font-medium cursor-pointer", children: "retry from here" })), _jsx(Timestamp, { value: assistantMessage.timestamp })] }), _jsx(CacheStatsLine, { msg: assistantMessage, expectedCacheRead: expectedCacheRead }), hasText && (_jsxs("div", { className: "mt-1", children: [_jsx("div", { className: "whitespace-pre-wrap break-words text-gray-700 text-[12px] leading-relaxed", children: displayText }), isTextTruncated && (_jsx("button", { type: "button", onClick: () => setTextExpanded(!textExpanded), className: "text-[11px] text-accent-peri hover:underline mt-1 font-medium cursor-pointer", children: textExpanded ? "Show less" : "Show more" }))] })), _jsx("div", { className: `space-y-1.5 ${hasText ? "mt-2" : ""}`, children: toolInteractions.map(({ call, response }) => (_jsx(ToolInteractionCard, { call: call, response: response }, call.id))) })] }));
|
|
192
|
+
}
|
|
193
|
+
// ============================================================================
|
|
194
|
+
// ToolInteractionCard
|
|
195
|
+
// ============================================================================
|
|
196
|
+
function oneLinePreview(value, maxLen = 80) {
|
|
197
|
+
const str = typeof value === "string" ? value : JSON.stringify(value);
|
|
198
|
+
const line = str.replace(/\n/g, " ").trim();
|
|
199
|
+
return line.length > maxLen ? line.slice(0, maxLen) + "…" : line;
|
|
200
|
+
}
|
|
201
|
+
function ToolInteractionCard({ call, response, }) {
|
|
202
|
+
const [expanded, setExpanded] = useState(false);
|
|
203
|
+
const [resultExpanded, setResultExpanded] = useState(false);
|
|
204
|
+
const status = response
|
|
205
|
+
? response.isError
|
|
206
|
+
? "failed"
|
|
207
|
+
: "completed"
|
|
208
|
+
: "pending";
|
|
209
|
+
const isResultTruncated = response !== undefined && response.content !== response.fullContent;
|
|
210
|
+
const displayResult = resultExpanded
|
|
211
|
+
? response?.fullContent
|
|
212
|
+
: response?.content;
|
|
213
|
+
return (_jsxs("div", { className: `rounded-lg border overflow-hidden ${response?.isError
|
|
214
|
+
? "border-red-200 bg-red-50/50"
|
|
215
|
+
: "border-gray-200 bg-gray-50/50"}`, children: [_jsxs("button", { type: "button", onClick: () => setExpanded(!expanded), className: "w-full flex items-start gap-2 px-2.5 py-2 text-left hover:bg-white/60 transition-colors cursor-pointer", children: [_jsx(ToolStatusDot, { status: status }), _jsxs("div", { className: "flex-1 min-w-0", children: [_jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx("span", { className: "font-mono font-medium text-[11px] text-gray-800", children: call.name }), response?.isError && (_jsx("span", { className: "text-[9px] bg-red-100 text-red-700 px-1.5 py-0.5 rounded-full font-semibold", children: "error" })), _jsx(Timestamp, { value: response?.timestamp })] }), !expanded && (_jsxs("div", { className: "mt-0.5 space-y-0", children: [call.input !== undefined && (_jsxs("div", { className: "text-[10px] text-gray-500 font-mono truncate", children: ["\u2191 ", oneLinePreview(call.input)] })), response && (_jsxs("div", { className: `text-[10px] font-mono truncate ${response.isError ? "text-red-600" : "text-gray-500"}`, children: ["\u2193 ", oneLinePreview(response.content)] }))] }))] }), _jsx("svg", { className: `w-3 h-3 text-gray-400 transition-transform shrink-0 mt-0.5 ${expanded ? "rotate-90" : ""}`, fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M9 5l7 7-7 7" }) })] }), expanded && (_jsxs("div", { className: "px-2.5 pb-2.5 space-y-2 border-t border-gray-100", children: [call.input !== undefined && (_jsxs("div", { className: "mt-2", children: [_jsx("div", { className: "text-[9px] text-gray-500 uppercase tracking-wider font-medium mb-1", children: "Input" }), _jsx(CodeBlock, { children: JSON.stringify(call.input, null, 2) })] })), response && !response.isError && (_jsxs("div", { children: [_jsx("div", { className: "text-[9px] text-green-700 uppercase tracking-wider font-medium mb-1", children: "Result" }), _jsx(CodeBlock, { variant: "success", children: displayResult ?? "" }), isResultTruncated && (_jsx("button", { type: "button", onClick: (e) => {
|
|
216
|
+
e.stopPropagation();
|
|
217
|
+
setResultExpanded(!resultExpanded);
|
|
218
|
+
}, className: "text-[10px] text-accent-peri hover:underline mt-0.5 font-medium cursor-pointer", children: resultExpanded ? "Show less" : "Show more" }))] })), response?.isError && (_jsxs("div", { children: [_jsx("div", { className: "text-[9px] text-red-700 uppercase tracking-wider font-medium mb-1", children: "Error" }), _jsx(CodeBlock, { variant: "error", children: displayResult ?? "" }), isResultTruncated && (_jsx("button", { type: "button", onClick: (e) => {
|
|
219
|
+
e.stopPropagation();
|
|
220
|
+
setResultExpanded(!resultExpanded);
|
|
221
|
+
}, className: "text-[10px] text-accent-peri hover:underline mt-0.5 font-medium cursor-pointer", children: resultExpanded ? "Show less" : "Show more" }))] }))] }))] }));
|
|
222
|
+
}
|
|
223
|
+
// ============================================================================
|
|
224
|
+
// ConversationMessage (user, system, orphan tool)
|
|
225
|
+
// ============================================================================
|
|
226
|
+
const roleStyles = {
|
|
227
|
+
user: {
|
|
228
|
+
bg: "bg-white",
|
|
229
|
+
leftBorder: "border-l-blue-500",
|
|
230
|
+
label: "text-blue-600",
|
|
231
|
+
},
|
|
232
|
+
assistant: {
|
|
233
|
+
bg: "bg-white",
|
|
234
|
+
leftBorder: "border-l-green-500",
|
|
235
|
+
label: "text-green-700",
|
|
236
|
+
},
|
|
237
|
+
tool: {
|
|
238
|
+
bg: "bg-white",
|
|
239
|
+
leftBorder: "border-l-indigo-400",
|
|
240
|
+
label: "text-indigo-600",
|
|
241
|
+
},
|
|
242
|
+
system: {
|
|
243
|
+
bg: "bg-gray-50",
|
|
244
|
+
leftBorder: "border-l-gray-300",
|
|
245
|
+
label: "text-gray-500",
|
|
246
|
+
},
|
|
247
|
+
};
|
|
248
|
+
function ConversationMessage({ msg }) {
|
|
249
|
+
const [expanded, setExpanded] = useState(false);
|
|
250
|
+
const style = roleStyles[msg.role] ?? roleStyles.system;
|
|
251
|
+
const isTruncated = msg.content !== msg.fullContent;
|
|
252
|
+
const displayContent = expanded ? msg.fullContent : msg.content;
|
|
253
|
+
const isError = msg.role === "tool" && msg.isError;
|
|
254
|
+
return (_jsxs("div", { className: `rounded-xl border border-gray-100 border-l-[3px] px-3.5 py-3 ${isError
|
|
255
|
+
? "bg-red-50 border-l-red-500"
|
|
256
|
+
: `${style.bg} ${style.leftBorder}`}`, children: [_jsxs("div", { className: "flex items-center gap-2 mb-2", children: [_jsx("span", { className: `text-[10px] font-bold uppercase tracking-wider ${isError ? "text-red-700" : style.label}`, children: msg.role }), msg.role === "tool" && (_jsxs(_Fragment, { children: [_jsx("span", { className: "text-[10px] text-gray-400 font-mono", children: msg.toolCallId.slice(0, 12) }), msg.isError && (_jsx("span", { className: "text-[9px] bg-red-100 text-red-700 px-1.5 py-0.5 rounded-full font-semibold", children: "error" }))] })), msg.role === "assistant" && msg.cost !== undefined && msg.cost > 0 && (_jsxs("span", { className: "text-[10px] text-emerald-600 font-medium tabular-nums", children: ["$", msg.cost.toFixed(4)] })), _jsx(Timestamp, { value: msg.timestamp })] }), _jsx("div", { className: `whitespace-pre-wrap break-words text-[12px] leading-relaxed ${isError ? "text-red-800" : "text-gray-700"}`, children: displayContent }), isTruncated && (_jsx("button", { type: "button", onClick: () => setExpanded(!expanded), className: "text-[11px] text-accent-peri hover:underline mt-1.5 font-medium cursor-pointer", children: expanded ? "Show less" : "Show more" }))] }));
|
|
257
|
+
}
|
|
258
|
+
// ============================================================================
|
|
259
|
+
// SendMessageForm
|
|
260
|
+
// ============================================================================
|
|
261
|
+
function SendMessageForm({ sessionId, agentId, }) {
|
|
262
|
+
const [content, setContent] = useState("");
|
|
263
|
+
const [senderType, setSenderType] = useState("user");
|
|
264
|
+
const [customSender, setCustomSender] = useState("");
|
|
265
|
+
const [sending, setSending] = useState(false);
|
|
266
|
+
const [error, setError] = useState(null);
|
|
267
|
+
const handleSend = useCallback(async () => {
|
|
268
|
+
if (!content.trim())
|
|
269
|
+
return;
|
|
270
|
+
setSending(true);
|
|
271
|
+
setError(null);
|
|
272
|
+
try {
|
|
273
|
+
if (senderType === "debug") {
|
|
274
|
+
unwrap(await api.call("mailbox.send", {
|
|
275
|
+
sessionId,
|
|
276
|
+
toAgentId: AgentId(agentId),
|
|
277
|
+
content: content.trim(),
|
|
278
|
+
debug: true,
|
|
279
|
+
}));
|
|
280
|
+
}
|
|
281
|
+
else {
|
|
282
|
+
unwrap(await api.call("user-chat.sendMessage", {
|
|
283
|
+
sessionId,
|
|
284
|
+
agentId: AgentId(agentId),
|
|
285
|
+
content: content.trim(),
|
|
286
|
+
}));
|
|
287
|
+
}
|
|
288
|
+
setContent("");
|
|
289
|
+
}
|
|
290
|
+
catch (e) {
|
|
291
|
+
setError(e instanceof Error ? e.message : "Failed to send message");
|
|
292
|
+
}
|
|
293
|
+
finally {
|
|
294
|
+
setSending(false);
|
|
295
|
+
}
|
|
296
|
+
}, [content, senderType, sessionId, agentId]);
|
|
297
|
+
const handleKeyDown = useCallback((e) => {
|
|
298
|
+
if (e.key === "Enter" && !e.shiftKey) {
|
|
299
|
+
e.preventDefault();
|
|
300
|
+
handleSend();
|
|
301
|
+
}
|
|
302
|
+
}, [handleSend]);
|
|
303
|
+
const handleSubmit = useCallback((e) => {
|
|
304
|
+
e.preventDefault();
|
|
305
|
+
handleSend();
|
|
306
|
+
}, [handleSend]);
|
|
307
|
+
return (_jsxs("div", { className: "bg-white rounded-2xl shadow-card p-4", children: [_jsx("h3", { className: "text-sm font-semibold text-gray-900 mb-3", children: "Send Debug Message" }), _jsxs("form", { onSubmit: handleSubmit, className: "space-y-3", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("label", { className: "text-[11px] text-gray-400 font-medium", children: "From:" }), _jsxs("select", { value: senderType, onChange: (e) => setSenderType(e.target.value), className: "text-[11px] border border-gray-200 rounded-lg px-2 py-1 bg-gray-50", children: [_jsx("option", { value: "user", children: "user" }), _jsx("option", { value: "debug", children: "debug" }), _jsx("option", { value: "custom", children: "custom..." })] }), senderType === "custom" && (_jsx("input", { type: "text", value: customSender, onChange: (e) => setCustomSender(e.target.value), placeholder: "agent ID or role", className: "text-[11px] border border-gray-200 rounded-lg px-2 py-1 flex-1 bg-gray-50" }))] }), _jsx("textarea", { value: content, onChange: (e) => setContent(e.target.value), onKeyDown: handleKeyDown, placeholder: "Message content... (Enter to send, Shift+Enter for new line)", rows: 3, className: "w-full border border-gray-200 rounded-xl px-3 py-2 text-sm resize-y bg-gray-50" }), error && _jsx("div", { className: "text-[11px] text-red-600", children: error }), _jsx("button", { type: "submit", disabled: sending || !content.trim(), className: `px-3 py-1.5 text-[11px] font-semibold rounded-lg transition-all ${content.trim()
|
|
308
|
+
? "text-white bg-accent-peri hover:brightness-110 cursor-pointer shadow-sm"
|
|
309
|
+
: "text-gray-400 bg-gray-100 cursor-not-allowed"} disabled:opacity-50 disabled:cursor-not-allowed`, children: sending ? "Sending..." : "Send Message" })] })] }));
|
|
310
|
+
}
|
|
311
|
+
// ============================================================================
|
|
312
|
+
// ResumeAgentButton
|
|
313
|
+
// ============================================================================
|
|
314
|
+
function ResumeAgentButton({ sessionId, agentId, }) {
|
|
315
|
+
const [resuming, setResuming] = useState(false);
|
|
316
|
+
const handleResume = useCallback(async (e) => {
|
|
317
|
+
e.stopPropagation();
|
|
318
|
+
setResuming(true);
|
|
319
|
+
try {
|
|
320
|
+
unwrap(await api.call("agents.resume", {
|
|
321
|
+
sessionId,
|
|
322
|
+
agentId: AgentId(agentId),
|
|
323
|
+
}));
|
|
324
|
+
}
|
|
325
|
+
catch {
|
|
326
|
+
// Error is visible via state change (or lack thereof)
|
|
327
|
+
}
|
|
328
|
+
finally {
|
|
329
|
+
setResuming(false);
|
|
330
|
+
}
|
|
331
|
+
}, [sessionId, agentId]);
|
|
332
|
+
return (_jsx("button", { type: "button", onClick: handleResume, disabled: resuming, className: "text-[11px] font-semibold text-white bg-red-600 hover:bg-red-700 px-2.5 py-1 rounded-lg disabled:opacity-50 disabled:cursor-not-allowed transition-colors shrink-0 cursor-pointer", children: resuming ? "Resuming..." : "Resume" }));
|
|
333
|
+
}
|
|
334
|
+
// ============================================================================
|
|
335
|
+
// Badges
|
|
336
|
+
// ============================================================================
|
|
337
|
+
function StatusBadge({ status }) {
|
|
338
|
+
const styles = {
|
|
339
|
+
idle: "bg-gray-100 text-gray-600",
|
|
340
|
+
thinking: "bg-accent-lime/30 text-gray-700",
|
|
341
|
+
responding: "bg-accent-peri/30 text-gray-700",
|
|
342
|
+
waiting_for_user: "bg-purple-100 text-purple-700",
|
|
343
|
+
error: "bg-red-100 text-red-700",
|
|
344
|
+
};
|
|
345
|
+
return (_jsx("span", { className: `text-[11px] px-2.5 py-1 rounded-full font-semibold ${styles[status] ?? "bg-gray-100 text-gray-600"}`, children: status }));
|
|
346
|
+
}
|
|
347
|
+
function ToolStatusBadge({ status }) {
|
|
348
|
+
const styles = {
|
|
349
|
+
pending: "bg-gray-100 text-gray-600",
|
|
350
|
+
executing: "bg-amber-100 text-amber-700",
|
|
351
|
+
completed: "bg-green-100 text-green-700",
|
|
352
|
+
failed: "bg-red-100 text-red-700",
|
|
353
|
+
};
|
|
354
|
+
return (_jsx("span", { className: `text-[10px] px-2 py-0.5 rounded-full font-semibold ${styles[status] ?? "bg-gray-100 text-gray-600"}`, children: status }));
|
|
355
|
+
}
|
|
356
|
+
function ToolStatusDot({ status }) {
|
|
357
|
+
const colors = {
|
|
358
|
+
pending: "bg-gray-400",
|
|
359
|
+
executing: "bg-amber-400 animate-pulse",
|
|
360
|
+
completed: "bg-green-500",
|
|
361
|
+
failed: "bg-red-500",
|
|
362
|
+
};
|
|
363
|
+
return (_jsx("div", { className: `w-2 h-2 rounded-full shrink-0 ${colors[status] ?? "bg-gray-400"}` }));
|
|
364
|
+
}
|
|
365
|
+
//# sourceMappingURL=AgentDetailPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AgentDetailPage.js","sourceRoot":"","sources":["../../../../src/components/debug/pages/AgentDetailPage.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AgentsPage.d.ts","sourceRoot":"","sources":["../../../../src/components/debug/pages/AgentsPage.tsx"],"names":[],"mappings":"AAWA,wBAAgB,UAAU,4CAiEzB"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { AgentId } from '@roj-ai/shared';
|
|
3
|
+
import { useCallback, useEffect, useState } from 'react';
|
|
4
|
+
import { api, unwrap } from '@roj-ai/client';
|
|
5
|
+
import { useAgentTree, useEventStore } from '../../../stores/event-store';
|
|
6
|
+
import { useDebugContext } from '../DebugContext';
|
|
7
|
+
import { DebugLink, useDebugSessionId } from '../DebugNavigation';
|
|
8
|
+
import { AgentDetailPage } from './AgentDetailPage';
|
|
9
|
+
export function AgentsPage() {
|
|
10
|
+
const sessionId = useDebugSessionId();
|
|
11
|
+
const { params } = useDebugContext();
|
|
12
|
+
// Get agent tree from event store (already loaded by DebugLayout)
|
|
13
|
+
const agents = useAgentTree();
|
|
14
|
+
const isLoading = useEventStore((s) => s.isLoading);
|
|
15
|
+
const error = useEventStore((s) => s.error);
|
|
16
|
+
const selectedAgentId = params.agentId ?? null;
|
|
17
|
+
return (_jsxs("div", { className: "h-full flex gap-4", children: [_jsxs("div", { className: "w-80 shrink-0 bg-white rounded-2xl shadow-card flex flex-col", children: [_jsx("div", { className: "p-3 border-b border-gray-100", children: _jsx("h2", { className: "font-semibold text-gray-900 text-sm", children: "Agent Tree" }) }), _jsx("div", { className: "flex-1 overflow-auto p-3", children: isLoading && agents.length === 0
|
|
18
|
+
? _jsx("div", { className: "text-gray-400 text-sm", children: "Loading..." })
|
|
19
|
+
: error
|
|
20
|
+
? _jsx("div", { className: "text-red-500 text-sm", children: error })
|
|
21
|
+
: agents.length === 0
|
|
22
|
+
? _jsx("div", { className: "text-gray-400 text-sm", children: "No agents yet" })
|
|
23
|
+
: (_jsx("div", { children: agents.map((agent, i) => (_jsx(AgentNode, { agent: agent, selectedId: selectedAgentId, isLast: i === agents.length - 1, guides: [] }, agent.id))) })) }), selectedAgentId && (_jsx(SpawnAgentSection, { sessionId: sessionId, parentId: selectedAgentId, parentDefinitionName: findAgentDefinitionName(agents, selectedAgentId) }))] }), _jsxs("div", { className: "flex-1 bg-gray-50/50 rounded-2xl flex flex-col min-w-0", children: [_jsx("div", { className: "p-3 border-b border-gray-100", children: _jsx("h2", { className: "font-semibold text-gray-900 text-sm", children: "Agent Detail" }) }), _jsx("div", { className: "flex-1 overflow-auto p-4", children: selectedAgentId
|
|
24
|
+
? _jsx(AgentDetailPage, { agentId: selectedAgentId })
|
|
25
|
+
: (_jsx("div", { className: "text-gray-400 text-sm", children: "Select an agent from the tree to view details" })) })] })] }));
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Find the definitionName of an agent by its ID in the tree.
|
|
29
|
+
*/
|
|
30
|
+
function findAgentDefinitionName(agents, agentId) {
|
|
31
|
+
for (const agent of agents) {
|
|
32
|
+
if (agent.id === agentId)
|
|
33
|
+
return agent.definitionName;
|
|
34
|
+
const found = findAgentDefinitionName(agent.children, agentId);
|
|
35
|
+
if (found)
|
|
36
|
+
return found;
|
|
37
|
+
}
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
function SpawnAgentSection({ sessionId, parentId, parentDefinitionName, }) {
|
|
41
|
+
const [presetAgents, setPresetAgents] = useState([]);
|
|
42
|
+
const [selectedAgent, setSelectedAgent] = useState('');
|
|
43
|
+
const [message, setMessage] = useState('');
|
|
44
|
+
const [spawning, setSpawning] = useState(false);
|
|
45
|
+
const [error, setError] = useState(null);
|
|
46
|
+
useEffect(() => {
|
|
47
|
+
api.call('presets.getAgents', { sessionId }).then((result) => {
|
|
48
|
+
setPresetAgents(unwrap(result).agents);
|
|
49
|
+
}).catch(() => {
|
|
50
|
+
setPresetAgents([]);
|
|
51
|
+
});
|
|
52
|
+
}, [sessionId]);
|
|
53
|
+
// Filter agents spawnable by the selected parent
|
|
54
|
+
const spawnableAgents = presetAgents.filter((a) => parentDefinitionName && a.spawnableBy.includes(parentDefinitionName));
|
|
55
|
+
const handleSpawn = useCallback(async () => {
|
|
56
|
+
if (!selectedAgent)
|
|
57
|
+
return;
|
|
58
|
+
setSpawning(true);
|
|
59
|
+
setError(null);
|
|
60
|
+
try {
|
|
61
|
+
unwrap(await api.call('agents.spawn', {
|
|
62
|
+
sessionId,
|
|
63
|
+
definitionName: selectedAgent,
|
|
64
|
+
parentId: AgentId(parentId),
|
|
65
|
+
message: message.trim() || undefined,
|
|
66
|
+
}));
|
|
67
|
+
setSelectedAgent('');
|
|
68
|
+
setMessage('');
|
|
69
|
+
}
|
|
70
|
+
catch (e) {
|
|
71
|
+
setError(e instanceof Error ? e.message : 'Failed to spawn agent');
|
|
72
|
+
}
|
|
73
|
+
finally {
|
|
74
|
+
setSpawning(false);
|
|
75
|
+
}
|
|
76
|
+
}, [selectedAgent, sessionId, parentId, message]);
|
|
77
|
+
if (spawnableAgents.length === 0)
|
|
78
|
+
return null;
|
|
79
|
+
return (_jsxs("div", { className: "p-3 border-t border-gray-100", children: [_jsx("h3", { className: "text-xs font-medium text-gray-400 mb-2", children: "Spawn Agent" }), _jsxs("div", { className: "space-y-2", children: [_jsxs("select", { value: selectedAgent, onChange: (e) => setSelectedAgent(e.target.value), className: "w-full text-xs border border-gray-200 rounded px-2 py-1", children: [_jsx("option", { value: "", children: "Select agent..." }), spawnableAgents.map((a) => (_jsxs("option", { value: a.name, children: [a.name, a.hasInputSchema ? ' (typed)' : ''] }, a.name)))] }), _jsx("input", { type: "text", value: message, onChange: (e) => setMessage(e.target.value), placeholder: "Initial message (optional)", className: "w-full text-xs border border-gray-200 rounded px-2 py-1" }), error && _jsx("div", { className: "text-xs text-red-600", children: error }), _jsx("button", { onClick: handleSpawn, disabled: spawning || !selectedAgent, className: "w-full px-2 py-1 text-xs font-medium text-white bg-green-600 rounded hover:bg-green-700 disabled:opacity-50 disabled:cursor-not-allowed", children: spawning ? 'Spawning...' : 'Spawn' })] })] }));
|
|
80
|
+
}
|
|
81
|
+
const statusDotColors = {
|
|
82
|
+
idle: 'bg-gray-400',
|
|
83
|
+
thinking: 'bg-accent-lime animate-pulse',
|
|
84
|
+
responding: 'bg-accent-peri',
|
|
85
|
+
waiting_for_user: 'bg-purple-400',
|
|
86
|
+
error: 'bg-red-400',
|
|
87
|
+
paused: 'bg-amber-400',
|
|
88
|
+
};
|
|
89
|
+
const statusTextColors = {
|
|
90
|
+
idle: 'text-gray-500',
|
|
91
|
+
thinking: 'text-lime-600',
|
|
92
|
+
responding: 'text-indigo-500',
|
|
93
|
+
waiting_for_user: 'text-purple-500',
|
|
94
|
+
error: 'text-red-500',
|
|
95
|
+
paused: 'text-amber-500',
|
|
96
|
+
};
|
|
97
|
+
const statusLabels = {
|
|
98
|
+
idle: 'idle',
|
|
99
|
+
thinking: 'thinking',
|
|
100
|
+
responding: 'responding',
|
|
101
|
+
waiting_for_user: 'waiting',
|
|
102
|
+
error: 'error',
|
|
103
|
+
paused: 'paused',
|
|
104
|
+
};
|
|
105
|
+
function AgentNode({ agent, selectedId, isLast, guides, }) {
|
|
106
|
+
const isSelected = selectedId === agent.id;
|
|
107
|
+
return (_jsxs(_Fragment, { children: [_jsxs("div", { className: "flex", children: [guides.map((active, i) => (_jsx("div", { className: "w-5 shrink-0 relative", children: active && _jsx("div", { className: "absolute left-2 top-0 bottom-0 w-px bg-gray-200" }) }, i))), _jsxs("div", { className: "w-5 shrink-0 relative", children: [_jsx("div", { className: `absolute left-2 top-0 w-px bg-gray-200 ${isLast ? 'h-5' : 'h-full'}` }), _jsx("div", { className: "absolute left-2 top-5 h-px w-2.5 bg-gray-200" })] }), _jsx("div", { className: "flex-1 min-w-0 py-0.5", children: _jsxs(DebugLink, { to: `agents/${agent.id}`, className: `block w-full text-left px-2.5 py-2 rounded-lg border transition-all ${isSelected
|
|
108
|
+
? 'bg-accent-peri/15 border-accent-peri/40 border-l-[3px] border-l-accent-peri text-gray-900 shadow-sm'
|
|
109
|
+
: 'bg-white border-gray-100 text-gray-700 hover:border-gray-200 hover:shadow-sm'}`, children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: `w-2 h-2 rounded-full shrink-0 ${statusDotColors[agent.status]}` }), _jsx("span", { className: "font-mono text-sm truncate font-medium", children: agent.definitionName }), _jsxs("span", { className: "ml-auto flex items-center gap-1.5 shrink-0", children: [_jsx("span", { className: `text-[10px] font-medium ${statusTextColors[agent.status]}`, children: statusLabels[agent.status] }), agent.cost > 0 && (_jsxs("span", { className: "text-[10px] text-emerald-600 font-medium tabular-nums", children: ["$", agent.cost.toFixed(4)] }))] })] }), _jsxs("div", { className: "flex items-center gap-1.5 ml-4 mt-1", children: [agent.isExecuting && (_jsx("span", { className: "text-[10px] bg-amber-100 text-amber-700 px-1.5 py-0.5 rounded-full font-semibold animate-pulse", children: "exec" })), agent.mailboxCount > 0 && (_jsxs("span", { className: "text-[10px] bg-orange-100 text-orange-600 px-1.5 py-0.5 rounded-full font-medium", children: [agent.mailboxCount, " msgs"] })), agent.pendingToolCalls > 0 && (_jsxs("span", { className: "text-[10px] bg-accent-peri/15 text-gray-600 px-1.5 py-0.5 rounded-full font-medium", children: [agent.pendingToolCalls, " tools"] })), _jsx("span", { className: "text-[10px] text-gray-400 font-mono ml-auto", children: agent.id.slice(0, 8) })] })] }) })] }), agent.children.map((child, i) => (_jsx(AgentNode, { agent: child, selectedId: selectedId, isLast: i === agent.children.length - 1, guides: [...guides, !isLast] }, child.id)))] }));
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=AgentsPage.js.map
|