@tonyclaw/agent-inspector 2.0.43 → 2.1.0
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-CxM1gCfL.js → CompareDrawer-VDpcSNGM.js} +1 -1
- package/.output/public/assets/ProxyViewerContainer-fsXSjqtm.js +117 -0
- package/.output/public/assets/{ReplayDialog-UseUkucS.js → ReplayDialog-CoDgTzHR.js} +1 -1
- package/.output/public/assets/RequestAnatomy-t3plgkPE.js +1 -0
- package/.output/public/assets/ResponseView-BYuKiNeG.js +1 -0
- package/.output/public/assets/{StreamingChunkSequence-JSQEPeNS.js → StreamingChunkSequence-DOdU38Is.js} +1 -1
- package/.output/public/assets/_sessionId-ew5QlyZ2.js +1 -0
- package/.output/public/assets/index-DFICWD6o.js +1 -0
- package/.output/public/assets/index-zLLCkAnF.css +1 -0
- package/.output/public/assets/{main-BpGVJcpB.js → main-DmzLt6ti.js} +2 -2
- package/.output/server/_libs/lucide-react.mjs +219 -178
- package/.output/server/{_sessionId-DGn-TENM.mjs → _sessionId-CCN1UoEf.mjs} +3 -3
- package/.output/server/_ssr/{CompareDrawer-CFElCSYY.mjs → CompareDrawer-DkSY3vxP.mjs} +4 -4
- package/.output/server/_ssr/{ProxyViewerContainer-B7SR9mrD.mjs → ProxyViewerContainer-OTh1V_Kh.mjs} +798 -394
- package/.output/server/_ssr/{ReplayDialog-DfKapj0k.mjs → ReplayDialog-DhI6yxrR.mjs} +5 -5
- package/.output/server/_ssr/{RequestAnatomy-CUxTCg31.mjs → RequestAnatomy-DN1SJVVL.mjs} +4 -4
- package/.output/server/_ssr/{ResponseView-BXY0w197.mjs → ResponseView-DW-kpJL5.mjs} +4 -4
- package/.output/server/_ssr/{StreamingChunkSequence-CzMnES9H.mjs → StreamingChunkSequence-BAE57Fae.mjs} +4 -4
- package/.output/server/_ssr/{index-CVlT-REW.mjs → index-C9ryJEna.mjs} +3 -3
- package/.output/server/_ssr/index.mjs +2 -2
- package/.output/server/_ssr/{router-B2d1LUx6.mjs → router-DIIJGyML.mjs} +458 -10
- package/.output/server/{_tanstack-start-manifest_v-Drpi28BM.mjs → _tanstack-start-manifest_v-C_v9-E5d.mjs} +1 -1
- package/.output/server/index.mjs +63 -63
- package/package.json +1 -1
- package/src/components/OnboardingBanner.tsx +74 -68
- package/src/components/ProxyViewer.tsx +869 -363
- package/src/components/ProxyViewerContainer.tsx +135 -3
- package/src/components/proxy-viewer/LogEntryHeader.tsx +12 -6
- package/src/components/ui/crab-logo.tsx +0 -50
- package/src/proxy/logIndex.ts +188 -1
- package/src/proxy/store.ts +405 -3
- package/src/routes/api/logs.ts +36 -0
- package/.output/public/assets/ProxyViewerContainer-TtRG-0E7.js +0 -117
- package/.output/public/assets/RequestAnatomy-aPxgEJ2L.js +0 -1
- package/.output/public/assets/ResponseView-DA-F4F97.js +0 -1
- package/.output/public/assets/_sessionId-BEXuCWq5.js +0 -1
- package/.output/public/assets/index-Bhsa_2xX.js +0 -1
- package/.output/public/assets/index-DOWlRJ0W.css +0 -1
|
@@ -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%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";
|
|
68
|
-
const appCss = "/assets/index-
|
|
68
|
+
const appCss = "/assets/index-zLLCkAnF.css";
|
|
69
69
|
const Route$z = 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-C9ryJEna.mjs");
|
|
112
112
|
const Route$y = 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-CCN1UoEf.mjs");
|
|
155
155
|
const Route$x = createFileRoute("/session/$sessionId")({
|
|
156
156
|
component: lazyRouteComponent($$splitComponentImporter, "component"),
|
|
157
157
|
parseParams: (params) => ({
|
|
@@ -857,6 +857,48 @@ function getIndexPath() {
|
|
|
857
857
|
return join(resolveLogDir(), INDEX_FILE);
|
|
858
858
|
}
|
|
859
859
|
let cachedIndex = null;
|
|
860
|
+
function textByteLength$2(value) {
|
|
861
|
+
return value === null ? null : Buffer.byteLength(value, "utf8");
|
|
862
|
+
}
|
|
863
|
+
function createLogIndexEntryMetadata(log) {
|
|
864
|
+
return {
|
|
865
|
+
sessionId: log.sessionId,
|
|
866
|
+
model: log.model,
|
|
867
|
+
summary: {
|
|
868
|
+
id: log.id,
|
|
869
|
+
timestamp: log.timestamp,
|
|
870
|
+
method: log.method,
|
|
871
|
+
path: log.path,
|
|
872
|
+
model: log.model,
|
|
873
|
+
sessionId: log.sessionId,
|
|
874
|
+
responseStatus: log.responseStatus,
|
|
875
|
+
inputTokens: log.inputTokens,
|
|
876
|
+
outputTokens: log.outputTokens,
|
|
877
|
+
cacheCreationInputTokens: log.cacheCreationInputTokens,
|
|
878
|
+
cacheReadInputTokens: log.cacheReadInputTokens,
|
|
879
|
+
elapsedMs: log.elapsedMs,
|
|
880
|
+
firstChunkMs: log.firstChunkMs ?? null,
|
|
881
|
+
totalStreamMs: log.totalStreamMs ?? null,
|
|
882
|
+
tokensPerSecond: log.tokensPerSecond ?? null,
|
|
883
|
+
streaming: log.streaming,
|
|
884
|
+
userAgent: log.userAgent,
|
|
885
|
+
origin: log.origin,
|
|
886
|
+
apiFormat: log.apiFormat,
|
|
887
|
+
isTest: log.isTest ?? false,
|
|
888
|
+
replayOfLogId: log.replayOfLogId ?? null,
|
|
889
|
+
providerName: log.providerName ?? null,
|
|
890
|
+
clientPort: log.clientPort ?? null,
|
|
891
|
+
clientPid: log.clientPid ?? null,
|
|
892
|
+
clientCwd: log.clientCwd ?? null,
|
|
893
|
+
clientProjectFolder: log.clientProjectFolder ?? null,
|
|
894
|
+
streamingChunksPath: log.streamingChunksPath ?? null,
|
|
895
|
+
rawRequestBodyBytes: log.rawRequestBodyBytes ?? textByteLength$2(log.rawRequestBody),
|
|
896
|
+
responseTextBytes: log.responseTextBytes ?? textByteLength$2(log.responseText),
|
|
897
|
+
warnings: log.warnings,
|
|
898
|
+
error: log.error ?? null
|
|
899
|
+
}
|
|
900
|
+
};
|
|
901
|
+
}
|
|
860
902
|
function createEmptyIndex() {
|
|
861
903
|
return {
|
|
862
904
|
version: INDEX_VERSION,
|
|
@@ -906,9 +948,9 @@ async function saveIndex(index) {
|
|
|
906
948
|
logger.error("[logIndex] Failed to save index:", String(err));
|
|
907
949
|
}
|
|
908
950
|
}
|
|
909
|
-
async function addToIndex(id, file, byteOffset, byteLength) {
|
|
951
|
+
async function addToIndex(id, file, byteOffset, byteLength, metadata) {
|
|
910
952
|
const index = await loadIndex();
|
|
911
|
-
index.entries[id] = { id, file, byteOffset, byteLength };
|
|
953
|
+
index.entries[id] = metadata === void 0 ? { id, file, byteOffset, byteLength } : { id, file, byteOffset, byteLength, ...metadata };
|
|
912
954
|
if (id > index.maxId) {
|
|
913
955
|
index.maxId = id;
|
|
914
956
|
}
|
|
@@ -946,6 +988,89 @@ async function listIndexEntries() {
|
|
|
946
988
|
const index = await loadIndex();
|
|
947
989
|
return Object.values(index.entries).sort((left, right) => left.id - right.id);
|
|
948
990
|
}
|
|
991
|
+
function readStringOrNullField(entry, field) {
|
|
992
|
+
const desc = Object.getOwnPropertyDescriptor(entry, field);
|
|
993
|
+
if (desc === void 0) return null;
|
|
994
|
+
if (typeof desc.value === "string") return desc.value;
|
|
995
|
+
return null;
|
|
996
|
+
}
|
|
997
|
+
function readStringField(entry, field) {
|
|
998
|
+
return readStringOrNullField(entry, field) ?? "";
|
|
999
|
+
}
|
|
1000
|
+
function readNumberOrNullField(entry, field) {
|
|
1001
|
+
const desc = Object.getOwnPropertyDescriptor(entry, field);
|
|
1002
|
+
if (desc === void 0) return null;
|
|
1003
|
+
return typeof desc.value === "number" ? desc.value : null;
|
|
1004
|
+
}
|
|
1005
|
+
function readBooleanField(entry, field) {
|
|
1006
|
+
const desc = Object.getOwnPropertyDescriptor(entry, field);
|
|
1007
|
+
if (desc === void 0) return false;
|
|
1008
|
+
return typeof desc.value === "boolean" ? desc.value : false;
|
|
1009
|
+
}
|
|
1010
|
+
function readApiFormatField(entry) {
|
|
1011
|
+
const value = readStringOrNullField(entry, "apiFormat");
|
|
1012
|
+
switch (value) {
|
|
1013
|
+
case "anthropic":
|
|
1014
|
+
return "anthropic";
|
|
1015
|
+
case "openai":
|
|
1016
|
+
return "openai";
|
|
1017
|
+
case "unknown":
|
|
1018
|
+
case null:
|
|
1019
|
+
return "unknown";
|
|
1020
|
+
default:
|
|
1021
|
+
return "unknown";
|
|
1022
|
+
}
|
|
1023
|
+
}
|
|
1024
|
+
function readStringArrayField(entry, field) {
|
|
1025
|
+
const desc = Object.getOwnPropertyDescriptor(entry, field);
|
|
1026
|
+
if (desc === void 0 || !Array.isArray(desc.value)) return void 0;
|
|
1027
|
+
const values = [];
|
|
1028
|
+
for (const item of desc.value) {
|
|
1029
|
+
if (typeof item !== "string") return void 0;
|
|
1030
|
+
values.push(item);
|
|
1031
|
+
}
|
|
1032
|
+
return values;
|
|
1033
|
+
}
|
|
1034
|
+
function readTextByteLength(entry, bytesField, textField) {
|
|
1035
|
+
const explicitBytes = readNumberOrNullField(entry, bytesField);
|
|
1036
|
+
if (explicitBytes !== null && explicitBytes >= 0) return explicitBytes;
|
|
1037
|
+
return textByteLength$2(readStringOrNullField(entry, textField));
|
|
1038
|
+
}
|
|
1039
|
+
function readLogIndexSummary(entry, id) {
|
|
1040
|
+
return {
|
|
1041
|
+
id,
|
|
1042
|
+
timestamp: readStringField(entry, "timestamp"),
|
|
1043
|
+
method: readStringField(entry, "method"),
|
|
1044
|
+
path: readStringField(entry, "path"),
|
|
1045
|
+
model: readStringOrNullField(entry, "model"),
|
|
1046
|
+
sessionId: readStringOrNullField(entry, "sessionId"),
|
|
1047
|
+
responseStatus: readNumberOrNullField(entry, "responseStatus"),
|
|
1048
|
+
inputTokens: readNumberOrNullField(entry, "inputTokens"),
|
|
1049
|
+
outputTokens: readNumberOrNullField(entry, "outputTokens"),
|
|
1050
|
+
cacheCreationInputTokens: readNumberOrNullField(entry, "cacheCreationInputTokens"),
|
|
1051
|
+
cacheReadInputTokens: readNumberOrNullField(entry, "cacheReadInputTokens"),
|
|
1052
|
+
elapsedMs: readNumberOrNullField(entry, "elapsedMs"),
|
|
1053
|
+
firstChunkMs: readNumberOrNullField(entry, "firstChunkMs"),
|
|
1054
|
+
totalStreamMs: readNumberOrNullField(entry, "totalStreamMs"),
|
|
1055
|
+
tokensPerSecond: readNumberOrNullField(entry, "tokensPerSecond"),
|
|
1056
|
+
streaming: readBooleanField(entry, "streaming"),
|
|
1057
|
+
userAgent: readStringOrNullField(entry, "userAgent"),
|
|
1058
|
+
origin: readStringOrNullField(entry, "origin"),
|
|
1059
|
+
apiFormat: readApiFormatField(entry),
|
|
1060
|
+
isTest: readBooleanField(entry, "isTest"),
|
|
1061
|
+
replayOfLogId: readNumberOrNullField(entry, "replayOfLogId"),
|
|
1062
|
+
providerName: readStringOrNullField(entry, "providerName"),
|
|
1063
|
+
clientPort: readNumberOrNullField(entry, "clientPort"),
|
|
1064
|
+
clientPid: readNumberOrNullField(entry, "clientPid"),
|
|
1065
|
+
clientCwd: readStringOrNullField(entry, "clientCwd"),
|
|
1066
|
+
clientProjectFolder: readStringOrNullField(entry, "clientProjectFolder"),
|
|
1067
|
+
streamingChunksPath: readStringOrNullField(entry, "streamingChunksPath"),
|
|
1068
|
+
rawRequestBodyBytes: readTextByteLength(entry, "rawRequestBodyBytes", "rawRequestBody"),
|
|
1069
|
+
responseTextBytes: readTextByteLength(entry, "responseTextBytes", "responseText"),
|
|
1070
|
+
warnings: readStringArrayField(entry, "warnings"),
|
|
1071
|
+
error: readStringOrNullField(entry, "error")
|
|
1072
|
+
};
|
|
1073
|
+
}
|
|
949
1074
|
async function indexFile(filePath, file) {
|
|
950
1075
|
const entries = {};
|
|
951
1076
|
let maxId = 0;
|
|
@@ -968,7 +1093,10 @@ async function indexFile(filePath, file) {
|
|
|
968
1093
|
id: entryId,
|
|
969
1094
|
file,
|
|
970
1095
|
byteOffset,
|
|
971
|
-
byteLength: lineBytes
|
|
1096
|
+
byteLength: lineBytes,
|
|
1097
|
+
sessionId: readStringOrNullField(entry, "sessionId"),
|
|
1098
|
+
model: readStringOrNullField(entry, "model"),
|
|
1099
|
+
summary: readLogIndexSummary(entry, entryId)
|
|
972
1100
|
};
|
|
973
1101
|
}
|
|
974
1102
|
}
|
|
@@ -1583,6 +1711,54 @@ function getSessionSnapshots() {
|
|
|
1583
1711
|
}
|
|
1584
1712
|
const MAX_MEMORY_CACHE = 100;
|
|
1585
1713
|
const memoryCache = /* @__PURE__ */ new Map();
|
|
1714
|
+
const MAX_CURSOR_PAGE_INDEXES = 16;
|
|
1715
|
+
const logCursorPageIndexes = /* @__PURE__ */ new Map();
|
|
1716
|
+
function cursorPageIndexKey(options) {
|
|
1717
|
+
return JSON.stringify({
|
|
1718
|
+
sessionId: options.sessionId ?? null,
|
|
1719
|
+
model: options.model ?? null
|
|
1720
|
+
});
|
|
1721
|
+
}
|
|
1722
|
+
function matchesCursorIndexFilters(log, index) {
|
|
1723
|
+
if (index.sessionId !== void 0 && getLogSessionId(log) !== index.sessionId) return false;
|
|
1724
|
+
if (index.model !== void 0 && log.model !== index.model) return false;
|
|
1725
|
+
return true;
|
|
1726
|
+
}
|
|
1727
|
+
function insertSortedLogId(ids, id) {
|
|
1728
|
+
if (ids.includes(id)) return;
|
|
1729
|
+
const insertionIndex = ids.findIndex((candidate) => candidate > id);
|
|
1730
|
+
if (insertionIndex === -1) {
|
|
1731
|
+
ids.push(id);
|
|
1732
|
+
return;
|
|
1733
|
+
}
|
|
1734
|
+
ids.splice(insertionIndex, 0, id);
|
|
1735
|
+
}
|
|
1736
|
+
function upsertLogCursorPageIndexes(log) {
|
|
1737
|
+
for (const index of logCursorPageIndexes.values()) {
|
|
1738
|
+
if (!matchesCursorIndexFilters(log, index)) {
|
|
1739
|
+
if (index.logsById.delete(log.id)) {
|
|
1740
|
+
index.ids = index.ids.filter((id) => id !== log.id);
|
|
1741
|
+
}
|
|
1742
|
+
index.entriesById.delete(log.id);
|
|
1743
|
+
continue;
|
|
1744
|
+
}
|
|
1745
|
+
index.logsById.set(log.id, log);
|
|
1746
|
+
insertSortedLogId(index.ids, log.id);
|
|
1747
|
+
}
|
|
1748
|
+
}
|
|
1749
|
+
function removeLogsFromCursorPageIndexes(ids) {
|
|
1750
|
+
if (ids.size === 0) return;
|
|
1751
|
+
for (const index of logCursorPageIndexes.values()) {
|
|
1752
|
+
for (const id of ids) {
|
|
1753
|
+
index.logsById.delete(id);
|
|
1754
|
+
index.entriesById.delete(id);
|
|
1755
|
+
}
|
|
1756
|
+
index.ids = index.ids.filter((id) => !ids.has(id));
|
|
1757
|
+
}
|
|
1758
|
+
}
|
|
1759
|
+
function clearLogCursorPageIndexes() {
|
|
1760
|
+
logCursorPageIndexes.clear();
|
|
1761
|
+
}
|
|
1586
1762
|
function evictOldestIfNeeded() {
|
|
1587
1763
|
while (memoryCache.size > MAX_MEMORY_CACHE) {
|
|
1588
1764
|
const oldestKey = memoryCache.keys().next().value;
|
|
@@ -1603,10 +1779,12 @@ function addToCache(log) {
|
|
|
1603
1779
|
memoryCache.delete(cachedLog.id);
|
|
1604
1780
|
}
|
|
1605
1781
|
memoryCache.set(cachedLog.id, cachedLog);
|
|
1782
|
+
upsertLogCursorPageIndexes(cachedLog);
|
|
1606
1783
|
evictOldestIfNeeded();
|
|
1607
1784
|
}
|
|
1608
1785
|
function removeFromCache(id) {
|
|
1609
1786
|
memoryCache.delete(id);
|
|
1787
|
+
removeLogsFromCursorPageIndexes(/* @__PURE__ */ new Set([id]));
|
|
1610
1788
|
}
|
|
1611
1789
|
function textByteLength$1(value) {
|
|
1612
1790
|
if (value === null) return null;
|
|
@@ -1625,6 +1803,44 @@ function compactLogForList(log) {
|
|
|
1625
1803
|
bodyContentMode: "compact"
|
|
1626
1804
|
};
|
|
1627
1805
|
}
|
|
1806
|
+
function compactLogFromIndexSummary(summary) {
|
|
1807
|
+
return normalizeLog({
|
|
1808
|
+
id: summary.id,
|
|
1809
|
+
timestamp: summary.timestamp,
|
|
1810
|
+
method: summary.method,
|
|
1811
|
+
path: summary.path,
|
|
1812
|
+
model: summary.model,
|
|
1813
|
+
sessionId: summary.sessionId,
|
|
1814
|
+
rawRequestBody: null,
|
|
1815
|
+
responseStatus: summary.responseStatus,
|
|
1816
|
+
responseText: null,
|
|
1817
|
+
inputTokens: summary.inputTokens,
|
|
1818
|
+
outputTokens: summary.outputTokens,
|
|
1819
|
+
cacheCreationInputTokens: summary.cacheCreationInputTokens,
|
|
1820
|
+
cacheReadInputTokens: summary.cacheReadInputTokens,
|
|
1821
|
+
elapsedMs: summary.elapsedMs,
|
|
1822
|
+
firstChunkMs: summary.firstChunkMs,
|
|
1823
|
+
totalStreamMs: summary.totalStreamMs,
|
|
1824
|
+
tokensPerSecond: summary.tokensPerSecond,
|
|
1825
|
+
streaming: summary.streaming,
|
|
1826
|
+
userAgent: summary.userAgent,
|
|
1827
|
+
origin: summary.origin,
|
|
1828
|
+
apiFormat: summary.apiFormat,
|
|
1829
|
+
isTest: summary.isTest,
|
|
1830
|
+
replayOfLogId: summary.replayOfLogId,
|
|
1831
|
+
providerName: summary.providerName,
|
|
1832
|
+
clientPort: summary.clientPort,
|
|
1833
|
+
clientPid: summary.clientPid,
|
|
1834
|
+
clientCwd: summary.clientCwd,
|
|
1835
|
+
clientProjectFolder: summary.clientProjectFolder,
|
|
1836
|
+
streamingChunksPath: summary.streamingChunksPath,
|
|
1837
|
+
rawRequestBodyBytes: summary.rawRequestBodyBytes,
|
|
1838
|
+
responseTextBytes: summary.responseTextBytes,
|
|
1839
|
+
bodyContentMode: "compact",
|
|
1840
|
+
warnings: summary.warnings,
|
|
1841
|
+
error: summary.error
|
|
1842
|
+
});
|
|
1843
|
+
}
|
|
1628
1844
|
function prepareLogForList(log, includeBodies) {
|
|
1629
1845
|
return includeBodies ? log : compactLogForList(log);
|
|
1630
1846
|
}
|
|
@@ -1651,7 +1867,7 @@ async function addTestLogEntry(entry) {
|
|
|
1651
1867
|
await runWithLogWriteLock(async () => {
|
|
1652
1868
|
const logFile = getCurrentLogFile();
|
|
1653
1869
|
appendLogEntry(log);
|
|
1654
|
-
await addToIndex(id, logFile, -1, -1);
|
|
1870
|
+
await addToIndex(id, logFile, -1, -1, createLogIndexEntryMetadata(log));
|
|
1655
1871
|
});
|
|
1656
1872
|
addToCache(log);
|
|
1657
1873
|
observeSessionLog(log, session.source);
|
|
@@ -1701,7 +1917,7 @@ async function createLog(method, path2, requestBody, headers, clientInfo, rawHea
|
|
|
1701
1917
|
await runWithLogWriteLock(async () => {
|
|
1702
1918
|
const logFile = getCurrentLogFile();
|
|
1703
1919
|
appendLogEntry(log);
|
|
1704
|
-
await addToIndex(id, logFile, -1, -1);
|
|
1920
|
+
await addToIndex(id, logFile, -1, -1, createLogIndexEntryMetadata(log));
|
|
1705
1921
|
});
|
|
1706
1922
|
addToCache(log);
|
|
1707
1923
|
markSessionStarted(log, session.source);
|
|
@@ -1907,6 +2123,180 @@ async function listLogsPage(options) {
|
|
|
1907
2123
|
limit: options.limit
|
|
1908
2124
|
};
|
|
1909
2125
|
}
|
|
2126
|
+
function matchesCursorWindow(id, options) {
|
|
2127
|
+
if (options.beforeLogId !== void 0 && id >= options.beforeLogId) return false;
|
|
2128
|
+
if (options.afterLogId !== void 0 && id <= options.afterLogId) return false;
|
|
2129
|
+
return true;
|
|
2130
|
+
}
|
|
2131
|
+
function selectCursorPageLogs(ids, options) {
|
|
2132
|
+
const matchingWindow = ids.filter((id) => matchesCursorWindow(id, options));
|
|
2133
|
+
if (options.afterLogId !== void 0 || options.anchor === "oldest") {
|
|
2134
|
+
return matchingWindow.slice(0, options.limit);
|
|
2135
|
+
}
|
|
2136
|
+
return matchingWindow.slice(Math.max(0, matchingWindow.length - options.limit));
|
|
2137
|
+
}
|
|
2138
|
+
function rememberLogCursorPageIndex(index) {
|
|
2139
|
+
if (logCursorPageIndexes.has(index.key)) {
|
|
2140
|
+
logCursorPageIndexes.delete(index.key);
|
|
2141
|
+
}
|
|
2142
|
+
logCursorPageIndexes.set(index.key, index);
|
|
2143
|
+
while (logCursorPageIndexes.size > MAX_CURSOR_PAGE_INDEXES) {
|
|
2144
|
+
const oldestKey = logCursorPageIndexes.keys().next().value;
|
|
2145
|
+
if (oldestKey === void 0) break;
|
|
2146
|
+
logCursorPageIndexes.delete(oldestKey);
|
|
2147
|
+
}
|
|
2148
|
+
return index;
|
|
2149
|
+
}
|
|
2150
|
+
function hasNullableStringField(entry, field) {
|
|
2151
|
+
const desc = Object.getOwnPropertyDescriptor(entry, field);
|
|
2152
|
+
if (desc === void 0) return false;
|
|
2153
|
+
return typeof desc.value === "string" || desc.value === null;
|
|
2154
|
+
}
|
|
2155
|
+
function hasLogIndexFilterMetadata(entry) {
|
|
2156
|
+
return hasNullableStringField(entry, "sessionId") && hasNullableStringField(entry, "model");
|
|
2157
|
+
}
|
|
2158
|
+
function hasLogIndexSummary(entry) {
|
|
2159
|
+
return entry.summary !== void 0;
|
|
2160
|
+
}
|
|
2161
|
+
function matchesLogIndexEntryFilters(entry, sessionId, model) {
|
|
2162
|
+
if (sessionId !== void 0 && entry.sessionId !== sessionId) return false;
|
|
2163
|
+
if (model !== void 0 && entry.model !== model) return false;
|
|
2164
|
+
return true;
|
|
2165
|
+
}
|
|
2166
|
+
async function buildLogCursorPageIndexFromLogIndex(options, allowRebuild) {
|
|
2167
|
+
let entries = await listIndexEntries();
|
|
2168
|
+
if (entries.length === 0 && allowRebuild) {
|
|
2169
|
+
await rebuildIndex();
|
|
2170
|
+
entries = await listIndexEntries();
|
|
2171
|
+
}
|
|
2172
|
+
if (entries.some((entry) => !hasLogIndexFilterMetadata(entry))) {
|
|
2173
|
+
if (!allowRebuild) return null;
|
|
2174
|
+
await rebuildIndex();
|
|
2175
|
+
return await buildLogCursorPageIndexFromLogIndex(options, false);
|
|
2176
|
+
}
|
|
2177
|
+
const matchingEntries = entries.filter(
|
|
2178
|
+
(entry) => matchesLogIndexEntryFilters(entry, options.sessionId, options.model)
|
|
2179
|
+
);
|
|
2180
|
+
if (matchingEntries.some((entry) => !hasLogIndexSummary(entry))) {
|
|
2181
|
+
if (!allowRebuild) return null;
|
|
2182
|
+
await rebuildIndex();
|
|
2183
|
+
return await buildLogCursorPageIndexFromLogIndex(options, false);
|
|
2184
|
+
}
|
|
2185
|
+
if (matchingEntries.some((entry) => !hasUsableIndexOffset(entry) && !memoryCache.has(entry.id))) {
|
|
2186
|
+
if (!allowRebuild) return null;
|
|
2187
|
+
await rebuildIndex();
|
|
2188
|
+
return await buildLogCursorPageIndexFromLogIndex(options, false);
|
|
2189
|
+
}
|
|
2190
|
+
const idsById = /* @__PURE__ */ new Set();
|
|
2191
|
+
const entriesById = /* @__PURE__ */ new Map();
|
|
2192
|
+
for (const entry of matchingEntries) {
|
|
2193
|
+
idsById.add(entry.id);
|
|
2194
|
+
entriesById.set(entry.id, entry);
|
|
2195
|
+
}
|
|
2196
|
+
const logsById = /* @__PURE__ */ new Map();
|
|
2197
|
+
for (const log of memoryCache.values()) {
|
|
2198
|
+
if (!matchesLogFilters(log, options.sessionId, options.model)) continue;
|
|
2199
|
+
idsById.add(log.id);
|
|
2200
|
+
logsById.set(log.id, log);
|
|
2201
|
+
}
|
|
2202
|
+
return {
|
|
2203
|
+
key: cursorPageIndexKey(options),
|
|
2204
|
+
sessionId: options.sessionId,
|
|
2205
|
+
model: options.model,
|
|
2206
|
+
ids: [...idsById].sort((left, right) => left - right),
|
|
2207
|
+
logsById,
|
|
2208
|
+
entriesById
|
|
2209
|
+
};
|
|
2210
|
+
}
|
|
2211
|
+
async function buildLogCursorPageIndex(options) {
|
|
2212
|
+
const indexed = await buildLogCursorPageIndexFromLogIndex(options, true);
|
|
2213
|
+
if (indexed !== null) return indexed;
|
|
2214
|
+
const key = cursorPageIndexKey(options);
|
|
2215
|
+
const logsById = /* @__PURE__ */ new Map();
|
|
2216
|
+
const visitLog = (log) => {
|
|
2217
|
+
if (!matchesLogFilters(log, options.sessionId, options.model)) return;
|
|
2218
|
+
logsById.set(log.id, log);
|
|
2219
|
+
};
|
|
2220
|
+
await visitPersistedLogs((log) => {
|
|
2221
|
+
observeSessionLog(log);
|
|
2222
|
+
visitLog(log);
|
|
2223
|
+
});
|
|
2224
|
+
for (const log of memoryCache.values()) {
|
|
2225
|
+
visitLog(log);
|
|
2226
|
+
}
|
|
2227
|
+
return {
|
|
2228
|
+
key,
|
|
2229
|
+
sessionId: options.sessionId,
|
|
2230
|
+
model: options.model,
|
|
2231
|
+
ids: [...logsById.keys()].sort((left, right) => left - right),
|
|
2232
|
+
logsById,
|
|
2233
|
+
entriesById: /* @__PURE__ */ new Map()
|
|
2234
|
+
};
|
|
2235
|
+
}
|
|
2236
|
+
async function getLogCursorPageIndex(options) {
|
|
2237
|
+
const key = cursorPageIndexKey(options);
|
|
2238
|
+
const cached = logCursorPageIndexes.get(key);
|
|
2239
|
+
if (cached !== void 0) {
|
|
2240
|
+
logCursorPageIndexes.delete(key);
|
|
2241
|
+
logCursorPageIndexes.set(key, cached);
|
|
2242
|
+
return cached;
|
|
2243
|
+
}
|
|
2244
|
+
return rememberLogCursorPageIndex(await buildLogCursorPageIndex(options));
|
|
2245
|
+
}
|
|
2246
|
+
async function hydrateCursorPageLogs(index, pageIds) {
|
|
2247
|
+
const logs = [];
|
|
2248
|
+
for (const id of pageIds) {
|
|
2249
|
+
const cached = index.logsById.get(id);
|
|
2250
|
+
if (cached !== void 0) {
|
|
2251
|
+
logs.push(cached);
|
|
2252
|
+
continue;
|
|
2253
|
+
}
|
|
2254
|
+
const log = await getLogById(id);
|
|
2255
|
+
if (log === null) continue;
|
|
2256
|
+
index.logsById.set(id, log);
|
|
2257
|
+
logs.push(log);
|
|
2258
|
+
}
|
|
2259
|
+
return logs;
|
|
2260
|
+
}
|
|
2261
|
+
async function hydrateCompactCursorPageLogs(index, pageIds) {
|
|
2262
|
+
const logs = [];
|
|
2263
|
+
for (const id of pageIds) {
|
|
2264
|
+
const cached = index.logsById.get(id);
|
|
2265
|
+
if (cached !== void 0) {
|
|
2266
|
+
logs.push(compactLogForList(cached));
|
|
2267
|
+
continue;
|
|
2268
|
+
}
|
|
2269
|
+
const entry = index.entriesById.get(id);
|
|
2270
|
+
if (entry !== void 0 && entry.summary !== void 0) {
|
|
2271
|
+
logs.push(compactLogFromIndexSummary(entry.summary));
|
|
2272
|
+
continue;
|
|
2273
|
+
}
|
|
2274
|
+
const log = await getLogById(id);
|
|
2275
|
+
if (log === null) continue;
|
|
2276
|
+
index.logsById.set(id, log);
|
|
2277
|
+
logs.push(compactLogForList(log));
|
|
2278
|
+
}
|
|
2279
|
+
return logs;
|
|
2280
|
+
}
|
|
2281
|
+
async function listLogsCursorPage(options) {
|
|
2282
|
+
const includeBodies = options.includeBodies !== false;
|
|
2283
|
+
const index = await getLogCursorPageIndex(options);
|
|
2284
|
+
const pageIds = selectCursorPageLogs(index.ids, options);
|
|
2285
|
+
const pageLogs = includeBodies ? await hydrateCursorPageLogs(index, pageIds) : await hydrateCompactCursorPageLogs(index, pageIds);
|
|
2286
|
+
const oldestLogId = pageIds[0] ?? null;
|
|
2287
|
+
const newestLogId = pageIds.at(-1) ?? null;
|
|
2288
|
+
const oldestIndex = oldestLogId === null ? -1 : index.ids.indexOf(oldestLogId);
|
|
2289
|
+
const newestIndex = newestLogId === null ? -1 : index.ids.indexOf(newestLogId);
|
|
2290
|
+
return {
|
|
2291
|
+
logs: pageLogs.map((log) => prepareLogForList(log, includeBodies)),
|
|
2292
|
+
total: index.ids.length,
|
|
2293
|
+
limit: options.limit,
|
|
2294
|
+
hasOlder: oldestIndex > 0,
|
|
2295
|
+
hasNewer: newestIndex >= 0 && newestIndex < index.ids.length - 1,
|
|
2296
|
+
oldestLogId,
|
|
2297
|
+
newestLogId
|
|
2298
|
+
};
|
|
2299
|
+
}
|
|
1910
2300
|
function findSessionSnapshot(sessionId) {
|
|
1911
2301
|
for (const snapshot of getSessionSnapshots()) {
|
|
1912
2302
|
if (snapshot.id === sessionId) return snapshot;
|
|
@@ -1919,7 +2309,11 @@ async function collectSessionLogSummaries(sessionId, includeHistory) {
|
|
|
1919
2309
|
if (!matchesLogFilters(log, sessionId, void 0)) return;
|
|
1920
2310
|
summariesById.set(log.id, buildSessionLogSummary(log));
|
|
1921
2311
|
};
|
|
1922
|
-
|
|
2312
|
+
const indexedSummaries = await collectIndexedSessionLogSummaries(sessionId);
|
|
2313
|
+
for (const summary of indexedSummaries) {
|
|
2314
|
+
summariesById.set(summary.id, summary);
|
|
2315
|
+
}
|
|
2316
|
+
if (includeHistory && summariesById.size === 0) {
|
|
1923
2317
|
await visitPersistedLogs((log) => {
|
|
1924
2318
|
observeSessionLog(log);
|
|
1925
2319
|
observeMatchingLog(log);
|
|
@@ -1930,6 +2324,26 @@ async function collectSessionLogSummaries(sessionId, includeHistory) {
|
|
|
1930
2324
|
}
|
|
1931
2325
|
return [...summariesById.values()];
|
|
1932
2326
|
}
|
|
2327
|
+
async function collectIndexedSessionLogSummaries(sessionId) {
|
|
2328
|
+
let entries = await listIndexEntries();
|
|
2329
|
+
if (entries.length === 0) return [];
|
|
2330
|
+
const needsMetadataRebuild = entries.some((entry) => !hasLogIndexFilterMetadata(entry));
|
|
2331
|
+
const needsSummaryRebuild = entries.some((entry) => {
|
|
2332
|
+
if (!matchesLogIndexEntryFilters(entry, sessionId, void 0)) return false;
|
|
2333
|
+
return !hasLogIndexSummary(entry);
|
|
2334
|
+
});
|
|
2335
|
+
if (needsMetadataRebuild || needsSummaryRebuild) {
|
|
2336
|
+
await rebuildIndex();
|
|
2337
|
+
entries = await listIndexEntries();
|
|
2338
|
+
}
|
|
2339
|
+
const summaries = [];
|
|
2340
|
+
for (const entry of entries) {
|
|
2341
|
+
if (!matchesLogIndexEntryFilters(entry, sessionId, void 0)) continue;
|
|
2342
|
+
if (entry.summary === void 0) continue;
|
|
2343
|
+
summaries.push(buildSessionLogSummary(compactLogFromIndexSummary(entry.summary)));
|
|
2344
|
+
}
|
|
2345
|
+
return summaries;
|
|
2346
|
+
}
|
|
1933
2347
|
async function includeSnapshotLastLogSummary(sessionId, snapshot, summaries) {
|
|
1934
2348
|
if (snapshot === null || snapshot.lastLogId === null) return summaries;
|
|
1935
2349
|
for (const summary of summaries) {
|
|
@@ -2014,6 +2428,7 @@ function getLogStorageStats() {
|
|
|
2014
2428
|
function clearAllLogs() {
|
|
2015
2429
|
const count = memoryCache.size;
|
|
2016
2430
|
memoryCache.clear();
|
|
2431
|
+
clearLogCursorPageIndexes();
|
|
2017
2432
|
clearSessionRegistry();
|
|
2018
2433
|
return { cleared: count };
|
|
2019
2434
|
}
|
|
@@ -2226,6 +2641,7 @@ async function clearPersistedLogsByIds(ids) {
|
|
|
2226
2641
|
deleteChunkFilesByIds(uniqueIds)
|
|
2227
2642
|
]);
|
|
2228
2643
|
await rebuildIndex();
|
|
2644
|
+
clearLogCursorPageIndexes();
|
|
2229
2645
|
const clearedIds = new Set(rewriteResult.removedIds);
|
|
2230
2646
|
if (result.cleared > 0) {
|
|
2231
2647
|
for (const id of memoryRemovedIds) {
|
|
@@ -2247,6 +2663,7 @@ function clearLogsByIds(ids) {
|
|
|
2247
2663
|
for (const id of unique2) {
|
|
2248
2664
|
removeFromCache(id);
|
|
2249
2665
|
}
|
|
2666
|
+
removeLogsFromCursorPageIndexes(unique2);
|
|
2250
2667
|
rebuildSessionRegistry(memoryCache.values());
|
|
2251
2668
|
return { cleared: unique2.size };
|
|
2252
2669
|
}
|
|
@@ -6921,7 +7338,7 @@ const Route$s = createFileRoute("/api/models")({
|
|
|
6921
7338
|
}
|
|
6922
7339
|
}
|
|
6923
7340
|
});
|
|
6924
|
-
const version = "2.0
|
|
7341
|
+
const version = "2.1.0";
|
|
6925
7342
|
const packageJson = {
|
|
6926
7343
|
version
|
|
6927
7344
|
};
|
|
@@ -9533,6 +9950,12 @@ function parsePositiveInt(value, fallback) {
|
|
|
9533
9950
|
if (!Number.isInteger(parsed) || parsed < 1) return fallback;
|
|
9534
9951
|
return parsed;
|
|
9535
9952
|
}
|
|
9953
|
+
function parseOptionalPositiveInt(value) {
|
|
9954
|
+
if (value === null) return { ok: true, value: null };
|
|
9955
|
+
const parsed = Number(value);
|
|
9956
|
+
if (!Number.isInteger(parsed) || parsed < 1) return { ok: false };
|
|
9957
|
+
return { ok: true, value: parsed };
|
|
9958
|
+
}
|
|
9536
9959
|
const Route$q = createFileRoute("/api/logs")({
|
|
9537
9960
|
server: {
|
|
9538
9961
|
handlers: {
|
|
@@ -9566,6 +9989,31 @@ const Route$q = createFileRoute("/api/logs")({
|
|
|
9566
9989
|
}
|
|
9567
9990
|
const limit = parsePositiveInt(url.searchParams.get("limit"), 50);
|
|
9568
9991
|
const includeBodies = url.searchParams.get("compact") !== "1";
|
|
9992
|
+
if (url.searchParams.get("cursor") === "1" || url.searchParams.get("cursor") === "true") {
|
|
9993
|
+
const beforeLogId = parseOptionalPositiveInt(url.searchParams.get("beforeLogId"));
|
|
9994
|
+
const afterLogId = parseOptionalPositiveInt(url.searchParams.get("afterLogId"));
|
|
9995
|
+
if (!beforeLogId.ok || !afterLogId.ok) {
|
|
9996
|
+
return Response.json({ error: "Invalid cursor log ID" }, { status: 400 });
|
|
9997
|
+
}
|
|
9998
|
+
if (beforeLogId.value !== null && afterLogId.value !== null) {
|
|
9999
|
+
return Response.json(
|
|
10000
|
+
{ error: "Use beforeLogId or afterLogId, not both" },
|
|
10001
|
+
{ status: 400 }
|
|
10002
|
+
);
|
|
10003
|
+
}
|
|
10004
|
+
const anchor = url.searchParams.get("anchor") === "oldest" ? "oldest" : "newest";
|
|
10005
|
+
return Response.json(
|
|
10006
|
+
await listLogsCursorPage({
|
|
10007
|
+
sessionId,
|
|
10008
|
+
model,
|
|
10009
|
+
limit,
|
|
10010
|
+
includeBodies,
|
|
10011
|
+
beforeLogId: beforeLogId.value ?? void 0,
|
|
10012
|
+
afterLogId: afterLogId.value ?? void 0,
|
|
10013
|
+
anchor
|
|
10014
|
+
})
|
|
10015
|
+
);
|
|
10016
|
+
}
|
|
9569
10017
|
return Response.json(
|
|
9570
10018
|
await listLogsPage({ sessionId, model, offset, limit, includeBodies })
|
|
9571
10019
|
);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const tsrStartManifest = () => ({ "routes": { "__root__": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/__root.tsx", "children": ["/", "/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/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-DmzLt6ti.js"], "assets": [] }, "/": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/index.tsx", "assets": [], "preloads": ["/assets/index-DFICWD6o.js", "/assets/ProxyViewerContainer-fsXSjqtm.js"] }, "/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/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-ew5QlyZ2.js", "/assets/ProxyViewerContainer-fsXSjqtm.js"] }, "/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/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/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/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-DmzLt6ti.js" });
|
|
2
2
|
export {
|
|
3
3
|
tsrStartManifest
|
|
4
4
|
};
|