@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.
- package/.output/nitro.json +1 -1
- package/.output/public/assets/{CompareDrawer-DrY-gAzy.js → CompareDrawer-DBTFzxG5.js} +1 -1
- package/.output/public/assets/ProxyViewerContainer-ivZk8MgE.js +115 -0
- package/.output/public/assets/{ReplayDialog-CFyw6Vu4.js → ReplayDialog-syW2hDNE.js} +1 -1
- package/.output/public/assets/{RequestAnatomy-DHGJ9py7.js → RequestAnatomy-BkuRtY9o.js} +1 -1
- package/.output/public/assets/{ResponseView-CB_3yc08.js → ResponseView-BwyvEvoE.js} +1 -1
- package/.output/public/assets/{StreamingChunkSequence-CqhHwgDn.js → StreamingChunkSequence-BY4MbPKg.js} +1 -1
- package/.output/public/assets/_sessionId-XlPUgIIb.js +1 -0
- package/.output/public/assets/index-By11a28-.js +1 -0
- package/.output/public/assets/index-DsiKfWCp.css +1 -0
- package/.output/public/assets/{main-CVw7-JyE.js → main-DKRDRBdd.js} +2 -2
- package/.output/server/{_sessionId-V33sBWBC.mjs → _sessionId-VDd4N_1B.mjs} +2 -2
- package/.output/server/_ssr/{CompareDrawer-C_Fk9joM.mjs → CompareDrawer-BQZlxsOC.mjs} +2 -2
- package/.output/server/_ssr/{ProxyViewerContainer-CyFKksQa.mjs → ProxyViewerContainer-njY2oQCc.mjs} +208 -22
- package/.output/server/_ssr/{ReplayDialog-BpQHN7O2.mjs → ReplayDialog-B8lkdAIh.mjs} +3 -3
- package/.output/server/_ssr/{RequestAnatomy-CuhmKAma.mjs → RequestAnatomy-CwOTfdwS.mjs} +2 -2
- package/.output/server/_ssr/{ResponseView-CO6LyBmj.mjs → ResponseView-3Iz_mZpd.mjs} +2 -2
- package/.output/server/_ssr/{StreamingChunkSequence-DLeVetNR.mjs → StreamingChunkSequence-hmJcQNW5.mjs} +2 -2
- package/.output/server/_ssr/{index-DWUKl9Bf.mjs → index-UuTKM4aC.mjs} +2 -2
- package/.output/server/_ssr/index.mjs +2 -2
- package/.output/server/_ssr/{router-BrK_DcTS.mjs → router-C7InHrxE.mjs} +352 -10
- package/.output/server/{_tanstack-start-manifest_v-BjW2XeWE.mjs → _tanstack-start-manifest_v-B6yfnMHA.mjs} +1 -1
- package/.output/server/index.mjs +58 -58
- package/package.json +1 -1
- package/src/components/providers/ProviderForm.tsx +176 -16
- package/src/lib/sessionInfoContract.ts +69 -0
- package/src/lib/utils.ts +46 -0
- package/src/mcp/server.ts +26 -0
- package/src/mcp/toolHandlers.ts +27 -0
- package/src/proxy/sessionInfo.ts +222 -0
- package/src/proxy/sessionSupervisor.ts +8 -5
- package/src/proxy/store.ts +77 -0
- package/src/routes/api/sessions.ts +29 -2
- package/.output/public/assets/ProxyViewerContainer-CiLvRNie.js +0 -115
- package/.output/public/assets/_sessionId-CgG9CQ9r.js +0 -1
- package/.output/public/assets/index-780zTVwp.css +0 -1
- 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,
|
|
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-
|
|
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-
|
|
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-
|
|
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.
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
|
|
1229
|
-
|
|
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-
|
|
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
|
};
|
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-06-
|
|
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-
|
|
45
|
+
"/assets/CompareDrawer-DBTFzxG5.js": {
|
|
46
46
|
"type": "text/javascript; charset=utf-8",
|
|
47
|
-
"etag": '"49fe-
|
|
48
|
-
"mtime": "2026-06-
|
|
47
|
+
"etag": '"49fe-0/x6kUv/QAjBzcBGGqiJEK7CrGo"',
|
|
48
|
+
"mtime": "2026-06-30T00:03:39.766Z",
|
|
49
49
|
"size": 18942,
|
|
50
|
-
"path": "../public/assets/CompareDrawer-
|
|
50
|
+
"path": "../public/assets/CompareDrawer-DBTFzxG5.js"
|
|
51
51
|
},
|
|
52
|
-
"/assets/
|
|
52
|
+
"/assets/ReplayDialog-syW2hDNE.js": {
|
|
53
53
|
"type": "text/javascript; charset=utf-8",
|
|
54
|
-
"etag": '"
|
|
55
|
-
"mtime": "2026-06-
|
|
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-
|
|
64
|
+
"path": "../public/assets/index-By11a28-.js"
|
|
58
65
|
},
|
|
59
|
-
"/assets/
|
|
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": '"
|
|
62
|
-
"mtime": "2026-06-
|
|
63
|
-
"size":
|
|
64
|
-
"path": "../public/assets/
|
|
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-
|
|
80
|
+
"/assets/RequestAnatomy-BkuRtY9o.js": {
|
|
67
81
|
"type": "text/javascript; charset=utf-8",
|
|
68
|
-
"etag": '"4485-
|
|
69
|
-
"mtime": "2026-06-
|
|
82
|
+
"etag": '"4485-ei5S3iwPLFX3XUKIwoNDXt6pfeg"',
|
|
83
|
+
"mtime": "2026-06-30T00:03:39.766Z",
|
|
70
84
|
"size": 17541,
|
|
71
|
-
"path": "../public/assets/RequestAnatomy-
|
|
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-
|
|
87
|
+
"/assets/ResponseView-BwyvEvoE.js": {
|
|
88
88
|
"type": "text/javascript; charset=utf-8",
|
|
89
|
-
"etag": '"30d0-
|
|
90
|
-
"mtime": "2026-06-
|
|
89
|
+
"etag": '"30d0-NcNgH32g8TreiCI4JgpE13I81fo"',
|
|
90
|
+
"mtime": "2026-06-30T00:03:39.766Z",
|
|
91
91
|
"size": 12496,
|
|
92
|
-
"path": "../public/assets/ResponseView-
|
|
92
|
+
"path": "../public/assets/ResponseView-BwyvEvoE.js"
|
|
93
93
|
},
|
|
94
|
-
"/assets/StreamingChunkSequence-
|
|
94
|
+
"/assets/StreamingChunkSequence-BY4MbPKg.js": {
|
|
95
95
|
"type": "text/javascript; charset=utf-8",
|
|
96
|
-
"etag": '"d57-
|
|
97
|
-
"mtime": "2026-06-
|
|
96
|
+
"etag": '"d57-HwRjNFQZ5p5h2qA6wui4VPdas/g"',
|
|
97
|
+
"mtime": "2026-06-30T00:03:39.766Z",
|
|
98
98
|
"size": 3415,
|
|
99
|
-
"path": "../public/assets/StreamingChunkSequence-
|
|
99
|
+
"path": "../public/assets/StreamingChunkSequence-BY4MbPKg.js"
|
|
100
100
|
},
|
|
101
|
-
"/assets/
|
|
102
|
-
"type": "
|
|
103
|
-
"etag": '"
|
|
104
|
-
"mtime": "2026-06-
|
|
105
|
-
"size":
|
|
106
|
-
"path": "../public/assets/
|
|
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-
|
|
111
|
+
"mtime": "2026-06-30T00:03:39.766Z",
|
|
112
112
|
"size": 11256,
|
|
113
113
|
"path": "../public/assets/zhipuai-BPNAnxo-.svg"
|
|
114
114
|
},
|
|
115
|
-
"/assets/
|
|
115
|
+
"/assets/_sessionId-XlPUgIIb.js": {
|
|
116
116
|
"type": "text/javascript; charset=utf-8",
|
|
117
|
-
"etag": '"
|
|
118
|
-
"mtime": "2026-06-
|
|
119
|
-
"size":
|
|
120
|
-
"path": "../public/assets/
|
|
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-
|
|
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-
|
|
129
|
+
"/assets/ProxyViewerContainer-ivZk8MgE.js": {
|
|
130
130
|
"type": "text/javascript; charset=utf-8",
|
|
131
|
-
"etag": '"
|
|
132
|
-
"mtime": "2026-06-
|
|
133
|
-
"size":
|
|
134
|
-
"path": "../public/assets/ProxyViewerContainer-
|
|
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) {
|