@tonyclaw/agent-inspector 2.0.43 → 2.1.1

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 (44) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/assets/{CompareDrawer-CxM1gCfL.js → CompareDrawer-DkDpl_Sg.js} +1 -1
  3. package/.output/public/assets/ProxyViewerContainer-D_-e1qn7.js +117 -0
  4. package/.output/public/assets/{ReplayDialog-UseUkucS.js → ReplayDialog-CKqYfD0A.js} +1 -1
  5. package/.output/public/assets/RequestAnatomy-CQZl-YIx.js +1 -0
  6. package/.output/public/assets/ResponseView-DW9tFPi0.js +1 -0
  7. package/.output/public/assets/{StreamingChunkSequence-JSQEPeNS.js → StreamingChunkSequence-m8zKc3L1.js} +1 -1
  8. package/.output/public/assets/_sessionId-DyfzgUXv.js +1 -0
  9. package/.output/public/assets/index-B6bobhTz.js +1 -0
  10. package/.output/public/assets/index-CLQKZ5A5.css +1 -0
  11. package/.output/public/assets/{main-BpGVJcpB.js → main-BjXd3DR-.js} +2 -2
  12. package/.output/server/_libs/lucide-react.mjs +219 -178
  13. package/.output/server/{_sessionId-DGn-TENM.mjs → _sessionId-LjzdyWF4.mjs} +3 -3
  14. package/.output/server/_ssr/{CompareDrawer-CFElCSYY.mjs → CompareDrawer-YX2uOwh9.mjs} +4 -4
  15. package/.output/server/_ssr/{ProxyViewerContainer-B7SR9mrD.mjs → ProxyViewerContainer-BcKHl2E3.mjs} +1016 -582
  16. package/.output/server/_ssr/{ReplayDialog-DfKapj0k.mjs → ReplayDialog-B9AxvV2j.mjs} +5 -5
  17. package/.output/server/_ssr/{RequestAnatomy-CUxTCg31.mjs → RequestAnatomy-DxmUOcz8.mjs} +4 -4
  18. package/.output/server/_ssr/{ResponseView-BXY0w197.mjs → ResponseView-B73PHDQ0.mjs} +4 -4
  19. package/.output/server/_ssr/{StreamingChunkSequence-CzMnES9H.mjs → StreamingChunkSequence-Bkwxu5Ev.mjs} +4 -4
  20. package/.output/server/_ssr/{index-CVlT-REW.mjs → index-Dfl6uxit.mjs} +3 -3
  21. package/.output/server/_ssr/index.mjs +2 -2
  22. package/.output/server/_ssr/{router-B2d1LUx6.mjs → router-B5cpU5Hi.mjs} +458 -10
  23. package/.output/server/{_tanstack-start-manifest_v-Drpi28BM.mjs → _tanstack-start-manifest_v-CHhxRQY_.mjs} +1 -1
  24. package/.output/server/index.mjs +62 -62
  25. package/package.json +1 -1
  26. package/src/components/OnboardingBanner.tsx +60 -70
  27. package/src/components/ProxyViewer.tsx +838 -366
  28. package/src/components/ProxyViewerContainer.tsx +136 -5
  29. package/src/components/providers/SettingsDialog.tsx +0 -13
  30. package/src/components/proxy-viewer/LogEntry.tsx +198 -89
  31. package/src/components/proxy-viewer/LogEntryHeader.tsx +23 -13
  32. package/src/components/proxy-viewer/RequestToolsPanel.tsx +8 -8
  33. package/src/components/ui/crab-logo.tsx +0 -50
  34. package/src/components/ui/json-viewer.tsx +6 -0
  35. package/src/proxy/logIndex.ts +188 -1
  36. package/src/proxy/store.ts +405 -3
  37. package/src/routes/api/logs.ts +36 -0
  38. package/styles/globals.css +53 -8
  39. package/.output/public/assets/ProxyViewerContainer-TtRG-0E7.js +0 -117
  40. package/.output/public/assets/RequestAnatomy-aPxgEJ2L.js +0 -1
  41. package/.output/public/assets/ResponseView-DA-F4F97.js +0 -1
  42. package/.output/public/assets/_sessionId-BEXuCWq5.js +0 -1
  43. package/.output/public/assets/index-Bhsa_2xX.js +0 -1
  44. 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-DOWlRJ0W.css";
68
+ const appCss = "/assets/index-CLQKZ5A5.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-CVlT-REW.mjs");
111
+ const $$splitComponentImporter$1 = () => import("./index-Dfl6uxit.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-DGn-TENM.mjs");
154
+ const $$splitComponentImporter = () => import("../_sessionId-LjzdyWF4.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
- if (includeHistory) {
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.43";
7341
+ const version = "2.1.1";
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-BpGVJcpB.js"], "assets": [] }, "/": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/index.tsx", "assets": [], "preloads": ["/assets/index-Bhsa_2xX.js", "/assets/ProxyViewerContainer-TtRG-0E7.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-BEXuCWq5.js", "/assets/ProxyViewerContainer-TtRG-0E7.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-BpGVJcpB.js" });
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-BjXd3DR-.js"], "assets": [] }, "/": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/index.tsx", "assets": [], "preloads": ["/assets/index-B6bobhTz.js", "/assets/ProxyViewerContainer-D_-e1qn7.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-DyfzgUXv.js", "/assets/ProxyViewerContainer-D_-e1qn7.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-BjXd3DR-.js" });
2
2
  export {
3
3
  tsrStartManifest
4
4
  };