@tonyclaw/agent-inspector 2.0.1 → 2.0.2

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 (42) hide show
  1. package/.output/cli.js +344 -53
  2. package/.output/nitro.json +1 -1
  3. package/.output/public/assets/{CompareDrawer-sVLGhCO3.js → CompareDrawer-Bp7_x-5N.js} +1 -1
  4. package/.output/public/assets/{ProxyViewerContainer-p9QvzZ6U.js → ProxyViewerContainer-USuxPy-K.js} +13 -13
  5. package/.output/public/assets/{ReplayDialog-DxbFUqNW.js → ReplayDialog-DFHCd0yx.js} +1 -1
  6. package/.output/public/assets/{RequestAnatomy-CSmGQa_g.js → RequestAnatomy-ehyrskxt.js} +1 -1
  7. package/.output/public/assets/{ResponseView-B5f89c8Z.js → ResponseView-BNGyc8e_.js} +1 -1
  8. package/.output/public/assets/{StreamingChunkSequence-BzqpY0TN.js → StreamingChunkSequence-Bjs4Lqwn.js} +1 -1
  9. package/.output/public/assets/_sessionId-D_SeK_qp.js +1 -0
  10. package/.output/public/assets/index-BGGOWR7A.js +1 -0
  11. package/.output/public/assets/index-CIL46Z2y.css +1 -0
  12. package/.output/public/assets/{json-viewer-CKNMihlh.js → json-viewer-6uV_YXws.js} +1 -1
  13. package/.output/public/assets/{main-yWf8dv9w.js → main-FSGUGtEL.js} +2 -2
  14. package/.output/server/{_sessionId-DfHd0gd8.mjs → _sessionId-_bf9vUww.mjs} +2 -2
  15. package/.output/server/_ssr/{CompareDrawer-DGYAUWgF.mjs → CompareDrawer-DIth2DQM.mjs} +3 -3
  16. package/.output/server/_ssr/{ProxyViewerContainer-fawglkTo.mjs → ProxyViewerContainer-249bTH-T.mjs} +24 -30
  17. package/.output/server/_ssr/{ReplayDialog-B4vlKa2W.mjs → ReplayDialog-C1aGx0y1.mjs} +4 -4
  18. package/.output/server/_ssr/{RequestAnatomy-BNQvEIZK.mjs → RequestAnatomy-D2bCiEJn.mjs} +2 -2
  19. package/.output/server/_ssr/{ResponseView-X6X6G16_.mjs → ResponseView-DP6k4Xs_.mjs} +3 -3
  20. package/.output/server/_ssr/{StreamingChunkSequence-BPVN3MnF.mjs → StreamingChunkSequence-HyXZV-b5.mjs} +3 -3
  21. package/.output/server/_ssr/{index-CXmpc2X5.mjs → index-Bt47f9pn.mjs} +2 -2
  22. package/.output/server/_ssr/index.mjs +2 -2
  23. package/.output/server/_ssr/{json-viewer-3XC3eq4R.mjs → json-viewer-Co-YRwUP.mjs} +2 -2
  24. package/.output/server/_ssr/{router-C0B2qvIM.mjs → router-to_OJirX.mjs} +383 -43
  25. package/.output/server/{_tanstack-start-manifest_v-7tfsmd2I.mjs → _tanstack-start-manifest_v-Bd-2YRWo.mjs} +1 -1
  26. package/.output/server/index.mjs +63 -63
  27. package/README.md +47 -7
  28. package/package.json +3 -2
  29. package/scripts/setup-codex-skill.mjs +38 -0
  30. package/scripts/setup-windows-runtime.mjs +4 -3
  31. package/src/cli/onboard.ts +175 -68
  32. package/src/cli/templates/codex-skill-onboard.ts +210 -0
  33. package/src/components/providers/ProviderCard.tsx +2 -27
  34. package/src/components/providers/ProvidersPanel.tsx +16 -0
  35. package/src/knowledge/openclawClient.ts +34 -5
  36. package/src/knowledge/openclawGatewayClient.ts +237 -0
  37. package/src/knowledge/openclawMarkdown.ts +146 -0
  38. package/src/lib/providerTestPrompt.ts +78 -0
  39. package/src/routes/api/providers.$providerId.test.log.ts +9 -22
  40. package/.output/public/assets/_sessionId-BF7ftHV3.js +0 -1
  41. package/.output/public/assets/index-BU0PpLby.js +0 -1
  42. package/.output/public/assets/index-CpWG2hFn.css +0 -1
@@ -1,6 +1,6 @@
1
1
  import { r as reactExports, j as jsxRuntimeExports } from "../_libs/react.mjs";
2
- import { k as TooltipProvider, f as formatTokens, c as cn, l as Tooltip, m as TooltipTrigger, n as TooltipContent } from "./ProxyViewerContainer-fawglkTo.mjs";
3
- import "./router-C0B2qvIM.mjs";
2
+ import { k as TooltipProvider, f as formatTokens, c as cn, l as Tooltip, m as TooltipTrigger, n as TooltipContent } from "./ProxyViewerContainer-249bTH-T.mjs";
3
+ import "./router-to_OJirX.mjs";
4
4
  import "../_libs/modelcontextprotocol__server.mjs";
5
5
  import "../_libs/jszip.mjs";
6
6
  import { Q as Info } from "../_libs/lucide-react.mjs";
@@ -1,7 +1,7 @@
1
1
  import { r as reactExports, j as jsxRuntimeExports } from "../_libs/react.mjs";
2
- import { g as getLogFormatAdapter, f as formatTokens, c as cn, p as getStatusCategory, B as Badge, s as safeJsonValue } from "./ProxyViewerContainer-fawglkTo.mjs";
3
- import { JsonViewer } from "./json-viewer-3XC3eq4R.mjs";
4
- import "./router-C0B2qvIM.mjs";
2
+ import { g as getLogFormatAdapter, f as formatTokens, c as cn, p as getStatusCategory, B as Badge, s as safeJsonValue } from "./ProxyViewerContainer-249bTH-T.mjs";
3
+ import { JsonViewer } from "./json-viewer-Co-YRwUP.mjs";
4
+ import "./router-to_OJirX.mjs";
5
5
  import "../_libs/modelcontextprotocol__server.mjs";
6
6
  import "../_libs/jszip.mjs";
7
7
  import { Z as Zap, i as TriangleAlert, V as CircleStop, Y as Brain, b as ChevronDown, f as ChevronRight, _ as Terminal } from "../_libs/lucide-react.mjs";
@@ -1,7 +1,7 @@
1
1
  import { r as reactExports, j as jsxRuntimeExports } from "../_libs/react.mjs";
2
- import { k as TooltipProvider, l as Tooltip, m as TooltipTrigger, B as Badge, n as TooltipContent } from "./ProxyViewerContainer-fawglkTo.mjs";
3
- import { JsonViewer } from "./json-viewer-3XC3eq4R.mjs";
4
- import "./router-C0B2qvIM.mjs";
2
+ import { k as TooltipProvider, l as Tooltip, m as TooltipTrigger, B as Badge, n as TooltipContent } from "./ProxyViewerContainer-249bTH-T.mjs";
3
+ import { JsonViewer } from "./json-viewer-Co-YRwUP.mjs";
4
+ import "./router-to_OJirX.mjs";
5
5
  import "../_libs/modelcontextprotocol__server.mjs";
6
6
  import "../_libs/jszip.mjs";
7
7
  import { b as ChevronDown, f as ChevronRight, L as LoaderCircle } from "../_libs/lucide-react.mjs";
@@ -1,6 +1,6 @@
1
- import { P as ProxyViewerContainer } from "./ProxyViewerContainer-fawglkTo.mjs";
1
+ import { P as ProxyViewerContainer } from "./ProxyViewerContainer-249bTH-T.mjs";
2
2
  import "../_libs/react.mjs";
3
- import "./router-C0B2qvIM.mjs";
3
+ import "./router-to_OJirX.mjs";
4
4
  import "../_libs/modelcontextprotocol__server.mjs";
5
5
  import "../_libs/jszip.mjs";
6
6
  import "../_libs/swr.mjs";
@@ -198,7 +198,7 @@ function getResponse() {
198
198
  return event.res;
199
199
  }
200
200
  async function getStartManifest(matchedRoutes) {
201
- const { tsrStartManifest } = await import("../_tanstack-start-manifest_v-7tfsmd2I.mjs");
201
+ const { tsrStartManifest } = await import("../_tanstack-start-manifest_v-Bd-2YRWo.mjs");
202
202
  const startManifest = tsrStartManifest();
203
203
  const rootRoute = startManifest.routes[rootRouteId] = startManifest.routes[rootRouteId] || {};
204
204
  rootRoute.assets = rootRoute.assets || [];
@@ -767,7 +767,7 @@ let entriesPromise;
767
767
  let baseManifestPromise;
768
768
  let cachedFinalManifestPromise;
769
769
  async function loadEntries() {
770
- const routerEntry = await import("./router-C0B2qvIM.mjs").then((n) => n.f);
770
+ const routerEntry = await import("./router-to_OJirX.mjs").then((n) => n.f);
771
771
  const startEntry = await import("./start-HYkvq4Ni.mjs");
772
772
  return { startEntry, routerEntry };
773
773
  }
@@ -1,6 +1,6 @@
1
1
  import { r as reactExports, j as jsxRuntimeExports } from "../_libs/react.mjs";
2
- import { q as parseJsonText, c as cn, k as TooltipProvider, l as Tooltip, m as TooltipTrigger, n as TooltipContent } from "./ProxyViewerContainer-fawglkTo.mjs";
3
- import "./router-C0B2qvIM.mjs";
2
+ import { q as parseJsonText, c as cn, k as TooltipProvider, l as Tooltip, m as TooltipTrigger, n as TooltipContent } from "./ProxyViewerContainer-249bTH-T.mjs";
3
+ import "./router-to_OJirX.mjs";
4
4
  import "../_libs/modelcontextprotocol__server.mjs";
5
5
  import "../_libs/jszip.mjs";
6
6
  import { C as Check, a as Copy, b as ChevronDown, f as ChevronRight, q as ChevronsDown } from "../_libs/lucide-react.mjs";
@@ -2,7 +2,7 @@ import { c as createRouter, a as createRootRoute, b as createFileRoute, l as laz
2
2
  import { j as jsxRuntimeExports } from "../_libs/react.mjs";
3
3
  import { S as SWRConfig } from "../_libs/swr.mjs";
4
4
  import { existsSync, readFileSync, mkdirSync, writeFileSync, renameSync, copyFileSync, unlinkSync } from "node:fs";
5
- import { mkdir, appendFile, readFile, open, readdir, stat, unlink, writeFile } from "node:fs/promises";
5
+ import fs, { mkdir, appendFile, readFile, open, readdir, stat, unlink, writeFile } from "node:fs/promises";
6
6
  import { Buffer } from "node:buffer";
7
7
  import path, { join, isAbsolute, dirname } from "node:path";
8
8
  import { execFile, exec, spawn } from "node:child_process";
@@ -13,7 +13,7 @@ import { promisify } from "node:util";
13
13
  import { Worker } from "node:worker_threads";
14
14
  import { M as McpServer, W as WebStandardStreamableHTTPServerTransport } from "../_libs/modelcontextprotocol__server.mjs";
15
15
  import { homedir } from "node:os";
16
- import { d as object, b as string, a as array, _ as _enum, u as union, n as number, c as boolean, l as literal, r as record, g as discriminatedUnion, h as _null, k as lazy, e as unknown } from "../_libs/zod.mjs";
16
+ import { d as object, b as string, a as array, _ as _enum, u as union, n as number, c as boolean, e as unknown, l as literal, r as record, g as discriminatedUnion, h as _null, k as lazy } from "../_libs/zod.mjs";
17
17
  import "../_libs/tiny-warning.mjs";
18
18
  import "../_libs/tanstack__router-core.mjs";
19
19
  import "../_libs/cookie-es.mjs";
@@ -49,7 +49,7 @@ import "../_libs/mimic-function.mjs";
49
49
  import "../_libs/semver.mjs";
50
50
  import "../_libs/uint8array-extras.mjs";
51
51
  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";
52
- const appCss = "/assets/index-CpWG2hFn.css";
52
+ const appCss = "/assets/index-CIL46Z2y.css";
53
53
  const Route$q = createRootRoute({
54
54
  head: () => ({
55
55
  meta: [
@@ -76,7 +76,7 @@ function RootDocument({ children }) {
76
76
  ] })
77
77
  ] });
78
78
  }
79
- const $$splitComponentImporter$1 = () => import("./index-CXmpc2X5.mjs");
79
+ const $$splitComponentImporter$1 = () => import("./index-Bt47f9pn.mjs");
80
80
  const Route$p = createFileRoute("/")({
81
81
  component: lazyRouteComponent($$splitComponentImporter$1, "component")
82
82
  });
@@ -119,7 +119,7 @@ function decodeSessionIdFromPath(encoded) {
119
119
  function getSessionPath(sessionId) {
120
120
  return `/session/${encodeSessionIdForPath(sessionId)}`;
121
121
  }
122
- const $$splitComponentImporter = () => import("../_sessionId-DfHd0gd8.mjs");
122
+ const $$splitComponentImporter = () => import("../_sessionId-_bf9vUww.mjs");
123
123
  const Route$o = createFileRoute("/session/$sessionId")({
124
124
  component: lazyRouteComponent($$splitComponentImporter, "component"),
125
125
  parseParams: (params) => ({
@@ -4770,6 +4770,192 @@ const KnowledgeSearchResponseSchema = object({
4770
4770
  results: array(KnowledgeSearchResultSchema),
4771
4771
  warning: string().nullable()
4772
4772
  });
4773
+ const OpenClawGatewayErrorSchema = object({
4774
+ type: string().optional(),
4775
+ message: string().optional()
4776
+ }).passthrough();
4777
+ const OpenClawGatewayInvokeResponseSchema = object({
4778
+ ok: boolean().optional(),
4779
+ result: unknown().optional(),
4780
+ error: OpenClawGatewayErrorSchema.optional()
4781
+ }).passthrough();
4782
+ const OpenClawGatewayContentItemSchema = object({
4783
+ type: string().optional(),
4784
+ text: string().optional()
4785
+ }).passthrough();
4786
+ const OpenClawMemoryHitSchema = object({
4787
+ id: string().optional(),
4788
+ path: string().optional(),
4789
+ title: string().optional(),
4790
+ kind: string().optional(),
4791
+ corpus: string().optional(),
4792
+ score: number().nullable().optional(),
4793
+ snippet: string().optional(),
4794
+ content: string().optional(),
4795
+ source: string().nullable().optional(),
4796
+ startLine: number().optional(),
4797
+ endLine: number().optional()
4798
+ }).passthrough();
4799
+ const OpenClawToolResultDetailsSchema = object({
4800
+ results: array(OpenClawMemoryHitSchema).optional()
4801
+ }).passthrough();
4802
+ const OpenClawToolResultSchema = object({
4803
+ results: array(OpenClawMemoryHitSchema).optional(),
4804
+ details: OpenClawToolResultDetailsSchema.optional(),
4805
+ content: array(OpenClawGatewayContentItemSchema).optional()
4806
+ }).passthrough();
4807
+ function getOpenClawGatewayUrl() {
4808
+ const value = process.env["OPENCLAW_GATEWAY_URL"];
4809
+ if (value === void 0 || value.trim() === "") {
4810
+ return null;
4811
+ }
4812
+ return value.trim();
4813
+ }
4814
+ function isOpenClawGatewayConfigured() {
4815
+ return getOpenClawGatewayUrl() !== null;
4816
+ }
4817
+ function buildToolInvokeUrl(gatewayUrl) {
4818
+ return `${gatewayUrl.replace(/\/$/, "")}/tools/invoke`;
4819
+ }
4820
+ function getOpenClawSessionKey() {
4821
+ const value = process.env["OPENCLAW_SESSION_KEY"];
4822
+ return value === void 0 || value.trim() === "" ? "main" : value.trim();
4823
+ }
4824
+ function getGatewayToken() {
4825
+ const token = process.env["OPENCLAW_GATEWAY_TOKEN"] ?? process.env["OPENCLAW_GATEWAY_PASSWORD"] ?? process.env["OPENCLAW_API_KEY"];
4826
+ if (token === void 0 || token.trim() === "") {
4827
+ return null;
4828
+ }
4829
+ return token.trim();
4830
+ }
4831
+ function gatewayHeaders() {
4832
+ const headers = new Headers({ "content-type": "application/json" });
4833
+ const token = getGatewayToken();
4834
+ if (token !== null) {
4835
+ headers.set("authorization", `Bearer ${token}`);
4836
+ }
4837
+ return headers;
4838
+ }
4839
+ function buildSearchQuery(query, project) {
4840
+ if (project === void 0 || project === "") {
4841
+ return query;
4842
+ }
4843
+ return `${query}
4844
+ Project: ${project}`;
4845
+ }
4846
+ function formatHitTitle(hit, index) {
4847
+ if (hit.title !== void 0 && hit.title !== "") {
4848
+ return hit.title;
4849
+ }
4850
+ if (hit.path !== void 0 && hit.path !== "") {
4851
+ return hit.path;
4852
+ }
4853
+ if (hit.id !== void 0 && hit.id !== "") {
4854
+ return hit.id;
4855
+ }
4856
+ return `OpenClaw memory result ${String(index + 1)}`;
4857
+ }
4858
+ function formatHitId(hit, index) {
4859
+ const base = hit.id ?? hit.path ?? `result-${String(index + 1)}`;
4860
+ const start = hit.startLine === void 0 ? "" : `:${String(hit.startLine)}`;
4861
+ const end = hit.endLine === void 0 ? "" : `-${String(hit.endLine)}`;
4862
+ return `openclaw:${base}${start}${end}`;
4863
+ }
4864
+ function formatHitContent(hit) {
4865
+ if (hit.snippet !== void 0 && hit.snippet !== "") {
4866
+ return hit.snippet;
4867
+ }
4868
+ if (hit.content !== void 0 && hit.content !== "") {
4869
+ return hit.content;
4870
+ }
4871
+ return "";
4872
+ }
4873
+ function formatHitType(hit) {
4874
+ if (hit.kind !== void 0 && hit.kind !== "") {
4875
+ return hit.kind;
4876
+ }
4877
+ if (hit.corpus !== void 0 && hit.corpus !== "") {
4878
+ return hit.corpus;
4879
+ }
4880
+ return "openclaw-memory";
4881
+ }
4882
+ function mapGatewayHit(hit, index, project) {
4883
+ return {
4884
+ id: formatHitId(hit, index),
4885
+ type: formatHitType(hit),
4886
+ title: formatHitTitle(hit, index),
4887
+ content: formatHitContent(hit),
4888
+ score: hit.score ?? null,
4889
+ source: hit.source ?? "openclaw",
4890
+ project: project ?? null,
4891
+ evidence: hit
4892
+ };
4893
+ }
4894
+ function extractGatewayHits(result) {
4895
+ const parsed = OpenClawToolResultSchema.safeParse(result);
4896
+ if (!parsed.success) {
4897
+ return null;
4898
+ }
4899
+ return parsed.data.details?.results ?? parsed.data.results ?? [];
4900
+ }
4901
+ function formatGatewayError(raw) {
4902
+ const parsed = OpenClawGatewayInvokeResponseSchema.safeParse(raw);
4903
+ if (!parsed.success) {
4904
+ return "OpenClaw Gateway returned an unparseable response.";
4905
+ }
4906
+ const message = parsed.data.error?.message;
4907
+ if (message !== void 0 && message !== "") {
4908
+ return message;
4909
+ }
4910
+ return "OpenClaw Gateway tool invocation failed.";
4911
+ }
4912
+ async function searchOpenClawGateway(query, project) {
4913
+ const gatewayUrl = getOpenClawGatewayUrl();
4914
+ if (gatewayUrl === null) {
4915
+ return {
4916
+ results: [],
4917
+ warning: "OpenClaw Gateway is not configured. Set OPENCLAW_GATEWAY_URL."
4918
+ };
4919
+ }
4920
+ const response = await fetch(buildToolInvokeUrl(gatewayUrl), {
4921
+ method: "POST",
4922
+ headers: gatewayHeaders(),
4923
+ body: JSON.stringify({
4924
+ tool: "memory_search",
4925
+ args: {
4926
+ query: buildSearchQuery(query, project),
4927
+ maxResults: 10,
4928
+ corpus: "all"
4929
+ },
4930
+ sessionKey: getOpenClawSessionKey()
4931
+ })
4932
+ });
4933
+ const raw = await response.json().catch(() => null);
4934
+ if (!response.ok) {
4935
+ return {
4936
+ results: [],
4937
+ warning: `OpenClaw Gateway search failed with ${response.status}: ${formatGatewayError(raw)}`
4938
+ };
4939
+ }
4940
+ const parsed = OpenClawGatewayInvokeResponseSchema.safeParse(raw);
4941
+ if (!parsed.success) {
4942
+ return { results: [], warning: "OpenClaw Gateway returned an unparseable response." };
4943
+ }
4944
+ if (parsed.data.ok === false) {
4945
+ return { results: [], warning: formatGatewayError(raw) };
4946
+ }
4947
+ const hits = extractGatewayHits(parsed.data.result);
4948
+ if (hits === null) {
4949
+ return {
4950
+ results: [],
4951
+ warning: "OpenClaw memory_search returned an unparseable tool result."
4952
+ };
4953
+ }
4954
+ return {
4955
+ results: hits.map((hit, index) => mapGatewayHit(hit, index, project)),
4956
+ warning: null
4957
+ };
4958
+ }
4773
4959
  const REDACTION_PATTERNS = [
4774
4960
  { name: "authorization-header", pattern: /\bAuthorization\s*:\s*[^\s,;]+/gi },
4775
4961
  { name: "bearer-token", pattern: /\bBearer\s+[A-Za-z0-9._~+/=-]{12,}/gi },
@@ -4832,11 +5018,121 @@ function redactCandidate(candidate) {
4832
5018
  redaction: combineRedaction(patterns)
4833
5019
  };
4834
5020
  }
5021
+ function getOpenClawWorkspaceDir() {
5022
+ const value = process.env["OPENCLAW_WORKSPACE_DIR"];
5023
+ if (value === void 0 || value.trim() === "") {
5024
+ return null;
5025
+ }
5026
+ return value.trim();
5027
+ }
5028
+ function isOpenClawFileBridgeConfigured() {
5029
+ return getOpenClawWorkspaceDir() !== null;
5030
+ }
5031
+ function normalizeDatePrefix(value) {
5032
+ const date = value.slice(0, 10);
5033
+ return /^\d{4}-\d{2}-\d{2}$/.test(date) ? date : "undated";
5034
+ }
5035
+ function normalizePathSegment(value, fallback) {
5036
+ const segment = value.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 96);
5037
+ return segment === "" ? fallback : segment;
5038
+ }
5039
+ function formatNullable(value) {
5040
+ return value === null || value === "" ? "unknown" : value;
5041
+ }
5042
+ function formatList(values) {
5043
+ return values.length === 0 ? "none" : values.join(", ");
5044
+ }
5045
+ function buildEvidenceLink(candidate) {
5046
+ return `agent-inspector:session:${candidate.sessionId}:candidate:${candidate.id}`;
5047
+ }
5048
+ function buildOpenClawMemoryRelativePath(candidate) {
5049
+ const date = normalizeDatePrefix(candidate.updatedAt);
5050
+ const slug = normalizePathSegment(candidate.id, "candidate");
5051
+ return path.join("memory", "agent-inspector", date, `${slug}.md`).replace(/\\/g, "/");
5052
+ }
5053
+ function buildOpenClawMemoryMarkdown(candidate) {
5054
+ const sanitized = redactCandidate(candidate);
5055
+ return [
5056
+ "# Agent Inspector Memory Candidate",
5057
+ "",
5058
+ "Layer: L3 memory candidate for OpenClaw L4 durable recall",
5059
+ "Source: agent-inspector",
5060
+ "",
5061
+ "## Metadata",
5062
+ "",
5063
+ `- Type: ${sanitized.type}`,
5064
+ `- Status: ${sanitized.status}`,
5065
+ `- Project: ${formatNullable(sanitized.evidence.project)}`,
5066
+ `- Session: ${sanitized.sessionId}`,
5067
+ `- Log IDs: ${sanitized.logIds.join(", ")}`,
5068
+ `- Models: ${formatList(sanitized.evidence.models)}`,
5069
+ `- Tags: ${formatList(sanitized.tags)}`,
5070
+ `- Created: ${sanitized.createdAt}`,
5071
+ `- Updated: ${sanitized.updatedAt}`,
5072
+ `- Evidence: ${buildEvidenceLink(sanitized)}`,
5073
+ `- Redacted: ${String(sanitized.redaction.redacted)}`,
5074
+ `- Redaction patterns: ${formatList(sanitized.redaction.patterns)}`,
5075
+ "",
5076
+ "## Durable Knowledge Candidate",
5077
+ "",
5078
+ sanitized.content,
5079
+ "",
5080
+ "## Recall Guidance",
5081
+ "",
5082
+ [
5083
+ "- Treat this as reviewed Agent Inspector knowledge extracted from LLM interaction traces.",
5084
+ "- Use the evidence id to return to Agent Inspector when raw proof is needed.",
5085
+ "- Do not treat this file as raw logs; sensitive values were redacted before export."
5086
+ ].join("\n"),
5087
+ ""
5088
+ ].join("\n");
5089
+ }
5090
+ function resolveTargetPath(workspaceDir, relativePath) {
5091
+ const root = path.resolve(workspaceDir);
5092
+ const target = path.resolve(root, relativePath);
5093
+ const relative = path.relative(root, target);
5094
+ if (relative.startsWith("..") || path.isAbsolute(relative)) {
5095
+ return null;
5096
+ }
5097
+ return target;
5098
+ }
5099
+ async function writeCandidateToOpenClawMemory(candidate) {
5100
+ const workspaceDir = getOpenClawWorkspaceDir();
5101
+ if (workspaceDir === null) {
5102
+ return {
5103
+ success: false,
5104
+ error: "OpenClaw workspace is not configured. Set OPENCLAW_WORKSPACE_DIR."
5105
+ };
5106
+ }
5107
+ const relativePath = buildOpenClawMemoryRelativePath(candidate);
5108
+ const target = resolveTargetPath(workspaceDir, relativePath);
5109
+ if (target === null) {
5110
+ return {
5111
+ success: false,
5112
+ error: "OpenClaw memory target resolved outside OPENCLAW_WORKSPACE_DIR."
5113
+ };
5114
+ }
5115
+ try {
5116
+ await fs.mkdir(path.dirname(target), { recursive: true });
5117
+ await fs.writeFile(target, buildOpenClawMemoryMarkdown(candidate), "utf8");
5118
+ } catch (error) {
5119
+ return {
5120
+ success: false,
5121
+ error: `OpenClaw memory file write failed: ${String(error)}`
5122
+ };
5123
+ }
5124
+ return {
5125
+ success: true,
5126
+ memoryId: `openclaw-file:${relativePath}`,
5127
+ relativePath,
5128
+ absolutePath: target
5129
+ };
5130
+ }
4835
5131
  const OpenClawWriteResponseSchema = object({
4836
5132
  id: string().optional(),
4837
5133
  memoryId: string().optional()
4838
5134
  });
4839
- function getEndpoint() {
5135
+ function getLegacyEndpoint() {
4840
5136
  const endpoint = process.env["OPENCLAW_MEMORY_URL"] ?? process.env["OPENCLAW_API_URL"];
4841
5137
  if (endpoint === void 0 || endpoint.trim() === "") return null;
4842
5138
  return endpoint.trim();
@@ -4874,11 +5170,18 @@ function buildOpenClawPayload(candidate) {
4874
5170
  };
4875
5171
  }
4876
5172
  async function promoteToOpenClaw(candidate) {
4877
- const endpoint = getEndpoint();
5173
+ if (isOpenClawFileBridgeConfigured()) {
5174
+ const result = await writeCandidateToOpenClawMemory(candidate);
5175
+ if (result.success) {
5176
+ return { success: true, memoryId: result.memoryId };
5177
+ }
5178
+ return { success: false, error: result.error };
5179
+ }
5180
+ const endpoint = getLegacyEndpoint();
4878
5181
  if (endpoint === null) {
4879
5182
  return {
4880
5183
  success: false,
4881
- error: "OpenClaw memory backend is not configured. Set OPENCLAW_MEMORY_URL."
5184
+ error: "OpenClaw memory backend is not configured. Set OPENCLAW_WORKSPACE_DIR for file-backed memory or OPENCLAW_MEMORY_URL for a legacy HTTP backend."
4882
5185
  };
4883
5186
  }
4884
5187
  const response = await fetch(buildMemoryUrl(endpoint), {
@@ -4897,11 +5200,15 @@ async function promoteToOpenClaw(candidate) {
4897
5200
  return { success: true, memoryId: parsed.data.memoryId ?? parsed.data.id ?? null };
4898
5201
  }
4899
5202
  async function searchOpenClaw(query, project) {
4900
- const endpoint = getEndpoint();
5203
+ if (isOpenClawGatewayConfigured()) {
5204
+ return await searchOpenClawGateway(query, project);
5205
+ }
5206
+ const endpoint = getLegacyEndpoint();
4901
5207
  if (endpoint === null) {
5208
+ const workspaceHint = isOpenClawFileBridgeConfigured() ? " OPENCLAW_WORKSPACE_DIR is configured for writes, but search requires OPENCLAW_GATEWAY_URL." : "";
4902
5209
  return {
4903
5210
  results: [],
4904
- warning: "OpenClaw memory backend is not configured. Set OPENCLAW_MEMORY_URL."
5211
+ warning: `OpenClaw search backend is not configured. Set OPENCLAW_GATEWAY_URL or OPENCLAW_MEMORY_URL.${workspaceHint}`
4905
5212
  };
4906
5213
  }
4907
5214
  const response = await fetch(buildSearchUrl(endpoint, query, project), {
@@ -5028,6 +5335,62 @@ const Route$6 = createFileRoute("/api/config/paths")({
5028
5335
  }
5029
5336
  }
5030
5337
  });
5338
+ const MEMORY_PROBE_FACTS = [
5339
+ "Project fact: Agent Inspector captures LLM traffic and turns it into Raw Trace, Session Episode, and Memory Candidate layers.",
5340
+ "Procedure: before release, run bun test, npm run typecheck, npm run lint, npm run build, and openspec validate --all --strict.",
5341
+ "Preference: the user prefers Chinese summaries, explicit verification, and commit/push/release closure when requested.",
5342
+ "Pitfall: preserve .llm-inspector config compatibility; do not write raw logs or secrets into durable memory.",
5343
+ "OpenClaw boundary: Agent Inspector owns L1-L3; OpenClaw owns durable indexing, retrieval, and recall."
5344
+ ];
5345
+ function modeInstruction(mode) {
5346
+ switch (mode) {
5347
+ case "non-streaming":
5348
+ return "Reply in four concise bullets.";
5349
+ case "streaming":
5350
+ return "Reply in three concise bullets.";
5351
+ }
5352
+ }
5353
+ function maxTokensForMode(mode) {
5354
+ switch (mode) {
5355
+ case "non-streaming":
5356
+ return 1024;
5357
+ case "streaming":
5358
+ return 384;
5359
+ }
5360
+ }
5361
+ function buildProviderTestUserPrompt(mode) {
5362
+ return [
5363
+ "You are validating an LLM provider connection for Agent Inspector.",
5364
+ "This request includes a synthetic memory probe so Agent Inspector can verify its three Inspector-owned memory layers.",
5365
+ "",
5366
+ "Synthetic memory probe:",
5367
+ ...MEMORY_PROBE_FACTS.map((fact) => `- ${fact}`),
5368
+ "",
5369
+ "Return:",
5370
+ "1. connection status",
5371
+ "2. one project fact",
5372
+ "3. one reusable procedure",
5373
+ "4. one caution",
5374
+ "",
5375
+ modeInstruction(mode)
5376
+ ].join("\n");
5377
+ }
5378
+ function buildProviderTestMessages(mode) {
5379
+ return [{ role: "user", content: buildProviderTestUserPrompt(mode) }];
5380
+ }
5381
+ function buildProviderTestRequestBody(model, mode) {
5382
+ const base = {
5383
+ model,
5384
+ messages: buildProviderTestMessages(mode),
5385
+ max_tokens: maxTokensForMode(mode)
5386
+ };
5387
+ switch (mode) {
5388
+ case "non-streaming":
5389
+ return base;
5390
+ case "streaming":
5391
+ return { ...base, stream: true };
5392
+ }
5393
+ }
5031
5394
  const ERROR_HINTS = {
5032
5395
  timeout: "The request took too long. Check your network connection or try again.",
5033
5396
  network_unreachable: "Cannot reach the server. Verify the base URL and check your firewall settings.",
@@ -5193,11 +5556,7 @@ function buildTestRequestHeaders(provider) {
5193
5556
  }
5194
5557
  async function testEndpoint(baseUrl, provider, path2, model, isOpenAI) {
5195
5558
  const startTime = Date.now();
5196
- const body = JSON.stringify({
5197
- model,
5198
- messages: [{ role: "user", content: "say hello and briefly introduce yourself" }],
5199
- max_tokens: 1024
5200
- });
5559
+ const body = JSON.stringify(buildProviderTestRequestBody(model, "non-streaming"));
5201
5560
  const requestHeaders = buildTestRequestHeaders(provider);
5202
5561
  const controller = new AbortController();
5203
5562
  const timeoutId = setTimeout(() => controller.abort(), TEST_TIMEOUT_MS);
@@ -5282,12 +5641,7 @@ async function testEndpoint(baseUrl, provider, path2, model, isOpenAI) {
5282
5641
  }
5283
5642
  async function testStreamingEndpoint(baseUrl, provider, path2, model, isOpenAI) {
5284
5643
  const startTime = Date.now();
5285
- const body = JSON.stringify({
5286
- model,
5287
- messages: [{ role: "user", content: "say hello" }],
5288
- max_tokens: 256,
5289
- stream: true
5290
- });
5644
+ const body = JSON.stringify(buildProviderTestRequestBody(model, "streaming"));
5291
5645
  const requestHeaders = buildTestRequestHeaders(provider);
5292
5646
  const controller = new AbortController();
5293
5647
  const timeoutId = setTimeout(() => controller.abort(), TEST_TIMEOUT_MS);
@@ -5775,11 +6129,7 @@ async function logModelResults(displayName, providerName, anthropicUrl, openaiUr
5775
6129
  if (hasSuccessField(nsResult) && hasSuccessField(sResult)) {
5776
6130
  const nonStreamingResult = nsResult;
5777
6131
  const streamingResult = sResult;
5778
- const requestBody = JSON.stringify({
5779
- model: usageModel,
5780
- messages: [{ role: "user", content: "say hello and briefly introduce yourself" }],
5781
- max_tokens: 1024
5782
- });
6132
+ const requestBody = JSON.stringify(buildProviderTestRequestBody(usageModel, "non-streaming"));
5783
6133
  const upstreamUrl = `${anthropicUrl}/v1/messages`;
5784
6134
  await addTestLogEntry({
5785
6135
  timestamp: (/* @__PURE__ */ new Date()).toISOString(),
@@ -5813,12 +6163,9 @@ async function logModelResults(displayName, providerName, anthropicUrl, openaiUr
5813
6163
  true
5814
6164
  )
5815
6165
  );
5816
- const streamingRequestBody = JSON.stringify({
5817
- model: usageModel,
5818
- messages: [{ role: "user", content: "say hello" }],
5819
- max_tokens: 256,
5820
- stream: true
5821
- });
6166
+ const streamingRequestBody = JSON.stringify(
6167
+ buildProviderTestRequestBody(usageModel, "streaming")
6168
+ );
5822
6169
  await addTestLogEntry({
5823
6170
  timestamp: (/* @__PURE__ */ new Date()).toISOString(),
5824
6171
  method: "POST",
@@ -5860,11 +6207,7 @@ async function logModelResults(displayName, providerName, anthropicUrl, openaiUr
5860
6207
  if (hasSuccessField(nsResult) && hasSuccessField(sResult)) {
5861
6208
  const nonStreamingResult = nsResult;
5862
6209
  const streamingResult = sResult;
5863
- const requestBody = JSON.stringify({
5864
- model: usageModel,
5865
- messages: [{ role: "user", content: "say hello and briefly introduce yourself" }],
5866
- max_tokens: 1024
5867
- });
6210
+ const requestBody = JSON.stringify(buildProviderTestRequestBody(usageModel, "non-streaming"));
5868
6211
  const upstreamUrl = `${openaiUrl}/v1/chat/completions`;
5869
6212
  await addTestLogEntry({
5870
6213
  timestamp: (/* @__PURE__ */ new Date()).toISOString(),
@@ -5898,12 +6241,9 @@ async function logModelResults(displayName, providerName, anthropicUrl, openaiUr
5898
6241
  true
5899
6242
  )
5900
6243
  );
5901
- const streamingRequestBody = JSON.stringify({
5902
- model: usageModel,
5903
- messages: [{ role: "user", content: "say hello" }],
5904
- max_tokens: 256,
5905
- stream: true
5906
- });
6244
+ const streamingRequestBody = JSON.stringify(
6245
+ buildProviderTestRequestBody(usageModel, "streaming")
6246
+ );
5907
6247
  await addTestLogEntry({
5908
6248
  timestamp: (/* @__PURE__ */ new Date()).toISOString(),
5909
6249
  method: "POST",
@@ -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-yWf8dv9w.js"], "assets": [] }, "/": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/index.tsx", "assets": [], "preloads": ["/assets/index-BU0PpLby.js", "/assets/ProxyViewerContainer-p9QvzZ6U.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-BF7ftHV3.js", "/assets/ProxyViewerContainer-p9QvzZ6U.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/promote"] }, "/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/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/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/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-yWf8dv9w.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-FSGUGtEL.js"], "assets": [] }, "/": { "filePath": "C:/Users/claw/workspace/agent-inspector/src/routes/index.tsx", "assets": [], "preloads": ["/assets/index-BGGOWR7A.js", "/assets/ProxyViewerContainer-USuxPy-K.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-D_SeK_qp.js", "/assets/ProxyViewerContainer-USuxPy-K.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/promote"] }, "/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/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/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/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-FSGUGtEL.js" });
2
2
  export {
3
3
  tsrStartManifest
4
4
  };