@tonyclaw/agent-inspector 2.0.8 → 2.0.10

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-Djb4XFZS.js → CompareDrawer-BWMipEjS.js} +1 -1
  3. package/.output/public/assets/ProxyViewerContainer-DIAgurux.js +114 -0
  4. package/.output/public/assets/{ReplayDialog-DBPMIs2I.js → ReplayDialog-DaSzZsvM.js} +1 -1
  5. package/.output/public/assets/RequestAnatomy-BfQmPHCd.js +1 -0
  6. package/.output/public/assets/ResponseView-CblEWDMx.js +1 -0
  7. package/.output/public/assets/StreamingChunkSequence-B4atnL99.js +1 -0
  8. package/.output/public/assets/_sessionId-DUzYnZXV.js +1 -0
  9. package/.output/public/assets/index-CxhRsekH.css +1 -0
  10. package/.output/public/assets/index-jagRsQaV.js +1 -0
  11. package/.output/public/assets/{main-CwhqfJqM.js → main-DE6Y4-wV.js} +2 -2
  12. package/.output/server/{_sessionId-DzBy9gLa.mjs → _sessionId-61HO9rUI.mjs} +3 -3
  13. package/.output/server/_ssr/{CompareDrawer-C5NBvE2e.mjs → CompareDrawer-CSPqneYm.mjs} +2 -2
  14. package/.output/server/_ssr/{ProxyViewerContainer-DiZjOTQT.mjs → ProxyViewerContainer-DrSMa5O7.mjs} +159 -14
  15. package/.output/server/_ssr/{ReplayDialog-EpvTwFvp.mjs → ReplayDialog-Dn3naENv.mjs} +3 -3
  16. package/.output/server/_ssr/{RequestAnatomy-DaQjhixp.mjs → RequestAnatomy-D1X3f3AX.mjs} +336 -42
  17. package/.output/server/_ssr/{ResponseView-D8tGHCGY.mjs → ResponseView-CwXAWOoE.mjs} +2 -2
  18. package/.output/server/_ssr/{StreamingChunkSequence-DGQnb1QE.mjs → StreamingChunkSequence-DRSR2FfN.mjs} +2 -2
  19. package/.output/server/_ssr/{index-N25hqa7t.mjs → index-D4zn5CAg.mjs} +2 -2
  20. package/.output/server/_ssr/index.mjs +2 -2
  21. package/.output/server/_ssr/{router-Bf0m6F0G.mjs → router-CSRaa_tu.mjs} +531 -111
  22. package/.output/server/{_tanstack-start-manifest_v-DlAyJ5DB.mjs → _tanstack-start-manifest_v-CfvVUYYj.mjs} +1 -1
  23. package/.output/server/index.mjs +60 -60
  24. package/bin/agent-inspector.js +2 -0
  25. package/package.json +3 -2
  26. package/src/components/providers/ProviderCard.tsx +59 -5
  27. package/src/components/providers/ProviderForm.tsx +42 -0
  28. package/src/components/providers/ProvidersPanel.tsx +68 -0
  29. package/src/components/proxy-viewer/LogEntry.tsx +6 -1
  30. package/src/components/proxy-viewer/anatomy/RequestAnatomy.tsx +134 -3
  31. package/src/components/proxy-viewer/anatomy/contextIntelligence.ts +298 -40
  32. package/src/lib/providerContract.ts +12 -0
  33. package/src/lib/providerModelMetadata.ts +327 -0
  34. package/src/proxy/providers.ts +112 -52
  35. package/src/routes/api/providers.$providerId.model-metadata.ts +134 -0
  36. package/src/routes/api/providers.$providerId.ts +3 -0
  37. package/src/routes/api/providers.ts +2 -0
  38. package/.output/public/assets/ProxyViewerContainer-CWdkPZsJ.js +0 -114
  39. package/.output/public/assets/RequestAnatomy-FBfRNQN7.js +0 -1
  40. package/.output/public/assets/ResponseView-Db4pJL7U.js +0 -1
  41. package/.output/public/assets/StreamingChunkSequence-BH175O6R.js +0 -1
  42. package/.output/public/assets/_sessionId-3ipVoQtW.js +0 -1
  43. package/.output/public/assets/index-Bo1dGS4R.css +0 -1
  44. package/.output/public/assets/index-CJgaCJo8.js +0 -1
@@ -0,0 +1,134 @@
1
+ import { createFileRoute } from "@tanstack/react-router";
2
+ import { z } from "zod";
3
+ import { getProvider, updateProvider } from "../../proxy/providers";
4
+ import {
5
+ applyBuiltinProviderModelMetadata,
6
+ applyProviderModelRegistry,
7
+ BUILTIN_MODEL_METADATA_SOURCE_URL,
8
+ ProviderModelRegistrySchema,
9
+ } from "../../lib/providerModelMetadata";
10
+
11
+ const RefreshModelMetadataInputSchema = z.object({
12
+ url: z.string().optional(),
13
+ });
14
+
15
+ function normalizeRefreshUrl(value: string | undefined): string | null {
16
+ if (value === undefined) return null;
17
+ const trimmed = value.trim();
18
+ return trimmed === "" ? null : trimmed;
19
+ }
20
+
21
+ function isHttpUrl(value: string): boolean {
22
+ try {
23
+ const parsed = new URL(value);
24
+ return parsed.protocol === "http:" || parsed.protocol === "https:";
25
+ } catch {
26
+ return false;
27
+ }
28
+ }
29
+
30
+ async function readRegistryJson(response: Response): Promise<unknown | null> {
31
+ try {
32
+ return JSON.parse(await response.text());
33
+ } catch {
34
+ return null;
35
+ }
36
+ }
37
+
38
+ export const Route = createFileRoute("/api/providers/$providerId/model-metadata")({
39
+ server: {
40
+ handlers: {
41
+ POST: async ({ params, request }: { params: { providerId: string }; request: Request }) => {
42
+ const provider = getProvider(params.providerId);
43
+ if (provider === undefined) {
44
+ return Response.json({ error: "Provider not found" }, { status: 404 });
45
+ }
46
+
47
+ const parsed = RefreshModelMetadataInputSchema.safeParse(await request.json());
48
+ if (!parsed.success) {
49
+ return Response.json({ error: parsed.error.message }, { status: 400 });
50
+ }
51
+
52
+ const sourceUrl = normalizeRefreshUrl(
53
+ parsed.data.url ??
54
+ provider.modelMetadataUrl ??
55
+ process.env["AGENT_INSPECTOR_MODEL_METADATA_URL"],
56
+ );
57
+ if (sourceUrl === null) {
58
+ const result = applyBuiltinProviderModelMetadata(provider, new Date().toISOString());
59
+ const updated = updateProvider(provider.id, {
60
+ modelMetadata: result.modelMetadata,
61
+ });
62
+ if (updated === null) {
63
+ return Response.json({ error: "Provider not found" }, { status: 404 });
64
+ }
65
+ return Response.json({
66
+ provider: updated,
67
+ imported: result.imported,
68
+ matchedModels: result.matchedModels,
69
+ missingModels: result.missingModels,
70
+ sourceUrl: BUILTIN_MODEL_METADATA_SOURCE_URL,
71
+ });
72
+ }
73
+ if (!isHttpUrl(sourceUrl)) {
74
+ return Response.json(
75
+ { error: "Model metadata URL must be an http(s) URL." },
76
+ { status: 400 },
77
+ );
78
+ }
79
+
80
+ let response: Response;
81
+ try {
82
+ response = await fetch(sourceUrl, { headers: { Accept: "application/json" } });
83
+ } catch (err) {
84
+ return Response.json(
85
+ { error: `Failed to fetch model metadata: ${String(err)}` },
86
+ { status: 502 },
87
+ );
88
+ }
89
+
90
+ if (!response.ok) {
91
+ return Response.json(
92
+ { error: `Model metadata fetch failed with HTTP ${String(response.status)}` },
93
+ { status: 502 },
94
+ );
95
+ }
96
+
97
+ const registryJson = await readRegistryJson(response);
98
+ if (registryJson === null) {
99
+ return Response.json(
100
+ { error: "Model metadata response is not valid JSON." },
101
+ { status: 400 },
102
+ );
103
+ }
104
+
105
+ const registry = ProviderModelRegistrySchema.safeParse(registryJson);
106
+ if (!registry.success) {
107
+ return Response.json({ error: registry.error.message }, { status: 400 });
108
+ }
109
+
110
+ const result = applyProviderModelRegistry(
111
+ provider,
112
+ registry.data,
113
+ sourceUrl,
114
+ new Date().toISOString(),
115
+ );
116
+ const updated = updateProvider(provider.id, {
117
+ modelMetadata: result.modelMetadata,
118
+ modelMetadataUrl: sourceUrl,
119
+ });
120
+ if (updated === null) {
121
+ return Response.json({ error: "Provider not found" }, { status: 404 });
122
+ }
123
+
124
+ return Response.json({
125
+ provider: updated,
126
+ imported: result.imported,
127
+ matchedModels: result.matchedModels,
128
+ missingModels: result.missingModels,
129
+ sourceUrl,
130
+ });
131
+ },
132
+ },
133
+ },
134
+ });
@@ -1,6 +1,7 @@
1
1
  import { createFileRoute } from "@tanstack/react-router";
2
2
  import { z } from "zod";
3
3
  import { getProviders, updateProvider, deleteProvider } from "../../proxy/providers";
4
+ import { ProviderModelMetadataSchema } from "../../lib/providerContract";
4
5
 
5
6
  const ProviderUpdateSchema = z.object({
6
7
  name: z.string().min(1, "Name is required").optional(),
@@ -13,6 +14,8 @@ const ProviderUpdateSchema = z.object({
13
14
  anthropicBaseUrl: z.string().optional(),
14
15
  openaiBaseUrl: z.string().optional(),
15
16
  apiDocsUrl: z.string().optional(),
17
+ modelMetadataUrl: z.string().optional(),
18
+ modelMetadata: z.array(ProviderModelMetadataSchema).optional(),
16
19
  source: z.enum(["company", "personal"]).optional(),
17
20
  });
18
21
 
@@ -12,6 +12,7 @@ const ProviderInputSchema = z.object({
12
12
  model: z.string().optional(),
13
13
  authHeader: z.enum(["bearer", "x-api-key"]).optional().default("bearer"),
14
14
  apiDocsUrl: z.string().optional(),
15
+ modelMetadataUrl: z.string().optional(),
15
16
  source: z.enum(["company", "personal"]).optional(),
16
17
  });
17
18
 
@@ -37,6 +38,7 @@ export const Route = createFileRoute("/api/providers")({
37
38
  parsed.data.anthropicBaseUrl,
38
39
  parsed.data.openaiBaseUrl,
39
40
  parsed.data.source,
41
+ parsed.data.modelMetadataUrl,
40
42
  );
41
43
  return Response.json(newProvider, { status: 201 });
42
44
  },