@tonyclaw/agent-inspector 2.1.8 → 2.1.10
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/.output/nitro.json +1 -1
- package/.output/public/assets/{CompareDrawer-CHkT7kun.js → CompareDrawer-BaGKK2R7.js} +1 -1
- package/.output/public/assets/{ProxyViewerContainer-BiZ2_tMC.js → ProxyViewerContainer-Cxwizw8H.js} +35 -35
- package/.output/public/assets/{ReplayDialog-C85cakjx.js → ReplayDialog-Io8Ufsif.js} +1 -1
- package/.output/public/assets/{RequestAnatomy-Dn_pMMoX.js → RequestAnatomy-CiZE_fKZ.js} +1 -1
- package/.output/public/assets/{ResponseView-DzcxCUBf.js → ResponseView-TJwxn-lh.js} +1 -1
- package/.output/public/assets/{StreamingChunkSequence-BamtvkgZ.js → StreamingChunkSequence-D-9ysFSG.js} +1 -1
- package/.output/public/assets/_sessionId-3JCekYV3.js +1 -0
- package/.output/public/assets/index-B3EOwfg7.js +1 -0
- package/.output/public/assets/index-CmtfjQPv.css +1 -0
- package/.output/public/assets/{main-Dc2qVWpb.js → main-JvXpk_ov.js} +2 -2
- package/.output/server/{_sessionId-BnimGger.mjs → _sessionId-DSZ76cjr.mjs} +3 -3
- package/.output/server/_ssr/{CompareDrawer-CwVFykVF.mjs → CompareDrawer-BcUJ7lNL.mjs} +3 -3
- package/.output/server/_ssr/{ProxyViewerContainer-X3S2TWBJ.mjs → ProxyViewerContainer-DEtSh7OB.mjs} +87 -93
- package/.output/server/_ssr/{ReplayDialog-BxC12XUj.mjs → ReplayDialog-DwSynSXP.mjs} +4 -4
- package/.output/server/_ssr/{RequestAnatomy-CWWS8Qh7.mjs → RequestAnatomy-C6LGadAw.mjs} +3 -3
- package/.output/server/_ssr/{ResponseView-BewErHF-.mjs → ResponseView-Dr27DXbx.mjs} +3 -3
- package/.output/server/_ssr/{StreamingChunkSequence-BlmCVryW.mjs → StreamingChunkSequence-CDTaUWjj.mjs} +3 -3
- package/.output/server/_ssr/{index-5qbGuoFX.mjs → index-D803rHfz.mjs} +3 -3
- package/.output/server/_ssr/index.mjs +2 -2
- package/.output/server/_ssr/{router-s78S54MU.mjs → router-D7dDibPa.mjs} +137 -120
- package/.output/server/{_tanstack-start-manifest_v-DTxpr3KE.mjs → _tanstack-start-manifest_v-P9lKyaOf.mjs} +1 -1
- package/.output/server/index.mjs +60 -60
- package/package.json +1 -1
- package/src/components/proxy-viewer/ConversationGroup.tsx +3 -9
- package/src/components/proxy-viewer/ConversationHeader.tsx +65 -39
- package/src/proxy/socketTracker.ts +265 -27
- package/.output/public/assets/_sessionId-xBBbFH1M.js +0 -1
- package/.output/public/assets/index-6udjwQO1.js +0 -1
- package/.output/public/assets/index-DP4NzCZ5.css +0 -1
|
@@ -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-
|
|
201
|
+
const { tsrStartManifest } = await import("../_tanstack-start-manifest_v-P9lKyaOf.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-
|
|
779
|
+
const routerEntry = await import("./router-D7dDibPa.mjs").then((n) => n.y);
|
|
780
780
|
const startEntry = await import("./start-HYkvq4Ni.mjs");
|
|
781
781
|
return { startEntry, routerEntry };
|
|
782
782
|
}
|
|
@@ -65,7 +65,7 @@ import "../_libs/immediate.mjs";
|
|
|
65
65
|
import "../_libs/setimmediate.mjs";
|
|
66
66
|
import "../_libs/pako.mjs";
|
|
67
67
|
const faviconSvg = "data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%20role='img'%20aria-label='Agent%20Inspector'%3e%3cg%20fill='none'%20stroke='%23f59e0b'%20stroke-width='1.5'%20stroke-linecap='round'%20stroke-linejoin='round'%20%3e%3cpath%20d='M5%2013%20C5%209%208%207%2012%207%20C16%207%2019%209%2019%2013%20C19%2016%2016%2018%2012%2018%20C8%2018%205%2016%205%2013%20Z'%20/%3e%3cpath%20d='M5%2011%20C3.5%209.5%201.5%2010%202%2012.5%20C2.5%2014%204%2013.5%205%2012.5'%20/%3e%3cpath%20d='M19%2011%20C20.5%209.5%2022.5%2010%2022%2012.5%20C21.5%2014%2020%2013.5%2019%2012.5'%20/%3e%3cline%20x1='10'%20y1='7'%20x2='9.5'%20y2='5'%20/%3e%3cline%20x1='14'%20y1='7'%20x2='14.5'%20y2='5'%20/%3e%3cline%20x1='6.5'%20y1='16'%20x2='4.5'%20y2='19.5'%20/%3e%3cline%20x1='9'%20y1='17.5'%20x2='8'%20y2='20.5'%20/%3e%3cline%20x1='15'%20y1='17.5'%20x2='16'%20y2='20.5'%20/%3e%3cline%20x1='17.5'%20y1='16'%20x2='19.5'%20y2='19.5'%20/%3e%3c/g%3e%3ccircle%20cx='9.5'%20cy='4.5'%20r='0.9'%20fill='%23f59e0b'%20/%3e%3ccircle%20cx='14.5'%20cy='4.5'%20r='0.9'%20fill='%23f59e0b'%20/%3e%3c/svg%3e";
|
|
68
|
-
const appCss = "/assets/index-
|
|
68
|
+
const appCss = "/assets/index-CmtfjQPv.css";
|
|
69
69
|
const Route$D = createRootRoute({
|
|
70
70
|
head: () => ({
|
|
71
71
|
meta: [
|
|
@@ -108,7 +108,7 @@ function RootDocument({ children }) {
|
|
|
108
108
|
] })
|
|
109
109
|
] });
|
|
110
110
|
}
|
|
111
|
-
const $$splitComponentImporter$1 = () => import("./index-
|
|
111
|
+
const $$splitComponentImporter$1 = () => import("./index-D803rHfz.mjs");
|
|
112
112
|
const Route$C = createFileRoute("/")({
|
|
113
113
|
component: lazyRouteComponent($$splitComponentImporter$1, "component")
|
|
114
114
|
});
|
|
@@ -151,7 +151,7 @@ function decodeSessionIdFromPath(encoded) {
|
|
|
151
151
|
function getSessionPath(sessionId) {
|
|
152
152
|
return `/session/${encodeSessionIdForPath(sessionId)}`;
|
|
153
153
|
}
|
|
154
|
-
const $$splitComponentImporter = () => import("../_sessionId-
|
|
154
|
+
const $$splitComponentImporter = () => import("../_sessionId-DSZ76cjr.mjs");
|
|
155
155
|
const Route$B = createFileRoute("/session/$sessionId")({
|
|
156
156
|
component: lazyRouteComponent($$splitComponentImporter, "component"),
|
|
157
157
|
parseParams: (params) => ({
|
|
@@ -5150,112 +5150,33 @@ function findProviderByModel(model) {
|
|
|
5150
5150
|
}
|
|
5151
5151
|
const execAsync = promisify(exec);
|
|
5152
5152
|
const execFileAsync = promisify(execFile);
|
|
5153
|
-
const cache = /* @__PURE__ */ new Map();
|
|
5154
|
-
const CACHE_TTL_MS = 5 * 60 * 1e3;
|
|
5155
|
-
const MAX_CACHE_SIZE = 200;
|
|
5156
5153
|
const RemotePortSchema = number().int().min(1).max(65535);
|
|
5157
|
-
|
|
5154
|
+
object({
|
|
5158
5155
|
remotePort: RemotePortSchema.nullish()
|
|
5159
5156
|
}).passthrough();
|
|
5160
|
-
const
|
|
5161
|
-
|
|
5162
|
-
|
|
5163
|
-
|
|
5164
|
-
|
|
5165
|
-
|
|
5166
|
-
|
|
5167
|
-
|
|
5168
|
-
|
|
5169
|
-
|
|
5170
|
-
|
|
5171
|
-
|
|
5157
|
+
const RECENT_CLIENT_TTL_MS = 1e3;
|
|
5158
|
+
let recentInflight = null;
|
|
5159
|
+
let recentCache = null;
|
|
5160
|
+
let recentCacheExpiresAt = 0;
|
|
5161
|
+
function getProxyPort() {
|
|
5162
|
+
const raw = process.env["PROXY_PORT"];
|
|
5163
|
+
if (raw !== void 0) {
|
|
5164
|
+
const parsed = parseInt(raw, 10);
|
|
5165
|
+
if (Number.isInteger(parsed) && parsed > 0 && parsed <= 65535) return parsed;
|
|
5166
|
+
}
|
|
5167
|
+
return 25947;
|
|
5168
|
+
}
|
|
5169
|
+
function getRecentClientFromCache() {
|
|
5170
|
+
if (recentCache === null) return null;
|
|
5171
|
+
if (Date.now() >= recentCacheExpiresAt) {
|
|
5172
|
+
recentCache = null;
|
|
5173
|
+
return null;
|
|
5172
5174
|
}
|
|
5173
|
-
|
|
5174
|
-
return null;
|
|
5175
|
-
}
|
|
5176
|
-
function setCache(port, info) {
|
|
5177
|
-
cache.set(port, { ...info, expiresAt: Date.now() + CACHE_TTL_MS });
|
|
5178
|
-
evictCacheIfNeeded();
|
|
5179
|
-
}
|
|
5180
|
-
function extractRemotePort(request) {
|
|
5181
|
-
const descriptor = Object.getOwnPropertyDescriptor(request, "socket");
|
|
5182
|
-
if (descriptor === void 0 || descriptor.get !== void 0) return null;
|
|
5183
|
-
const parsed = SocketSchema.safeParse(descriptor.value);
|
|
5184
|
-
if (!parsed.success) return null;
|
|
5185
|
-
const remotePort = parsed.data.remotePort;
|
|
5186
|
-
if (remotePort === void 0 || remotePort === null) return null;
|
|
5187
|
-
return remotePort;
|
|
5175
|
+
return recentCache;
|
|
5188
5176
|
}
|
|
5189
|
-
|
|
5190
|
-
|
|
5191
|
-
|
|
5192
|
-
if (platform === "win32") {
|
|
5193
|
-
const psScript = [
|
|
5194
|
-
`$conn = Get-NetTCPConnection -LocalPort ${port} -State Established -ErrorAction SilentlyContinue | Select-Object -First 1`,
|
|
5195
|
-
`if ($conn) {`,
|
|
5196
|
-
` $pid = $conn.OwningProcess`,
|
|
5197
|
-
` $proc = Get-CimInstance Win32_Process -Filter "ProcessId=$pid" -ErrorAction SilentlyContinue`,
|
|
5198
|
-
` $cmd = if ($proc) { $proc.CommandLine } else { "" }`,
|
|
5199
|
-
` Write-Output "$pid|$cmd"`,
|
|
5200
|
-
`}`
|
|
5201
|
-
].join("; ");
|
|
5202
|
-
const { stdout } = await execFileAsync(
|
|
5203
|
-
"powershell.exe",
|
|
5204
|
-
["-NoProfile", "-NonInteractive", "-ExecutionPolicy", "Bypass", "-Command", psScript],
|
|
5205
|
-
{
|
|
5206
|
-
windowsHide: true,
|
|
5207
|
-
timeout: 3e3,
|
|
5208
|
-
maxBuffer: 64 * 1024
|
|
5209
|
-
}
|
|
5210
|
-
);
|
|
5211
|
-
const trimmed = stdout.trim();
|
|
5212
|
-
if (trimmed === "") {
|
|
5213
|
-
return { port, pid: null, cwd: null, projectFolder: null };
|
|
5214
|
-
}
|
|
5215
|
-
const [pidStr, ...cmdParts] = trimmed.split("|");
|
|
5216
|
-
const pid2 = parseInt(pidStr ?? "", 10);
|
|
5217
|
-
if (isNaN(pid2) || pid2 <= 0) {
|
|
5218
|
-
return { port, pid: null, cwd: null, projectFolder: null };
|
|
5219
|
-
}
|
|
5220
|
-
const commandLine = cmdParts.join("|").trim();
|
|
5221
|
-
const { cwd: cwd2, projectFolder: projectFolder2 } = parseCommandLine(commandLine, "\\");
|
|
5222
|
-
return { port, pid: pid2, cwd: cwd2, projectFolder: projectFolder2 };
|
|
5223
|
-
}
|
|
5224
|
-
let pid = null;
|
|
5225
|
-
if (platform === "darwin") {
|
|
5226
|
-
const { stdout } = await execAsync(`lsof -i :${port} -sTCP:ESTABLISHED -t 2>/dev/null`, {
|
|
5227
|
-
shell: "/bin/sh"
|
|
5228
|
-
});
|
|
5229
|
-
const parsed = parseInt(stdout.trim(), 10);
|
|
5230
|
-
if (!isNaN(parsed) && parsed > 0) pid = parsed;
|
|
5231
|
-
} else {
|
|
5232
|
-
try {
|
|
5233
|
-
const { stdout } = await execAsync(
|
|
5234
|
-
`ss -tlnp 'sport = :${port}' 2>/dev/null | grep ESTAB | awk '{print $6}' | grep -o 'pid=[0-9]*' | cut -d= -f2`,
|
|
5235
|
-
{ shell: "/bin/sh" }
|
|
5236
|
-
);
|
|
5237
|
-
const parsed = parseInt(stdout.trim(), 10);
|
|
5238
|
-
if (!isNaN(parsed) && parsed > 0) pid = parsed;
|
|
5239
|
-
} catch {
|
|
5240
|
-
}
|
|
5241
|
-
if (pid === null) {
|
|
5242
|
-
const { stdout } = await execAsync(
|
|
5243
|
-
`netstat -tan 2>/dev/null | grep ':${port}' | grep ESTABLISHED | awk '{print $7}' | cut -d/ -f1`,
|
|
5244
|
-
{ shell: "/bin/sh" }
|
|
5245
|
-
);
|
|
5246
|
-
const parsed = parseInt(stdout.trim(), 10);
|
|
5247
|
-
if (!isNaN(parsed) && parsed > 0) pid = parsed;
|
|
5248
|
-
}
|
|
5249
|
-
}
|
|
5250
|
-
if (pid === null) {
|
|
5251
|
-
return { port, pid: null, cwd: null, projectFolder: null };
|
|
5252
|
-
}
|
|
5253
|
-
const { cwd, projectFolder } = await lookupProcessInfo(pid);
|
|
5254
|
-
return { port, pid, cwd, projectFolder };
|
|
5255
|
-
} catch (err) {
|
|
5256
|
-
logger.debug(`[socketTracker] Failed to lookup info for port ${port}:`, String(err));
|
|
5257
|
-
return { port, pid: null, cwd: null, projectFolder: null };
|
|
5258
|
-
}
|
|
5177
|
+
function setRecentClientCache(info) {
|
|
5178
|
+
recentCache = info;
|
|
5179
|
+
recentCacheExpiresAt = Date.now() + RECENT_CLIENT_TTL_MS;
|
|
5259
5180
|
}
|
|
5260
5181
|
function parseCommandLine(commandLine, sep) {
|
|
5261
5182
|
if (!commandLine) return { cwd: null, projectFolder: null };
|
|
@@ -5318,27 +5239,123 @@ async function lookupProcessInfo(pid) {
|
|
|
5318
5239
|
return { cwd: null, projectFolder: null };
|
|
5319
5240
|
}
|
|
5320
5241
|
}
|
|
5321
|
-
async function
|
|
5322
|
-
const port =
|
|
5323
|
-
|
|
5242
|
+
async function lookupRecentClient() {
|
|
5243
|
+
const port = getProxyPort();
|
|
5244
|
+
const platform = process.platform;
|
|
5245
|
+
try {
|
|
5246
|
+
if (platform === "win32") {
|
|
5247
|
+
const psScript = [
|
|
5248
|
+
`$rows = Get-NetTCPConnection -RemotePort ${port} -State Established -ErrorAction SilentlyContinue`,
|
|
5249
|
+
`if ($rows) {`,
|
|
5250
|
+
` $rows = $rows | Sort-Object CreationTime -Descending`,
|
|
5251
|
+
` $top = $rows | Select-Object -First 1`,
|
|
5252
|
+
` if ($top) { Write-Output ("$($top.OwningProcess)|$($top.LocalPort)") }`,
|
|
5253
|
+
`}`
|
|
5254
|
+
].join("; ");
|
|
5255
|
+
const { stdout: stdout2 } = await execFileAsync(
|
|
5256
|
+
"powershell.exe",
|
|
5257
|
+
["-NoProfile", "-NonInteractive", "-ExecutionPolicy", "Bypass", "-Command", psScript],
|
|
5258
|
+
{ windowsHide: true, timeout: 3e3, maxBuffer: 16 * 1024 }
|
|
5259
|
+
);
|
|
5260
|
+
const trimmed = stdout2.trim();
|
|
5261
|
+
if (trimmed === "") return { port: null, pid: null, cwd: null, projectFolder: null };
|
|
5262
|
+
const [pidStr, portStr] = trimmed.split("|");
|
|
5263
|
+
const pid = parseInt(pidStr ?? "", 10);
|
|
5264
|
+
const clientPort = parseInt(portStr ?? "", 10);
|
|
5265
|
+
if (!Number.isInteger(pid) || pid <= 0) {
|
|
5266
|
+
return { port: null, pid: null, cwd: null, projectFolder: null };
|
|
5267
|
+
}
|
|
5268
|
+
const { cwd: cwd2, projectFolder: projectFolder2 } = await lookupProcessInfo(pid);
|
|
5269
|
+
return {
|
|
5270
|
+
port: Number.isInteger(clientPort) && clientPort > 0 ? clientPort : null,
|
|
5271
|
+
pid,
|
|
5272
|
+
cwd: cwd2,
|
|
5273
|
+
projectFolder: projectFolder2
|
|
5274
|
+
};
|
|
5275
|
+
}
|
|
5276
|
+
const { stdout } = await execAsync(
|
|
5277
|
+
`netstat -tanp 2>/dev/null | grep ':${port}' | grep ESTAB || ss -tanp 2>/dev/null | grep ':${port}' | grep ESTAB`,
|
|
5278
|
+
{ shell: "/bin/sh" }
|
|
5279
|
+
);
|
|
5280
|
+
const lines = stdout.trim().split("\n").filter((line) => line.includes("ESTAB"));
|
|
5281
|
+
const clientPid = pickNewestClientPidFromNetstat(lines, port);
|
|
5282
|
+
if (clientPid === null) {
|
|
5283
|
+
return { port: null, pid: null, cwd: null, projectFolder: null };
|
|
5284
|
+
}
|
|
5285
|
+
const { cwd, projectFolder } = await lookupProcessInfo(clientPid);
|
|
5286
|
+
return { port: null, pid: clientPid, cwd, projectFolder };
|
|
5287
|
+
} catch (err) {
|
|
5288
|
+
logger.debug(`[socketTracker] Recent-client lookup failed for port ${port}:`, String(err));
|
|
5324
5289
|
return { port: null, pid: null, cwd: null, projectFolder: null };
|
|
5325
5290
|
}
|
|
5326
|
-
|
|
5327
|
-
|
|
5328
|
-
const
|
|
5291
|
+
}
|
|
5292
|
+
function pickNewestClientPidFromNetstat(lines, proxyPort) {
|
|
5293
|
+
const proxyToken = `:${proxyPort}`;
|
|
5294
|
+
const candidates2 = [];
|
|
5295
|
+
let order = 0;
|
|
5296
|
+
for (const line of lines) {
|
|
5297
|
+
order++;
|
|
5298
|
+
const cols = line.trim().split(/\s+/);
|
|
5299
|
+
if (cols.length < 7) continue;
|
|
5300
|
+
const localAddr = cols[3] ?? "";
|
|
5301
|
+
const remoteAddr = cols[4] ?? "";
|
|
5302
|
+
const pidField = cols[6] ?? "";
|
|
5303
|
+
if (!remoteAddr.endsWith(proxyToken)) continue;
|
|
5304
|
+
const pidMatch = pidField.match(/^(\d+)/);
|
|
5305
|
+
if (pidMatch === null) continue;
|
|
5306
|
+
const pid = parseInt(pidMatch[1] ?? "", 10);
|
|
5307
|
+
if (!Number.isInteger(pid) || pid <= 0) continue;
|
|
5308
|
+
const localPortMatch = localAddr.match(/:(\d+)$/);
|
|
5309
|
+
const localPort = localPortMatch !== null ? parseInt(localPortMatch[1] ?? "", 10) : 0;
|
|
5310
|
+
candidates2.push({ pid, localPort, order });
|
|
5311
|
+
}
|
|
5312
|
+
if (candidates2.length === 0) return null;
|
|
5313
|
+
candidates2.sort((a, b) => b.localPort - a.localPort || b.order - a.order);
|
|
5314
|
+
return candidates2[0]?.pid ?? null;
|
|
5315
|
+
}
|
|
5316
|
+
const CLIENT_HEADERS = {
|
|
5317
|
+
pid: "x-agent-inspector-client-pid",
|
|
5318
|
+
port: "x-agent-inspector-client-port",
|
|
5319
|
+
cwd: "x-agent-inspector-client-cwd",
|
|
5320
|
+
projectFolder: "x-agent-inspector-client-project-folder"
|
|
5321
|
+
};
|
|
5322
|
+
function readIntHeader(headers, name) {
|
|
5323
|
+
const raw = headers.get(name);
|
|
5324
|
+
if (raw === null || raw === "") return null;
|
|
5325
|
+
const parsed = parseInt(raw, 10);
|
|
5326
|
+
if (!Number.isInteger(parsed) || parsed < 0) return null;
|
|
5327
|
+
return parsed;
|
|
5328
|
+
}
|
|
5329
|
+
function readClientHeaders(request) {
|
|
5330
|
+
const pid = readIntHeader(request.headers, CLIENT_HEADERS.pid);
|
|
5331
|
+
if (pid === null || pid === 0) return null;
|
|
5332
|
+
const port = readIntHeader(request.headers, CLIENT_HEADERS.port);
|
|
5333
|
+
const cwd = request.headers.get(CLIENT_HEADERS.cwd);
|
|
5334
|
+
const projectFolder = request.headers.get(CLIENT_HEADERS.projectFolder);
|
|
5335
|
+
return {
|
|
5336
|
+
pid,
|
|
5337
|
+
port: port !== null && port > 0 ? port : null,
|
|
5338
|
+
cwd: cwd !== null && cwd !== "" ? cwd : null,
|
|
5339
|
+
projectFolder: projectFolder !== null && projectFolder !== "" ? projectFolder : null
|
|
5340
|
+
};
|
|
5341
|
+
}
|
|
5342
|
+
async function getClientInfo(request) {
|
|
5343
|
+
const fromHeaders = readClientHeaders(request);
|
|
5344
|
+
if (fromHeaders !== null) return fromHeaders;
|
|
5345
|
+
const cached = getRecentClientFromCache();
|
|
5346
|
+
if (cached !== null) return cached;
|
|
5347
|
+
const existing = recentInflight;
|
|
5329
5348
|
if (existing) return existing;
|
|
5330
|
-
const promise =
|
|
5331
|
-
|
|
5332
|
-
|
|
5349
|
+
const promise = lookupRecentClient().then((info) => {
|
|
5350
|
+
setRecentClientCache(info);
|
|
5351
|
+
recentInflight = null;
|
|
5333
5352
|
return info;
|
|
5334
5353
|
}).catch((err) => {
|
|
5335
|
-
|
|
5336
|
-
logger.debug(`[socketTracker]
|
|
5337
|
-
|
|
5338
|
-
setCache(port, fallback);
|
|
5339
|
-
return fallback;
|
|
5354
|
+
recentInflight = null;
|
|
5355
|
+
logger.debug(`[socketTracker] Recent-client lookup failed:`, String(err));
|
|
5356
|
+
return { port: null, pid: null, cwd: null, projectFolder: null };
|
|
5340
5357
|
});
|
|
5341
|
-
|
|
5358
|
+
recentInflight = promise;
|
|
5342
5359
|
return promise;
|
|
5343
5360
|
}
|
|
5344
5361
|
const DEFAULT_SLOW_RESPONSE_THRESHOLD_SECONDS = 10;
|
|
@@ -8345,7 +8362,7 @@ const Route$w = createFileRoute("/api/models")({
|
|
|
8345
8362
|
}
|
|
8346
8363
|
}
|
|
8347
8364
|
});
|
|
8348
|
-
const version = "2.1.
|
|
8365
|
+
const version = "2.1.10";
|
|
8349
8366
|
const packageJson = {
|
|
8350
8367
|
version
|
|
8351
8368
|
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const tsrStartManifest = () => ({ "routes": { "__root__": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/__root.tsx", "children": ["/", "/api/alerts", "/api/config", "/api/groups", "/api/health", "/api/logs", "/api/mcp", "/api/models", "/api/providers", "/api/runs", "/api/sessions", "/proxy/$", "/session/$sessionId", "/api/knowledge/candidates", "/api/knowledge/project-context", "/api/knowledge/search", "/api/knowledge/sessions/$sessionId/candidates"], "preloads": ["/assets/main-
|
|
1
|
+
const tsrStartManifest = () => ({ "routes": { "__root__": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/__root.tsx", "children": ["/", "/api/alerts", "/api/config", "/api/groups", "/api/health", "/api/logs", "/api/mcp", "/api/models", "/api/providers", "/api/runs", "/api/sessions", "/proxy/$", "/session/$sessionId", "/api/knowledge/candidates", "/api/knowledge/project-context", "/api/knowledge/search", "/api/knowledge/sessions/$sessionId/candidates"], "preloads": ["/assets/main-JvXpk_ov.js"], "assets": [] }, "/": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/index.tsx", "assets": [], "preloads": ["/assets/index-B3EOwfg7.js", "/assets/ProxyViewerContainer-Cxwizw8H.js"] }, "/api/alerts": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/alerts.ts", "children": ["/api/alerts/summary"] }, "/api/config": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/config.ts", "children": ["/api/config/paths"] }, "/api/groups": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/groups.ts", "children": ["/api/groups/$groupId"] }, "/api/health": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/health.ts" }, "/api/logs": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/logs.ts", "children": ["/api/logs/$id", "/api/logs/import", "/api/logs/stream"] }, "/api/mcp": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/mcp.ts" }, "/api/models": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/models.ts" }, "/api/providers": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/providers.ts", "children": ["/api/providers/$providerId", "/api/providers/export", "/api/providers/import", "/api/providers/scan"] }, "/api/runs": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/runs.ts", "children": ["/api/runs/$runId"] }, "/api/sessions": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/sessions.ts" }, "/proxy/$": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/proxy/$.ts" }, "/session/$sessionId": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/session/$sessionId.tsx", "assets": [], "preloads": ["/assets/_sessionId-3JCekYV3.js", "/assets/ProxyViewerContainer-Cxwizw8H.js"] }, "/api/alerts/summary": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/alerts.summary.ts" }, "/api/config/paths": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/config.paths.ts" }, "/api/groups/$groupId": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/groups.$groupId.ts", "children": ["/api/groups/$groupId/evidence", "/api/groups/$groupId/sessions"] }, "/api/knowledge/candidates": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/knowledge.candidates.ts", "children": ["/api/knowledge/candidates/$candidateId"] }, "/api/knowledge/project-context": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/knowledge.project-context.ts" }, "/api/knowledge/search": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/knowledge.search.ts" }, "/api/logs/$id": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/logs.$id.ts", "children": ["/api/logs/$id/body", "/api/logs/$id/chunks", "/api/logs/$id/replay"] }, "/api/logs/import": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/logs.import.ts" }, "/api/logs/stream": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/logs.stream.ts" }, "/api/providers/$providerId": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/providers.$providerId.ts", "children": ["/api/providers/$providerId/model-metadata", "/api/providers/$providerId/test"] }, "/api/providers/export": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/providers.export.ts" }, "/api/providers/import": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/providers.import.ts" }, "/api/providers/scan": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/providers.scan.ts" }, "/api/runs/$runId": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/runs.$runId.ts", "children": ["/api/runs/$runId/evidence"] }, "/api/groups/$groupId/evidence": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/groups.$groupId.evidence.ts" }, "/api/groups/$groupId/sessions": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/groups.$groupId.sessions.ts" }, "/api/knowledge/candidates/$candidateId": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/knowledge.candidates.$candidateId.ts", "children": ["/api/knowledge/candidates/$candidateId/promote"] }, "/api/logs/$id/body": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/logs.$id.body.ts" }, "/api/logs/$id/chunks": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/logs.$id.chunks.ts" }, "/api/logs/$id/replay": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/logs.$id.replay.ts" }, "/api/providers/$providerId/model-metadata": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/providers.$providerId.model-metadata.ts" }, "/api/providers/$providerId/test": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/providers.$providerId.test.ts", "children": ["/api/providers/$providerId/test/log"] }, "/api/runs/$runId/evidence": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/runs.$runId.evidence.ts" }, "/api/knowledge/candidates/$candidateId/promote": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/knowledge.candidates.$candidateId.promote.ts" }, "/api/knowledge/sessions/$sessionId/candidates": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/knowledge.sessions.$sessionId.candidates.ts" }, "/api/providers/$providerId/test/log": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/providers.$providerId.test.log.ts" } }, "clientEntry": "/assets/main-JvXpk_ov.js" });
|
|
2
2
|
export {
|
|
3
3
|
tsrStartManifest
|
|
4
4
|
};
|
package/.output/server/index.mjs
CHANGED
|
@@ -38,100 +38,100 @@ const assets = {
|
|
|
38
38
|
"/assets/alibaba-TTwafVwX.svg": {
|
|
39
39
|
"type": "image/svg+xml",
|
|
40
40
|
"etag": '"171b-6dyV5K8QjiaY35sN9qNprh9zDIs"',
|
|
41
|
-
"mtime": "2026-07-
|
|
41
|
+
"mtime": "2026-07-04T02:02:10.927Z",
|
|
42
42
|
"size": 5915,
|
|
43
43
|
"path": "../public/assets/alibaba-TTwafVwX.svg"
|
|
44
44
|
},
|
|
45
|
-
"/assets/CompareDrawer-
|
|
45
|
+
"/assets/CompareDrawer-BaGKK2R7.js": {
|
|
46
46
|
"type": "text/javascript; charset=utf-8",
|
|
47
|
-
"etag": '"49e8-
|
|
48
|
-
"mtime": "2026-07-
|
|
47
|
+
"etag": '"49e8-G1wNmDGmbVxNPpz1a8oaOgtZzos"',
|
|
48
|
+
"mtime": "2026-07-04T02:02:10.929Z",
|
|
49
49
|
"size": 18920,
|
|
50
|
-
"path": "../public/assets/CompareDrawer-
|
|
50
|
+
"path": "../public/assets/CompareDrawer-BaGKK2R7.js"
|
|
51
51
|
},
|
|
52
|
-
"/assets/index-
|
|
52
|
+
"/assets/index-B3EOwfg7.js": {
|
|
53
53
|
"type": "text/javascript; charset=utf-8",
|
|
54
|
-
"etag": '"74
|
|
55
|
-
"mtime": "2026-07-
|
|
54
|
+
"etag": '"74-+kptPbQ2kpjXzSI1SU6SHbX2+SQ"',
|
|
55
|
+
"mtime": "2026-07-04T02:02:10.929Z",
|
|
56
56
|
"size": 116,
|
|
57
|
-
"path": "../public/assets/index-
|
|
57
|
+
"path": "../public/assets/index-B3EOwfg7.js"
|
|
58
58
|
},
|
|
59
|
-
"/assets/
|
|
59
|
+
"/assets/index-CmtfjQPv.css": {
|
|
60
|
+
"type": "text/css; charset=utf-8",
|
|
61
|
+
"etag": '"1e968-15dLAIs72Zhi4Qe/CRWBTVZ7MtI"',
|
|
62
|
+
"mtime": "2026-07-04T02:02:10.929Z",
|
|
63
|
+
"size": 125288,
|
|
64
|
+
"path": "../public/assets/index-CmtfjQPv.css"
|
|
65
|
+
},
|
|
66
|
+
"/assets/main-JvXpk_ov.js": {
|
|
60
67
|
"type": "text/javascript; charset=utf-8",
|
|
61
|
-
"etag": '"
|
|
62
|
-
"mtime": "2026-07-
|
|
63
|
-
"size":
|
|
64
|
-
"path": "../public/assets/
|
|
68
|
+
"etag": '"512fd-ayrpztHB+N7SGRB3bs6EZN4hnBo"',
|
|
69
|
+
"mtime": "2026-07-04T02:02:10.929Z",
|
|
70
|
+
"size": 332541,
|
|
71
|
+
"path": "../public/assets/main-JvXpk_ov.js"
|
|
65
72
|
},
|
|
66
|
-
"/assets/
|
|
67
|
-
"type": "
|
|
68
|
-
"etag": '"
|
|
69
|
-
"mtime": "2026-07-
|
|
70
|
-
"size":
|
|
71
|
-
"path": "../public/assets/
|
|
73
|
+
"/assets/minimax-BPMzvuL-.jpeg": {
|
|
74
|
+
"type": "image/jpeg",
|
|
75
|
+
"etag": '"1b06-IwivU89ko5UTMUM1/t7hn4sQK9A"',
|
|
76
|
+
"mtime": "2026-07-04T02:02:10.929Z",
|
|
77
|
+
"size": 6918,
|
|
78
|
+
"path": "../public/assets/minimax-BPMzvuL-.jpeg"
|
|
72
79
|
},
|
|
73
|
-
"/assets/RequestAnatomy-
|
|
80
|
+
"/assets/RequestAnatomy-CiZE_fKZ.js": {
|
|
74
81
|
"type": "text/javascript; charset=utf-8",
|
|
75
|
-
"etag": '"43f2-
|
|
76
|
-
"mtime": "2026-07-
|
|
82
|
+
"etag": '"43f2-pcT1lJeQNTmnbmOFKpaANfuLxXQ"',
|
|
83
|
+
"mtime": "2026-07-04T02:02:10.929Z",
|
|
77
84
|
"size": 17394,
|
|
78
|
-
"path": "../public/assets/RequestAnatomy-
|
|
85
|
+
"path": "../public/assets/RequestAnatomy-CiZE_fKZ.js"
|
|
86
|
+
},
|
|
87
|
+
"/assets/ReplayDialog-Io8Ufsif.js": {
|
|
88
|
+
"type": "text/javascript; charset=utf-8",
|
|
89
|
+
"etag": '"318c-OhkrsLfrsml3ZquW9kjlH6TiWK0"',
|
|
90
|
+
"mtime": "2026-07-04T02:02:10.929Z",
|
|
91
|
+
"size": 12684,
|
|
92
|
+
"path": "../public/assets/ReplayDialog-Io8Ufsif.js"
|
|
93
|
+
},
|
|
94
|
+
"/assets/ResponseView-TJwxn-lh.js": {
|
|
95
|
+
"type": "text/javascript; charset=utf-8",
|
|
96
|
+
"etag": '"30d2-zO82t52tyuafUQNMKhsmem+8W9c"',
|
|
97
|
+
"mtime": "2026-07-04T02:02:10.929Z",
|
|
98
|
+
"size": 12498,
|
|
99
|
+
"path": "../public/assets/ResponseView-TJwxn-lh.js"
|
|
79
100
|
},
|
|
80
101
|
"/assets/zhipuai-BPNAnxo-.svg": {
|
|
81
102
|
"type": "image/svg+xml",
|
|
82
103
|
"etag": '"2bf8-hNaLCTi89nOFCsIIfWpP/jrfo0s"',
|
|
83
|
-
"mtime": "2026-07-
|
|
104
|
+
"mtime": "2026-07-04T02:02:10.929Z",
|
|
84
105
|
"size": 11256,
|
|
85
106
|
"path": "../public/assets/zhipuai-BPNAnxo-.svg"
|
|
86
107
|
},
|
|
87
|
-
"/assets/StreamingChunkSequence-
|
|
108
|
+
"/assets/StreamingChunkSequence-D-9ysFSG.js": {
|
|
88
109
|
"type": "text/javascript; charset=utf-8",
|
|
89
|
-
"etag": '"d5c-
|
|
90
|
-
"mtime": "2026-07-
|
|
110
|
+
"etag": '"d5c-Siu/PgtKfi5RvFy2DV5/y0lzSDU"',
|
|
111
|
+
"mtime": "2026-07-04T02:02:10.930Z",
|
|
91
112
|
"size": 3420,
|
|
92
|
-
"path": "../public/assets/StreamingChunkSequence-
|
|
93
|
-
},
|
|
94
|
-
"/assets/minimax-BPMzvuL-.jpeg": {
|
|
95
|
-
"type": "image/jpeg",
|
|
96
|
-
"etag": '"1b06-IwivU89ko5UTMUM1/t7hn4sQK9A"',
|
|
97
|
-
"mtime": "2026-07-03T09:33:24.943Z",
|
|
98
|
-
"size": 6918,
|
|
99
|
-
"path": "../public/assets/minimax-BPMzvuL-.jpeg"
|
|
100
|
-
},
|
|
101
|
-
"/assets/ResponseView-DzcxCUBf.js": {
|
|
102
|
-
"type": "text/javascript; charset=utf-8",
|
|
103
|
-
"etag": '"30d2-8DsNs/G/6A8XI5njIKBI2cyKmwo"',
|
|
104
|
-
"mtime": "2026-07-03T09:33:24.945Z",
|
|
105
|
-
"size": 12498,
|
|
106
|
-
"path": "../public/assets/ResponseView-DzcxCUBf.js"
|
|
113
|
+
"path": "../public/assets/StreamingChunkSequence-D-9ysFSG.js"
|
|
107
114
|
},
|
|
108
|
-
"/assets/_sessionId-
|
|
115
|
+
"/assets/_sessionId-3JCekYV3.js": {
|
|
109
116
|
"type": "text/javascript; charset=utf-8",
|
|
110
|
-
"etag": '"d2-
|
|
111
|
-
"mtime": "2026-07-
|
|
117
|
+
"etag": '"d2-Ck1cytNneSGYTerMobA/d7kU7E4"',
|
|
118
|
+
"mtime": "2026-07-04T02:02:10.929Z",
|
|
112
119
|
"size": 210,
|
|
113
|
-
"path": "../public/assets/_sessionId-
|
|
114
|
-
},
|
|
115
|
-
"/assets/main-Dc2qVWpb.js": {
|
|
116
|
-
"type": "text/javascript; charset=utf-8",
|
|
117
|
-
"etag": '"512fd-Db3WHW7AQfz2p877CuP7TCMZFMM"',
|
|
118
|
-
"mtime": "2026-07-03T09:33:24.945Z",
|
|
119
|
-
"size": 332541,
|
|
120
|
-
"path": "../public/assets/main-Dc2qVWpb.js"
|
|
120
|
+
"path": "../public/assets/_sessionId-3JCekYV3.js"
|
|
121
121
|
},
|
|
122
122
|
"/assets/qwen-CONDcHqt.png": {
|
|
123
123
|
"type": "image/png",
|
|
124
124
|
"etag": '"572c3-cdJAPaHdOvFCGzuaQjagdgOu6XE"',
|
|
125
|
-
"mtime": "2026-07-
|
|
125
|
+
"mtime": "2026-07-04T02:02:10.929Z",
|
|
126
126
|
"size": 357059,
|
|
127
127
|
"path": "../public/assets/qwen-CONDcHqt.png"
|
|
128
128
|
},
|
|
129
|
-
"/assets/ProxyViewerContainer-
|
|
129
|
+
"/assets/ProxyViewerContainer-Cxwizw8H.js": {
|
|
130
130
|
"type": "text/javascript; charset=utf-8",
|
|
131
|
-
"etag": '"
|
|
132
|
-
"mtime": "2026-07-
|
|
133
|
-
"size":
|
|
134
|
-
"path": "../public/assets/ProxyViewerContainer-
|
|
131
|
+
"etag": '"c1bf2-b7zp7bO7iKSX7NYjIYX/gBZE8b4"',
|
|
132
|
+
"mtime": "2026-07-04T02:02:10.929Z",
|
|
133
|
+
"size": 793586,
|
|
134
|
+
"path": "../public/assets/ProxyViewerContainer-Cxwizw8H.js"
|
|
135
135
|
}
|
|
136
136
|
};
|
|
137
137
|
function readAsset(id) {
|
package/package.json
CHANGED
|
@@ -2,12 +2,7 @@ import { useState, memo, useCallback, useEffect, useMemo } from "react";
|
|
|
2
2
|
import type { JSX } from "react";
|
|
3
3
|
import type { TimeDisplayFormat } from "../../lib/runtimeConfig";
|
|
4
4
|
import type { CapturedLog } from "../../contracts";
|
|
5
|
-
import {
|
|
6
|
-
ConversationHeader,
|
|
7
|
-
getGroupApiFormat,
|
|
8
|
-
hasMixedApiFormat,
|
|
9
|
-
type ConversationGroupData,
|
|
10
|
-
} from "./ConversationHeader";
|
|
5
|
+
import { ConversationHeader, type ConversationGroupData } from "./ConversationHeader";
|
|
11
6
|
import { detectProvider } from "../providers/ProviderLogo";
|
|
12
7
|
import { TurnGroup } from "./TurnGroup";
|
|
13
8
|
import { AgentTraceSummary } from "./AgentTraceSummary";
|
|
@@ -113,7 +108,6 @@ export const ConversationGroup = memo(function ({
|
|
|
113
108
|
const providers = useMemo(() => collectProviders(group.logs), [group.logs]);
|
|
114
109
|
const startTime = group.logs[0]?.timestamp ?? new Date().toISOString();
|
|
115
110
|
const endTime = group.logs[group.logs.length - 1]?.timestamp ?? new Date().toISOString();
|
|
116
|
-
const mixed = hasMixedApiFormat(group.logs);
|
|
117
111
|
const isLoading = group.logs.some((log) => log.responseStatus === null);
|
|
118
112
|
const showTraceRollupMetrics = standalone && !hasPinnedSessionContext;
|
|
119
113
|
|
|
@@ -145,13 +139,13 @@ export const ConversationGroup = memo(function ({
|
|
|
145
139
|
totalCalls={group.logs.length}
|
|
146
140
|
totalInputTokens={stats.totalInputTokens}
|
|
147
141
|
totalOutputTokens={stats.totalOutputTokens}
|
|
148
|
-
apiFormat={getGroupApiFormat(group.logs)}
|
|
149
142
|
expanded={expanded}
|
|
150
143
|
onToggle={() => setExpanded(!expanded)}
|
|
151
|
-
hideApiFormat={mixed}
|
|
152
144
|
providers={providers}
|
|
153
145
|
isLoading={isLoading}
|
|
154
146
|
userAgent={group.logs[0]?.userAgent ?? null}
|
|
147
|
+
clientPid={group.logs[0]?.clientPid ?? null}
|
|
148
|
+
clientProjectFolder={group.logs[0]?.clientProjectFolder ?? null}
|
|
155
149
|
timeDisplayFormat={timeDisplayFormat}
|
|
156
150
|
onClear={() => onClearGroup(group.logs.map((l) => l.id))}
|
|
157
151
|
/>
|