@parhelia/core 0.1.12776 → 0.1.12780
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/ui/button.d.ts +1 -1
- package/dist/editor/ai/AgentTerminal.d.ts +5 -1
- package/dist/editor/ai/AgentTerminal.js +740 -600
- package/dist/editor/ai/AgentTerminal.js.map +1 -1
- package/dist/editor/ai/AgentTerminalStatusBar.d.ts +7 -1
- package/dist/editor/ai/AgentTerminalStatusBar.js +8 -2
- package/dist/editor/ai/AgentTerminalStatusBar.js.map +1 -1
- package/dist/editor/ai/AiResponseMessage.js +1 -13
- package/dist/editor/ai/AiResponseMessage.js.map +1 -1
- package/dist/editor/ai/HeartbeatDiagnosticsPanel.d.ts +12 -0
- package/dist/editor/ai/HeartbeatDiagnosticsPanel.js +310 -0
- package/dist/editor/ai/HeartbeatDiagnosticsPanel.js.map +1 -0
- package/dist/editor/ai/ToolCallDisplay.d.ts +1 -3
- package/dist/editor/ai/ToolCallDisplay.js +7 -37
- package/dist/editor/ai/ToolCallDisplay.js.map +1 -1
- package/dist/editor/ai/agentDiagnostics.d.ts +24 -51
- package/dist/editor/ai/agentDiagnostics.js +22 -199
- package/dist/editor/ai/agentDiagnostics.js.map +1 -1
- package/dist/editor/ai/agentDiagnostics.test.js +93 -322
- package/dist/editor/ai/agentDiagnostics.test.js.map +1 -1
- package/dist/editor/ai/agentRecoveryEventBus.d.ts +10 -0
- package/dist/editor/ai/agentRecoveryEventBus.js +18 -0
- package/dist/editor/ai/agentRecoveryEventBus.js.map +1 -0
- package/dist/editor/ai/agentWatchdogStatusRegistry.d.ts +17 -0
- package/dist/editor/ai/agentWatchdogStatusRegistry.js +25 -0
- package/dist/editor/ai/agentWatchdogStatusRegistry.js.map +1 -0
- package/dist/editor/client/EditorShell.js +8 -7
- package/dist/editor/client/EditorShell.js.map +1 -1
- package/dist/editor/reviews/Comment.js +9 -0
- package/dist/editor/reviews/Comment.js.map +1 -1
- package/dist/editor/services/agentService.d.ts +1 -0
- package/dist/editor/services/agentService.js.map +1 -1
- package/dist/editor/settings/SettingsHeaderActionsContext.d.ts +0 -1
- package/dist/editor/settings/SettingsHeaderActionsContext.js +0 -3
- package/dist/editor/settings/SettingsHeaderActionsContext.js.map +1 -1
- package/dist/editor/settings/SettingsView.js +1 -1
- package/dist/editor/settings/SettingsView.js.map +1 -1
- package/dist/revision.d.ts +2 -2
- package/dist/revision.js +2 -2
- package/dist/splash-screen/ParheliaAssistantChat.js +61 -16
- package/dist/splash-screen/ParheliaAssistantChat.js.map +1 -1
- package/dist/splash-screen/SplashScreenAgentContext.d.ts +28 -0
- package/dist/splash-screen/SplashScreenAgentContext.js +51 -0
- package/dist/splash-screen/SplashScreenAgentContext.js.map +1 -0
- package/dist/task-board/TaskBoardWorkspace.js +31 -1
- package/dist/task-board/TaskBoardWorkspace.js.map +1 -1
- package/dist/task-board/components/TaskBoardTitlebar.js +6 -2
- package/dist/task-board/components/TaskBoardTitlebar.js.map +1 -1
- package/dist/task-board/services/taskService.d.ts +3 -0
- package/dist/task-board/services/taskService.js +4 -0
- package/dist/task-board/services/taskService.js.map +1 -1
- package/dist/task-board/taskBoardNavStore.d.ts +1 -0
- package/dist/task-board/taskBoardNavStore.js +1 -0
- package/dist/task-board/taskBoardNavStore.js.map +1 -1
- package/dist/task-board/types.d.ts +3 -0
- package/dist/task-board/views/DependencyGraphView.js +9 -8
- package/dist/task-board/views/DependencyGraphView.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useMemo, useRef, useState } from "react";
|
|
3
|
+
import { Activity, Loader2, ShieldAlert } from "lucide-react";
|
|
4
|
+
import { getAgentRunMessageAgentId, getAgentRunMessageSeq, isHeartbeatRunEventMessage, } from "./agentMessageHelpers";
|
|
5
|
+
import { subscribeAgentRecoveryEvents, } from "./agentRecoveryEventBus";
|
|
6
|
+
import { getAgentWatchdogStatus, subscribeAgentWatchdogStatus, } from "./agentWatchdogStatusRegistry";
|
|
7
|
+
const MAX_ENTRIES = 150;
|
|
8
|
+
const TIMER_INTERVAL_MS = 500;
|
|
9
|
+
function extractHeartbeatPayload(message) {
|
|
10
|
+
const data = message?.payload?.data && typeof message.payload.data === "object"
|
|
11
|
+
? message.payload.data
|
|
12
|
+
: null;
|
|
13
|
+
if (!data) {
|
|
14
|
+
return {
|
|
15
|
+
message: null,
|
|
16
|
+
waitedMs: null,
|
|
17
|
+
providerRequestStartedAt: null,
|
|
18
|
+
providerRequestInFlight: null,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
const pickString = (...keys) => {
|
|
22
|
+
for (const key of keys) {
|
|
23
|
+
const value = data[key];
|
|
24
|
+
if (typeof value === "string" && value.trim().length > 0)
|
|
25
|
+
return value;
|
|
26
|
+
}
|
|
27
|
+
return null;
|
|
28
|
+
};
|
|
29
|
+
const pickNumber = (...keys) => {
|
|
30
|
+
for (const key of keys) {
|
|
31
|
+
const value = data[key];
|
|
32
|
+
if (typeof value === "number" && Number.isFinite(value))
|
|
33
|
+
return value;
|
|
34
|
+
}
|
|
35
|
+
return null;
|
|
36
|
+
};
|
|
37
|
+
const pickBoolean = (...keys) => {
|
|
38
|
+
for (const key of keys) {
|
|
39
|
+
const value = data[key];
|
|
40
|
+
if (typeof value === "boolean")
|
|
41
|
+
return value;
|
|
42
|
+
}
|
|
43
|
+
return null;
|
|
44
|
+
};
|
|
45
|
+
return {
|
|
46
|
+
message: pickString("message", "Message"),
|
|
47
|
+
waitedMs: pickNumber("waitedMs", "WaitedMs"),
|
|
48
|
+
providerRequestStartedAt: pickString("providerRequestStartedAt", "ProviderRequestStartedAt"),
|
|
49
|
+
providerRequestInFlight: pickBoolean("providerRequestInFlight", "ProviderRequestInFlight"),
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
function formatDuration(ms) {
|
|
53
|
+
if (!Number.isFinite(ms) || ms < 0)
|
|
54
|
+
return "—";
|
|
55
|
+
if (ms < 1000)
|
|
56
|
+
return `${ms}ms`;
|
|
57
|
+
const totalSeconds = Math.floor(ms / 1000);
|
|
58
|
+
if (totalSeconds < 60)
|
|
59
|
+
return `${totalSeconds}s`;
|
|
60
|
+
const minutes = Math.floor(totalSeconds / 60);
|
|
61
|
+
const seconds = totalSeconds % 60;
|
|
62
|
+
if (minutes < 60)
|
|
63
|
+
return `${minutes}m ${seconds}s`;
|
|
64
|
+
const hours = Math.floor(minutes / 60);
|
|
65
|
+
return `${hours}h ${minutes % 60}m`;
|
|
66
|
+
}
|
|
67
|
+
function formatClockTime(date) {
|
|
68
|
+
const hh = String(date.getHours()).padStart(2, "0");
|
|
69
|
+
const mm = String(date.getMinutes()).padStart(2, "0");
|
|
70
|
+
const ss = String(date.getSeconds()).padStart(2, "0");
|
|
71
|
+
const ms = String(date.getMilliseconds()).padStart(3, "0");
|
|
72
|
+
return `${hh}:${mm}:${ss}.${ms}`;
|
|
73
|
+
}
|
|
74
|
+
function Stat({ label, value, emphasis, }) {
|
|
75
|
+
const valueClass = emphasis === "alert"
|
|
76
|
+
? "text-red-600"
|
|
77
|
+
: emphasis === "warn"
|
|
78
|
+
? "text-amber-600"
|
|
79
|
+
: emphasis === "ok"
|
|
80
|
+
? "text-emerald-600"
|
|
81
|
+
: "text-slate-800";
|
|
82
|
+
return (_jsxs("div", { className: "rounded border border-slate-200 bg-white px-2 py-1.5", children: [_jsx("div", { className: "text-[10px] tracking-wider text-slate-500 uppercase", children: label }), _jsx("div", { className: `mt-0.5 truncate text-[12px] font-medium ${valueClass}`, children: value })] }));
|
|
83
|
+
}
|
|
84
|
+
function recoveryEntryFromBusEvent(event, seq) {
|
|
85
|
+
let detail = null;
|
|
86
|
+
try {
|
|
87
|
+
detail = JSON.stringify(event.payload);
|
|
88
|
+
if (detail === "{}")
|
|
89
|
+
detail = null;
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
detail = null;
|
|
93
|
+
}
|
|
94
|
+
return {
|
|
95
|
+
kind: "recovery",
|
|
96
|
+
id: `bus-${event.timestamp}-${event.kind}-${seq}`,
|
|
97
|
+
receivedAt: new Date(event.timestamp),
|
|
98
|
+
type: `recovery:${event.kind}`,
|
|
99
|
+
recoveryKind: event.kind,
|
|
100
|
+
detail,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
function recoveryEntryFromSeed(event) {
|
|
104
|
+
if (!event?.type?.startsWith("recovery:"))
|
|
105
|
+
return null;
|
|
106
|
+
const recoveryKind = event.type.slice("recovery:".length);
|
|
107
|
+
const receivedAt = new Date(event.timestamp);
|
|
108
|
+
if (Number.isNaN(receivedAt.getTime()))
|
|
109
|
+
return null;
|
|
110
|
+
return {
|
|
111
|
+
kind: "recovery",
|
|
112
|
+
id: `seed-${event.timestamp}-${recoveryKind}-${event.seq ?? "x"}`,
|
|
113
|
+
receivedAt,
|
|
114
|
+
type: event.type,
|
|
115
|
+
recoveryKind,
|
|
116
|
+
detail: event.detail ?? null,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
export function HeartbeatDiagnosticsPanel({ agentId, addSocketMessageListener, seedRecoveryEvents, }) {
|
|
120
|
+
const [entries, setEntries] = useState([]);
|
|
121
|
+
const [now, setNow] = useState(() => Date.now());
|
|
122
|
+
const [watchdogStatus, setWatchdogStatus] = useState(() => getAgentWatchdogStatus(agentId));
|
|
123
|
+
const counterRef = useRef(0);
|
|
124
|
+
const seenIdsRef = useRef(new Set());
|
|
125
|
+
const mountedAtRef = useRef(Date.now());
|
|
126
|
+
useEffect(() => {
|
|
127
|
+
setWatchdogStatus(getAgentWatchdogStatus(agentId));
|
|
128
|
+
const unsubscribe = subscribeAgentWatchdogStatus((id, status) => {
|
|
129
|
+
if (id !== agentId)
|
|
130
|
+
return;
|
|
131
|
+
setWatchdogStatus(status);
|
|
132
|
+
});
|
|
133
|
+
return unsubscribe;
|
|
134
|
+
}, [agentId]);
|
|
135
|
+
useEffect(() => {
|
|
136
|
+
mountedAtRef.current = Date.now();
|
|
137
|
+
counterRef.current = 0;
|
|
138
|
+
seenIdsRef.current = new Set();
|
|
139
|
+
const seeded = [];
|
|
140
|
+
if (seedRecoveryEvents) {
|
|
141
|
+
for (const event of seedRecoveryEvents) {
|
|
142
|
+
const entry = recoveryEntryFromSeed(event);
|
|
143
|
+
if (entry && !seenIdsRef.current.has(entry.id)) {
|
|
144
|
+
seenIdsRef.current.add(entry.id);
|
|
145
|
+
seeded.push(entry);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
seeded.sort((a, b) => b.receivedAt.getTime() - a.receivedAt.getTime());
|
|
150
|
+
setEntries(seeded.slice(0, MAX_ENTRIES));
|
|
151
|
+
}, [agentId, seedRecoveryEvents]);
|
|
152
|
+
useEffect(() => {
|
|
153
|
+
if (!addSocketMessageListener)
|
|
154
|
+
return;
|
|
155
|
+
const handler = (message) => {
|
|
156
|
+
if (!message)
|
|
157
|
+
return;
|
|
158
|
+
if (!isHeartbeatRunEventMessage(message))
|
|
159
|
+
return;
|
|
160
|
+
const messageAgentId = getAgentRunMessageAgentId(message.payload);
|
|
161
|
+
if (messageAgentId && messageAgentId !== agentId)
|
|
162
|
+
return;
|
|
163
|
+
const seq = getAgentRunMessageSeq(message.payload);
|
|
164
|
+
const detail = extractHeartbeatPayload(message);
|
|
165
|
+
counterRef.current += 1;
|
|
166
|
+
const entry = {
|
|
167
|
+
kind: "heartbeat",
|
|
168
|
+
id: `hb-${counterRef.current}`,
|
|
169
|
+
receivedAt: new Date(),
|
|
170
|
+
type: message.type,
|
|
171
|
+
seq,
|
|
172
|
+
...detail,
|
|
173
|
+
};
|
|
174
|
+
seenIdsRef.current.add(entry.id);
|
|
175
|
+
setEntries((prev) => {
|
|
176
|
+
const next = [entry, ...prev];
|
|
177
|
+
return next.length > MAX_ENTRIES ? next.slice(0, MAX_ENTRIES) : next;
|
|
178
|
+
});
|
|
179
|
+
};
|
|
180
|
+
const unsubscribe = addSocketMessageListener(handler);
|
|
181
|
+
return () => unsubscribe();
|
|
182
|
+
}, [agentId, addSocketMessageListener]);
|
|
183
|
+
useEffect(() => {
|
|
184
|
+
const unsubscribe = subscribeAgentRecoveryEvents((event) => {
|
|
185
|
+
if (event.agentId !== agentId)
|
|
186
|
+
return;
|
|
187
|
+
counterRef.current += 1;
|
|
188
|
+
const entry = recoveryEntryFromBusEvent(event, counterRef.current);
|
|
189
|
+
if (seenIdsRef.current.has(entry.id))
|
|
190
|
+
return;
|
|
191
|
+
seenIdsRef.current.add(entry.id);
|
|
192
|
+
setEntries((prev) => {
|
|
193
|
+
const next = [entry, ...prev];
|
|
194
|
+
next.sort((a, b) => b.receivedAt.getTime() - a.receivedAt.getTime());
|
|
195
|
+
return next.length > MAX_ENTRIES ? next.slice(0, MAX_ENTRIES) : next;
|
|
196
|
+
});
|
|
197
|
+
});
|
|
198
|
+
return unsubscribe;
|
|
199
|
+
}, [agentId]);
|
|
200
|
+
useEffect(() => {
|
|
201
|
+
const id = window.setInterval(() => setNow(Date.now()), TIMER_INTERVAL_MS);
|
|
202
|
+
return () => window.clearInterval(id);
|
|
203
|
+
}, []);
|
|
204
|
+
const heartbeatEntries = useMemo(() => entries.filter((e) => e.kind === "heartbeat"), [entries]);
|
|
205
|
+
const recoveryEntries = useMemo(() => entries.filter((e) => e.kind === "recovery"), [entries]);
|
|
206
|
+
const lastHeartbeat = heartbeatEntries[0];
|
|
207
|
+
const sinceLastMs = lastHeartbeat
|
|
208
|
+
? now - lastHeartbeat.receivedAt.getTime()
|
|
209
|
+
: null;
|
|
210
|
+
const watchingMs = now - mountedAtRef.current;
|
|
211
|
+
const interArrivals = useMemo(() => {
|
|
212
|
+
const intervals = [];
|
|
213
|
+
for (let i = 0; i < heartbeatEntries.length - 1; i++) {
|
|
214
|
+
const a = heartbeatEntries[i].receivedAt.getTime();
|
|
215
|
+
const b = heartbeatEntries[i + 1].receivedAt.getTime();
|
|
216
|
+
intervals.push(a - b);
|
|
217
|
+
}
|
|
218
|
+
return intervals;
|
|
219
|
+
}, [heartbeatEntries]);
|
|
220
|
+
const avgIntervalMs = interArrivals.length > 0
|
|
221
|
+
? Math.round(interArrivals.reduce((sum, value) => sum + value, 0) /
|
|
222
|
+
interArrivals.length)
|
|
223
|
+
: null;
|
|
224
|
+
const lastIntervalEmphasis = (() => {
|
|
225
|
+
if (sinceLastMs == null)
|
|
226
|
+
return undefined;
|
|
227
|
+
if (sinceLastMs > 30_000)
|
|
228
|
+
return "alert";
|
|
229
|
+
if (sinceLastMs > 10_000)
|
|
230
|
+
return "warn";
|
|
231
|
+
return "ok";
|
|
232
|
+
})();
|
|
233
|
+
return (_jsxs("div", { className: "flex h-full min-h-0 flex-col gap-2", children: [_jsxs("div", { className: "rounded border border-sky-100 bg-sky-50/70 px-3 py-2 text-[11px] text-sky-800", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Loader2, { className: "h-3 w-3 animate-spin", strokeWidth: 1.5 }), _jsx("span", { className: "font-medium", children: "Live heartbeat & watchdog capture" })] }), _jsxs("div", { className: "mt-1 text-[10px] text-sky-700", children: ["Watching incoming heartbeats and stall-watchdog activity for this agent (", formatDuration(watchingMs), " so far). Watchdog history before the panel opened is seeded from the existing run snapshot. Nothing is recorded once the panel closes."] })] }), _jsxs("div", { className: "grid grid-cols-2 gap-2 text-[11px] sm:grid-cols-4", children: [_jsx(Stat, { label: "Heartbeats received", value: String(heartbeatEntries.length) }), _jsx(Stat, { label: "Since last heartbeat", value: sinceLastMs != null ? `${formatDuration(sinceLastMs)} ago` : "—", emphasis: lastIntervalEmphasis }), _jsx(Stat, { label: "Average interval", value: avgIntervalMs != null ? formatDuration(avgIntervalMs) : "—" }), _jsx(Stat, { label: "Watchdog events", value: String(recoveryEntries.length), emphasis: recoveryEntries.length > 0 ? "warn" : undefined })] }), _jsx(WatchdogStatusCard, { status: watchdogStatus, now: now }), _jsx("div", { className: "min-h-0 flex-1 overflow-auto rounded border border-slate-200 bg-white", children: entries.length === 0 ? (_jsx("div", { className: "flex h-full items-center justify-center px-4 py-6 text-center text-[11px] text-gray-500", children: "Waiting for heartbeats. If the agent is running and none arrive within ~30 seconds, the provider request or stream may be stuck \u2014 the watchdog will fire and show up here." })) : (_jsxs("table", { className: "w-full border-collapse text-[11px] text-slate-700", children: [_jsx("thead", { className: "sticky top-0 z-10 bg-slate-50", children: _jsxs("tr", { className: "border-b border-slate-200 text-left text-[10px] font-semibold tracking-wider text-slate-500 uppercase", children: [_jsx("th", { className: "px-2 py-1.5", children: "Received" }), _jsx("th", { className: "px-2 py-1.5", children: "Source" }), _jsx("th", { className: "px-2 py-1.5", children: "Event" }), _jsx("th", { className: "px-2 py-1.5", children: "Seq" }), _jsx("th", { className: "px-2 py-1.5", children: "Detail" })] }) }), _jsx("tbody", { children: entries.map((entry, index) => {
|
|
234
|
+
const nextEntry = entries[index + 1];
|
|
235
|
+
const intervalMs = nextEntry
|
|
236
|
+
? entry.receivedAt.getTime() -
|
|
237
|
+
nextEntry.receivedAt.getTime()
|
|
238
|
+
: null;
|
|
239
|
+
const isRecovery = entry.kind === "recovery";
|
|
240
|
+
const sourceClass = isRecovery
|
|
241
|
+
? "text-amber-700"
|
|
242
|
+
: "text-sky-700";
|
|
243
|
+
const rowClass = isRecovery ? "bg-amber-50/40" : "";
|
|
244
|
+
const heartbeatDetail = entry.kind === "heartbeat"
|
|
245
|
+
? [
|
|
246
|
+
entry.message ? entry.message : null,
|
|
247
|
+
entry.waitedMs != null
|
|
248
|
+
? `waited ${formatDuration(entry.waitedMs)}`
|
|
249
|
+
: null,
|
|
250
|
+
entry.providerRequestInFlight == null
|
|
251
|
+
? null
|
|
252
|
+
: `in-flight: ${entry.providerRequestInFlight ? "yes" : "no"}`,
|
|
253
|
+
]
|
|
254
|
+
.filter(Boolean)
|
|
255
|
+
.join(" · ") || "—"
|
|
256
|
+
: null;
|
|
257
|
+
return (_jsxs("tr", { className: `border-b border-slate-100 align-top last:border-b-0 ${rowClass}`, children: [_jsxs("td", { className: "px-2 py-1 whitespace-nowrap tabular-nums text-slate-500", children: [_jsx("div", { children: formatClockTime(entry.receivedAt) }), intervalMs != null && (_jsxs("div", { className: "text-[10px] text-slate-400", children: ["+", formatDuration(intervalMs)] }))] }), _jsx("td", { className: `px-2 py-1 whitespace-nowrap font-medium ${sourceClass}`, children: _jsxs("span", { className: "inline-flex items-center gap-1", children: [isRecovery ? (_jsx(ShieldAlert, { className: "h-3 w-3", strokeWidth: 1.5 })) : (_jsx(Activity, { className: "h-3 w-3", strokeWidth: 1.5 })), isRecovery ? "Watchdog" : "Heartbeat"] }) }), _jsx("td", { className: "px-2 py-1 whitespace-nowrap font-medium", children: entry.kind === "recovery"
|
|
258
|
+
? entry.recoveryKind
|
|
259
|
+
: entry.type }), _jsx("td", { className: "px-2 py-1 whitespace-nowrap tabular-nums", children: entry.kind === "heartbeat" ? entry.seq ?? "—" : "—" }), _jsx("td", { className: "px-2 py-1 break-all text-slate-600", children: entry.kind === "heartbeat"
|
|
260
|
+
? heartbeatDetail
|
|
261
|
+
: entry.detail ?? "—" })] }, entry.id));
|
|
262
|
+
}) })] })) })] }));
|
|
263
|
+
}
|
|
264
|
+
function WatchdogStatusCard({ status, now, }) {
|
|
265
|
+
if (!status) {
|
|
266
|
+
return (_jsxs("div", { className: "rounded border border-slate-200 bg-slate-50 px-3 py-2 text-[11px] text-slate-600", children: [_jsx("div", { className: "font-medium text-slate-700", children: "Watchdog: unknown" }), _jsx("div", { className: "mt-0.5 text-[10px]", children: "The watchdog has not reported any state for this agent yet. It runs inside the agent terminal \u2014 open the terminal to see status here." })] }));
|
|
267
|
+
}
|
|
268
|
+
const reasonsNotRunning = [];
|
|
269
|
+
if (status.isExecuting === false)
|
|
270
|
+
reasonsNotRunning.push("agent not executing");
|
|
271
|
+
if (status.isVisible === false)
|
|
272
|
+
reasonsNotRunning.push("terminal not visible");
|
|
273
|
+
if (status.isStopping === true)
|
|
274
|
+
reasonsNotRunning.push("stop pending");
|
|
275
|
+
if (status.isWaitingForCapacity === true)
|
|
276
|
+
reasonsNotRunning.push("waiting for capacity");
|
|
277
|
+
const lastTickAgo = status.lastTickAt != null ? now - status.lastTickAt : null;
|
|
278
|
+
const silentMs = status.lastNonHeartbeatUpdateAt != null && status.lastNonHeartbeatUpdateAt > 0
|
|
279
|
+
? now - status.lastNonHeartbeatUpdateAt
|
|
280
|
+
: null;
|
|
281
|
+
const threshold = status.stalledThresholdMs ?? null;
|
|
282
|
+
const isStalled = status.running &&
|
|
283
|
+
silentMs != null &&
|
|
284
|
+
threshold != null &&
|
|
285
|
+
silentMs > threshold;
|
|
286
|
+
const headerClass = status.running
|
|
287
|
+
? isStalled
|
|
288
|
+
? "text-red-700"
|
|
289
|
+
: "text-emerald-700"
|
|
290
|
+
: "text-amber-700";
|
|
291
|
+
const containerClass = status.running
|
|
292
|
+
? isStalled
|
|
293
|
+
? "border-red-200 bg-red-50/60"
|
|
294
|
+
: "border-emerald-200 bg-emerald-50/60"
|
|
295
|
+
: "border-amber-200 bg-amber-50/60";
|
|
296
|
+
return (_jsxs("div", { className: `rounded border px-3 py-2 text-[11px] text-slate-700 ${containerClass}`, children: [_jsx("div", { className: `font-medium ${headerClass}`, children: status.running
|
|
297
|
+
? isStalled
|
|
298
|
+
? "Watchdog: running — stream STALLED"
|
|
299
|
+
: "Watchdog: running"
|
|
300
|
+
: `Watchdog: not running${reasonsNotRunning.length > 0
|
|
301
|
+
? ` (${reasonsNotRunning.join(", ")})`
|
|
302
|
+
: ""}` }), _jsxs("div", { className: "mt-1 grid grid-cols-2 gap-x-4 gap-y-0.5 text-[10px] text-slate-600 sm:grid-cols-4", children: [_jsxs("div", { children: ["isExecuting:", " ", _jsx("span", { className: "font-mono", children: status.isExecuting == null ? "—" : status.isExecuting ? "yes" : "no" })] }), _jsxs("div", { children: ["isVisible:", " ", _jsx("span", { className: "font-mono", children: status.isVisible == null ? "—" : status.isVisible ? "yes" : "no" })] }), _jsxs("div", { children: ["isStopping:", " ", _jsx("span", { className: "font-mono", children: status.isStopping == null ? "—" : status.isStopping ? "yes" : "no" })] }), _jsxs("div", { children: ["waitingForCapacity:", " ", _jsx("span", { className: "font-mono", children: status.isWaitingForCapacity == null
|
|
303
|
+
? "—"
|
|
304
|
+
: status.isWaitingForCapacity
|
|
305
|
+
? "yes"
|
|
306
|
+
: "no" })] }), _jsxs("div", { children: ["last tick:", " ", _jsx("span", { className: "font-mono", children: lastTickAgo != null ? `${formatDuration(lastTickAgo)} ago` : "—" })] }), _jsxs("div", { children: ["silent (non-heartbeat):", " ", _jsx("span", { className: "font-mono", children: silentMs != null ? formatDuration(silentMs) : "—" })] }), _jsxs("div", { children: ["stall threshold:", " ", _jsx("span", { className: "font-mono", children: threshold != null ? formatDuration(threshold) : "—" })] }), _jsxs("div", { children: ["started:", " ", _jsx("span", { className: "font-mono", children: status.startedAt != null
|
|
307
|
+
? `${formatDuration(now - status.startedAt)} ago`
|
|
308
|
+
: "—" })] })] })] }));
|
|
309
|
+
}
|
|
310
|
+
//# sourceMappingURL=HeartbeatDiagnosticsPanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HeartbeatDiagnosticsPanel.js","sourceRoot":"","sources":["../../../src/editor/ai/HeartbeatDiagnosticsPanel.tsx"],"names":[],"mappings":"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"}
|
|
@@ -64,8 +64,6 @@ interface ToolCallDisplayProps {
|
|
|
64
64
|
agentId?: string;
|
|
65
65
|
allPendingApprovals?: PendingToolCallInfo[];
|
|
66
66
|
onSwitchToAutonomous?: () => void;
|
|
67
|
-
seenApprovalDialogs?: Set<string>;
|
|
68
|
-
onApprovalDialogShown?: (toolCallId: string) => void;
|
|
69
67
|
browserCaptureInlinePrompt?: {
|
|
70
68
|
toolNames: string[];
|
|
71
69
|
label: string;
|
|
@@ -78,5 +76,5 @@ interface ToolCallDisplayProps {
|
|
|
78
76
|
} | null;
|
|
79
77
|
readOnly?: boolean;
|
|
80
78
|
}
|
|
81
|
-
export declare function ToolCallDisplay({ toolCalls, finished, openPopovers, setOpenPopovers, messageId, agentId, allPendingApprovals, onSwitchToAutonomous,
|
|
79
|
+
export declare function ToolCallDisplay({ toolCalls, finished, openPopovers, setOpenPopovers, messageId, agentId, allPendingApprovals, onSwitchToAutonomous, browserCaptureInlinePrompt, readOnly, }: ToolCallDisplayProps): import("react/jsx-runtime").JSX.Element | null;
|
|
82
80
|
export {};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
-
import { useState, useMemo, memo, useEffect
|
|
2
|
+
import { useState, useMemo, memo, useEffect } from "react";
|
|
3
3
|
import { JsonView, defaultStyles } from "react-json-view-lite";
|
|
4
4
|
import "react-json-view-lite/dist/index.css";
|
|
5
5
|
import { Spinner } from "../ui/Spinner";
|
|
@@ -457,7 +457,7 @@ ToolCallDetails.displayName = "ToolCallDetails";
|
|
|
457
457
|
const AnimatedToolCallDetails = ({ isExpanded, children, }) => {
|
|
458
458
|
return (_jsx(AnimatedDisclosureContent, { isExpanded: isExpanded, children: children }));
|
|
459
459
|
};
|
|
460
|
-
export function ToolCallDisplay({ toolCalls, finished, openPopovers, setOpenPopovers, messageId, agentId, allPendingApprovals = [], onSwitchToAutonomous,
|
|
460
|
+
export function ToolCallDisplay({ toolCalls, finished, openPopovers, setOpenPopovers, messageId, agentId, allPendingApprovals = [], onSwitchToAutonomous, browserCaptureInlinePrompt, readOnly = false, }) {
|
|
461
461
|
const [batchRiskAction, setBatchRiskAction] = useState(null);
|
|
462
462
|
const [isSwitchingMode, setIsSwitchingMode] = useState(false);
|
|
463
463
|
const [isGroupExpanded, setIsGroupExpanded] = useState(() => {
|
|
@@ -483,11 +483,6 @@ export function ToolCallDisplay({ toolCalls, finished, openPopovers, setOpenPopo
|
|
|
483
483
|
return (!funcName.includes("(approved)") && !funcName.includes("(rejected)"));
|
|
484
484
|
});
|
|
485
485
|
}, [toolCalls]);
|
|
486
|
-
useEffect(() => {
|
|
487
|
-
if (!userToggled) {
|
|
488
|
-
setIsGroupExpanded(hasPendingApprovalsInGroup);
|
|
489
|
-
}
|
|
490
|
-
}, [userToggled, hasPendingApprovalsInGroup]);
|
|
491
486
|
const isGroupExpandedForRender = !userToggled && hasPendingApprovalsInGroup ? true : isGroupExpanded;
|
|
492
487
|
const groupSummary = useMemo(() => {
|
|
493
488
|
if (!toolCalls || toolCalls.length === 0)
|
|
@@ -674,7 +669,9 @@ export function ToolCallDisplay({ toolCalls, finished, openPopovers, setOpenPopo
|
|
|
674
669
|
}, children: browserCaptureInlinePrompt.actionLabel }), browserCaptureInlinePrompt.onCancel && (_jsx("button", { type: "button", className: "rounded border border-blue-300 bg-white px-2 py-1 text-[11px] font-medium text-blue-900 disabled:cursor-not-allowed disabled:opacity-60", disabled: browserCaptureInlinePrompt.isPending, onClick: (event) => {
|
|
675
670
|
event.stopPropagation();
|
|
676
671
|
browserCaptureInlinePrompt.onCancel?.();
|
|
677
|
-
}, children: browserCaptureInlinePrompt.cancelLabel ?? "Cancel" }))] })] }) })), _jsx("div", { className:
|
|
672
|
+
}, children: browserCaptureInlinePrompt.cancelLabel ?? "Cancel" }))] })] }) })), _jsx("div", { className: userToggled
|
|
673
|
+
? "grid transition-[grid-template-rows] duration-200 ease-out"
|
|
674
|
+
: "grid", style: {
|
|
678
675
|
gridTemplateRows: isGroupExpandedForRender ? "1fr" : "0fr",
|
|
679
676
|
}, "aria-hidden": !isGroupExpandedForRender, children: _jsx("div", { className: "overflow-hidden", children: _jsx("div", { className: "ml-4", children: toolCalls.map((originalToolCall, toolIndex) => {
|
|
680
677
|
const toolCall = normalizeToolCall(originalToolCall);
|
|
@@ -697,11 +694,9 @@ export function ToolCallDisplay({ toolCalls, finished, openPopovers, setOpenPopo
|
|
|
697
694
|
originalToolCall.isStreaming === true;
|
|
698
695
|
// Use the approval info from the backend
|
|
699
696
|
const finalApprovalInfo = approvalInfo;
|
|
700
|
-
// Check if this tool call's approval dialog has already been shown (for deduplication)
|
|
701
697
|
const toolCallIdForApproval = "toolCallId" in originalToolCall
|
|
702
698
|
? originalToolCall.toolCallId
|
|
703
699
|
: toolCall.id;
|
|
704
|
-
const approvalAlreadyShown = seenApprovalDialogs?.has(toolCallIdForApproval) ?? false;
|
|
705
700
|
// Check if this tool call has been approved/rejected (look for status indicators in function name)
|
|
706
701
|
// The AgentTerminal adds " (approved)" or " (rejected)" or " (pending approval)" to the functionName field
|
|
707
702
|
const originalFunctionName = ("functionName" in originalToolCall
|
|
@@ -752,7 +747,7 @@ export function ToolCallDisplay({ toolCalls, finished, openPopovers, setOpenPopo
|
|
|
752
747
|
!isRejected &&
|
|
753
748
|
!isPruned && (_jsx("span", { className: "ml-1 leading-4 text-red-500", children: "(error)" })), isPruned && (_jsxs("span", { className: "ml-2 inline-flex items-center gap-1 rounded-full bg-slate-100 px-2 py-0.5 text-[10px] font-semibold text-slate-700", children: [_jsx("span", { children: "\u2702" }), " Pruned"] })), finalApprovalInfo && isRejected && (_jsxs("span", { className: "ml-2 inline-flex items-center gap-1 rounded-full bg-red-100 px-2 py-0.5 text-[10px] font-semibold text-red-700", children: [_jsx("span", { children: "\u2717" }), " Rejected"] }))] }), finalApprovalInfo?.summary && (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "min-w-0 flex-1 cursor-help truncate text-xs leading-4 text-gray-500 italic", children: finalApprovalInfo.summary }) }), _jsx(TooltipContent, { side: "top", className: "max-w-md", children: finalApprovalInfo.summary })] })), _jsxs("div", { className: "ml-auto flex shrink-0 items-center gap-1.5", children: [!isCompleted &&
|
|
754
749
|
finalApprovalInfo &&
|
|
755
|
-
!hasApprovalStatus && (_jsx(ApprovalDialog, { toolCallId: toolCallIdForApproval,
|
|
750
|
+
!hasApprovalStatus && (_jsx(ApprovalDialog, { toolCallId: toolCallIdForApproval, finalApprovalInfo: finalApprovalInfo, isAgentToolCall: isAgentToolCall, originalToolCall: originalToolCall, toolCall: toolCall, messageId: toolCallMessageId, agentId: agentId, readOnly: readOnly })), toolCallMeta &&
|
|
756
751
|
(toolCallMeta.tooltip ? (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "cursor-help text-[10px] leading-4 text-gray-400", children: toolCallMeta.display }) }), _jsx(TooltipContent, { side: "top", children: toolCallMeta.tooltip })] })) : (_jsx("span", { className: "text-[10px] leading-4 text-gray-400", children: toolCallMeta.display })))] })] })] }), _jsx(AnimatedToolCallDetails, { isExpanded: isExpanded, children: _jsx(ToolCallDetails, { toolCall: toolCall, result: toolResult }) }), !shouldShowGroupBrowserCaptureInlinePrompt &&
|
|
757
752
|
shouldShowBrowserCaptureInlinePrompt &&
|
|
758
753
|
browserCaptureInlinePrompt && (_jsx("div", { className: "mt-2 ml-5 rounded-lg border border-blue-200 bg-blue-50 p-3 text-[11px] text-blue-900", children: _jsxs("div", { className: "flex items-center justify-between gap-3", children: [_jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("div", { className: "font-semibold", children: browserCaptureInlinePrompt.label }), _jsx("div", { className: "mt-1 text-blue-800", children: browserCaptureInlinePrompt.description })] }), _jsxs("div", { className: "flex shrink-0 items-center gap-2", children: [_jsx("button", { type: "button", className: "rounded border border-blue-300 bg-white px-2 py-1 text-[11px] font-medium text-blue-900 disabled:cursor-not-allowed disabled:opacity-60", disabled: browserCaptureInlinePrompt.isPending, onClick: (event) => {
|
|
@@ -795,32 +790,8 @@ export function ToolCallDisplay({ toolCalls, finished, openPopovers, setOpenPopo
|
|
|
795
790
|
: "Stop asking for approval and let the agent run autonomously", className: "ml-auto h-7 gap-1.5 px-2 text-xs text-gray-600 hover:text-gray-900", children: [isSwitchingMode ? (_jsx(Spinner, { size: "xs" })) : (_jsx(Zap, { size: 12, strokeWidth: 2 })), isSwitchingMode ? "Switching" : "Autonomous"] }))] })] }));
|
|
796
791
|
})()] }));
|
|
797
792
|
}
|
|
798
|
-
|
|
799
|
-
function ApprovalDialog({ toolCallId, onApprovalDialogShown, finalApprovalInfo, isAgentToolCall, originalToolCall, toolCall, messageId, agentId, readOnly = false, }) {
|
|
800
|
-
const hasMarkedAsShown = useRef(false);
|
|
793
|
+
function ApprovalDialog({ toolCallId, finalApprovalInfo, isAgentToolCall, originalToolCall, toolCall, messageId, agentId, readOnly = false, }) {
|
|
801
794
|
const [isCreatingAllowance, setIsCreatingAllowance] = useState(false);
|
|
802
|
-
// Mark dialog as shown on mount to prevent duplicate dialogs
|
|
803
|
-
// The dialog stays visible until hasApprovalStatus becomes true (after approve/reject)
|
|
804
|
-
useEffect(() => {
|
|
805
|
-
if (!hasMarkedAsShown.current && onApprovalDialogShown && toolCallId) {
|
|
806
|
-
// Use requestAnimationFrame to ensure the dialog is rendered before marking as shown
|
|
807
|
-
requestAnimationFrame(() => {
|
|
808
|
-
requestAnimationFrame(() => {
|
|
809
|
-
if (!hasMarkedAsShown.current) {
|
|
810
|
-
onApprovalDialogShown(toolCallId);
|
|
811
|
-
hasMarkedAsShown.current = true;
|
|
812
|
-
}
|
|
813
|
-
});
|
|
814
|
-
});
|
|
815
|
-
}
|
|
816
|
-
}, [onApprovalDialogShown, toolCallId]);
|
|
817
|
-
// Also mark as shown when user interacts (redundant but safe)
|
|
818
|
-
const markAsShown = () => {
|
|
819
|
-
if (!hasMarkedAsShown.current && onApprovalDialogShown && toolCallId) {
|
|
820
|
-
onApprovalDialogShown(toolCallId);
|
|
821
|
-
hasMarkedAsShown.current = true;
|
|
822
|
-
}
|
|
823
|
-
};
|
|
824
795
|
const getActualMessageId = () => {
|
|
825
796
|
return isAgentToolCall
|
|
826
797
|
? originalToolCall.dbMessageId || originalToolCall.messageId
|
|
@@ -868,7 +839,6 @@ function ApprovalDialog({ toolCallId, onApprovalDialogShown, finalApprovalInfo,
|
|
|
868
839
|
e.stopPropagation();
|
|
869
840
|
if (readOnly)
|
|
870
841
|
return;
|
|
871
|
-
markAsShown();
|
|
872
842
|
if (!agentId || !allowableScope?.parentItemId)
|
|
873
843
|
return;
|
|
874
844
|
setIsCreatingAllowance(true);
|