@tonyclaw/agent-inspector 2.0.4 → 2.0.5
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/nitro.json +1 -1
- package/.output/public/assets/{CompareDrawer-BCH_fsLm.js → CompareDrawer-3nRwtk8J.js} +1 -1
- package/.output/public/assets/ProxyViewerContainer-CbW5VRER.js +101 -0
- package/.output/public/assets/ReplayDialog-Cl62N9PI.js +1 -0
- package/.output/public/assets/{RequestAnatomy-DZ8grAih.js → RequestAnatomy-DgQWGvjs.js} +1 -1
- package/.output/public/assets/ResponseView-Cvc-ct4E.js +1 -0
- package/.output/public/assets/StreamingChunkSequence-BCQaCAIe.js +1 -0
- package/.output/public/assets/_sessionId-CcD_aLGq.js +1 -0
- package/.output/public/assets/index-B_dffD3u.js +1 -0
- package/.output/public/assets/index-CX796gvi.css +1 -0
- package/.output/public/assets/{json-viewer-BrzjD7qI.js → json-viewer-IXejqXB0.js} +1 -1
- package/.output/public/assets/{main-mgxeUdZQ.js → main-2NlGzgOe.js} +2 -2
- package/.output/server/_libs/lucide-react.mjs +181 -114
- package/.output/server/{_sessionId-C4xsxIWm.mjs → _sessionId-DWCTasJU.mjs} +3 -3
- package/.output/server/_ssr/{CompareDrawer-DuWEpqQ7.mjs → CompareDrawer-DhrN1uC2.mjs} +6 -6
- package/.output/server/_ssr/{ProxyViewerContainer-Cckz5qKu.mjs → ProxyViewerContainer-DRl51s_n.mjs} +763 -119
- package/.output/server/_ssr/{ReplayDialog-BDRcr8E5.mjs → ReplayDialog-BQT_ygxC.mjs} +240 -14
- package/.output/server/_ssr/{RequestAnatomy-BoO2_Ij0.mjs → RequestAnatomy-DS2tZOgq.mjs} +3 -3
- package/.output/server/_ssr/{ResponseView-DZiPBxvO.mjs → ResponseView-e0kL2C3x.mjs} +8 -8
- package/.output/server/_ssr/{StreamingChunkSequence-D-be7KEL.mjs → StreamingChunkSequence-BJG-m7xs.mjs} +3 -3
- package/.output/server/_ssr/{index-5RImHKfu.mjs → index-Dea3OeRw.mjs} +2 -2
- package/.output/server/_ssr/index.mjs +2 -2
- package/.output/server/_ssr/{json-viewer-aJhb93ZK.mjs → json-viewer-DDU55MLK.mjs} +3 -3
- package/.output/server/_ssr/{router-Dgkv5nKP.mjs → router-Dl7oh0zx.mjs} +145 -71
- package/.output/server/_tanstack-start-manifest_v-m-FJNBVf.mjs +4 -0
- package/.output/server/index.mjs +69 -69
- package/package.json +1 -1
- package/src/components/OnboardingBanner.tsx +11 -19
- package/src/components/ProxyViewer.tsx +1 -1
- package/src/components/providers/ProviderCard.tsx +6 -20
- package/src/components/providers/SettingsDialog.tsx +95 -2
- package/src/components/proxy-viewer/AgentTraceSummary.tsx +639 -38
- package/src/components/proxy-viewer/CompareDrawer.tsx +4 -2
- package/src/components/proxy-viewer/LogEntryHeader.tsx +12 -22
- package/src/components/proxy-viewer/ReplayDialog.tsx +190 -8
- package/src/components/proxy-viewer/ResponseView.tsx +2 -2
- package/src/components/proxy-viewer/ToolTraceEvents.tsx +37 -16
- package/src/components/proxy-viewer/TurnGroup.tsx +14 -2
- package/src/components/proxy-viewer/formats/anthropic/ResponseView.tsx +2 -2
- package/src/components/proxy-viewer/replayComparison.ts +131 -0
- package/src/components/proxy-viewer/useKeyboardNavigation.ts +64 -22
- package/src/components/proxy-viewer/viewerState.ts +14 -2
- package/src/knowledge/candidateStore.ts +32 -1
- package/src/routes/api/knowledge.candidates.$candidateId.ts +50 -0
- package/src/routes/api/knowledge.sessions.$sessionId.candidates.ts +12 -2
- package/.output/public/assets/ProxyViewerContainer-D85_UANk.js +0 -101
- package/.output/public/assets/ReplayDialog-DTeaHHit.js +0 -1
- package/.output/public/assets/ResponseView-Cldm6RCi.js +0 -1
- package/.output/public/assets/StreamingChunkSequence-3x4p-yT7.js +0 -1
- package/.output/public/assets/_sessionId-YqWFBu6d.js +0 -1
- package/.output/public/assets/index-BIw2H6jO.js +0 -1
- package/.output/public/assets/index-CobXD0yH.css +0 -1
- package/.output/server/_tanstack-start-manifest_v-B8rrWXjr.mjs +0 -4
package/.output/server/index.mjs
CHANGED
|
@@ -38,107 +38,107 @@ const assets = {
|
|
|
38
38
|
"/assets/alibaba-TTwafVwX.svg": {
|
|
39
39
|
"type": "image/svg+xml",
|
|
40
40
|
"etag": '"171b-6dyV5K8QjiaY35sN9qNprh9zDIs"',
|
|
41
|
-
"mtime": "2026-06-
|
|
41
|
+
"mtime": "2026-06-21T02:55:38.892Z",
|
|
42
42
|
"size": 5915,
|
|
43
43
|
"path": "../public/assets/alibaba-TTwafVwX.svg"
|
|
44
44
|
},
|
|
45
|
-
"/assets/index-BIw2H6jO.js": {
|
|
46
|
-
"type": "text/javascript; charset=utf-8",
|
|
47
|
-
"etag": '"74-4Z3U3XPh22QGtEz8rgtC6KUxxBk"',
|
|
48
|
-
"mtime": "2026-06-20T09:50:40.189Z",
|
|
49
|
-
"size": 116,
|
|
50
|
-
"path": "../public/assets/index-BIw2H6jO.js"
|
|
51
|
-
},
|
|
52
|
-
"/assets/index-CobXD0yH.css": {
|
|
53
|
-
"type": "text/css; charset=utf-8",
|
|
54
|
-
"etag": '"17587-wM3UwOtYjpQy81oA4sjkIdizScg"',
|
|
55
|
-
"mtime": "2026-06-20T09:50:40.188Z",
|
|
56
|
-
"size": 95623,
|
|
57
|
-
"path": "../public/assets/index-CobXD0yH.css"
|
|
58
|
-
},
|
|
59
45
|
"/assets/minimax-BPMzvuL-.jpeg": {
|
|
60
46
|
"type": "image/jpeg",
|
|
61
47
|
"etag": '"1b06-IwivU89ko5UTMUM1/t7hn4sQK9A"',
|
|
62
|
-
"mtime": "2026-06-
|
|
48
|
+
"mtime": "2026-06-21T02:55:38.892Z",
|
|
63
49
|
"size": 6918,
|
|
64
50
|
"path": "../public/assets/minimax-BPMzvuL-.jpeg"
|
|
65
51
|
},
|
|
66
|
-
"/assets/
|
|
52
|
+
"/assets/CompareDrawer-3nRwtk8J.js": {
|
|
67
53
|
"type": "text/javascript; charset=utf-8",
|
|
68
|
-
"etag": '"
|
|
69
|
-
"mtime": "2026-06-
|
|
70
|
-
"size":
|
|
71
|
-
"path": "../public/assets/
|
|
54
|
+
"etag": '"4a25-urgvq4zVkJNkh48bDzRCZpmV0XU"',
|
|
55
|
+
"mtime": "2026-06-21T02:55:38.893Z",
|
|
56
|
+
"size": 18981,
|
|
57
|
+
"path": "../public/assets/CompareDrawer-3nRwtk8J.js"
|
|
72
58
|
},
|
|
73
|
-
"/assets/
|
|
59
|
+
"/assets/index-B_dffD3u.js": {
|
|
74
60
|
"type": "text/javascript; charset=utf-8",
|
|
75
|
-
"etag": '"
|
|
76
|
-
"mtime": "2026-06-
|
|
77
|
-
"size":
|
|
78
|
-
"path": "../public/assets/
|
|
61
|
+
"etag": '"74-G34R32wRb35yFy01Xx5+tisQpbk"',
|
|
62
|
+
"mtime": "2026-06-21T02:55:38.892Z",
|
|
63
|
+
"size": 116,
|
|
64
|
+
"path": "../public/assets/index-B_dffD3u.js"
|
|
79
65
|
},
|
|
80
|
-
"/assets/
|
|
81
|
-
"type": "text/
|
|
82
|
-
"etag": '"
|
|
83
|
-
"mtime": "2026-06-
|
|
84
|
-
"size":
|
|
85
|
-
"path": "../public/assets/
|
|
66
|
+
"/assets/index-CX796gvi.css": {
|
|
67
|
+
"type": "text/css; charset=utf-8",
|
|
68
|
+
"etag": '"17a41-dqXsKD+MttGurME/qf9nmjJckRY"',
|
|
69
|
+
"mtime": "2026-06-21T02:55:38.892Z",
|
|
70
|
+
"size": 96833,
|
|
71
|
+
"path": "../public/assets/index-CX796gvi.css"
|
|
86
72
|
},
|
|
87
|
-
"/assets/
|
|
73
|
+
"/assets/json-viewer-IXejqXB0.js": {
|
|
88
74
|
"type": "text/javascript; charset=utf-8",
|
|
89
|
-
"etag": '"
|
|
90
|
-
"mtime": "2026-06-
|
|
91
|
-
"size":
|
|
92
|
-
"path": "../public/assets/
|
|
75
|
+
"etag": '"1e653-JGlILG827/WNy4+hkJi+2gTndaU"',
|
|
76
|
+
"mtime": "2026-06-21T02:55:38.893Z",
|
|
77
|
+
"size": 124499,
|
|
78
|
+
"path": "../public/assets/json-viewer-IXejqXB0.js"
|
|
93
79
|
},
|
|
94
|
-
"/assets/ResponseView-
|
|
80
|
+
"/assets/ResponseView-Cvc-ct4E.js": {
|
|
95
81
|
"type": "text/javascript; charset=utf-8",
|
|
96
|
-
"etag": '"
|
|
97
|
-
"mtime": "2026-06-
|
|
98
|
-
"size":
|
|
99
|
-
"path": "../public/assets/ResponseView-
|
|
82
|
+
"etag": '"6aab-UwVVOTtKRLo51GriiJxR9m6Feak"',
|
|
83
|
+
"mtime": "2026-06-21T02:55:38.893Z",
|
|
84
|
+
"size": 27307,
|
|
85
|
+
"path": "../public/assets/ResponseView-Cvc-ct4E.js"
|
|
100
86
|
},
|
|
101
|
-
"/assets/
|
|
87
|
+
"/assets/ReplayDialog-Cl62N9PI.js": {
|
|
102
88
|
"type": "text/javascript; charset=utf-8",
|
|
103
|
-
"etag": '"
|
|
104
|
-
"mtime": "2026-06-
|
|
105
|
-
"size":
|
|
106
|
-
"path": "../public/assets/
|
|
89
|
+
"etag": '"2383-flKSjr0F8tecuRkIDNpAYjivJcI"',
|
|
90
|
+
"mtime": "2026-06-21T02:55:38.893Z",
|
|
91
|
+
"size": 9091,
|
|
92
|
+
"path": "../public/assets/ReplayDialog-Cl62N9PI.js"
|
|
107
93
|
},
|
|
108
|
-
"/assets/
|
|
109
|
-
"type": "
|
|
110
|
-
"etag": '"
|
|
111
|
-
"mtime": "2026-06-
|
|
112
|
-
"size":
|
|
113
|
-
"path": "../public/assets/
|
|
94
|
+
"/assets/RequestAnatomy-DgQWGvjs.js": {
|
|
95
|
+
"type": "text/javascript; charset=utf-8",
|
|
96
|
+
"etag": '"1426-61x287FrHKfb80GSEu4faAyIsQQ"',
|
|
97
|
+
"mtime": "2026-06-21T02:55:38.893Z",
|
|
98
|
+
"size": 5158,
|
|
99
|
+
"path": "../public/assets/RequestAnatomy-DgQWGvjs.js"
|
|
114
100
|
},
|
|
115
|
-
"/assets/
|
|
101
|
+
"/assets/StreamingChunkSequence-BCQaCAIe.js": {
|
|
116
102
|
"type": "text/javascript; charset=utf-8",
|
|
117
|
-
"etag": '"
|
|
118
|
-
"mtime": "2026-06-
|
|
119
|
-
"size":
|
|
120
|
-
"path": "../public/assets/
|
|
103
|
+
"etag": '"d82-mxAzpHhDD3SrHO5SmP2+22ql54A"',
|
|
104
|
+
"mtime": "2026-06-21T02:55:38.893Z",
|
|
105
|
+
"size": 3458,
|
|
106
|
+
"path": "../public/assets/StreamingChunkSequence-BCQaCAIe.js"
|
|
121
107
|
},
|
|
122
|
-
"/assets/
|
|
108
|
+
"/assets/ProxyViewerContainer-CbW5VRER.js": {
|
|
123
109
|
"type": "text/javascript; charset=utf-8",
|
|
124
|
-
"etag": '"
|
|
125
|
-
"mtime": "2026-06-
|
|
126
|
-
"size":
|
|
127
|
-
"path": "../public/assets/
|
|
110
|
+
"etag": '"7d8fb-FLtU4XIXbbkqJROwzR9ncAvk86E"',
|
|
111
|
+
"mtime": "2026-06-21T02:55:38.893Z",
|
|
112
|
+
"size": 514299,
|
|
113
|
+
"path": "../public/assets/ProxyViewerContainer-CbW5VRER.js"
|
|
128
114
|
},
|
|
129
115
|
"/assets/qwen-CONDcHqt.png": {
|
|
130
116
|
"type": "image/png",
|
|
131
117
|
"etag": '"572c3-cdJAPaHdOvFCGzuaQjagdgOu6XE"',
|
|
132
|
-
"mtime": "2026-06-
|
|
118
|
+
"mtime": "2026-06-21T02:55:38.892Z",
|
|
133
119
|
"size": 357059,
|
|
134
120
|
"path": "../public/assets/qwen-CONDcHqt.png"
|
|
135
121
|
},
|
|
136
|
-
"/assets/
|
|
122
|
+
"/assets/zhipuai-BPNAnxo-.svg": {
|
|
123
|
+
"type": "image/svg+xml",
|
|
124
|
+
"etag": '"2bf8-hNaLCTi89nOFCsIIfWpP/jrfo0s"',
|
|
125
|
+
"mtime": "2026-06-21T02:55:38.892Z",
|
|
126
|
+
"size": 11256,
|
|
127
|
+
"path": "../public/assets/zhipuai-BPNAnxo-.svg"
|
|
128
|
+
},
|
|
129
|
+
"/assets/main-2NlGzgOe.js": {
|
|
137
130
|
"type": "text/javascript; charset=utf-8",
|
|
138
|
-
"etag": '"
|
|
139
|
-
"mtime": "2026-06-
|
|
140
|
-
"size":
|
|
141
|
-
"path": "../public/assets/
|
|
131
|
+
"etag": '"5138c-nIshtdU9NYoVXvBBEN1D74xi9gk"',
|
|
132
|
+
"mtime": "2026-06-21T02:55:38.892Z",
|
|
133
|
+
"size": 332684,
|
|
134
|
+
"path": "../public/assets/main-2NlGzgOe.js"
|
|
135
|
+
},
|
|
136
|
+
"/assets/_sessionId-CcD_aLGq.js": {
|
|
137
|
+
"type": "text/javascript; charset=utf-8",
|
|
138
|
+
"etag": '"d2-ELNVvbTmYkGjU2wEF0iGQm6YfmM"',
|
|
139
|
+
"mtime": "2026-06-21T02:55:38.892Z",
|
|
140
|
+
"size": 210,
|
|
141
|
+
"path": "../public/assets/_sessionId-CcD_aLGq.js"
|
|
142
142
|
}
|
|
143
143
|
};
|
|
144
144
|
function readAsset(id) {
|
package/package.json
CHANGED
|
@@ -3,13 +3,8 @@ import type { JSX } from "react";
|
|
|
3
3
|
import { useOnboarding } from "../lib/useOnboarding";
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
|
-
* First-launch onboarding banner. Shows once on a fresh install
|
|
7
|
-
*
|
|
8
|
-
* shapes the proxy captures, and disappears forever on dismissal.
|
|
9
|
-
*
|
|
10
|
-
* The "seen" state lives in the server's runtime config — see
|
|
11
|
-
* `useOnboarding` — so the dismissal persists across browser sessions
|
|
12
|
-
* and devices for the same install.
|
|
6
|
+
* First-launch onboarding banner. Shows once on a fresh install and persists
|
|
7
|
+
* dismissal through the server runtime config.
|
|
13
8
|
*/
|
|
14
9
|
export function OnboardingBanner(): JSX.Element | null {
|
|
15
10
|
const { hasSeenOnboarding, isLoading, markSeen } = useOnboarding();
|
|
@@ -22,22 +17,19 @@ export function OnboardingBanner(): JSX.Element | null {
|
|
|
22
17
|
aria-label="Onboarding tip"
|
|
23
18
|
className="mx-4 mt-2 mb-1 flex items-start gap-3 rounded-md border border-amber-500/30 bg-amber-500/5 px-4 py-3 text-sm"
|
|
24
19
|
>
|
|
25
|
-
<div className="
|
|
26
|
-
<div className="font-medium text-amber-600 dark:text-amber-400
|
|
27
|
-
|
|
20
|
+
<div className="min-w-0 flex-1">
|
|
21
|
+
<div className="mb-1 font-medium text-amber-600 dark:text-amber-400">
|
|
22
|
+
Agent Inspector is ready
|
|
28
23
|
</div>
|
|
29
|
-
<ul className="space-y-0.5 text-
|
|
24
|
+
<ul className="space-y-0.5 text-xs leading-relaxed text-muted-foreground">
|
|
30
25
|
<li>
|
|
31
|
-
<strong>
|
|
32
|
-
proxy sent and received.
|
|
26
|
+
<strong>Trace</strong>: requests, responses, streaming chunks, tools, and timing.
|
|
33
27
|
</li>
|
|
34
28
|
<li>
|
|
35
|
-
<strong>
|
|
29
|
+
<strong>Replay</strong>: resend captured requests and compare provider behavior.
|
|
36
30
|
</li>
|
|
37
31
|
<li>
|
|
38
|
-
<strong>
|
|
39
|
-
<strong>Raw Response</strong> — exact bytes from the upstream provider (visible in Full
|
|
40
|
-
mode).
|
|
32
|
+
<strong>Memory</strong>: create reviewable candidates before promotion to OpenClaw.
|
|
41
33
|
</li>
|
|
42
34
|
</ul>
|
|
43
35
|
</div>
|
|
@@ -46,7 +38,7 @@ export function OnboardingBanner(): JSX.Element | null {
|
|
|
46
38
|
onClick={() => {
|
|
47
39
|
void markSeen();
|
|
48
40
|
}}
|
|
49
|
-
className="inline-flex items-center gap-1.5
|
|
41
|
+
className="inline-flex h-8 shrink-0 items-center gap-1.5 rounded-md border border-amber-500/40 px-3 text-xs text-amber-700 transition-colors hover:bg-amber-500/10 dark:text-amber-300"
|
|
50
42
|
aria-label="Dismiss onboarding tip"
|
|
51
43
|
>
|
|
52
44
|
<Check className="size-3.5" />
|
|
@@ -57,7 +49,7 @@ export function OnboardingBanner(): JSX.Element | null {
|
|
|
57
49
|
onClick={() => {
|
|
58
50
|
void markSeen();
|
|
59
51
|
}}
|
|
60
|
-
className="
|
|
52
|
+
className="-m-1 shrink-0 p-1 text-muted-foreground transition-colors hover:text-foreground"
|
|
61
53
|
aria-label="Dismiss"
|
|
62
54
|
>
|
|
63
55
|
<X className="size-3.5" />
|
|
@@ -253,7 +253,7 @@ export function ProxyViewer({
|
|
|
253
253
|
);
|
|
254
254
|
const logListRef = useRef<HTMLDivElement>(null);
|
|
255
255
|
const logListWrapperRef = useRef<HTMLDivElement>(null);
|
|
256
|
-
useKeyboardNavigation(logListRef, logListWrapperRef);
|
|
256
|
+
useKeyboardNavigation(logListRef, logListWrapperRef, { pageWide: true });
|
|
257
257
|
|
|
258
258
|
useEffect(() => {
|
|
259
259
|
const perCrabDuration = 400;
|
|
@@ -110,30 +110,16 @@ function TestStatus({ result }: { result: ProviderTestState }): JSX.Element {
|
|
|
110
110
|
}
|
|
111
111
|
if (result.cacheCreationInputTokens !== undefined && result.cacheCreationInputTokens > 0) {
|
|
112
112
|
tokenParts.push(
|
|
113
|
-
<
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
<span className="font-mono tabular-nums text-emerald-400">
|
|
117
|
-
+{result.cacheCreationInputTokens} cache
|
|
118
|
-
</span>
|
|
119
|
-
</TooltipTrigger>
|
|
120
|
-
<TooltipContent>Tokens cached for reuse, reducing future API cost</TooltipContent>
|
|
121
|
-
</Tooltip>
|
|
122
|
-
</TooltipProvider>,
|
|
113
|
+
<span key="cache-create" className="font-mono tabular-nums text-emerald-400">
|
|
114
|
+
KV Cache +{result.cacheCreationInputTokens}
|
|
115
|
+
</span>,
|
|
123
116
|
);
|
|
124
117
|
}
|
|
125
118
|
if (result.cacheReadInputTokens !== undefined && result.cacheReadInputTokens > 0) {
|
|
126
119
|
tokenParts.push(
|
|
127
|
-
<
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
<span className="font-mono tabular-nums text-purple-400">
|
|
131
|
-
~{result.cacheReadInputTokens} cached
|
|
132
|
-
</span>
|
|
133
|
-
</TooltipTrigger>
|
|
134
|
-
<TooltipContent>Tokens served from cache, reducing API cost</TooltipContent>
|
|
135
|
-
</Tooltip>
|
|
136
|
-
</TooltipProvider>,
|
|
120
|
+
<span key="cache-read" className="font-mono tabular-nums text-purple-400">
|
|
121
|
+
KV Cache ~{result.cacheReadInputTokens}
|
|
122
|
+
</span>,
|
|
137
123
|
);
|
|
138
124
|
}
|
|
139
125
|
const displayTokens: ReactNode[] = [];
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { type JSX, useState, useCallback } from "react";
|
|
2
|
-
import { Settings } from "lucide-react";
|
|
1
|
+
import { type JSX, useState, useCallback, useMemo } from "react";
|
|
2
|
+
import { Check, Copy, Settings, Terminal } from "lucide-react";
|
|
3
3
|
import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from "../ui/dialog";
|
|
4
4
|
import { Tabs, TabsList, TabsTrigger, TabsContent } from "../ui/tabs";
|
|
5
5
|
import { Button } from "../ui/button";
|
|
@@ -72,6 +72,7 @@ export function SettingsDialog(): JSX.Element {
|
|
|
72
72
|
<TabsList>
|
|
73
73
|
<TabsTrigger value="providers">Providers</TabsTrigger>
|
|
74
74
|
<TabsTrigger value="proxy">Proxy</TabsTrigger>
|
|
75
|
+
<TabsTrigger value="onboarding">Onboarding</TabsTrigger>
|
|
75
76
|
</TabsList>
|
|
76
77
|
|
|
77
78
|
<div className="mt-4 overflow-y-auto flex-1 pr-3">
|
|
@@ -93,6 +94,9 @@ export function SettingsDialog(): JSX.Element {
|
|
|
93
94
|
<TabsContent value="proxy">
|
|
94
95
|
<ProxySettingsTab />
|
|
95
96
|
</TabsContent>
|
|
97
|
+
<TabsContent value="onboarding">
|
|
98
|
+
<OnboardingSettingsTab />
|
|
99
|
+
</TabsContent>
|
|
96
100
|
</div>
|
|
97
101
|
</Tabs>
|
|
98
102
|
</DialogContent>
|
|
@@ -100,6 +104,95 @@ export function SettingsDialog(): JSX.Element {
|
|
|
100
104
|
);
|
|
101
105
|
}
|
|
102
106
|
|
|
107
|
+
function CopyableSetupValue({
|
|
108
|
+
id,
|
|
109
|
+
label,
|
|
110
|
+
value,
|
|
111
|
+
copiedId,
|
|
112
|
+
onCopy,
|
|
113
|
+
}: {
|
|
114
|
+
id: string;
|
|
115
|
+
label: string;
|
|
116
|
+
value: string;
|
|
117
|
+
copiedId: string | null;
|
|
118
|
+
onCopy: (id: string, value: string) => void;
|
|
119
|
+
}): JSX.Element {
|
|
120
|
+
const copied = copiedId === id;
|
|
121
|
+
return (
|
|
122
|
+
<div className="rounded-md border border-border bg-muted/20 px-3 py-2">
|
|
123
|
+
<div className="mb-1 text-xs font-medium text-muted-foreground">{label}</div>
|
|
124
|
+
<div className="flex min-w-0 items-center gap-2">
|
|
125
|
+
<code className="min-w-0 flex-1 truncate font-mono text-xs text-foreground">{value}</code>
|
|
126
|
+
<Button
|
|
127
|
+
type="button"
|
|
128
|
+
variant="ghost"
|
|
129
|
+
size="icon"
|
|
130
|
+
className="size-7 shrink-0"
|
|
131
|
+
onClick={() => onCopy(id, value)}
|
|
132
|
+
aria-label={copied ? `Copied ${label}` : `Copy ${label}`}
|
|
133
|
+
>
|
|
134
|
+
{copied ? <Check className="size-3.5 text-emerald-500" /> : <Copy className="size-3.5" />}
|
|
135
|
+
</Button>
|
|
136
|
+
</div>
|
|
137
|
+
</div>
|
|
138
|
+
);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
function OnboardingSettingsTab(): JSX.Element {
|
|
142
|
+
const [copiedId, setCopiedId] = useState<string | null>(null);
|
|
143
|
+
const origin = useMemo(() => {
|
|
144
|
+
if (typeof window === "undefined") return "http://localhost:25947";
|
|
145
|
+
return window.location.origin;
|
|
146
|
+
}, []);
|
|
147
|
+
const values = useMemo(
|
|
148
|
+
() => [
|
|
149
|
+
{ id: "skill", label: "Codex skill", value: "agent-inspector onboard --force" },
|
|
150
|
+
{ id: "mcp", label: "MCP URL", value: `${origin}/api/mcp` },
|
|
151
|
+
{ id: "proxy", label: "Proxy URL", value: `${origin}/proxy` },
|
|
152
|
+
{ id: "anthropic", label: "Anthropic base", value: `ANTHROPIC_BASE_URL=${origin}/proxy` },
|
|
153
|
+
],
|
|
154
|
+
[origin],
|
|
155
|
+
);
|
|
156
|
+
|
|
157
|
+
const handleCopy = useCallback((id: string, value: string) => {
|
|
158
|
+
void window.navigator.clipboard.writeText(value).then(() => {
|
|
159
|
+
setCopiedId(id);
|
|
160
|
+
setTimeout(() => setCopiedId(null), 1600);
|
|
161
|
+
});
|
|
162
|
+
}, []);
|
|
163
|
+
|
|
164
|
+
return (
|
|
165
|
+
<div className="space-y-4">
|
|
166
|
+
<div className="flex items-center gap-2">
|
|
167
|
+
<Terminal className="size-4 text-muted-foreground" />
|
|
168
|
+
<h3 className="text-sm font-semibold">Agent onboarding</h3>
|
|
169
|
+
</div>
|
|
170
|
+
<div className="grid gap-2">
|
|
171
|
+
{values.map((item) => (
|
|
172
|
+
<CopyableSetupValue
|
|
173
|
+
key={item.id}
|
|
174
|
+
id={item.id}
|
|
175
|
+
label={item.label}
|
|
176
|
+
value={item.value}
|
|
177
|
+
copiedId={copiedId}
|
|
178
|
+
onCopy={handleCopy}
|
|
179
|
+
/>
|
|
180
|
+
))}
|
|
181
|
+
</div>
|
|
182
|
+
<div className="grid gap-2 rounded-md border border-border bg-background px-3 py-2 text-xs text-muted-foreground">
|
|
183
|
+
<div className="flex items-center gap-2">
|
|
184
|
+
<Check className="size-3.5 text-emerald-500" />
|
|
185
|
+
<span>Provider test creates a traceable memory probe session.</span>
|
|
186
|
+
</div>
|
|
187
|
+
<div className="flex items-center gap-2">
|
|
188
|
+
<Check className="size-3.5 text-emerald-500" />
|
|
189
|
+
<span>Captured sessions can produce reviewable memory candidates.</span>
|
|
190
|
+
</div>
|
|
191
|
+
</div>
|
|
192
|
+
</div>
|
|
193
|
+
);
|
|
194
|
+
}
|
|
195
|
+
|
|
103
196
|
function ProxySettingsTab(): JSX.Element {
|
|
104
197
|
const {
|
|
105
198
|
strip,
|