@tonyclaw/agent-inspector 2.0.24 → 2.0.26

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 (37) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/assets/{CompareDrawer-DrY-gAzy.js → CompareDrawer-DBTFzxG5.js} +1 -1
  3. package/.output/public/assets/ProxyViewerContainer-ivZk8MgE.js +115 -0
  4. package/.output/public/assets/{ReplayDialog-CFyw6Vu4.js → ReplayDialog-syW2hDNE.js} +1 -1
  5. package/.output/public/assets/{RequestAnatomy-DHGJ9py7.js → RequestAnatomy-BkuRtY9o.js} +1 -1
  6. package/.output/public/assets/{ResponseView-CB_3yc08.js → ResponseView-BwyvEvoE.js} +1 -1
  7. package/.output/public/assets/{StreamingChunkSequence-CqhHwgDn.js → StreamingChunkSequence-BY4MbPKg.js} +1 -1
  8. package/.output/public/assets/_sessionId-XlPUgIIb.js +1 -0
  9. package/.output/public/assets/index-By11a28-.js +1 -0
  10. package/.output/public/assets/index-DsiKfWCp.css +1 -0
  11. package/.output/public/assets/{main-CVw7-JyE.js → main-DKRDRBdd.js} +2 -2
  12. package/.output/server/{_sessionId-V33sBWBC.mjs → _sessionId-VDd4N_1B.mjs} +2 -2
  13. package/.output/server/_ssr/{CompareDrawer-C_Fk9joM.mjs → CompareDrawer-BQZlxsOC.mjs} +2 -2
  14. package/.output/server/_ssr/{ProxyViewerContainer-CyFKksQa.mjs → ProxyViewerContainer-njY2oQCc.mjs} +208 -22
  15. package/.output/server/_ssr/{ReplayDialog-BpQHN7O2.mjs → ReplayDialog-B8lkdAIh.mjs} +3 -3
  16. package/.output/server/_ssr/{RequestAnatomy-CuhmKAma.mjs → RequestAnatomy-CwOTfdwS.mjs} +2 -2
  17. package/.output/server/_ssr/{ResponseView-CO6LyBmj.mjs → ResponseView-3Iz_mZpd.mjs} +2 -2
  18. package/.output/server/_ssr/{StreamingChunkSequence-DLeVetNR.mjs → StreamingChunkSequence-hmJcQNW5.mjs} +2 -2
  19. package/.output/server/_ssr/{index-DWUKl9Bf.mjs → index-UuTKM4aC.mjs} +2 -2
  20. package/.output/server/_ssr/index.mjs +2 -2
  21. package/.output/server/_ssr/{router-BrK_DcTS.mjs → router-C7InHrxE.mjs} +352 -10
  22. package/.output/server/{_tanstack-start-manifest_v-BjW2XeWE.mjs → _tanstack-start-manifest_v-B6yfnMHA.mjs} +1 -1
  23. package/.output/server/index.mjs +58 -58
  24. package/package.json +1 -1
  25. package/src/components/providers/ProviderForm.tsx +176 -16
  26. package/src/lib/sessionInfoContract.ts +69 -0
  27. package/src/lib/utils.ts +46 -0
  28. package/src/mcp/server.ts +26 -0
  29. package/src/mcp/toolHandlers.ts +27 -0
  30. package/src/proxy/sessionInfo.ts +222 -0
  31. package/src/proxy/sessionSupervisor.ts +8 -5
  32. package/src/proxy/store.ts +77 -0
  33. package/src/routes/api/sessions.ts +29 -2
  34. package/.output/public/assets/ProxyViewerContainer-CiLvRNie.js +0 -115
  35. package/.output/public/assets/_sessionId-CgG9CQ9r.js +0 -1
  36. package/.output/public/assets/index-780zTVwp.css +0 -1
  37. package/.output/public/assets/index-CViEXkqa.js +0 -1
@@ -1,7 +1,7 @@
1
1
  import { c as createRouter, a as createRootRoute, b as createFileRoute, l as lazyRouteComponent, O as Outlet, H as HeadContent, S as Scripts } from "../_libs/tanstack__react-router.mjs";
2
2
  import { j as jsxRuntimeExports } from "../_libs/react.mjs";
3
3
  import { S as SWRConfig } from "../_libs/swr.mjs";
4
- import { existsSync, readFileSync, mkdirSync, writeFileSync, renameSync, copyFileSync, unlinkSync, readdirSync, statSync, createReadStream, cpSync, rmSync, createWriteStream } from "node:fs";
4
+ import { existsSync, readFileSync, mkdirSync, writeFileSync, renameSync, copyFileSync, unlinkSync, createReadStream, readdirSync, statSync, cpSync, rmSync, createWriteStream } from "node:fs";
5
5
  import fs, { mkdir, appendFile, readFile, writeFile, readdir, open, stat, unlink, rename } from "node:fs/promises";
6
6
  import { createInterface } from "node:readline";
7
7
  import { Buffer } from "node:buffer";
@@ -50,7 +50,7 @@ import "../_libs/mimic-function.mjs";
50
50
  import "../_libs/semver.mjs";
51
51
  import "../_libs/uint8array-extras.mjs";
52
52
  const faviconSvg = "data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2064%2064'%20role='img'%20aria-label='Agent%20Inspector'%3e%3crect%20width='64'%20height='64'%20rx='14'%20fill='%23111827'%20/%3e%3cg%20fill='none'%20stroke='%23f59e0b'%20stroke-width='4.2'%20stroke-linecap='round'%20stroke-linejoin='round'%3e%3cpath%20fill='%23f59e0b'%20d='M15%2036c0-11%207-18%2017-18s17%207%2017%2018c0%208-7%2013-17%2013s-17-5-17-13z'%20/%3e%3cpath%20d='M16%2031c-6-5-12-3-12%204%200%205%206%206%2011%202'%20/%3e%3cpath%20d='M48%2031c6-5%2012-3%2012%204%200%205-6%206-11%202'%20/%3e%3cpath%20d='M27%2019l-3-7'%20/%3e%3cpath%20d='M37%2019l3-7'%20/%3e%3cpath%20d='M19%2045l-6%209'%20/%3e%3cpath%20d='M27%2048l-3%209'%20/%3e%3cpath%20d='M37%2048l3%209'%20/%3e%3cpath%20d='M45%2045l6%209'%20/%3e%3c/g%3e%3cpath%20d='M14%2047l9-8%208%209c-5%203.5-12%203-17-1z'%20fill='%232f6b3f'%20opacity='.95'%20/%3e%3cpath%20d='M18%2046l5-5%205%206c-3%201.6-7%201.4-10-1z'%20fill='%236fb36f'%20opacity='.95'%20/%3e%3cpath%20d='M23%2041v10'%20fill='none'%20stroke='%23d6b45f'%20stroke-width='1.6'%20stroke-linecap='round'%20/%3e%3ccircle%20cx='31'%20cy='48'%20r='1.8'%20fill='%23c2412d'%20/%3e%3cpath%20d='M24%2044l13-11%2014%2013c-8%205.8-18%205.3-27-2z'%20fill='%232f6b3f'%20opacity='.97'%20/%3e%3cpath%20d='M30%2043l7-7%209%209c-5%202.7-11%202.5-16-2z'%20fill='%236fb36f'%20opacity='.95'%20/%3e%3cpath%20d='M37%2036v14'%20fill='none'%20stroke='%23d6b45f'%20stroke-width='2'%20stroke-linecap='round'%20/%3e%3cpath%20d='M30%2043c5-2%2011-1.5%2016%202'%20fill='none'%20stroke='%239fca78'%20stroke-width='1.8'%20stroke-linecap='round'%20/%3e%3ccircle%20cx='51'%20cy='46'%20r='2'%20fill='%23c2412d'%20/%3e%3cpath%20d='M40%2050l8-8%207%208c-4.2%203.2-10%203-15%200z'%20fill='%232f6b3f'%20opacity='.95'%20/%3e%3cpath%20d='M43%2049l5-5%204.5%205.5c-3%201.5-6%201.2-9.5-.5z'%20fill='%236fb36f'%20opacity='.95'%20/%3e%3cpath%20d='M48%2044v9'%20fill='none'%20stroke='%23d6b45f'%20stroke-width='1.5'%20stroke-linecap='round'%20/%3e%3ccircle%20cx='55'%20cy='50'%20r='1.7'%20fill='%23c2412d'%20/%3e%3ccircle%20cx='24'%20cy='11'%20r='3.2'%20fill='%23f59e0b'%20/%3e%3ccircle%20cx='40'%20cy='11'%20r='3.2'%20fill='%23f59e0b'%20/%3e%3ccircle%20cx='25'%20cy='34'%20r='2.1'%20fill='%23111827'%20/%3e%3ccircle%20cx='39'%20cy='34'%20r='2.1'%20fill='%23111827'%20/%3e%3c/svg%3e";
53
- const appCss = "/assets/index-780zTVwp.css";
53
+ const appCss = "/assets/index-DsiKfWCp.css";
54
54
  const Route$s = createRootRoute({
55
55
  head: () => ({
56
56
  meta: [
@@ -93,7 +93,7 @@ function RootDocument({ children }) {
93
93
  ] })
94
94
  ] });
95
95
  }
96
- const $$splitComponentImporter$1 = () => import("./index-DWUKl9Bf.mjs");
96
+ const $$splitComponentImporter$1 = () => import("./index-UuTKM4aC.mjs");
97
97
  const Route$r = createFileRoute("/")({
98
98
  component: lazyRouteComponent($$splitComponentImporter$1, "component")
99
99
  });
@@ -136,7 +136,7 @@ function decodeSessionIdFromPath(encoded) {
136
136
  function getSessionPath(sessionId) {
137
137
  return `/session/${encodeSessionIdForPath(sessionId)}`;
138
138
  }
139
- const $$splitComponentImporter = () => import("../_sessionId-V33sBWBC.mjs");
139
+ const $$splitComponentImporter = () => import("../_sessionId-VDd4N_1B.mjs");
140
140
  const Route$q = createFileRoute("/session/$sessionId")({
141
141
  component: lazyRouteComponent($$splitComponentImporter, "component"),
142
142
  parseParams: (params) => ({
@@ -1030,6 +1030,184 @@ function getCurrentLogFile() {
1030
1030
  const dd = String(now.getUTCDate()).padStart(2, "0");
1031
1031
  return `${yyyy}-${mm}-${dd}.jsonl`;
1032
1032
  }
1033
+ const SESSION_INFO_DEFAULT_LATEST_LOG_LIMIT = 10;
1034
+ const SESSION_INFO_MAX_LATEST_LOG_LIMIT = 50;
1035
+ function clampSessionInfoLogLimit(input) {
1036
+ if (input === void 0) return SESSION_INFO_DEFAULT_LATEST_LOG_LIMIT;
1037
+ if (!Number.isFinite(input) || input < 1) return 1;
1038
+ return Math.min(Math.floor(input), SESSION_INFO_MAX_LATEST_LOG_LIMIT);
1039
+ }
1040
+ function normalizeString(value) {
1041
+ if (value === null || value === void 0 || value.length === 0) return null;
1042
+ return value;
1043
+ }
1044
+ function truncateError(value) {
1045
+ const normalized = normalizeString(value);
1046
+ if (normalized === null) return null;
1047
+ if (normalized.length <= 500) return normalized;
1048
+ return `${normalized.slice(0, 500)}...`;
1049
+ }
1050
+ function hasLogError(log) {
1051
+ const error = normalizeString(log.error);
1052
+ if (error !== null) return true;
1053
+ return log.responseStatus !== null && log.responseStatus >= 400;
1054
+ }
1055
+ function buildSessionLogSummary(log) {
1056
+ return {
1057
+ id: log.id,
1058
+ timestamp: log.timestamp,
1059
+ provider: normalizeString(log.providerName),
1060
+ model: normalizeString(log.model),
1061
+ apiFormat: log.apiFormat,
1062
+ method: log.method,
1063
+ path: log.path,
1064
+ status: log.responseStatus,
1065
+ isStreaming: log.streaming,
1066
+ hasError: hasLogError(log),
1067
+ error: truncateError(log.error),
1068
+ latencyMs: log.elapsedMs,
1069
+ tokens: {
1070
+ input: log.inputTokens,
1071
+ output: log.outputTokens,
1072
+ cacheCreate: log.cacheCreationInputTokens,
1073
+ cacheRead: log.cacheReadInputTokens
1074
+ },
1075
+ sessionId: normalizeString(log.sessionId)
1076
+ };
1077
+ }
1078
+ function nonNegativeInteger(value) {
1079
+ if (value === null || !Number.isFinite(value) || value < 0) return 0;
1080
+ return Math.floor(value);
1081
+ }
1082
+ function addTokenUsage(total, summary) {
1083
+ const input = nonNegativeInteger(summary.tokens.input);
1084
+ const output = nonNegativeInteger(summary.tokens.output);
1085
+ const cacheCreate = nonNegativeInteger(summary.tokens.cacheCreate);
1086
+ const cacheRead = nonNegativeInteger(summary.tokens.cacheRead);
1087
+ return {
1088
+ input: total.input + input,
1089
+ output: total.output + output,
1090
+ cacheCreate: total.cacheCreate + cacheCreate,
1091
+ cacheRead: total.cacheRead + cacheRead,
1092
+ total: total.total + input + output + cacheCreate + cacheRead
1093
+ };
1094
+ }
1095
+ function buildRelativePath(pathname, params) {
1096
+ const query = params.toString();
1097
+ return query.length > 0 ? `${pathname}?${query}` : pathname;
1098
+ }
1099
+ function buildAbsoluteUrl(baseUrl, path2) {
1100
+ try {
1101
+ return new URL(path2, baseUrl).toString();
1102
+ } catch {
1103
+ return path2;
1104
+ }
1105
+ }
1106
+ function buildApiPath(sessionId) {
1107
+ return buildRelativePath("/api/sessions", new URLSearchParams({ sessionId }));
1108
+ }
1109
+ function buildCompactLogsPath(sessionId) {
1110
+ return buildRelativePath("/api/logs", new URLSearchParams({ compact: "1", sessionId }));
1111
+ }
1112
+ function collectSortedValues(values) {
1113
+ const set = /* @__PURE__ */ new Set();
1114
+ for (const value of values) {
1115
+ if (value !== null && value.length > 0) {
1116
+ set.add(value);
1117
+ }
1118
+ }
1119
+ return [...set].sort();
1120
+ }
1121
+ function countCompletedLogs(summaries) {
1122
+ let count = 0;
1123
+ for (const summary of summaries) {
1124
+ if (summary.status !== null || summary.latencyMs !== null) {
1125
+ count += 1;
1126
+ }
1127
+ }
1128
+ return count;
1129
+ }
1130
+ function countErrorLogs(summaries) {
1131
+ let count = 0;
1132
+ for (const summary of summaries) {
1133
+ if (summary.hasError) {
1134
+ count += 1;
1135
+ }
1136
+ }
1137
+ return count;
1138
+ }
1139
+ function deriveSessionStatus(input) {
1140
+ if (input.activeRequests > 0 || input.runningTasks > 0) return "active";
1141
+ if (input.failedRequests > 0 || input.errorCount > 0 || input.lastTaskError !== null) {
1142
+ return "failed";
1143
+ }
1144
+ if (input.completedRequests > 0 || input.logCount > 0) return "completed";
1145
+ return "empty";
1146
+ }
1147
+ function buildSessionInfo(input) {
1148
+ const latestLogLimit = clampSessionInfoLogLimit(input.latestLogLimit);
1149
+ const summaries = [...input.summaries].sort((left, right) => right.id - left.id);
1150
+ const latestLog = summaries[0] ?? null;
1151
+ const oldestLog = summaries.length > 0 ? summaries[summaries.length - 1] : null;
1152
+ const logCount = input.logCoverage === "history" ? summaries.length : Math.max(input.snapshot?.requestCount ?? 0, summaries.length);
1153
+ const errorCount = Math.max(countErrorLogs(summaries), input.snapshot?.failedRequests ?? 0);
1154
+ const completedLogCount = countCompletedLogs(summaries);
1155
+ const tokenUsage = summaries.reduce(
1156
+ (total, summary) => addTokenUsage(total, summary),
1157
+ { input: 0, output: 0, cacheCreate: 0, cacheRead: 0, total: 0 }
1158
+ );
1159
+ const requestCount = Math.max(input.snapshot?.requestCount ?? 0, logCount);
1160
+ const activeRequests = input.snapshot?.activeRequests ?? 0;
1161
+ const completedRequests = Math.max(input.snapshot?.completedRequests ?? 0, completedLogCount);
1162
+ const failedRequests = Math.max(input.snapshot?.failedRequests ?? 0, errorCount);
1163
+ const queuedTasks = input.snapshot?.queuedTasks ?? 0;
1164
+ const runningTasks = input.snapshot?.runningTasks ?? 0;
1165
+ const lastTaskError = normalizeString(input.snapshot?.lastTaskError);
1166
+ const inspectorPath = getSessionPath(input.sessionId);
1167
+ const apiPath = buildApiPath(input.sessionId);
1168
+ const compactLogsPath = buildCompactLogsPath(input.sessionId);
1169
+ return {
1170
+ id: input.sessionId,
1171
+ status: deriveSessionStatus({
1172
+ activeRequests,
1173
+ runningTasks,
1174
+ failedRequests,
1175
+ errorCount,
1176
+ lastTaskError,
1177
+ completedRequests,
1178
+ logCount
1179
+ }),
1180
+ logCoverage: input.logCoverage,
1181
+ source: input.snapshot?.source ?? null,
1182
+ runtimeMode: input.snapshot?.runtimeMode ?? null,
1183
+ createdAt: input.snapshot?.createdAt ?? oldestLog?.timestamp ?? null,
1184
+ updatedAt: input.snapshot?.updatedAt ?? latestLog?.timestamp ?? null,
1185
+ requestCount,
1186
+ activeRequests,
1187
+ completedRequests,
1188
+ failedRequests,
1189
+ queuedTasks,
1190
+ runningTasks,
1191
+ lastTaskError,
1192
+ logCount,
1193
+ errorCount,
1194
+ models: collectSortedValues(summaries.map((summary) => summary.model)),
1195
+ providers: collectSortedValues(summaries.map((summary) => summary.provider)),
1196
+ tokenUsage,
1197
+ lastLogId: input.snapshot?.lastLogId ?? latestLog?.id ?? null,
1198
+ lastModel: normalizeString(input.snapshot?.lastModel) ?? latestLog?.model ?? null,
1199
+ clientPid: input.snapshot?.clientPid ?? null,
1200
+ clientProjectFolder: normalizeString(input.snapshot?.clientProjectFolder),
1201
+ inspectorPath,
1202
+ inspectorUrl: buildAbsoluteUrl(input.baseUrl, inspectorPath),
1203
+ apiPath,
1204
+ apiUrl: buildAbsoluteUrl(input.baseUrl, apiPath),
1205
+ compactLogsPath,
1206
+ compactLogsUrl: buildAbsoluteUrl(input.baseUrl, compactLogsPath),
1207
+ latestLogLimit,
1208
+ latestLogs: summaries.slice(0, latestLogLimit)
1209
+ };
1210
+ }
1033
1211
  const IDLE_TIMEOUT_MS = Number(process.env["SESSION_PROCESS_IDLE_MS"]) || 5 * 60 * 1e3;
1034
1212
  const MAX_RESTARTS = 3;
1035
1213
  const _processes = /* @__PURE__ */ new Map();
@@ -1222,11 +1400,14 @@ function upsertSession(log, sourceOverride) {
1222
1400
  if (source === null) return null;
1223
1401
  const existing = sessions.get(identity.id);
1224
1402
  const session = existing ?? createSessionRecord(identity.id, source, log);
1225
- session.updatedAt = (/* @__PURE__ */ new Date()).toISOString();
1226
- session.lastLogId = log.id;
1227
- session.lastModel = log.model ?? session.lastModel;
1228
- session.clientPid = log.clientPid ?? session.clientPid;
1229
- session.clientProjectFolder = log.clientProjectFolder ?? session.clientProjectFolder;
1403
+ const isSameOrNewerLog = session.lastLogId === null || log.id >= session.lastLogId;
1404
+ if (isSameOrNewerLog) {
1405
+ session.updatedAt = (/* @__PURE__ */ new Date()).toISOString();
1406
+ session.lastLogId = log.id;
1407
+ session.lastModel = log.model ?? session.lastModel;
1408
+ session.clientPid = log.clientPid ?? session.clientPid;
1409
+ session.clientProjectFolder = log.clientProjectFolder ?? session.clientProjectFolder;
1410
+ }
1230
1411
  sessions.set(identity.id, session);
1231
1412
  return session;
1232
1413
  }
@@ -1644,6 +1825,53 @@ async function listLogsPage(options) {
1644
1825
  limit: options.limit
1645
1826
  };
1646
1827
  }
1828
+ function findSessionSnapshot(sessionId) {
1829
+ for (const snapshot of getSessionSnapshots()) {
1830
+ if (snapshot.id === sessionId) return snapshot;
1831
+ }
1832
+ return null;
1833
+ }
1834
+ async function collectSessionLogSummaries(sessionId, includeHistory) {
1835
+ const summariesById = /* @__PURE__ */ new Map();
1836
+ const observeMatchingLog = (log) => {
1837
+ if (!matchesLogFilters(log, sessionId, void 0)) return;
1838
+ summariesById.set(log.id, buildSessionLogSummary(log));
1839
+ };
1840
+ if (includeHistory) {
1841
+ await visitPersistedLogs((log) => {
1842
+ observeSessionLog(log);
1843
+ observeMatchingLog(log);
1844
+ });
1845
+ }
1846
+ for (const log of memoryCache.values()) {
1847
+ observeMatchingLog(log);
1848
+ }
1849
+ return [...summariesById.values()];
1850
+ }
1851
+ async function includeSnapshotLastLogSummary(sessionId, snapshot, summaries) {
1852
+ if (snapshot === null || snapshot.lastLogId === null) return summaries;
1853
+ for (const summary of summaries) {
1854
+ if (summary.id === snapshot.lastLogId) return summaries;
1855
+ }
1856
+ const log = await getLogById(snapshot.lastLogId);
1857
+ if (log === null || !matchesLogFilters(log, sessionId, void 0)) return summaries;
1858
+ return [...summaries, buildSessionLogSummary(log)];
1859
+ }
1860
+ async function getSessionInfo(sessionId, options) {
1861
+ const includeHistory = options.includeHistory === true;
1862
+ const collectedSummaries = await collectSessionLogSummaries(sessionId, includeHistory);
1863
+ const snapshot = findSessionSnapshot(sessionId);
1864
+ const summaries = includeHistory ? collectedSummaries : await includeSnapshotLastLogSummary(sessionId, snapshot, collectedSummaries);
1865
+ if (snapshot === null && summaries.length === 0) return null;
1866
+ return buildSessionInfo({
1867
+ sessionId,
1868
+ baseUrl: options.baseUrl,
1869
+ snapshot,
1870
+ summaries,
1871
+ logCoverage: includeHistory ? "history" : "recent",
1872
+ latestLogLimit: options.latestLogLimit
1873
+ });
1874
+ }
1647
1875
  function getSessions() {
1648
1876
  return getSessionIds();
1649
1877
  }
@@ -4656,11 +4884,35 @@ const Route$p = createFileRoute("/proxy/$")({
4656
4884
  }
4657
4885
  }
4658
4886
  });
4887
+ function parsePositiveInt$1(value) {
4888
+ if (value === null) return void 0;
4889
+ const parsed = Number(value);
4890
+ if (!Number.isInteger(parsed) || parsed < 1) return void 0;
4891
+ return parsed;
4892
+ }
4893
+ function parseBooleanFlag(value) {
4894
+ return value === "1" || value === "true";
4895
+ }
4659
4896
  const Route$o = createFileRoute("/api/sessions")({
4660
4897
  server: {
4661
4898
  handlers: {
4662
- GET: ({ request }) => {
4899
+ GET: async ({ request }) => {
4663
4900
  const url = new URL(request.url);
4901
+ const sessionId = url.searchParams.get("sessionId");
4902
+ if (sessionId !== null) {
4903
+ if (sessionId.length === 0) {
4904
+ return Response.json({ error: "sessionId is required" }, { status: 400 });
4905
+ }
4906
+ const info = await getSessionInfo(sessionId, {
4907
+ baseUrl: url.origin,
4908
+ includeHistory: parseBooleanFlag(url.searchParams.get("includeHistory")),
4909
+ latestLogLimit: parsePositiveInt$1(url.searchParams.get("limit"))
4910
+ });
4911
+ if (info === null) {
4912
+ return Response.json({ error: "Session not found" }, { status: 404 });
4913
+ }
4914
+ return Response.json(info);
4915
+ }
4664
4916
  const details = url.searchParams.get("details");
4665
4917
  if (details === "true" || details === "1") {
4666
4918
  return Response.json(getSessionSnapshots());
@@ -4875,6 +5127,67 @@ function extractResponsePreview(log) {
4875
5127
  }
4876
5128
  return null;
4877
5129
  }
5130
+ const SessionTokenUsageSchema = object({
5131
+ input: number().int().nonnegative(),
5132
+ output: number().int().nonnegative(),
5133
+ cacheCreate: number().int().nonnegative(),
5134
+ cacheRead: number().int().nonnegative(),
5135
+ total: number().int().nonnegative()
5136
+ });
5137
+ const SessionLogSummarySchema = object({
5138
+ id: number().int().positive(),
5139
+ timestamp: string(),
5140
+ provider: string().nullable(),
5141
+ model: string().nullable(),
5142
+ apiFormat: _enum(["anthropic", "openai", "unknown"]),
5143
+ method: string(),
5144
+ path: string(),
5145
+ status: number().nullable(),
5146
+ isStreaming: boolean(),
5147
+ hasError: boolean(),
5148
+ error: string().nullable(),
5149
+ latencyMs: number().nullable(),
5150
+ tokens: object({
5151
+ input: number().nullable(),
5152
+ output: number().nullable(),
5153
+ cacheCreate: number().nullable(),
5154
+ cacheRead: number().nullable()
5155
+ }),
5156
+ sessionId: string().nullable()
5157
+ });
5158
+ const SessionInfoSchema = object({
5159
+ id: string(),
5160
+ status: _enum(["active", "failed", "completed", "empty"]),
5161
+ logCoverage: _enum(["recent", "history"]),
5162
+ source: _enum(["explicit", "client-process", "client-connection", "provider-test"]).nullable(),
5163
+ runtimeMode: _enum(["in-process", "worker-thread", "child-process"]).nullable(),
5164
+ createdAt: string().nullable(),
5165
+ updatedAt: string().nullable(),
5166
+ requestCount: number().int().nonnegative(),
5167
+ activeRequests: number().int().nonnegative(),
5168
+ completedRequests: number().int().nonnegative(),
5169
+ failedRequests: number().int().nonnegative(),
5170
+ queuedTasks: number().int().nonnegative(),
5171
+ runningTasks: number().int().nonnegative(),
5172
+ lastTaskError: string().nullable(),
5173
+ logCount: number().int().nonnegative(),
5174
+ errorCount: number().int().nonnegative(),
5175
+ models: array(string()),
5176
+ providers: array(string()),
5177
+ tokenUsage: SessionTokenUsageSchema,
5178
+ lastLogId: number().nullable(),
5179
+ lastModel: string().nullable(),
5180
+ clientPid: number().nullable(),
5181
+ clientProjectFolder: string().nullable(),
5182
+ inspectorPath: string(),
5183
+ inspectorUrl: string(),
5184
+ apiPath: string(),
5185
+ apiUrl: string(),
5186
+ compactLogsPath: string(),
5187
+ compactLogsUrl: string(),
5188
+ latestLogLimit: number().int().positive(),
5189
+ latestLogs: array(SessionLogSummarySchema)
5190
+ });
4878
5191
  const LogsListResponseSchema = object({
4879
5192
  logs: array(CapturedLogSchema).optional(),
4880
5193
  total: number().optional(),
@@ -5005,6 +5318,22 @@ async function listSessionsImpl(callApi2) {
5005
5318
  if (!res.ok) return toolError(`GET /api/sessions returned ${res.status}`);
5006
5319
  return textJson(await res.json());
5007
5320
  }
5321
+ async function getSessionImpl(callApi2, args) {
5322
+ const params = new URLSearchParams({ sessionId: args.sessionId });
5323
+ if (args.latestLogLimit !== void 0) {
5324
+ params.set("limit", String(args.latestLogLimit));
5325
+ }
5326
+ if (args.includeHistory === true) {
5327
+ params.set("includeHistory", "1");
5328
+ }
5329
+ const path2 = `/api/sessions?${params.toString()}`;
5330
+ const res = await callApi2(path2);
5331
+ if (!res.ok) return toolError(`GET ${path2} returned ${res.status}`);
5332
+ const rawBody = await res.json();
5333
+ const parsed = SessionInfoSchema.safeParse(rawBody);
5334
+ if (!parsed.success) return toolError("GET /api/sessions returned an unparseable session info");
5335
+ return textJson(parsed.data);
5336
+ }
5008
5337
  async function listModelsImpl(callApi2) {
5009
5338
  const res = await callApi2("/api/models");
5010
5339
  if (!res.ok) return toolError(`GET /api/models returned ${res.status}`);
@@ -5231,6 +5560,19 @@ function registerTools(server) {
5231
5560
  },
5232
5561
  () => safeCall(() => listSessionsImpl(callApi))
5233
5562
  );
5563
+ server.registerTool(
5564
+ "inspector_get_session",
5565
+ {
5566
+ title: "Get Inspector session info",
5567
+ description: "Returns a lightweight, evidence-friendly summary for one Inspector session: clickable inspectorUrl, compact logs URL, status, request/error counts, token totals, models/providers, and the latest compact log summaries. Defaults to recent in-memory/cache data for speed; set includeHistory=true only when you explicitly want to scan persisted jsonl history. It avoids raw request/response bodies so it is safe to use in evaluation artifacts.",
5568
+ inputSchema: object({
5569
+ sessionId: string().min(1).describe("The Inspector session id."),
5570
+ includeHistory: boolean().optional().describe("Scan persisted jsonl history for this session. Slower; default false."),
5571
+ latestLogLimit: number().int().positive().max(50).optional().describe("How many latest compact log summaries to include. Max 50, default 10.")
5572
+ })
5573
+ },
5574
+ (args) => safeCall(() => getSessionImpl(callApi, args))
5575
+ );
5234
5576
  server.registerTool(
5235
5577
  "inspector_list_models",
5236
5578
  {
@@ -1,4 +1,4 @@
1
- const tsrStartManifest = () => ({ "routes": { "__root__": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/__root.tsx", "children": ["/", "/api/config", "/api/health", "/api/logs", "/api/mcp", "/api/models", "/api/providers", "/api/sessions", "/proxy/$", "/session/$sessionId", "/api/knowledge/candidates", "/api/knowledge/project-context", "/api/knowledge/search", "/api/knowledge/sessions/$sessionId/candidates"], "preloads": ["/assets/main-CVw7-JyE.js"], "assets": [] }, "/": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/index.tsx", "assets": [], "preloads": ["/assets/index-CViEXkqa.js", "/assets/ProxyViewerContainer-CiLvRNie.js"] }, "/api/config": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/config.ts", "children": ["/api/config/paths"] }, "/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/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/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-CgG9CQ9r.js", "/assets/ProxyViewerContainer-CiLvRNie.js"] }, "/api/config/paths": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/config.paths.ts" }, "/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/chunks", "/api/logs/$id/replay"] }, "/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/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/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/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-CVw7-JyE.js" });
1
+ const tsrStartManifest = () => ({ "routes": { "__root__": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/__root.tsx", "children": ["/", "/api/config", "/api/health", "/api/logs", "/api/mcp", "/api/models", "/api/providers", "/api/sessions", "/proxy/$", "/session/$sessionId", "/api/knowledge/candidates", "/api/knowledge/project-context", "/api/knowledge/search", "/api/knowledge/sessions/$sessionId/candidates"], "preloads": ["/assets/main-DKRDRBdd.js"], "assets": [] }, "/": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/index.tsx", "assets": [], "preloads": ["/assets/index-By11a28-.js", "/assets/ProxyViewerContainer-ivZk8MgE.js"] }, "/api/config": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/config.ts", "children": ["/api/config/paths"] }, "/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/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/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-XlPUgIIb.js", "/assets/ProxyViewerContainer-ivZk8MgE.js"] }, "/api/config/paths": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/api/config.paths.ts" }, "/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/chunks", "/api/logs/$id/replay"] }, "/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/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/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/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-DKRDRBdd.js" });
2
2
  export {
3
3
  tsrStartManifest
4
4
  };
@@ -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-06-29T12:29:42.542Z",
41
+ "mtime": "2026-06-30T00:03:39.766Z",
42
42
  "size": 5915,
43
43
  "path": "../public/assets/alibaba-TTwafVwX.svg"
44
44
  },
45
- "/assets/CompareDrawer-DrY-gAzy.js": {
45
+ "/assets/CompareDrawer-DBTFzxG5.js": {
46
46
  "type": "text/javascript; charset=utf-8",
47
- "etag": '"49fe-MpHiIJshHfw4LFDNCsCMDZDrWGg"',
48
- "mtime": "2026-06-29T12:29:42.542Z",
47
+ "etag": '"49fe-0/x6kUv/QAjBzcBGGqiJEK7CrGo"',
48
+ "mtime": "2026-06-30T00:03:39.766Z",
49
49
  "size": 18942,
50
- "path": "../public/assets/CompareDrawer-DrY-gAzy.js"
50
+ "path": "../public/assets/CompareDrawer-DBTFzxG5.js"
51
51
  },
52
- "/assets/index-CViEXkqa.js": {
52
+ "/assets/ReplayDialog-syW2hDNE.js": {
53
53
  "type": "text/javascript; charset=utf-8",
54
- "etag": '"74-U7AFlYRRMX3IzoDVXXko4xBPBvM"',
55
- "mtime": "2026-06-29T12:29:42.542Z",
54
+ "etag": '"318c-NQmbQD7SPA/gh+gt24ulUI098ko"',
55
+ "mtime": "2026-06-30T00:03:39.766Z",
56
+ "size": 12684,
57
+ "path": "../public/assets/ReplayDialog-syW2hDNE.js"
58
+ },
59
+ "/assets/index-By11a28-.js": {
60
+ "type": "text/javascript; charset=utf-8",
61
+ "etag": '"74-wKECK+LXurWi55O6mYvJFEu73U4"',
62
+ "mtime": "2026-06-30T00:03:39.766Z",
56
63
  "size": 116,
57
- "path": "../public/assets/index-CViEXkqa.js"
64
+ "path": "../public/assets/index-By11a28-.js"
58
65
  },
59
- "/assets/ReplayDialog-CFyw6Vu4.js": {
66
+ "/assets/index-DsiKfWCp.css": {
67
+ "type": "text/css; charset=utf-8",
68
+ "etag": '"1a3d5-pnLJEAiyUUKlRw5OUnvwf1dCQeI"',
69
+ "mtime": "2026-06-30T00:03:39.766Z",
70
+ "size": 107477,
71
+ "path": "../public/assets/index-DsiKfWCp.css"
72
+ },
73
+ "/assets/main-DKRDRBdd.js": {
60
74
  "type": "text/javascript; charset=utf-8",
61
- "etag": '"318c-yVT324FTJnGgK/IiiYVI1v6/IEw"',
62
- "mtime": "2026-06-29T12:29:42.542Z",
63
- "size": 12684,
64
- "path": "../public/assets/ReplayDialog-CFyw6Vu4.js"
75
+ "etag": '"51726-1JXlqBObsVCWwZtRttZD0+8rmmo"',
76
+ "mtime": "2026-06-30T00:03:39.766Z",
77
+ "size": 333606,
78
+ "path": "../public/assets/main-DKRDRBdd.js"
65
79
  },
66
- "/assets/RequestAnatomy-DHGJ9py7.js": {
80
+ "/assets/RequestAnatomy-BkuRtY9o.js": {
67
81
  "type": "text/javascript; charset=utf-8",
68
- "etag": '"4485-2C+vaW+lYZaQ0wLkm/KTOsK3AOY"',
69
- "mtime": "2026-06-29T12:29:42.542Z",
82
+ "etag": '"4485-ei5S3iwPLFX3XUKIwoNDXt6pfeg"',
83
+ "mtime": "2026-06-30T00:03:39.766Z",
70
84
  "size": 17541,
71
- "path": "../public/assets/RequestAnatomy-DHGJ9py7.js"
72
- },
73
- "/assets/minimax-BPMzvuL-.jpeg": {
74
- "type": "image/jpeg",
75
- "etag": '"1b06-IwivU89ko5UTMUM1/t7hn4sQK9A"',
76
- "mtime": "2026-06-29T12:29:42.542Z",
77
- "size": 6918,
78
- "path": "../public/assets/minimax-BPMzvuL-.jpeg"
79
- },
80
- "/assets/index-780zTVwp.css": {
81
- "type": "text/css; charset=utf-8",
82
- "etag": '"1a380-Lz+Shs13XyKSlh9PTaGE50w/BpU"',
83
- "mtime": "2026-06-29T12:29:42.542Z",
84
- "size": 107392,
85
- "path": "../public/assets/index-780zTVwp.css"
85
+ "path": "../public/assets/RequestAnatomy-BkuRtY9o.js"
86
86
  },
87
- "/assets/ResponseView-CB_3yc08.js": {
87
+ "/assets/ResponseView-BwyvEvoE.js": {
88
88
  "type": "text/javascript; charset=utf-8",
89
- "etag": '"30d0-M6AktqEyUeyPg4kcv2fzak6vFlw"',
90
- "mtime": "2026-06-29T12:29:42.542Z",
89
+ "etag": '"30d0-NcNgH32g8TreiCI4JgpE13I81fo"',
90
+ "mtime": "2026-06-30T00:03:39.766Z",
91
91
  "size": 12496,
92
- "path": "../public/assets/ResponseView-CB_3yc08.js"
92
+ "path": "../public/assets/ResponseView-BwyvEvoE.js"
93
93
  },
94
- "/assets/StreamingChunkSequence-CqhHwgDn.js": {
94
+ "/assets/StreamingChunkSequence-BY4MbPKg.js": {
95
95
  "type": "text/javascript; charset=utf-8",
96
- "etag": '"d57-C9p9lFGRMu7L/bxJPes/RpOKks0"',
97
- "mtime": "2026-06-29T12:29:42.542Z",
96
+ "etag": '"d57-HwRjNFQZ5p5h2qA6wui4VPdas/g"',
97
+ "mtime": "2026-06-30T00:03:39.766Z",
98
98
  "size": 3415,
99
- "path": "../public/assets/StreamingChunkSequence-CqhHwgDn.js"
99
+ "path": "../public/assets/StreamingChunkSequence-BY4MbPKg.js"
100
100
  },
101
- "/assets/_sessionId-CgG9CQ9r.js": {
102
- "type": "text/javascript; charset=utf-8",
103
- "etag": '"d2-QqZWnWujfEY0vnXMOs1NyoEJukI"',
104
- "mtime": "2026-06-29T12:29:42.542Z",
105
- "size": 210,
106
- "path": "../public/assets/_sessionId-CgG9CQ9r.js"
101
+ "/assets/minimax-BPMzvuL-.jpeg": {
102
+ "type": "image/jpeg",
103
+ "etag": '"1b06-IwivU89ko5UTMUM1/t7hn4sQK9A"',
104
+ "mtime": "2026-06-30T00:03:39.765Z",
105
+ "size": 6918,
106
+ "path": "../public/assets/minimax-BPMzvuL-.jpeg"
107
107
  },
108
108
  "/assets/zhipuai-BPNAnxo-.svg": {
109
109
  "type": "image/svg+xml",
110
110
  "etag": '"2bf8-hNaLCTi89nOFCsIIfWpP/jrfo0s"',
111
- "mtime": "2026-06-29T12:29:42.542Z",
111
+ "mtime": "2026-06-30T00:03:39.766Z",
112
112
  "size": 11256,
113
113
  "path": "../public/assets/zhipuai-BPNAnxo-.svg"
114
114
  },
115
- "/assets/main-CVw7-JyE.js": {
115
+ "/assets/_sessionId-XlPUgIIb.js": {
116
116
  "type": "text/javascript; charset=utf-8",
117
- "etag": '"51726-W+9s8t7uIYMEgBdKzOagDvVRdKc"',
118
- "mtime": "2026-06-29T12:29:42.542Z",
119
- "size": 333606,
120
- "path": "../public/assets/main-CVw7-JyE.js"
117
+ "etag": '"d2-MoOX/bvv9993P6qEc8POysKqaj0"',
118
+ "mtime": "2026-06-30T00:03:39.766Z",
119
+ "size": 210,
120
+ "path": "../public/assets/_sessionId-XlPUgIIb.js"
121
121
  },
122
122
  "/assets/qwen-CONDcHqt.png": {
123
123
  "type": "image/png",
124
124
  "etag": '"572c3-cdJAPaHdOvFCGzuaQjagdgOu6XE"',
125
- "mtime": "2026-06-29T12:29:42.542Z",
125
+ "mtime": "2026-06-30T00:03:39.766Z",
126
126
  "size": 357059,
127
127
  "path": "../public/assets/qwen-CONDcHqt.png"
128
128
  },
129
- "/assets/ProxyViewerContainer-CiLvRNie.js": {
129
+ "/assets/ProxyViewerContainer-ivZk8MgE.js": {
130
130
  "type": "text/javascript; charset=utf-8",
131
- "etag": '"ae3c0-Cpzx6KeaKuGDUgS/cMjRV9y+6zQ"',
132
- "mtime": "2026-06-29T12:29:42.542Z",
133
- "size": 713664,
134
- "path": "../public/assets/ProxyViewerContainer-CiLvRNie.js"
131
+ "etag": '"af111-IykBkxC0TII63qeShJvyrJajFT0"',
132
+ "mtime": "2026-06-30T00:03:39.766Z",
133
+ "size": 717073,
134
+ "path": "../public/assets/ProxyViewerContainer-ivZk8MgE.js"
135
135
  }
136
136
  };
137
137
  function readAsset(id) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tonyclaw/agent-inspector",
3
- "version": "2.0.24",
3
+ "version": "2.0.26",
4
4
  "type": "module",
5
5
  "description": "Agent observability and knowledge capture layer for AI coding tools.",
6
6
  "license": "MIT",