@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.
- package/.output/cli.js +10 -0
- package/.output/nitro.json +1 -1
- package/.output/public/assets/{CompareDrawer-ztKMd-FE.js → CompareDrawer-NEdpe1wl.js} +1 -1
- package/.output/public/assets/ProxyViewerContainer-Dwhi4Q1c.js +115 -0
- package/.output/public/assets/{ReplayDialog-RNhfLSsW.js → ReplayDialog-DijzJwaQ.js} +1 -1
- package/.output/public/assets/{RequestAnatomy-fsUI5HhH.js → RequestAnatomy-CYbosGYy.js} +1 -1
- package/.output/public/assets/{ResponseView-B3YTDBBX.js → ResponseView-B3dPM63X.js} +1 -1
- package/.output/public/assets/{StreamingChunkSequence-CbGqQ0mO.js → StreamingChunkSequence-DYDx3xRY.js} +1 -1
- package/.output/public/assets/_sessionId-b1KDnByv.js +1 -0
- package/.output/public/assets/index-780zTVwp.css +1 -0
- package/.output/public/assets/index-CUyRKgII.js +1 -0
- package/.output/public/assets/{main-lTQKpxiU.js → main-N-sjHJUM.js} +2 -2
- package/.output/server/_libs/lucide-react.mjs +27 -27
- package/.output/server/{_sessionId-DsF6LFJG.mjs → _sessionId-BR46y_bO.mjs} +2 -2
- package/.output/server/_ssr/{CompareDrawer-DgdZcMpg.mjs → CompareDrawer-DDxpmdPs.mjs} +3 -3
- package/.output/server/_ssr/{ProxyViewerContainer-DaFW1IVu.mjs → ProxyViewerContainer-B1zAefzz.mjs} +214 -41
- package/.output/server/_ssr/{ReplayDialog-BOaTX1ir.mjs → ReplayDialog-DleMFvMx.mjs} +4 -4
- package/.output/server/_ssr/{RequestAnatomy-C-2_dejd.mjs → RequestAnatomy-B-P9tC3D.mjs} +3 -3
- package/.output/server/_ssr/{ResponseView-BtRVhgzy.mjs → ResponseView-DWfGn0i3.mjs} +3 -3
- package/.output/server/_ssr/{StreamingChunkSequence-DZaerowX.mjs → StreamingChunkSequence-C8kFF6xJ.mjs} +3 -3
- package/.output/server/_ssr/{index-B3_fgwFy.mjs → index-DzENi2RO.mjs} +2 -2
- package/.output/server/_ssr/index.mjs +2 -2
- package/.output/server/_ssr/{router-CDOnHAWy.mjs → router-Dy1VEjxy.mjs} +246 -77
- package/.output/server/{_tanstack-start-manifest_v-Brrx1NEa.mjs → _tanstack-start-manifest_v-CyzuAD8A.mjs} +1 -1
- package/.output/server/index.mjs +60 -60
- package/package.json +1 -1
- package/src/cli/templates/codex-skill-onboard.ts +5 -0
- package/src/cli/templates/skill-onboard.ts +5 -0
- package/src/components/OnboardingBanner.tsx +4 -0
- package/src/components/ProxyViewer.tsx +5 -0
- package/src/components/providers/ProviderCard.tsx +178 -38
- package/src/components/providers/ProvidersPanel.tsx +21 -3
- package/src/components/providers/SettingsDialog.tsx +76 -2
- package/src/lib/providerTestContract.ts +13 -0
- package/src/lib/runtimeConfig.ts +8 -0
- package/src/lib/useOnboarding.ts +3 -0
- package/src/lib/useStripConfig.ts +22 -0
- package/src/proxy/config.ts +4 -0
- package/src/routes/api/config.ts +7 -0
- package/src/routes/api/providers.$providerId.test.log.ts +28 -12
- package/.output/public/assets/ProxyViewerContainer-BT8Ilsbs.js +0 -114
- package/.output/public/assets/_sessionId-C9cpyfLX.js +0 -1
- package/.output/public/assets/index-0mTTpvA2.js +0 -1
- 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-
|
|
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-
|
|
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-
|
|
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:
|
|
6604
|
-
network_unreachable:
|
|
6605
|
-
connection_refused:
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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(),
|
|
6857
|
+
const timeoutId = setTimeout(() => controller.abort(), getProviderTestTimeoutMs());
|
|
6771
6858
|
try {
|
|
6772
|
-
|
|
6773
|
-
const response = await fetch(
|
|
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
|
-
|
|
6838
|
-
model,
|
|
6931
|
+
return createErrorResult(
|
|
6932
|
+
`Invalid response: ${String(parseErr)}`,
|
|
6839
6933
|
latencyMs,
|
|
6840
|
-
|
|
6841
|
-
|
|
6842
|
-
|
|
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(),
|
|
6963
|
+
const timeoutId = setTimeout(() => controller.abort(), getProviderTestTimeoutMs());
|
|
6856
6964
|
try {
|
|
6857
|
-
|
|
6858
|
-
const response = await fetch(
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
6990
|
-
model,
|
|
7122
|
+
return createErrorResult(
|
|
7123
|
+
"Invalid response: could not parse reconstructed stream response",
|
|
6991
7124
|
latencyMs,
|
|
6992
|
-
|
|
6993
|
-
|
|
6994
|
-
|
|
6995
|
-
|
|
6996
|
-
|
|
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
|
|
7536
|
-
responseText:
|
|
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
|
|
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
|
|
7561
|
-
responseText:
|
|
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
|
|
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
|
|
7593
|
-
responseText:
|
|
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
|
|
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
|
|
7618
|
-
responseText:
|
|
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
|
|
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
|
-
|
|
8037
|
-
|
|
8038
|
-
|
|
8039
|
-
|
|
8040
|
-
|
|
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
|
-
|
|
8043
|
-
|
|
8044
|
-
|
|
8045
|
-
|
|
8046
|
-
|
|
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
|
-
|
|
8049
|
-
|
|
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-
|
|
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
|
};
|