@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.
Files changed (58) hide show
  1. package/dist/components/ui/button.d.ts +1 -1
  2. package/dist/editor/ai/AgentTerminal.d.ts +5 -1
  3. package/dist/editor/ai/AgentTerminal.js +740 -600
  4. package/dist/editor/ai/AgentTerminal.js.map +1 -1
  5. package/dist/editor/ai/AgentTerminalStatusBar.d.ts +7 -1
  6. package/dist/editor/ai/AgentTerminalStatusBar.js +8 -2
  7. package/dist/editor/ai/AgentTerminalStatusBar.js.map +1 -1
  8. package/dist/editor/ai/AiResponseMessage.js +1 -13
  9. package/dist/editor/ai/AiResponseMessage.js.map +1 -1
  10. package/dist/editor/ai/HeartbeatDiagnosticsPanel.d.ts +12 -0
  11. package/dist/editor/ai/HeartbeatDiagnosticsPanel.js +310 -0
  12. package/dist/editor/ai/HeartbeatDiagnosticsPanel.js.map +1 -0
  13. package/dist/editor/ai/ToolCallDisplay.d.ts +1 -3
  14. package/dist/editor/ai/ToolCallDisplay.js +7 -37
  15. package/dist/editor/ai/ToolCallDisplay.js.map +1 -1
  16. package/dist/editor/ai/agentDiagnostics.d.ts +24 -51
  17. package/dist/editor/ai/agentDiagnostics.js +22 -199
  18. package/dist/editor/ai/agentDiagnostics.js.map +1 -1
  19. package/dist/editor/ai/agentDiagnostics.test.js +93 -322
  20. package/dist/editor/ai/agentDiagnostics.test.js.map +1 -1
  21. package/dist/editor/ai/agentRecoveryEventBus.d.ts +10 -0
  22. package/dist/editor/ai/agentRecoveryEventBus.js +18 -0
  23. package/dist/editor/ai/agentRecoveryEventBus.js.map +1 -0
  24. package/dist/editor/ai/agentWatchdogStatusRegistry.d.ts +17 -0
  25. package/dist/editor/ai/agentWatchdogStatusRegistry.js +25 -0
  26. package/dist/editor/ai/agentWatchdogStatusRegistry.js.map +1 -0
  27. package/dist/editor/client/EditorShell.js +8 -7
  28. package/dist/editor/client/EditorShell.js.map +1 -1
  29. package/dist/editor/reviews/Comment.js +9 -0
  30. package/dist/editor/reviews/Comment.js.map +1 -1
  31. package/dist/editor/services/agentService.d.ts +1 -0
  32. package/dist/editor/services/agentService.js.map +1 -1
  33. package/dist/editor/settings/SettingsHeaderActionsContext.d.ts +0 -1
  34. package/dist/editor/settings/SettingsHeaderActionsContext.js +0 -3
  35. package/dist/editor/settings/SettingsHeaderActionsContext.js.map +1 -1
  36. package/dist/editor/settings/SettingsView.js +1 -1
  37. package/dist/editor/settings/SettingsView.js.map +1 -1
  38. package/dist/revision.d.ts +2 -2
  39. package/dist/revision.js +2 -2
  40. package/dist/splash-screen/ParheliaAssistantChat.js +61 -16
  41. package/dist/splash-screen/ParheliaAssistantChat.js.map +1 -1
  42. package/dist/splash-screen/SplashScreenAgentContext.d.ts +28 -0
  43. package/dist/splash-screen/SplashScreenAgentContext.js +51 -0
  44. package/dist/splash-screen/SplashScreenAgentContext.js.map +1 -0
  45. package/dist/task-board/TaskBoardWorkspace.js +31 -1
  46. package/dist/task-board/TaskBoardWorkspace.js.map +1 -1
  47. package/dist/task-board/components/TaskBoardTitlebar.js +6 -2
  48. package/dist/task-board/components/TaskBoardTitlebar.js.map +1 -1
  49. package/dist/task-board/services/taskService.d.ts +3 -0
  50. package/dist/task-board/services/taskService.js +4 -0
  51. package/dist/task-board/services/taskService.js.map +1 -1
  52. package/dist/task-board/taskBoardNavStore.d.ts +1 -0
  53. package/dist/task-board/taskBoardNavStore.js +1 -0
  54. package/dist/task-board/taskBoardNavStore.js.map +1 -1
  55. package/dist/task-board/types.d.ts +3 -0
  56. package/dist/task-board/views/DependencyGraphView.js +9 -8
  57. package/dist/task-board/views/DependencyGraphView.js.map +1 -1
  58. 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, seenApprovalDialogs, onApprovalDialogShown, browserCaptureInlinePrompt, readOnly, }: ToolCallDisplayProps): import("react/jsx-runtime").JSX.Element | null;
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, useRef } from "react";
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, seenApprovalDialogs, onApprovalDialogShown, browserCaptureInlinePrompt, readOnly = false, }) {
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: "grid transition-[grid-template-rows] duration-200 ease-out", style: {
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, onApprovalDialogShown: onApprovalDialogShown, finalApprovalInfo: finalApprovalInfo, isAgentToolCall: isAgentToolCall, originalToolCall: originalToolCall, toolCall: toolCall, messageId: toolCallMessageId, agentId: agentId, readOnly: readOnly })), toolCallMeta &&
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
- // Separate component for approval dialog to properly handle useEffect
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);