@tonyclaw/agent-inspector 3.0.7 → 3.0.8

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 (66) hide show
  1. package/.output/cli.js +245 -171
  2. package/.output/nitro.json +1 -1
  3. package/.output/public/assets/{CompareDrawer-C0Kbsm-Q.js → CompareDrawer-Bth_Ywyt.js} +1 -1
  4. package/.output/public/assets/ProxyViewerContainer-C73EU9Jq.js +106 -0
  5. package/.output/public/assets/ReplayDialog-C2YYAuTe.js +1 -0
  6. package/.output/public/assets/{RequestAnatomy-fa0JXy5p.js → RequestAnatomy-8k9dAX2j.js} +1 -1
  7. package/.output/public/assets/ResponseView-DEL6JcXm.js +3 -0
  8. package/.output/public/assets/StreamingChunkSequence-DngmoR9j.js +1 -0
  9. package/.output/public/assets/{_sessionId-D5fYH2C0.js → _sessionId-4vk9RMZ5.js} +1 -1
  10. package/.output/public/assets/index-DBEB1rHe.css +1 -0
  11. package/.output/public/assets/{index-BEsqvywM.js → index-DINLvnm9.js} +1 -1
  12. package/.output/public/assets/index-LPIGiUMP.js +1 -0
  13. package/.output/public/assets/{json-viewer-B0QRbMSf.js → json-viewer-CH5dvS2Y.js} +1 -1
  14. package/.output/public/assets/{main-CuKZD7n0.js → main-GWkZn4xy.js} +2 -2
  15. package/.output/server/{_sessionId-DdBTK3qm.mjs → _sessionId-EgsjdkN7.mjs} +3 -3
  16. package/.output/server/_ssr/{CompareDrawer-m82cVZ73.mjs → CompareDrawer-CaM8FYuD.mjs} +2 -2
  17. package/.output/server/_ssr/{ProxyViewerContainer-7geuf78f.mjs → ProxyViewerContainer-EJIogcGd.mjs} +545 -309
  18. package/.output/server/_ssr/{ReplayDialog-B8RlWLLH.mjs → ReplayDialog-BPpJ2-q8.mjs} +58 -23
  19. package/.output/server/_ssr/{RequestAnatomy-BE7pmwpv.mjs → RequestAnatomy-DeQAWnZx.mjs} +2 -2
  20. package/.output/server/_ssr/{ResponseView-D-sDsdQr.mjs → ResponseView-Dshm8iQ7.mjs} +2 -2
  21. package/.output/server/_ssr/{StreamingChunkSequence-DU_hThJr.mjs → StreamingChunkSequence-32yIU2hn.mjs} +30 -20
  22. package/.output/server/_ssr/{index-D0sV8UbE.mjs → index-XRcx9blU.mjs} +2 -2
  23. package/.output/server/_ssr/index.mjs +2 -2
  24. package/.output/server/_ssr/{json-viewer-CaDh1zrw.mjs → json-viewer-C0aX5rqC.mjs} +2 -2
  25. package/.output/server/_ssr/{router-Zh2iZ_u0.mjs → router-BI-Mvxz9.mjs} +441 -172
  26. package/.output/server/_tanstack-start-manifest_v-jKScklL_.mjs +4 -0
  27. package/.output/server/index.mjs +71 -71
  28. package/package.json +1 -1
  29. package/src/assets/IDE/opencode.svg +1 -1
  30. package/src/assets/IDE/xiaomimimo.svg +1 -1
  31. package/src/cli/detect-tools.ts +2 -27
  32. package/src/cli/templates/codex-skill-onboard.ts +1 -1
  33. package/src/cli/templates/skill-onboard.ts +2 -3
  34. package/src/cli.ts +9 -86
  35. package/src/components/ProxyViewer.tsx +55 -8
  36. package/src/components/ProxyViewerContainer.tsx +30 -19
  37. package/src/components/clients/ClientLogo.tsx +22 -2
  38. package/src/components/ecosystem/AgentLabDialog.tsx +204 -3
  39. package/src/components/groups/GroupsDialog.tsx +28 -40
  40. package/src/components/providers/ImportWizardDialog.tsx +51 -101
  41. package/src/components/providers/ProvidersPanel.tsx +82 -68
  42. package/src/components/providers/SettingsDialog.tsx +11 -12
  43. package/src/components/proxy-viewer/AgentTraceSummary.tsx +15 -23
  44. package/src/components/proxy-viewer/ReplayDialog.tsx +65 -22
  45. package/src/components/proxy-viewer/StreamingChunkSequence.tsx +33 -20
  46. package/src/lib/apiClient.ts +43 -10
  47. package/src/lib/ecosystemContract.ts +32 -0
  48. package/src/lib/export-logs.ts +37 -3
  49. package/src/proxy/ecosystemRegistry.ts +244 -0
  50. package/src/proxy/ecosystemTasks.ts +153 -0
  51. package/src/proxy/platformCommands.ts +212 -0
  52. package/src/proxy/socketTracker.ts +84 -143
  53. package/src/routes/api/ecosystem.packages.$packageId.help.ts +16 -0
  54. package/src/routes/api/ecosystem.packages.$packageId.install.ts +16 -0
  55. package/src/routes/api/ecosystem.packages.$packageId.runner-presets.ts +19 -0
  56. package/src/routes/api/ecosystem.packages.$packageId.upgrade.ts +16 -0
  57. package/src/routes/api/ecosystem.packages.ts +1 -248
  58. package/src/routes/api/ecosystem.tasks.$taskId.ts +16 -0
  59. package/src/routes/api/ecosystem.tasks.ts +12 -0
  60. package/.output/public/assets/ProxyViewerContainer-p-rpYyiF.js +0 -106
  61. package/.output/public/assets/ReplayDialog-CM3dhP8v.js +0 -1
  62. package/.output/public/assets/ResponseView-Bq6sC7Ay.js +0 -3
  63. package/.output/public/assets/StreamingChunkSequence-CGOun3Df.js +0 -1
  64. package/.output/public/assets/index-C29Olfzt.js +0 -1
  65. package/.output/public/assets/index-DgANE0r3.css +0 -1
  66. package/.output/server/_tanstack-start-manifest_v-LCE-2AaF.mjs +0 -4
@@ -1,7 +1,7 @@
1
1
  import { r as reactExports, j as jsxRuntimeExports } from "../_libs/react.mjs";
2
- import { u as useProviders, D as Dialog, d as DialogContent, e as DialogHeader, h as DialogTitle, T as Tabs, i as TabsList, j as TabsTrigger, k as TabsContent, l as Button, m as TooltipProvider, n as Tooltip, o as TooltipTrigger, p as TooltipContent, q as dispatchLogFocusRequest } from "./ProxyViewerContainer-7geuf78f.mjs";
3
- import { ResponseView } from "./ResponseView-D-sDsdQr.mjs";
4
- import { C as CapturedLogSchema } from "./router-Zh2iZ_u0.mjs";
2
+ import { u as useProviders, d as fetchJsonWithTimeout, D as Dialog, e as DialogContent, h as DialogHeader, i as DialogTitle, T as Tabs, j as TabsList, k as TabsTrigger, l as TabsContent, m as Button, n as TooltipProvider, o as Tooltip, p as TooltipTrigger, q as TooltipContent, s as dispatchLogFocusRequest, A as ApiTimeoutError } from "./ProxyViewerContainer-EJIogcGd.mjs";
3
+ import { ResponseView } from "./ResponseView-Dshm8iQ7.mjs";
4
+ import { C as CapturedLogSchema } from "./router-BI-Mvxz9.mjs";
5
5
  import "../_libs/jszip.mjs";
6
6
  import "../_libs/modelcontextprotocol__server.mjs";
7
7
  import { am as RotateCcw, ay as Braces, az as Minimize2 } from "../_libs/lucide-react.mjs";
@@ -223,6 +223,8 @@ const ReplayHistorySchema = object({
223
223
  logs: array(CapturedLogSchema),
224
224
  total: number()
225
225
  });
226
+ const REPLAY_TIMEOUT_MS = 6e4;
227
+ const REPLAY_HISTORY_TIMEOUT_MS = 1e4;
226
228
  function formatJsonForEdit(value) {
227
229
  try {
228
230
  const parsed = JSON.parse(value);
@@ -330,56 +332,89 @@ function ReplayDialog({
330
332
  const [replayHistory, setReplayHistory] = reactExports.useState([]);
331
333
  const [loading, setLoading] = reactExports.useState(false);
332
334
  const [error, setError] = reactExports.useState(null);
335
+ const replayAbortRef = reactExports.useRef(null);
336
+ const replayRequestIdRef = reactExports.useRef(0);
333
337
  const jsonEditState = reactExports.useMemo(() => readJsonEditState(modifiedBody), [modifiedBody]);
338
+ const cancelReplay = reactExports.useCallback(() => {
339
+ replayRequestIdRef.current += 1;
340
+ replayAbortRef.current?.abort();
341
+ replayAbortRef.current = null;
342
+ setLoading(false);
343
+ }, []);
334
344
  const refreshReplayHistory = reactExports.useCallback(async () => {
335
345
  if (!open) return;
336
346
  try {
337
- const response = await fetch(`/api/logs?replayOf=${String(log.id)}`);
338
- if (!response.ok) return;
339
- const data = await response.json();
340
- const parsed = ReplayHistorySchema.safeParse(data);
341
- if (!parsed.success) return;
342
- setReplayHistory(parsed.data.logs);
347
+ const data = await fetchJsonWithTimeout(
348
+ `/api/logs?replayOf=${String(log.id)}`,
349
+ ReplayHistorySchema,
350
+ REPLAY_HISTORY_TIMEOUT_MS
351
+ );
352
+ setReplayHistory(data.logs);
343
353
  } catch {
344
354
  }
345
355
  }, [log.id, open]);
346
356
  reactExports.useEffect(() => {
347
357
  void refreshReplayHistory();
348
358
  }, [refreshReplayHistory]);
359
+ reactExports.useEffect(() => {
360
+ if (open) return void 0;
361
+ cancelReplay();
362
+ return void 0;
363
+ }, [cancelReplay, open]);
364
+ reactExports.useEffect(() => {
365
+ return () => {
366
+ replayRequestIdRef.current += 1;
367
+ replayAbortRef.current?.abort();
368
+ replayAbortRef.current = null;
369
+ };
370
+ }, []);
349
371
  async function handleReplay() {
350
372
  if (!jsonEditState.valid) {
351
373
  setError("Request body must be valid JSON before replay.");
352
374
  return;
353
375
  }
376
+ replayAbortRef.current?.abort();
377
+ const requestId = replayRequestIdRef.current + 1;
378
+ replayRequestIdRef.current = requestId;
379
+ const controller = new AbortController();
380
+ replayAbortRef.current = controller;
354
381
  setLoading(true);
355
382
  setError(null);
356
383
  setReplayResult(null);
357
384
  try {
358
- const res = await fetch(`/api/logs/${log.id}/replay`, {
359
- method: "POST",
360
- headers: { "Content-Type": "application/json" },
361
- body: JSON.stringify({ modifiedBody })
362
- });
363
- const json = await res.json();
364
- const parsed = ReplayResultSchema.safeParse(json);
365
- if (!parsed.success) {
366
- setError("Invalid response from server");
367
- setLoading(false);
368
- return;
369
- }
370
- const data = parsed.data;
385
+ const data = await fetchJsonWithTimeout(
386
+ `/api/logs/${log.id}/replay`,
387
+ ReplayResultSchema,
388
+ REPLAY_TIMEOUT_MS,
389
+ {
390
+ method: "POST",
391
+ headers: { "Content-Type": "application/json" },
392
+ body: JSON.stringify({ modifiedBody }),
393
+ signal: controller.signal
394
+ }
395
+ );
396
+ if (replayRequestIdRef.current !== requestId) return;
371
397
  setReplayResult(data);
372
398
  await refreshReplayHistory();
373
399
  if (!data.success) {
374
400
  setError(data.error ?? "Replay failed");
375
401
  }
376
402
  } catch (err) {
403
+ if (replayRequestIdRef.current !== requestId) return;
404
+ if (err instanceof ApiTimeoutError || err instanceof DOMException && err.name === "AbortError") {
405
+ setError("Replay timed out or was canceled.");
406
+ return;
407
+ }
377
408
  setError(err instanceof Error ? err.message : "Network error");
378
409
  } finally {
379
- setLoading(false);
410
+ if (replayRequestIdRef.current === requestId) {
411
+ replayAbortRef.current = null;
412
+ setLoading(false);
413
+ }
380
414
  }
381
415
  }
382
416
  function handleClose() {
417
+ cancelReplay();
383
418
  setReplayResult(null);
384
419
  setError(null);
385
420
  onOpenChange(false);
@@ -1,6 +1,6 @@
1
1
  import { r as reactExports, j as jsxRuntimeExports } from "../_libs/react.mjs";
2
- import { u as useProviders, s as analyzeContextIntelligence, f as formatTokens, m as TooltipProvider, c as cn, n as Tooltip, o as TooltipTrigger, p as TooltipContent, S as SegmentBar, R as ROLE_COLOR_CLASSES, A as ANATOMY_ROLE_LABELS, t as formatContextWindowTokens, C as CONTEXT_USAGE_THRESHOLDS } from "./ProxyViewerContainer-7geuf78f.mjs";
3
- import "./router-Zh2iZ_u0.mjs";
2
+ import { u as useProviders, t as analyzeContextIntelligence, f as formatTokens, n as TooltipProvider, c as cn, o as Tooltip, p as TooltipTrigger, q as TooltipContent, S as SegmentBar, R as ROLE_COLOR_CLASSES, v as ANATOMY_ROLE_LABELS, w as formatContextWindowTokens, C as CONTEXT_USAGE_THRESHOLDS } from "./ProxyViewerContainer-EJIogcGd.mjs";
3
+ import "./router-BI-Mvxz9.mjs";
4
4
  import "../_libs/modelcontextprotocol__server.mjs";
5
5
  import "../_libs/jszip.mjs";
6
6
  import { I as Info, a as ChevronDown, h as ChevronRight } from "../_libs/lucide-react.mjs";
@@ -1,6 +1,6 @@
1
1
  import { r as reactExports, j as jsxRuntimeExports } from "../_libs/react.mjs";
2
- import { g as getLogFormatAdapter, f as formatTokens, c as cn, v as getStatusCategory, B as Badge, w as Collapsible, x as CollapsibleTrigger, y as CollapsibleContent, z as ScrollArea, E as LazyJsonViewer, F as safeJsonValue } from "./ProxyViewerContainer-7geuf78f.mjs";
3
- import { s as safeGetOwnProperty } from "./router-Zh2iZ_u0.mjs";
2
+ import { g as getLogFormatAdapter, f as formatTokens, c as cn, x as getStatusCategory, B as Badge, y as Collapsible, z as CollapsibleTrigger, E as CollapsibleContent, F as ScrollArea, G as LazyJsonViewer, H as safeJsonValue } from "./ProxyViewerContainer-EJIogcGd.mjs";
3
+ import { s as safeGetOwnProperty } from "./router-BI-Mvxz9.mjs";
4
4
  import "../_libs/jszip.mjs";
5
5
  import "../_libs/modelcontextprotocol__server.mjs";
6
6
  import { $ as Zap, T as TriangleAlert, aA as CircleStop, a1 as Brain, a as ChevronDown, h as ChevronRight, r as Terminal } from "../_libs/lucide-react.mjs";
@@ -1,9 +1,10 @@
1
1
  import { r as reactExports, j as jsxRuntimeExports } from "../_libs/react.mjs";
2
- import { m as TooltipProvider, n as Tooltip, o as TooltipTrigger, B as Badge, p as TooltipContent, E as LazyJsonViewer } from "./ProxyViewerContainer-7geuf78f.mjs";
3
- import "./router-Zh2iZ_u0.mjs";
4
- import "../_libs/modelcontextprotocol__server.mjs";
2
+ import { d as fetchJsonWithTimeout, n as TooltipProvider, o as Tooltip, p as TooltipTrigger, B as Badge, q as TooltipContent, G as LazyJsonViewer } from "./ProxyViewerContainer-EJIogcGd.mjs";
3
+ import { S as StreamingChunkSchema$1 } from "./router-BI-Mvxz9.mjs";
5
4
  import "../_libs/jszip.mjs";
5
+ import "../_libs/modelcontextprotocol__server.mjs";
6
6
  import { a as ChevronDown, h as ChevronRight, L as LoaderCircle } from "../_libs/lucide-react.mjs";
7
+ import { d as object, c as boolean, a as array } from "../_libs/zod.mjs";
7
8
  import "../_libs/swr.mjs";
8
9
  import "../_libs/use-sync-external-store.mjs";
9
10
  import "../_libs/dequal.mjs";
@@ -55,7 +56,6 @@ import "../_libs/radix-ui__react-arrow.mjs";
55
56
  import "../_libs/radix-ui__react-use-size.mjs";
56
57
  import "../_libs/radix-ui__react-use-previous.mjs";
57
58
  import "../_libs/@radix-ui/react-visually-hidden+[...].mjs";
58
- import "../_libs/zod.mjs";
59
59
  import "../_libs/radix-ui__react-tabs.mjs";
60
60
  import "../_libs/radix-ui__react-roving-focus.mjs";
61
61
  import "../_libs/radix-ui__react-tooltip.mjs";
@@ -115,6 +115,11 @@ import "../_libs/lie.mjs";
115
115
  import "../_libs/immediate.mjs";
116
116
  import "../_libs/setimmediate.mjs";
117
117
  import "../_libs/pako.mjs";
118
+ const StreamingChunksResponseSchema = object({
119
+ chunks: array(StreamingChunkSchema$1),
120
+ truncated: boolean().optional()
121
+ });
122
+ const CHUNK_FETCH_TIMEOUT_MS = 1e4;
118
123
  const StreamingChunkSequence = reactExports.memo(function StreamingChunkSequence2({
119
124
  logId,
120
125
  truncated
@@ -122,26 +127,31 @@ const StreamingChunkSequence = reactExports.memo(function StreamingChunkSequence
122
127
  const [containerExpanded, setContainerExpanded] = reactExports.useState(false);
123
128
  const [chunkState, setChunkState] = reactExports.useState({ status: "idle" });
124
129
  const [expandedIndices, setExpandedIndices] = reactExports.useState(/* @__PURE__ */ new Set());
130
+ const loadedLogIdRef = reactExports.useRef(null);
125
131
  reactExports.useEffect(() => {
126
- if (!containerExpanded || chunkState.status !== "idle") return;
127
- let cancelled = false;
132
+ if (!containerExpanded) return;
133
+ if (loadedLogIdRef.current === logId) return;
134
+ const controller = new AbortController();
128
135
  setChunkState({ status: "loading" });
129
- fetch(`/api/logs/${logId}/chunks`).then((res) => {
130
- if (!res.ok) {
131
- return Promise.reject(new Error("Chunks not found"));
132
- }
133
- return res.json();
134
- }).then((data) => {
135
- if (!cancelled) {
136
- setChunkState({ status: "success", chunks: data.chunks });
137
- }
138
- }).catch(() => {
139
- if (!cancelled) {
140
- setChunkState({ status: "error", message: "Chunk data unavailable" });
141
- }
136
+ void fetchJsonWithTimeout(
137
+ `/api/logs/${logId}/chunks`,
138
+ StreamingChunksResponseSchema,
139
+ CHUNK_FETCH_TIMEOUT_MS,
140
+ { signal: controller.signal },
141
+ () => "Chunks not found"
142
+ ).then((data) => {
143
+ loadedLogIdRef.current = logId;
144
+ setChunkState({ status: "success", chunks: data.chunks });
145
+ }).catch((error) => {
146
+ if (error instanceof DOMException && error.name === "AbortError") return;
147
+ loadedLogIdRef.current = null;
148
+ setChunkState({
149
+ status: "error",
150
+ message: error instanceof Error ? error.message : "Chunk data unavailable"
151
+ });
142
152
  });
143
153
  return () => {
144
- cancelled = true;
154
+ controller.abort();
145
155
  };
146
156
  }, [containerExpanded, logId]);
147
157
  const groups = reactExports.useMemo(() => {
@@ -1,6 +1,6 @@
1
- import { P as ProxyViewerContainer } from "./ProxyViewerContainer-7geuf78f.mjs";
1
+ import { P as ProxyViewerContainer } from "./ProxyViewerContainer-EJIogcGd.mjs";
2
2
  import "../_libs/react.mjs";
3
- import "./router-Zh2iZ_u0.mjs";
3
+ import "./router-BI-Mvxz9.mjs";
4
4
  import "../_libs/modelcontextprotocol__server.mjs";
5
5
  import "../_libs/jszip.mjs";
6
6
  import "../_libs/swr.mjs";
@@ -198,7 +198,7 @@ function getResponse() {
198
198
  return event.res;
199
199
  }
200
200
  async function getStartManifest(matchedRoutes) {
201
- const { tsrStartManifest } = await import("../_tanstack-start-manifest_v-LCE-2AaF.mjs");
201
+ const { tsrStartManifest } = await import("../_tanstack-start-manifest_v-jKScklL_.mjs");
202
202
  const startManifest = tsrStartManifest();
203
203
  const rootRoute = startManifest.routes[rootRouteId] = startManifest.routes[rootRouteId] || {};
204
204
  rootRoute.assets = rootRoute.assets || [];
@@ -776,7 +776,7 @@ let entriesPromise;
776
776
  let baseManifestPromise;
777
777
  let cachedFinalManifestPromise;
778
778
  async function loadEntries() {
779
- const routerEntry = await import("./router-Zh2iZ_u0.mjs").then((n) => n.N);
779
+ const routerEntry = await import("./router-BI-Mvxz9.mjs").then((n) => n.N);
780
780
  const startEntry = await import("./start-HYkvq4Ni.mjs");
781
781
  return { startEntry, routerEntry };
782
782
  }
@@ -1,6 +1,6 @@
1
1
  import { r as reactExports, j as jsxRuntimeExports } from "../_libs/react.mjs";
2
- import { G as parseJsonText, c as cn, m as TooltipProvider, n as Tooltip, o as TooltipTrigger, p as TooltipContent, b as copyTextToClipboard } from "./ProxyViewerContainer-7geuf78f.mjs";
3
- import "./router-Zh2iZ_u0.mjs";
2
+ import { I as parseJsonText, c as cn, n as TooltipProvider, o as Tooltip, p as TooltipTrigger, q as TooltipContent, b as copyTextToClipboard } from "./ProxyViewerContainer-EJIogcGd.mjs";
3
+ import "./router-BI-Mvxz9.mjs";
4
4
  import "../_libs/modelcontextprotocol__server.mjs";
5
5
  import "../_libs/jszip.mjs";
6
6
  import { b as Check, e as Copy, a as ChevronDown, h as ChevronRight, aj as ChevronsDown } from "../_libs/lucide-react.mjs";