@tonyclaw/agent-inspector 2.0.21 → 2.0.22

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/cli.js +10 -0
  2. package/.output/nitro.json +1 -1
  3. package/.output/public/assets/{CompareDrawer-ztKMd-FE.js → CompareDrawer-NEdpe1wl.js} +1 -1
  4. package/.output/public/assets/ProxyViewerContainer-Dwhi4Q1c.js +115 -0
  5. package/.output/public/assets/{ReplayDialog-RNhfLSsW.js → ReplayDialog-DijzJwaQ.js} +1 -1
  6. package/.output/public/assets/{RequestAnatomy-fsUI5HhH.js → RequestAnatomy-CYbosGYy.js} +1 -1
  7. package/.output/public/assets/{ResponseView-B3YTDBBX.js → ResponseView-B3dPM63X.js} +1 -1
  8. package/.output/public/assets/{StreamingChunkSequence-CbGqQ0mO.js → StreamingChunkSequence-DYDx3xRY.js} +1 -1
  9. package/.output/public/assets/_sessionId-b1KDnByv.js +1 -0
  10. package/.output/public/assets/index-780zTVwp.css +1 -0
  11. package/.output/public/assets/index-CUyRKgII.js +1 -0
  12. package/.output/public/assets/{main-lTQKpxiU.js → main-N-sjHJUM.js} +2 -2
  13. package/.output/server/_libs/lucide-react.mjs +27 -27
  14. package/.output/server/{_sessionId-DsF6LFJG.mjs → _sessionId-BR46y_bO.mjs} +2 -2
  15. package/.output/server/_ssr/{CompareDrawer-DgdZcMpg.mjs → CompareDrawer-DDxpmdPs.mjs} +3 -3
  16. package/.output/server/_ssr/{ProxyViewerContainer-DaFW1IVu.mjs → ProxyViewerContainer-B1zAefzz.mjs} +214 -41
  17. package/.output/server/_ssr/{ReplayDialog-BOaTX1ir.mjs → ReplayDialog-DleMFvMx.mjs} +4 -4
  18. package/.output/server/_ssr/{RequestAnatomy-C-2_dejd.mjs → RequestAnatomy-B-P9tC3D.mjs} +3 -3
  19. package/.output/server/_ssr/{ResponseView-BtRVhgzy.mjs → ResponseView-DWfGn0i3.mjs} +3 -3
  20. package/.output/server/_ssr/{StreamingChunkSequence-DZaerowX.mjs → StreamingChunkSequence-C8kFF6xJ.mjs} +3 -3
  21. package/.output/server/_ssr/{index-B3_fgwFy.mjs → index-DzENi2RO.mjs} +2 -2
  22. package/.output/server/_ssr/index.mjs +2 -2
  23. package/.output/server/_ssr/{router-CDOnHAWy.mjs → router-Dy1VEjxy.mjs} +246 -77
  24. package/.output/server/{_tanstack-start-manifest_v-Brrx1NEa.mjs → _tanstack-start-manifest_v-CyzuAD8A.mjs} +1 -1
  25. package/.output/server/index.mjs +60 -60
  26. package/package.json +1 -1
  27. package/src/cli/templates/codex-skill-onboard.ts +5 -0
  28. package/src/cli/templates/skill-onboard.ts +5 -0
  29. package/src/components/OnboardingBanner.tsx +4 -0
  30. package/src/components/ProxyViewer.tsx +5 -0
  31. package/src/components/providers/ProviderCard.tsx +178 -38
  32. package/src/components/providers/ProvidersPanel.tsx +21 -3
  33. package/src/components/providers/SettingsDialog.tsx +76 -2
  34. package/src/lib/providerTestContract.ts +13 -0
  35. package/src/lib/runtimeConfig.ts +8 -0
  36. package/src/lib/useOnboarding.ts +3 -0
  37. package/src/lib/useStripConfig.ts +22 -0
  38. package/src/proxy/config.ts +4 -0
  39. package/src/routes/api/config.ts +7 -0
  40. package/src/routes/api/providers.$providerId.test.log.ts +28 -12
  41. package/.output/public/assets/ProxyViewerContainer-BT8Ilsbs.js +0 -114
  42. package/.output/public/assets/_sessionId-C9cpyfLX.js +0 -1
  43. package/.output/public/assets/index-0mTTpvA2.js +0 -1
  44. package/.output/public/assets/index-DynnYt7S.css +0 -1
@@ -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-DynnYt7S.css";
53
+ const appCss = "/assets/index-780zTVwp.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-B3_fgwFy.mjs");
96
+ const $$splitComponentImporter$1 = () => import("./index-DzENi2RO.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-DsF6LFJG.mjs");
139
+ const $$splitComponentImporter = () => import("../_sessionId-BR46y_bO.mjs");
140
140
  const Route$q = createFileRoute("/session/$sessionId")({
141
141
  component: lazyRouteComponent($$splitComponentImporter, "component"),
142
142
  parseParams: (params) => ({
@@ -3527,6 +3527,8 @@ async function getClientInfo(request) {
3527
3527
  }
3528
3528
  const DEFAULT_SLOW_RESPONSE_THRESHOLD_SECONDS = 10;
3529
3529
  const MAX_SLOW_RESPONSE_THRESHOLD_SECONDS = 600;
3530
+ const DEFAULT_PROVIDER_TEST_TIMEOUT_SECONDS = 60;
3531
+ const MAX_PROVIDER_TEST_TIMEOUT_SECONDS = 600;
3530
3532
  const DEFAULT_TIME_DISPLAY_FORMAT = "time";
3531
3533
  const DEFAULT_CAPTURE_MODE = "simple";
3532
3534
  const TimeDisplayFormatSchema = _enum(["time", "full"]);
@@ -3535,6 +3537,7 @@ const RuntimeConfigSchema = object({
3535
3537
  stripClaudeCodeBillingHeader: boolean(),
3536
3538
  hasSeenOnboarding: boolean().default(false),
3537
3539
  slowResponseThresholdSeconds: number().int().min(0).max(MAX_SLOW_RESPONSE_THRESHOLD_SECONDS).default(DEFAULT_SLOW_RESPONSE_THRESHOLD_SECONDS),
3540
+ providerTestTimeoutSeconds: number().int().min(1).max(MAX_PROVIDER_TEST_TIMEOUT_SECONDS).default(DEFAULT_PROVIDER_TEST_TIMEOUT_SECONDS),
3538
3541
  timeDisplayFormat: TimeDisplayFormatSchema.default(DEFAULT_TIME_DISPLAY_FORMAT),
3539
3542
  captureMode: CaptureModeSchema.default(DEFAULT_CAPTURE_MODE)
3540
3543
  });
@@ -3579,6 +3582,7 @@ function resolveInitialConfig() {
3579
3582
  stripClaudeCodeBillingHeader: true,
3580
3583
  hasSeenOnboarding: false,
3581
3584
  slowResponseThresholdSeconds: DEFAULT_SLOW_RESPONSE_THRESHOLD_SECONDS,
3585
+ providerTestTimeoutSeconds: DEFAULT_PROVIDER_TEST_TIMEOUT_SECONDS,
3582
3586
  timeDisplayFormat: DEFAULT_TIME_DISPLAY_FORMAT,
3583
3587
  captureMode
3584
3588
  };
@@ -3587,6 +3591,7 @@ function resolveInitialConfig() {
3587
3591
  stripClaudeCodeBillingHeader: false,
3588
3592
  hasSeenOnboarding: false,
3589
3593
  slowResponseThresholdSeconds: DEFAULT_SLOW_RESPONSE_THRESHOLD_SECONDS,
3594
+ providerTestTimeoutSeconds: DEFAULT_PROVIDER_TEST_TIMEOUT_SECONDS,
3590
3595
  timeDisplayFormat: DEFAULT_TIME_DISPLAY_FORMAT,
3591
3596
  captureMode
3592
3597
  };
@@ -3640,6 +3645,7 @@ function toPersistedConfig(value) {
3640
3645
  stripClaudeCodeBillingHeader: value.stripClaudeCodeBillingHeader,
3641
3646
  hasSeenOnboarding: value.hasSeenOnboarding,
3642
3647
  slowResponseThresholdSeconds: value.slowResponseThresholdSeconds,
3648
+ providerTestTimeoutSeconds: value.providerTestTimeoutSeconds,
3643
3649
  timeDisplayFormat: value.timeDisplayFormat
3644
3650
  };
3645
3651
  }
@@ -5233,6 +5239,7 @@ const RuntimeConfigPatchSchema = object({
5233
5239
  stripClaudeCodeBillingHeader: boolean().optional(),
5234
5240
  hasSeenOnboarding: boolean().optional(),
5235
5241
  slowResponseThresholdSeconds: number().int().min(0).max(MAX_SLOW_RESPONSE_THRESHOLD_SECONDS).optional(),
5242
+ providerTestTimeoutSeconds: number().int().min(1).max(MAX_PROVIDER_TEST_TIMEOUT_SECONDS).optional(),
5236
5243
  timeDisplayFormat: TimeDisplayFormatSchema.optional()
5237
5244
  }).strict().refine((v) => Object.keys(v).length > 0, {
5238
5245
  message: "At least one field must be provided"
@@ -6599,10 +6606,11 @@ function buildProviderTestRequestBody(model, mode) {
6599
6606
  return { ...base, stream: true };
6600
6607
  }
6601
6608
  }
6609
+ const CONTAINER_NETWORK_HINT = "If the tool, Agent Inspector, or provider runs in another container or host, replace localhost with an address reachable from the caller and verify the network/firewall path.";
6602
6610
  const ERROR_HINTS = {
6603
- timeout: "The request took too long. Check your network connection or try again.",
6604
- network_unreachable: "Cannot reach the server. Verify the base URL and check your firewall settings.",
6605
- connection_refused: "Connection was refused. Make sure the provider server is running and the URL is correct.",
6611
+ timeout: `The request took too long. Check your network connection or try again. ${CONTAINER_NETWORK_HINT}`,
6612
+ network_unreachable: `Cannot reach the server. Verify the base URL and check your firewall settings. ${CONTAINER_NETWORK_HINT}`,
6613
+ connection_refused: `Connection was refused. Make sure the provider server is running and the URL is correct. ${CONTAINER_NETWORK_HINT}`,
6606
6614
  auth_failed: "Authentication failed. Check your API key is correct and has not expired.",
6607
6615
  rate_limited: "Too many requests. Wait a moment and try again, or check your API quota.",
6608
6616
  server_error: "The provider server encountered an error. Check their status page and try again later.",
@@ -6610,6 +6618,17 @@ const ERROR_HINTS = {
6610
6618
  unknown: "An unexpected error occurred. Check the details and try again."
6611
6619
  };
6612
6620
  const MAX_ERROR_DETAILS_LENGTH = 200;
6621
+ const MAX_DEBUG_TEXT_LENGTH = 2e4;
6622
+ const REDACTED_HEADER_VALUE = "[redacted]";
6623
+ const SENSITIVE_HEADER_NAMES = /* @__PURE__ */ new Set([
6624
+ "authorization",
6625
+ "x-api-key",
6626
+ "api-key",
6627
+ "x-goog-api-key",
6628
+ "anthropic-api-key",
6629
+ "openai-api-key",
6630
+ "proxy-authorization"
6631
+ ]);
6613
6632
  function classifyError(error, responseStatus) {
6614
6633
  const errorStr = String(error);
6615
6634
  const errorLower = errorStr.toLowerCase();
@@ -6649,6 +6668,9 @@ function classifyError(error, responseStatus) {
6649
6668
  if (errorLower.includes("bad gateway") || errorLower.includes("gateway timeout")) {
6650
6669
  return { type: "server_error", details: extractErrorDetails(errorStr) };
6651
6670
  }
6671
+ if (errorLower.includes("invalid response") || errorLower.includes("unexpected token") || errorLower.includes("failed to parse") || errorLower.includes("schema") || errorLower.includes("zod")) {
6672
+ return { type: "invalid_response", details: extractErrorDetails(errorStr) };
6673
+ }
6652
6674
  if (responseStatus !== void 0) {
6653
6675
  if (responseStatus === 401 || responseStatus === 403) {
6654
6676
  return { type: "auth_failed", details: `Authentication failed (HTTP ${responseStatus})` };
@@ -6689,9 +6711,64 @@ function truncateErrorDetails(details) {
6689
6711
  }
6690
6712
  return details.slice(0, MAX_ERROR_DETAILS_LENGTH) + "...";
6691
6713
  }
6692
- function createErrorResult(error, latencyMs, streaming, responseStatus) {
6714
+ function truncateDebugText(text) {
6715
+ if (text.length <= MAX_DEBUG_TEXT_LENGTH) {
6716
+ return text;
6717
+ }
6718
+ return `${text.slice(0, MAX_DEBUG_TEXT_LENGTH)}
6719
+ ... truncated`;
6720
+ }
6721
+ function headersToRecord(headers) {
6722
+ const result = {};
6723
+ headers.forEach((value, key) => {
6724
+ result[key] = value;
6725
+ });
6726
+ return result;
6727
+ }
6728
+ function redactHeaderValue(name, value) {
6729
+ const lowerName = name.toLowerCase();
6730
+ if (!SENSITIVE_HEADER_NAMES.has(lowerName)) {
6731
+ return value;
6732
+ }
6733
+ if (lowerName === "authorization" && value.startsWith("Bearer ")) {
6734
+ return `Bearer ${REDACTED_HEADER_VALUE}`;
6735
+ }
6736
+ return REDACTED_HEADER_VALUE;
6737
+ }
6738
+ function redactHeaders(headers) {
6739
+ const result = {};
6740
+ for (const [name, value] of Object.entries(headers)) {
6741
+ result[name] = redactHeaderValue(name, value);
6742
+ }
6743
+ return result;
6744
+ }
6745
+ function createTestDebug(input) {
6746
+ const debug = {
6747
+ requestUrl: input.requestUrl,
6748
+ requestMethod: "POST",
6749
+ requestHeaders: redactHeaders(input.requestHeaders),
6750
+ requestBody: truncateDebugText(input.requestBody)
6751
+ };
6752
+ if (input.response !== void 0) {
6753
+ debug.responseStatus = input.response.status;
6754
+ debug.responseStatusText = input.response.statusText;
6755
+ debug.responseHeaders = headersToRecord(input.response.headers);
6756
+ }
6757
+ if (input.responseBody !== void 0) {
6758
+ debug.responseBody = truncateDebugText(input.responseBody);
6759
+ }
6760
+ return debug;
6761
+ }
6762
+ async function readResponseText(response) {
6763
+ try {
6764
+ return await response.text();
6765
+ } catch (err) {
6766
+ return `Failed to read response body: ${String(err)}`;
6767
+ }
6768
+ }
6769
+ function createErrorResult(error, latencyMs, streaming, responseStatus, debug) {
6693
6770
  const { type, details } = classifyError(error, responseStatus);
6694
- return {
6771
+ const result = {
6695
6772
  success: false,
6696
6773
  error: {
6697
6774
  message: getErrorMessage(type),
@@ -6702,6 +6779,13 @@ function createErrorResult(error, latencyMs, streaming, responseStatus) {
6702
6779
  latencyMs,
6703
6780
  streaming
6704
6781
  };
6782
+ if (debug !== void 0) {
6783
+ result.debug = debug;
6784
+ if (debug.requestHeaders !== void 0) {
6785
+ result.requestHeaders = debug.requestHeaders;
6786
+ }
6787
+ }
6788
+ return result;
6705
6789
  }
6706
6790
  function getErrorMessage(type) {
6707
6791
  const messages = {
@@ -6751,7 +6835,9 @@ const OpenAIResponseSchema = object({
6751
6835
  })
6752
6836
  )
6753
6837
  });
6754
- const TEST_TIMEOUT_MS = 3e4;
6838
+ function getProviderTestTimeoutMs() {
6839
+ return getConfig().providerTestTimeoutSeconds * 1e3;
6840
+ }
6755
6841
  function buildTestRequestHeaders(provider) {
6756
6842
  const headers = new Headers();
6757
6843
  headers.set("Content-Type", "application/json");
@@ -6766,27 +6852,36 @@ async function testEndpoint(baseUrl, provider, path2, model, isOpenAI) {
6766
6852
  const startTime = Date.now();
6767
6853
  const body = JSON.stringify(buildProviderTestRequestBody(model, "non-streaming"));
6768
6854
  const requestHeaders = buildTestRequestHeaders(provider);
6855
+ let requestUrl = baseUrl;
6769
6856
  const controller = new AbortController();
6770
- const timeoutId = setTimeout(() => controller.abort(), TEST_TIMEOUT_MS);
6857
+ const timeoutId = setTimeout(() => controller.abort(), getProviderTestTimeoutMs());
6771
6858
  try {
6772
- const url = buildUpstreamUrl(baseUrl, path2);
6773
- const response = await fetch(url, {
6859
+ requestUrl = buildUpstreamUrl(baseUrl, path2);
6860
+ const response = await fetch(requestUrl, {
6774
6861
  method: "POST",
6775
6862
  headers: requestHeaders,
6776
6863
  body,
6777
6864
  signal: controller.signal
6778
6865
  });
6779
- clearTimeout(timeoutId);
6780
6866
  const latencyMs = Date.now() - startTime;
6781
6867
  if (!response.ok) {
6868
+ const responseText2 = await readResponseText(response);
6782
6869
  return createErrorResult(
6783
6870
  `HTTP ${response.status}: ${response.statusText}`,
6784
6871
  latencyMs,
6785
6872
  false,
6786
- response.status
6873
+ response.status,
6874
+ createTestDebug({
6875
+ requestUrl,
6876
+ requestHeaders,
6877
+ requestBody: body,
6878
+ response,
6879
+ responseBody: responseText2
6880
+ })
6787
6881
  );
6788
6882
  }
6789
6883
  const responseText = await response.text();
6884
+ const safeRequestHeaders = redactHeaders(requestHeaders);
6790
6885
  try {
6791
6886
  if (isOpenAI) {
6792
6887
  const json = OpenAIResponseSchema.parse(JSON.parse(responseText));
@@ -6802,7 +6897,7 @@ async function testEndpoint(baseUrl, provider, path2, model, isOpenAI) {
6802
6897
  latencyMs,
6803
6898
  content: content !== null && content !== "" ? [{ type: "text", text: content }] : void 0,
6804
6899
  rawResponse: responseText,
6805
- requestHeaders
6900
+ requestHeaders: safeRequestHeaders
6806
6901
  };
6807
6902
  } else {
6808
6903
  const json = AnthropicResponseSchema.parse(JSON.parse(responseText));
@@ -6829,61 +6924,78 @@ async function testEndpoint(baseUrl, provider, path2, model, isOpenAI) {
6829
6924
  latencyMs,
6830
6925
  content: content.length > 0 ? content : void 0,
6831
6926
  rawResponse: responseText,
6832
- requestHeaders
6927
+ requestHeaders: safeRequestHeaders
6833
6928
  };
6834
6929
  }
6835
6930
  } catch (parseErr) {
6836
- return {
6837
- success: true,
6838
- model,
6931
+ return createErrorResult(
6932
+ `Invalid response: ${String(parseErr)}`,
6839
6933
  latencyMs,
6840
- content: [{ type: "text", text: responseText.slice(0, 2e3) }],
6841
- rawResponse: responseText,
6842
- requestHeaders
6843
- };
6934
+ false,
6935
+ response.status,
6936
+ createTestDebug({
6937
+ requestUrl,
6938
+ requestHeaders,
6939
+ requestBody: body,
6940
+ response,
6941
+ responseBody: responseText
6942
+ })
6943
+ );
6844
6944
  }
6845
6945
  } catch (err) {
6946
+ return createErrorResult(
6947
+ err,
6948
+ Date.now() - startTime,
6949
+ false,
6950
+ void 0,
6951
+ createTestDebug({ requestUrl, requestHeaders, requestBody: body })
6952
+ );
6953
+ } finally {
6846
6954
  clearTimeout(timeoutId);
6847
- return createErrorResult(err, Date.now() - startTime, false);
6848
6955
  }
6849
6956
  }
6850
6957
  async function testStreamingEndpoint(baseUrl, provider, path2, model, isOpenAI) {
6851
6958
  const startTime = Date.now();
6852
6959
  const body = JSON.stringify(buildProviderTestRequestBody(model, "streaming"));
6853
6960
  const requestHeaders = buildTestRequestHeaders(provider);
6961
+ let requestUrl = baseUrl;
6854
6962
  const controller = new AbortController();
6855
- const timeoutId = setTimeout(() => controller.abort(), TEST_TIMEOUT_MS);
6963
+ const timeoutId = setTimeout(() => controller.abort(), getProviderTestTimeoutMs());
6856
6964
  try {
6857
- const url = buildUpstreamUrl(baseUrl, path2);
6858
- const response = await fetch(url, {
6965
+ requestUrl = buildUpstreamUrl(baseUrl, path2);
6966
+ const response = await fetch(requestUrl, {
6859
6967
  method: "POST",
6860
6968
  headers: requestHeaders,
6861
6969
  body,
6862
6970
  signal: controller.signal
6863
6971
  });
6864
- clearTimeout(timeoutId);
6865
6972
  const latencyMs = Date.now() - startTime;
6866
6973
  if (!response.ok) {
6974
+ const responseText = await readResponseText(response);
6867
6975
  return createErrorResult(
6868
6976
  `HTTP ${response.status}: ${response.statusText}`,
6869
6977
  latencyMs,
6870
6978
  true,
6871
- response.status
6979
+ response.status,
6980
+ createTestDebug({
6981
+ requestUrl,
6982
+ requestHeaders,
6983
+ requestBody: body,
6984
+ response,
6985
+ responseBody: responseText
6986
+ })
6872
6987
  );
6873
6988
  }
6874
6989
  const chunks = [];
6875
6990
  const reader = response.body?.getReader();
6876
6991
  if (!reader) {
6877
- return {
6878
- success: false,
6879
- error: {
6880
- message: "No response body",
6881
- type: "invalid_response",
6882
- hint: ERROR_HINTS.invalid_response
6883
- },
6992
+ return createErrorResult(
6993
+ "Invalid response: no response body",
6884
6994
  latencyMs,
6885
- streaming: true
6886
- };
6995
+ true,
6996
+ response.status,
6997
+ createTestDebug({ requestUrl, requestHeaders, requestBody: body, response })
6998
+ );
6887
6999
  }
6888
7000
  const decoder = new TextDecoder();
6889
7001
  const MAX_CHUNKS_SIZE = 10 * 1024 * 1024;
@@ -6896,7 +7008,15 @@ async function testStreamingEndpoint(baseUrl, provider, path2, model, isOpenAI)
6896
7008
  return createErrorResult(
6897
7009
  "Response too large (exceeded 10MB limit)",
6898
7010
  Date.now() - startTime,
6899
- true
7011
+ true,
7012
+ response.status,
7013
+ createTestDebug({
7014
+ requestUrl,
7015
+ requestHeaders,
7016
+ requestBody: body,
7017
+ response,
7018
+ responseBody: chunks.join("")
7019
+ })
6900
7020
  );
6901
7021
  }
6902
7022
  const decoded = decoder.decode(value, { stream: true });
@@ -6908,9 +7028,23 @@ async function testStreamingEndpoint(baseUrl, provider, path2, model, isOpenAI)
6908
7028
  chunks.push(finalChunk);
6909
7029
  }
6910
7030
  } catch (readErr) {
6911
- return createErrorResult(`Stream read error: ${readErr}`, latencyMs, true);
7031
+ const error = readErr instanceof Error && readErr.name === "AbortError" ? readErr : `Stream read error: ${String(readErr)}`;
7032
+ return createErrorResult(
7033
+ error,
7034
+ latencyMs,
7035
+ true,
7036
+ response.status,
7037
+ createTestDebug({
7038
+ requestUrl,
7039
+ requestHeaders,
7040
+ requestBody: body,
7041
+ response,
7042
+ responseBody: chunks.join("")
7043
+ })
7044
+ );
6912
7045
  }
6913
7046
  const fullResponse = chunks.join("");
7047
+ const safeRequestHeaders = redactHeaders(requestHeaders);
6914
7048
  const mockLog = {
6915
7049
  id: 0,
6916
7050
  timestamp: "",
@@ -6982,23 +7116,33 @@ async function testStreamingEndpoint(baseUrl, provider, path2, model, isOpenAI)
6982
7116
  rawResponse: reconstructedJson,
6983
7117
  streaming: true,
6984
7118
  streamingChunks,
6985
- requestHeaders
7119
+ requestHeaders: safeRequestHeaders
6986
7120
  };
6987
7121
  } catch {
6988
- return {
6989
- success: true,
6990
- model,
7122
+ return createErrorResult(
7123
+ "Invalid response: could not parse reconstructed stream response",
6991
7124
  latencyMs,
6992
- content: [{ type: "text", text: reconstructedJson.slice(0, 2e3) }],
6993
- rawResponse: reconstructedJson,
6994
- streaming: true,
6995
- streamingChunks,
6996
- requestHeaders
6997
- };
7125
+ true,
7126
+ response.status,
7127
+ createTestDebug({
7128
+ requestUrl,
7129
+ requestHeaders,
7130
+ requestBody: body,
7131
+ response,
7132
+ responseBody: fullResponse
7133
+ })
7134
+ );
6998
7135
  }
6999
7136
  } catch (err) {
7137
+ return createErrorResult(
7138
+ err,
7139
+ Date.now() - startTime,
7140
+ true,
7141
+ void 0,
7142
+ createTestDebug({ requestUrl, requestHeaders, requestBody: body })
7143
+ );
7144
+ } finally {
7000
7145
  clearTimeout(timeoutId);
7001
- return createErrorResult(err, Date.now() - startTime, true);
7002
7146
  }
7003
7147
  }
7004
7148
  const Route$7 = createFileRoute("/api/providers/$providerId/test")({
@@ -7451,6 +7595,16 @@ const ProviderTestContentSchema = object({
7451
7595
  text: string().optional(),
7452
7596
  thinking: string().optional()
7453
7597
  });
7598
+ const ProviderTestDebugSchema = object({
7599
+ requestUrl: string().optional(),
7600
+ requestMethod: string().optional(),
7601
+ requestHeaders: record(string(), string()).optional(),
7602
+ requestBody: string().optional(),
7603
+ responseStatus: number().optional(),
7604
+ responseStatusText: string().optional(),
7605
+ responseHeaders: record(string(), string()).optional(),
7606
+ responseBody: string().optional()
7607
+ });
7454
7608
  const ProviderTestResultSchema = object({
7455
7609
  success: boolean(),
7456
7610
  error: ProviderTestErrorSchema.optional(),
@@ -7467,7 +7621,8 @@ const ProviderTestResultSchema = object({
7467
7621
  chunks: array(StreamingChunkSchema$1),
7468
7622
  truncated: boolean().default(false)
7469
7623
  }).optional(),
7470
- requestHeaders: record(string(), string()).optional()
7624
+ requestHeaders: record(string(), string()).optional(),
7625
+ debug: ProviderTestDebugSchema.optional()
7471
7626
  });
7472
7627
  const ProviderTestStateSchema = union([
7473
7628
  ProviderTestResultSchema,
@@ -7516,6 +7671,18 @@ function createFailedProviderTestResults(message, type) {
7516
7671
  function hasSuccessField(result) {
7517
7672
  return Object.prototype.hasOwnProperty.call(result, "success");
7518
7673
  }
7674
+ function getResultResponseStatus(result) {
7675
+ if (result.debug?.responseStatus !== void 0) {
7676
+ return result.debug.responseStatus;
7677
+ }
7678
+ return result.success ? 200 : 500;
7679
+ }
7680
+ function getResultResponseText(result) {
7681
+ return result.rawResponse ?? result.debug?.responseBody ?? JSON.stringify(result);
7682
+ }
7683
+ function getResultHeaders(result) {
7684
+ return result.requestHeaders ?? result.debug?.requestHeaders ?? {};
7685
+ }
7519
7686
  async function logModelResults(displayName, providerName, anthropicUrl, openaiUrl, modelResults, captureFullDetails) {
7520
7687
  const usageModel = getModelUsageName(displayName, providerName);
7521
7688
  if (anthropicUrl !== void 0) {
@@ -7532,8 +7699,8 @@ async function logModelResults(displayName, providerName, anthropicUrl, openaiUr
7532
7699
  model: nonStreamingResult.model ?? displayName,
7533
7700
  sessionId: null,
7534
7701
  rawRequestBody: requestBody,
7535
- responseStatus: nonStreamingResult.success ? 200 : 500,
7536
- responseText: nonStreamingResult.rawResponse ?? JSON.stringify(nonStreamingResult),
7702
+ responseStatus: getResultResponseStatus(nonStreamingResult),
7703
+ responseText: getResultResponseText(nonStreamingResult),
7537
7704
  inputTokens: nonStreamingResult.inputTokens ?? null,
7538
7705
  outputTokens: nonStreamingResult.outputTokens ?? null,
7539
7706
  cacheCreationInputTokens: nonStreamingResult.cacheCreationInputTokens ?? null,
@@ -7545,7 +7712,7 @@ async function logModelResults(displayName, providerName, anthropicUrl, openaiUr
7545
7712
  apiFormat: "anthropic",
7546
7713
  isTest: true,
7547
7714
  providerName,
7548
- headers: captureFullDetails ? nonStreamingResult.requestHeaders ?? {} : void 0
7715
+ headers: captureFullDetails ? getResultHeaders(nonStreamingResult) : void 0
7549
7716
  });
7550
7717
  const streamingRequestBody = JSON.stringify(
7551
7718
  buildProviderTestRequestBody(usageModel, "streaming")
@@ -7557,8 +7724,8 @@ async function logModelResults(displayName, providerName, anthropicUrl, openaiUr
7557
7724
  model: streamingResult.model ?? displayName,
7558
7725
  sessionId: null,
7559
7726
  rawRequestBody: streamingRequestBody,
7560
- responseStatus: streamingResult.success ? 200 : 500,
7561
- responseText: streamingResult.rawResponse ?? JSON.stringify(streamingResult),
7727
+ responseStatus: getResultResponseStatus(streamingResult),
7728
+ responseText: getResultResponseText(streamingResult),
7562
7729
  inputTokens: streamingResult.inputTokens ?? null,
7563
7730
  outputTokens: streamingResult.outputTokens ?? null,
7564
7731
  cacheCreationInputTokens: streamingResult.cacheCreationInputTokens ?? null,
@@ -7571,7 +7738,7 @@ async function logModelResults(displayName, providerName, anthropicUrl, openaiUr
7571
7738
  apiFormat: "anthropic",
7572
7739
  isTest: true,
7573
7740
  providerName,
7574
- headers: captureFullDetails ? streamingResult.requestHeaders ?? {} : void 0
7741
+ headers: captureFullDetails ? getResultHeaders(streamingResult) : void 0
7575
7742
  });
7576
7743
  }
7577
7744
  }
@@ -7589,8 +7756,8 @@ async function logModelResults(displayName, providerName, anthropicUrl, openaiUr
7589
7756
  model: nonStreamingResult.model ?? displayName,
7590
7757
  sessionId: null,
7591
7758
  rawRequestBody: requestBody,
7592
- responseStatus: nonStreamingResult.success ? 200 : 500,
7593
- responseText: nonStreamingResult.rawResponse ?? JSON.stringify(nonStreamingResult),
7759
+ responseStatus: getResultResponseStatus(nonStreamingResult),
7760
+ responseText: getResultResponseText(nonStreamingResult),
7594
7761
  inputTokens: nonStreamingResult.inputTokens ?? null,
7595
7762
  outputTokens: nonStreamingResult.outputTokens ?? null,
7596
7763
  cacheCreationInputTokens: null,
@@ -7602,7 +7769,7 @@ async function logModelResults(displayName, providerName, anthropicUrl, openaiUr
7602
7769
  apiFormat: "openai",
7603
7770
  isTest: true,
7604
7771
  providerName,
7605
- headers: captureFullDetails ? nonStreamingResult.requestHeaders ?? {} : void 0
7772
+ headers: captureFullDetails ? getResultHeaders(nonStreamingResult) : void 0
7606
7773
  });
7607
7774
  const streamingRequestBody = JSON.stringify(
7608
7775
  buildProviderTestRequestBody(usageModel, "streaming")
@@ -7614,8 +7781,8 @@ async function logModelResults(displayName, providerName, anthropicUrl, openaiUr
7614
7781
  model: streamingResult.model ?? displayName,
7615
7782
  sessionId: null,
7616
7783
  rawRequestBody: streamingRequestBody,
7617
- responseStatus: streamingResult.success ? 200 : 500,
7618
- responseText: streamingResult.rawResponse ?? JSON.stringify(streamingResult),
7784
+ responseStatus: getResultResponseStatus(streamingResult),
7785
+ responseText: getResultResponseText(streamingResult),
7619
7786
  inputTokens: streamingResult.inputTokens ?? null,
7620
7787
  outputTokens: streamingResult.outputTokens ?? null,
7621
7788
  cacheCreationInputTokens: null,
@@ -7628,7 +7795,7 @@ async function logModelResults(displayName, providerName, anthropicUrl, openaiUr
7628
7795
  apiFormat: "openai",
7629
7796
  isTest: true,
7630
7797
  providerName,
7631
- headers: captureFullDetails ? streamingResult.requestHeaders ?? {} : void 0
7798
+ headers: captureFullDetails ? getResultHeaders(streamingResult) : void 0
7632
7799
  });
7633
7800
  }
7634
7801
  }
@@ -8033,21 +8200,23 @@ export {
8033
8200
  Route$q as R,
8034
8201
  TimeDisplayFormatSchema as T,
8035
8202
  DEFAULT_SLOW_RESPONSE_THRESHOLD_SECONDS as a,
8036
- DEFAULT_TIME_DISPLAY_FORMAT as b,
8037
- RuntimeConfigSchema as c,
8038
- AnthropicRequestSchema as d,
8039
- stripClaudeCodeBillingHeader as e,
8040
- providerHasContextMetadata as f,
8203
+ DEFAULT_PROVIDER_TEST_TIMEOUT_SECONDS as b,
8204
+ DEFAULT_TIME_DISPLAY_FORMAT as c,
8205
+ RuntimeConfigSchema as d,
8206
+ AnthropicRequestSchema as e,
8207
+ stripClaudeCodeBillingHeader as f,
8041
8208
  getSessionPath as g,
8042
- findProviderModelMetadata as h,
8043
- createPendingProviderTestResults as i,
8044
- ProviderTestResultsSchema as j,
8045
- createFailedProviderTestResults as k,
8046
- resolveProviderContextWindow as l,
8209
+ providerHasContextMetadata as h,
8210
+ findProviderModelMetadata as i,
8211
+ createPendingProviderTestResults as j,
8212
+ ProviderTestResultsSchema as k,
8213
+ createFailedProviderTestResults as l,
8047
8214
  maskApiKey as m,
8048
- isPlainRecord as n,
8049
- router as o,
8215
+ MAX_PROVIDER_TEST_TIMEOUT_SECONDS as n,
8216
+ resolveProviderContextWindow as o,
8050
8217
  parseOpenAIResponse as p,
8218
+ isPlainRecord as q,
8051
8219
  requestFormatForPath as r,
8052
- safeGetOwnProperty as s
8220
+ safeGetOwnProperty as s,
8221
+ router as t
8053
8222
  };
@@ -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-lTQKpxiU.js"], "assets": [] }, "/": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/index.tsx", "assets": [], "preloads": ["/assets/index-0mTTpvA2.js", "/assets/ProxyViewerContainer-BT8Ilsbs.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-C9cpyfLX.js", "/assets/ProxyViewerContainer-BT8Ilsbs.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-lTQKpxiU.js" });
1
+ const tsrStartManifest = () => ({ "routes": { "__root__": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/__root.tsx", "children": ["/", "/api/config", "/api/health", "/api/logs", "/api/mcp", "/api/models", "/api/providers", "/api/sessions", "/proxy/$", "/session/$sessionId", "/api/knowledge/candidates", "/api/knowledge/project-context", "/api/knowledge/search", "/api/knowledge/sessions/$sessionId/candidates"], "preloads": ["/assets/main-N-sjHJUM.js"], "assets": [] }, "/": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/index.tsx", "assets": [], "preloads": ["/assets/index-CUyRKgII.js", "/assets/ProxyViewerContainer-Dwhi4Q1c.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-b1KDnByv.js", "/assets/ProxyViewerContainer-Dwhi4Q1c.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-N-sjHJUM.js" });
2
2
  export {
3
3
  tsrStartManifest
4
4
  };