@tonyclaw/agent-inspector 2.0.0

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 (400) hide show
  1. package/.output/cli.js +1611 -0
  2. package/.output/nitro.json +17 -0
  3. package/.output/public/assets/CompareDrawer-CU5ZrWcL.js +1 -0
  4. package/.output/public/assets/ProxyViewerContainer-pEBqVp1d.js +101 -0
  5. package/.output/public/assets/ReplayDialog-F58yNg5j.js +1 -0
  6. package/.output/public/assets/RequestAnatomy-C9lT0qE_.js +1 -0
  7. package/.output/public/assets/ResponseView-DHJq6bnz.js +1 -0
  8. package/.output/public/assets/StreamingChunkSequence-BTgfpFUT.js +1 -0
  9. package/.output/public/assets/_sessionId-DsNRbnNm.js +1 -0
  10. package/.output/public/assets/alibaba-TTwafVwX.svg +1 -0
  11. package/.output/public/assets/index-CpWG2hFn.css +1 -0
  12. package/.output/public/assets/index-DmBV8Gve.js +1 -0
  13. package/.output/public/assets/json-viewer-CZVYLR8j.js +14 -0
  14. package/.output/public/assets/main-DHs7FBK3.js +18 -0
  15. package/.output/public/assets/minimax-BPMzvuL-.jpeg +0 -0
  16. package/.output/public/assets/qwen-CONDcHqt.png +0 -0
  17. package/.output/public/assets/zhipuai-BPNAnxo-.svg +219 -0
  18. package/.output/server/_chunks/ssr-renderer.mjs +22 -0
  19. package/.output/server/_libs/@radix-ui/react-accessible-icon+[...].mjs +1 -0
  20. package/.output/server/_libs/@radix-ui/react-dismissable-layer+[...].mjs +210 -0
  21. package/.output/server/_libs/@radix-ui/react-navigation-menu+[...].mjs +2 -0
  22. package/.output/server/_libs/@radix-ui/react-one-time-password-field+[...].mjs +2 -0
  23. package/.output/server/_libs/@radix-ui/react-password-toggle-field+[...].mjs +2 -0
  24. package/.output/server/_libs/@radix-ui/react-use-callback-ref+[...].mjs +11 -0
  25. package/.output/server/_libs/@radix-ui/react-use-controllable-state+[...].mjs +69 -0
  26. package/.output/server/_libs/@radix-ui/react-use-effect-event+[...].mjs +1 -0
  27. package/.output/server/_libs/@radix-ui/react-use-escape-keydown+[...].mjs +17 -0
  28. package/.output/server/_libs/@radix-ui/react-use-is-hydrated+[...].mjs +1 -0
  29. package/.output/server/_libs/@radix-ui/react-use-layout-effect+[...].mjs +6 -0
  30. package/.output/server/_libs/@radix-ui/react-visually-hidden+[...].mjs +34 -0
  31. package/.output/server/_libs/ajv-formats.mjs +330 -0
  32. package/.output/server/_libs/ajv.mjs +11444 -0
  33. package/.output/server/_libs/aria-hidden.mjs +122 -0
  34. package/.output/server/_libs/atomically.mjs +152 -0
  35. package/.output/server/_libs/bail.mjs +8 -0
  36. package/.output/server/_libs/cfworker__json-schema.mjs +1 -0
  37. package/.output/server/_libs/character-entities.mjs +2130 -0
  38. package/.output/server/_libs/class-variance-authority.mjs +44 -0
  39. package/.output/server/_libs/clsx.mjs +16 -0
  40. package/.output/server/_libs/comma-separated-tokens.mjs +10 -0
  41. package/.output/server/_libs/conf.mjs +635 -0
  42. package/.output/server/_libs/cookie-es.mjs +58 -0
  43. package/.output/server/_libs/core-util-is.mjs +75 -0
  44. package/.output/server/_libs/croner.mjs +1 -0
  45. package/.output/server/_libs/crossws.mjs +1 -0
  46. package/.output/server/_libs/debounce-fn.mjs +69 -0
  47. package/.output/server/_libs/decode-named-character-reference+[...].mjs +8 -0
  48. package/.output/server/_libs/dequal.mjs +27 -0
  49. package/.output/server/_libs/detect-node-es.mjs +1 -0
  50. package/.output/server/_libs/devlop.mjs +8 -0
  51. package/.output/server/_libs/diff.mjs +320 -0
  52. package/.output/server/_libs/dot-prop.mjs +265 -0
  53. package/.output/server/_libs/env-paths.mjs +57 -0
  54. package/.output/server/_libs/estree-util-is-identifier-name.mjs +11 -0
  55. package/.output/server/_libs/extend.mjs +97 -0
  56. package/.output/server/_libs/fast-deep-equal.mjs +38 -0
  57. package/.output/server/_libs/fast-uri.mjs +812 -0
  58. package/.output/server/_libs/floating-ui__core.mjs +725 -0
  59. package/.output/server/_libs/floating-ui__dom.mjs +622 -0
  60. package/.output/server/_libs/floating-ui__react-dom.mjs +292 -0
  61. package/.output/server/_libs/floating-ui__utils.mjs +320 -0
  62. package/.output/server/_libs/get-nonce.mjs +9 -0
  63. package/.output/server/_libs/h3-v2.mjs +276 -0
  64. package/.output/server/_libs/h3.mjs +408 -0
  65. package/.output/server/_libs/hast-util-to-jsx-runtime.mjs +388 -0
  66. package/.output/server/_libs/hast-util-whitespace.mjs +10 -0
  67. package/.output/server/_libs/hookable.mjs +1 -0
  68. package/.output/server/_libs/html-url-attributes.mjs +26 -0
  69. package/.output/server/_libs/immediate.mjs +74 -0
  70. package/.output/server/_libs/inherits.mjs +50 -0
  71. package/.output/server/_libs/inline-style-parser.mjs +142 -0
  72. package/.output/server/_libs/is-plain-obj.mjs +10 -0
  73. package/.output/server/_libs/isarray.mjs +14 -0
  74. package/.output/server/_libs/isbot.mjs +20 -0
  75. package/.output/server/_libs/json-schema-traverse.mjs +180 -0
  76. package/.output/server/_libs/jszip.mjs +3051 -0
  77. package/.output/server/_libs/lie.mjs +273 -0
  78. package/.output/server/_libs/lucide-react.mjs +492 -0
  79. package/.output/server/_libs/mdast-util-from-markdown.mjs +717 -0
  80. package/.output/server/_libs/mdast-util-to-hast.mjs +710 -0
  81. package/.output/server/_libs/mdast-util-to-string.mjs +38 -0
  82. package/.output/server/_libs/micromark-core-commonmark.mjs +2259 -0
  83. package/.output/server/_libs/micromark-factory-destination.mjs +94 -0
  84. package/.output/server/_libs/micromark-factory-label.mjs +63 -0
  85. package/.output/server/_libs/micromark-factory-space.mjs +24 -0
  86. package/.output/server/_libs/micromark-factory-title.mjs +65 -0
  87. package/.output/server/_libs/micromark-factory-whitespace.mjs +22 -0
  88. package/.output/server/_libs/micromark-util-character.mjs +44 -0
  89. package/.output/server/_libs/micromark-util-chunked.mjs +36 -0
  90. package/.output/server/_libs/micromark-util-classify-character+[...].mjs +12 -0
  91. package/.output/server/_libs/micromark-util-combine-extensions+[...].mjs +41 -0
  92. package/.output/server/_libs/micromark-util-decode-numeric-character-reference+[...].mjs +19 -0
  93. package/.output/server/_libs/micromark-util-decode-string.mjs +21 -0
  94. package/.output/server/_libs/micromark-util-encode.mjs +1 -0
  95. package/.output/server/_libs/micromark-util-html-tag-name.mjs +69 -0
  96. package/.output/server/_libs/micromark-util-normalize-identifier+[...].mjs +6 -0
  97. package/.output/server/_libs/micromark-util-resolve-all.mjs +15 -0
  98. package/.output/server/_libs/micromark-util-sanitize-uri.mjs +41 -0
  99. package/.output/server/_libs/micromark-util-subtokenize.mjs +346 -0
  100. package/.output/server/_libs/micromark.mjs +906 -0
  101. package/.output/server/_libs/mimic-function.mjs +47 -0
  102. package/.output/server/_libs/modelcontextprotocol__server.mjs +9738 -0
  103. package/.output/server/_libs/ocache.mjs +1 -0
  104. package/.output/server/_libs/ohash.mjs +1 -0
  105. package/.output/server/_libs/pako.mjs +4223 -0
  106. package/.output/server/_libs/process-nextick-args.mjs +48 -0
  107. package/.output/server/_libs/property-information.mjs +1209 -0
  108. package/.output/server/_libs/radix-ui.mjs +1 -0
  109. package/.output/server/_libs/radix-ui__number.mjs +6 -0
  110. package/.output/server/_libs/radix-ui__primitive.mjs +11 -0
  111. package/.output/server/_libs/radix-ui__react-accordion.mjs +1 -0
  112. package/.output/server/_libs/radix-ui__react-alert-dialog.mjs +1 -0
  113. package/.output/server/_libs/radix-ui__react-arrow.mjs +23 -0
  114. package/.output/server/_libs/radix-ui__react-aspect-ratio.mjs +1 -0
  115. package/.output/server/_libs/radix-ui__react-avatar.mjs +1 -0
  116. package/.output/server/_libs/radix-ui__react-checkbox.mjs +1 -0
  117. package/.output/server/_libs/radix-ui__react-collapsible.mjs +144 -0
  118. package/.output/server/_libs/radix-ui__react-collection.mjs +69 -0
  119. package/.output/server/_libs/radix-ui__react-compose-refs.mjs +39 -0
  120. package/.output/server/_libs/radix-ui__react-context-menu.mjs +1 -0
  121. package/.output/server/_libs/radix-ui__react-context.mjs +78 -0
  122. package/.output/server/_libs/radix-ui__react-dialog.mjs +325 -0
  123. package/.output/server/_libs/radix-ui__react-direction.mjs +9 -0
  124. package/.output/server/_libs/radix-ui__react-dropdown-menu.mjs +1 -0
  125. package/.output/server/_libs/radix-ui__react-focus-guards.mjs +29 -0
  126. package/.output/server/_libs/radix-ui__react-focus-scope.mjs +206 -0
  127. package/.output/server/_libs/radix-ui__react-form.mjs +1 -0
  128. package/.output/server/_libs/radix-ui__react-hover-card.mjs +1 -0
  129. package/.output/server/_libs/radix-ui__react-id.mjs +14 -0
  130. package/.output/server/_libs/radix-ui__react-label.mjs +1 -0
  131. package/.output/server/_libs/radix-ui__react-menu.mjs +1 -0
  132. package/.output/server/_libs/radix-ui__react-menubar.mjs +1 -0
  133. package/.output/server/_libs/radix-ui__react-popover.mjs +1 -0
  134. package/.output/server/_libs/radix-ui__react-popper.mjs +286 -0
  135. package/.output/server/_libs/radix-ui__react-portal.mjs +16 -0
  136. package/.output/server/_libs/radix-ui__react-presence.mjs +128 -0
  137. package/.output/server/_libs/radix-ui__react-primitive.mjs +42 -0
  138. package/.output/server/_libs/radix-ui__react-progress.mjs +1 -0
  139. package/.output/server/_libs/radix-ui__react-radio-group.mjs +1 -0
  140. package/.output/server/_libs/radix-ui__react-roving-focus.mjs +224 -0
  141. package/.output/server/_libs/radix-ui__react-scroll-area.mjs +721 -0
  142. package/.output/server/_libs/radix-ui__react-select.mjs +1163 -0
  143. package/.output/server/_libs/radix-ui__react-separator.mjs +28 -0
  144. package/.output/server/_libs/radix-ui__react-slider.mjs +1 -0
  145. package/.output/server/_libs/radix-ui__react-slot.mjs +99 -0
  146. package/.output/server/_libs/radix-ui__react-switch.mjs +1 -0
  147. package/.output/server/_libs/radix-ui__react-tabs.mjs +189 -0
  148. package/.output/server/_libs/radix-ui__react-toast.mjs +2 -0
  149. package/.output/server/_libs/radix-ui__react-toggle-group.mjs +1 -0
  150. package/.output/server/_libs/radix-ui__react-toggle.mjs +1 -0
  151. package/.output/server/_libs/radix-ui__react-toolbar.mjs +1 -0
  152. package/.output/server/_libs/radix-ui__react-tooltip.mjs +495 -0
  153. package/.output/server/_libs/radix-ui__react-use-previous.mjs +14 -0
  154. package/.output/server/_libs/radix-ui__react-use-size.mjs +39 -0
  155. package/.output/server/_libs/react-dom.mjs +10781 -0
  156. package/.output/server/_libs/react-markdown.mjs +147 -0
  157. package/.output/server/_libs/react-remove-scroll-bar.mjs +82 -0
  158. package/.output/server/_libs/react-remove-scroll.mjs +328 -0
  159. package/.output/server/_libs/react-style-singleton.mjs +69 -0
  160. package/.output/server/_libs/react.mjs +515 -0
  161. package/.output/server/_libs/readable-stream.mjs +1518 -0
  162. package/.output/server/_libs/remark-parse.mjs +19 -0
  163. package/.output/server/_libs/remark-rehype.mjs +21 -0
  164. package/.output/server/_libs/rou3.mjs +14 -0
  165. package/.output/server/_libs/safe-buffer.mjs +64 -0
  166. package/.output/server/_libs/semver.mjs +1938 -0
  167. package/.output/server/_libs/seroval-plugins.mjs +58 -0
  168. package/.output/server/_libs/seroval.mjs +1765 -0
  169. package/.output/server/_libs/setimmediate.mjs +152 -0
  170. package/.output/server/_libs/space-separated-tokens.mjs +6 -0
  171. package/.output/server/_libs/srvx.mjs +1029 -0
  172. package/.output/server/_libs/stubborn-fs.mjs +91 -0
  173. package/.output/server/_libs/stubborn-utils.mjs +66 -0
  174. package/.output/server/_libs/style-to-js.mjs +72 -0
  175. package/.output/server/_libs/style-to-object.mjs +38 -0
  176. package/.output/server/_libs/swr.mjs +939 -0
  177. package/.output/server/_libs/tailwind-merge.mjs +3010 -0
  178. package/.output/server/_libs/tanstack__history.mjs +217 -0
  179. package/.output/server/_libs/tanstack__react-router.mjs +1480 -0
  180. package/.output/server/_libs/tanstack__react-store.mjs +1 -0
  181. package/.output/server/_libs/tanstack__react-virtual.mjs +44 -0
  182. package/.output/server/_libs/tanstack__router-core.mjs +4827 -0
  183. package/.output/server/_libs/tanstack__store.mjs +1 -0
  184. package/.output/server/_libs/tanstack__virtual-core.mjs +1225 -0
  185. package/.output/server/_libs/tiny-invariant.mjs +12 -0
  186. package/.output/server/_libs/tiny-warning.mjs +5 -0
  187. package/.output/server/_libs/trim-lines.mjs +41 -0
  188. package/.output/server/_libs/trough.mjs +85 -0
  189. package/.output/server/_libs/tslib.mjs +1 -0
  190. package/.output/server/_libs/ufo.mjs +54 -0
  191. package/.output/server/_libs/uint8array-extras.mjs +69 -0
  192. package/.output/server/_libs/ungap__structured-clone.mjs +212 -0
  193. package/.output/server/_libs/unified.mjs +661 -0
  194. package/.output/server/_libs/unist-util-is.mjs +100 -0
  195. package/.output/server/_libs/unist-util-position.mjs +27 -0
  196. package/.output/server/_libs/unist-util-stringify-position.mjs +27 -0
  197. package/.output/server/_libs/unist-util-visit-parents.mjs +82 -0
  198. package/.output/server/_libs/unist-util-visit.mjs +24 -0
  199. package/.output/server/_libs/unstorage.mjs +1 -0
  200. package/.output/server/_libs/use-callback-ref.mjs +66 -0
  201. package/.output/server/_libs/use-sidecar.mjs +106 -0
  202. package/.output/server/_libs/use-sync-external-store.mjs +64 -0
  203. package/.output/server/_libs/util-deprecate.mjs +12 -0
  204. package/.output/server/_libs/vfile-message.mjs +138 -0
  205. package/.output/server/_libs/vfile.mjs +467 -0
  206. package/.output/server/_libs/when-exit.mjs +53 -0
  207. package/.output/server/_libs/zod.mjs +4524 -0
  208. package/.output/server/_sessionId-wMLPvC5g.mjs +123 -0
  209. package/.output/server/_ssr/CompareDrawer-BU4V0uVf.mjs +1041 -0
  210. package/.output/server/_ssr/ProxyViewerContainer-BnRwFEnn.mjs +5972 -0
  211. package/.output/server/_ssr/ReplayDialog-C7dn9pd_.mjs +322 -0
  212. package/.output/server/_ssr/RequestAnatomy-C1rWpe9-.mjs +353 -0
  213. package/.output/server/_ssr/ResponseView-hGpPaYsf.mjs +602 -0
  214. package/.output/server/_ssr/StreamingChunkSequence-BRWI1r_G.mjs +302 -0
  215. package/.output/server/_ssr/index-BKURLVPz.mjs +118 -0
  216. package/.output/server/_ssr/index.mjs +1184 -0
  217. package/.output/server/_ssr/json-viewer-BBd2DtQP.mjs +515 -0
  218. package/.output/server/_ssr/router-BcZ0D6AB.mjs +6317 -0
  219. package/.output/server/_ssr/start-HYkvq4Ni.mjs +4 -0
  220. package/.output/server/_tanstack-start-manifest_v-1y8ZVxRI.mjs +4 -0
  221. package/.output/server/index.mjs +436 -0
  222. package/.output/server/node_modules/tslib/modules/index.js +70 -0
  223. package/.output/server/node_modules/tslib/modules/package.json +3 -0
  224. package/.output/server/node_modules/tslib/package.json +47 -0
  225. package/.output/server/node_modules/tslib/tslib.js +484 -0
  226. package/.output/server/package.json +9 -0
  227. package/LICENSE +21 -0
  228. package/README.md +52 -0
  229. package/package.json +110 -0
  230. package/src/assets/favicon.svg +31 -0
  231. package/src/assets/logos/alibaba.svg +1 -0
  232. package/src/assets/logos/anthropic.svg +1 -0
  233. package/src/assets/logos/claude-code.svg +4 -0
  234. package/src/assets/logos/deepseek.svg +1 -0
  235. package/src/assets/logos/mcp.png +0 -0
  236. package/src/assets/logos/minimax.jpeg +0 -0
  237. package/src/assets/logos/openai.svg +1 -0
  238. package/src/assets/logos/opencode.svg +4 -0
  239. package/src/assets/logos/qwen.png +0 -0
  240. package/src/assets/logos/zhipuai.svg +219 -0
  241. package/src/cli/detect-tools.ts +147 -0
  242. package/src/cli/doctor.ts +521 -0
  243. package/src/cli/onboard.ts +224 -0
  244. package/src/cli/templates/command-onboard.ts +17 -0
  245. package/src/cli/templates/skill-onboard.ts +547 -0
  246. package/src/cli.ts +345 -0
  247. package/src/components/OnboardingBanner.tsx +67 -0
  248. package/src/components/ProxyViewer.tsx +545 -0
  249. package/src/components/ProxyViewerContainer.tsx +363 -0
  250. package/src/components/providers/ImportWizardDialog.tsx +349 -0
  251. package/src/components/providers/ProviderCard.tsx +474 -0
  252. package/src/components/providers/ProviderForm.tsx +494 -0
  253. package/src/components/providers/ProviderLogo.tsx +117 -0
  254. package/src/components/providers/ProvidersPanel.tsx +619 -0
  255. package/src/components/providers/SettingsDialog.tsx +202 -0
  256. package/src/components/proxy-viewer/CompareDrawer.tsx +893 -0
  257. package/src/components/proxy-viewer/ConversationGroup.tsx +107 -0
  258. package/src/components/proxy-viewer/ConversationHeader.tsx +300 -0
  259. package/src/components/proxy-viewer/LogEntry.tsx +543 -0
  260. package/src/components/proxy-viewer/LogEntryHeader.tsx +501 -0
  261. package/src/components/proxy-viewer/ReplayDialog.tsx +218 -0
  262. package/src/components/proxy-viewer/ResponseView.tsx +171 -0
  263. package/src/components/proxy-viewer/StreamingChunkSequence.tsx +188 -0
  264. package/src/components/proxy-viewer/ThreadConnector.tsx +136 -0
  265. package/src/components/proxy-viewer/TurnGroup.tsx +337 -0
  266. package/src/components/proxy-viewer/anatomy/RequestAnatomy.tsx +98 -0
  267. package/src/components/proxy-viewer/anatomy/SegmentBar.tsx +196 -0
  268. package/src/components/proxy-viewer/anatomy/tokenEstimate.ts +53 -0
  269. package/src/components/proxy-viewer/anatomy/types.ts +39 -0
  270. package/src/components/proxy-viewer/anatomy/useAnatomyJump.ts +114 -0
  271. package/src/components/proxy-viewer/cacheTrend.ts +50 -0
  272. package/src/components/proxy-viewer/diff/DiffView.tsx +321 -0
  273. package/src/components/proxy-viewer/diff/computeDiff.ts +178 -0
  274. package/src/components/proxy-viewer/diff/index.ts +3 -0
  275. package/src/components/proxy-viewer/formats/anthropic/ContentBlocks.tsx +157 -0
  276. package/src/components/proxy-viewer/formats/anthropic/ResponseView.tsx +66 -0
  277. package/src/components/proxy-viewer/formats/anthropic/thinkingExtract.ts +21 -0
  278. package/src/components/proxy-viewer/formats/index.tsx +33 -0
  279. package/src/components/proxy-viewer/formats/openai/ResponseView.tsx +170 -0
  280. package/src/components/proxy-viewer/index.ts +9 -0
  281. package/src/components/proxy-viewer/lazy.ts +37 -0
  282. package/src/components/proxy-viewer/log-formats/anthropic.ts +194 -0
  283. package/src/components/proxy-viewer/log-formats/index.ts +23 -0
  284. package/src/components/proxy-viewer/log-formats/openai.ts +167 -0
  285. package/src/components/proxy-viewer/log-formats/types.ts +40 -0
  286. package/src/components/proxy-viewer/log-formats/unknown.ts +18 -0
  287. package/src/components/proxy-viewer/logEntryVisibility.ts +39 -0
  288. package/src/components/proxy-viewer/requestDiff.ts +277 -0
  289. package/src/components/proxy-viewer/useCopyFeedback.ts +36 -0
  290. package/src/components/proxy-viewer/useKeyboardNavigation.ts +190 -0
  291. package/src/components/proxy-viewer/viewerState.ts +66 -0
  292. package/src/components/ui/badge.tsx +47 -0
  293. package/src/components/ui/button.tsx +47 -0
  294. package/src/components/ui/collapsible.tsx +21 -0
  295. package/src/components/ui/confirm-dialog.tsx +51 -0
  296. package/src/components/ui/crab-logo.tsx +95 -0
  297. package/src/components/ui/crab-variants.tsx +467 -0
  298. package/src/components/ui/dialog.tsx +129 -0
  299. package/src/components/ui/json-expansion-button.tsx +56 -0
  300. package/src/components/ui/json-viewer-bulk.ts +97 -0
  301. package/src/components/ui/json-viewer.tsx +494 -0
  302. package/src/components/ui/mcp-logo.tsx +20 -0
  303. package/src/components/ui/scroll-area.tsx +54 -0
  304. package/src/components/ui/select.tsx +178 -0
  305. package/src/components/ui/separator.tsx +28 -0
  306. package/src/components/ui/tabs.tsx +88 -0
  307. package/src/components/ui/tooltip.tsx +51 -0
  308. package/src/index.css +11 -0
  309. package/src/knowledge/candidateStore.ts +63 -0
  310. package/src/knowledge/distiller.ts +98 -0
  311. package/src/knowledge/openclawClient.ts +118 -0
  312. package/src/knowledge/redactor.ts +80 -0
  313. package/src/knowledge/types.ts +84 -0
  314. package/src/lib/apiClient.ts +49 -0
  315. package/src/lib/export-logs.ts +51 -0
  316. package/src/lib/mask.ts +4 -0
  317. package/src/lib/objectUtils.ts +22 -0
  318. package/src/lib/providerContract.ts +26 -0
  319. package/src/lib/providerTestContract.ts +107 -0
  320. package/src/lib/runtimeConfig.ts +25 -0
  321. package/src/lib/serverPort.ts +41 -0
  322. package/src/lib/sessionUrl.ts +44 -0
  323. package/src/lib/stopReason.ts +58 -0
  324. package/src/lib/useOnboarding.ts +80 -0
  325. package/src/lib/useProviders.ts +30 -0
  326. package/src/lib/useStripConfig.ts +108 -0
  327. package/src/lib/utils.ts +21 -0
  328. package/src/mcp/loopback.ts +76 -0
  329. package/src/mcp/previewExtractor.ts +166 -0
  330. package/src/mcp/server.ts +396 -0
  331. package/src/mcp/toolHandlers.ts +341 -0
  332. package/src/proxy/chunkStorage.ts +112 -0
  333. package/src/proxy/claudeCodeStrip.ts +99 -0
  334. package/src/proxy/config.ts +172 -0
  335. package/src/proxy/constants.ts +47 -0
  336. package/src/proxy/dataDir.ts +86 -0
  337. package/src/proxy/formats/anthropic/anthropicProvider.ts +75 -0
  338. package/src/proxy/formats/anthropic/handler.ts +71 -0
  339. package/src/proxy/formats/anthropic/index.ts +14 -0
  340. package/src/proxy/formats/anthropic/register.ts +4 -0
  341. package/src/proxy/formats/anthropic/schemas.ts +237 -0
  342. package/src/proxy/formats/anthropic/stream.ts +205 -0
  343. package/src/proxy/formats/handler.ts +46 -0
  344. package/src/proxy/formats/index.ts +12 -0
  345. package/src/proxy/formats/jsonSchema.ts +36 -0
  346. package/src/proxy/formats/openai/alibabaProvider.ts +38 -0
  347. package/src/proxy/formats/openai/handler.ts +96 -0
  348. package/src/proxy/formats/openai/index.ts +25 -0
  349. package/src/proxy/formats/openai/provider.ts +50 -0
  350. package/src/proxy/formats/openai/register.ts +4 -0
  351. package/src/proxy/formats/openai/schemas.ts +187 -0
  352. package/src/proxy/formats/openai/stream.ts +206 -0
  353. package/src/proxy/formats/protocol.ts +50 -0
  354. package/src/proxy/formats/providerRegistry.ts +51 -0
  355. package/src/proxy/formats/providers/index.ts +3 -0
  356. package/src/proxy/formats/registry.ts +66 -0
  357. package/src/proxy/handler.ts +334 -0
  358. package/src/proxy/logFinalizer.ts +305 -0
  359. package/src/proxy/logFinalizer.worker.ts +24 -0
  360. package/src/proxy/logIndex.ts +268 -0
  361. package/src/proxy/logger.ts +179 -0
  362. package/src/proxy/openaiOrphanToolStrip.ts +142 -0
  363. package/src/proxy/providerImporters.ts +491 -0
  364. package/src/proxy/providers.ts +613 -0
  365. package/src/proxy/schemas.ts +209 -0
  366. package/src/proxy/sessionProcess.ts +140 -0
  367. package/src/proxy/sessionRuntime.ts +85 -0
  368. package/src/proxy/sessionSupervisor.ts +283 -0
  369. package/src/proxy/sessionWorkerEntry.ts +26 -0
  370. package/src/proxy/socketTracker.ts +255 -0
  371. package/src/proxy/store.ts +412 -0
  372. package/src/proxy/upstream.ts +90 -0
  373. package/src/router.tsx +16 -0
  374. package/src/routes/__root.tsx +45 -0
  375. package/src/routes/api/config.paths.ts +14 -0
  376. package/src/routes/api/config.ts +53 -0
  377. package/src/routes/api/health.ts +15 -0
  378. package/src/routes/api/knowledge.candidates.$candidateId.promote.ts +32 -0
  379. package/src/routes/api/knowledge.candidates.ts +10 -0
  380. package/src/routes/api/knowledge.project-context.ts +18 -0
  381. package/src/routes/api/knowledge.search.ts +31 -0
  382. package/src/routes/api/knowledge.sessions.$sessionId.candidates.ts +16 -0
  383. package/src/routes/api/logs.$id.chunks.ts +36 -0
  384. package/src/routes/api/logs.$id.replay.ts +191 -0
  385. package/src/routes/api/logs.$id.ts +22 -0
  386. package/src/routes/api/logs.stream.ts +74 -0
  387. package/src/routes/api/logs.ts +59 -0
  388. package/src/routes/api/mcp.ts +25 -0
  389. package/src/routes/api/models.ts +10 -0
  390. package/src/routes/api/providers.$providerId.test.log.ts +293 -0
  391. package/src/routes/api/providers.$providerId.ts +50 -0
  392. package/src/routes/api/providers.export.ts +26 -0
  393. package/src/routes/api/providers.import.ts +47 -0
  394. package/src/routes/api/providers.scan.ts +23 -0
  395. package/src/routes/api/providers.ts +45 -0
  396. package/src/routes/api/sessions.ts +17 -0
  397. package/src/routes/index.tsx +6 -0
  398. package/src/routes/proxy/$.ts +15 -0
  399. package/src/routes/session/$sessionId.tsx +23 -0
  400. package/styles/globals.css +188 -0
@@ -0,0 +1,396 @@
1
+ /**
2
+ * MCP (Model Context Protocol) server for agent-inspector.
3
+ *
4
+ * Exposes `inspector_*` tools that delegate to existing `/api/*` endpoints
5
+ * via internal HTTP loopback (see `loopback.ts` for the rationale). Mounted
6
+ * at `POST /api/mcp` in the existing TanStack Start process using HTTP Streamable
7
+ * transport. localhost-only, no auth in v1 — see
8
+ * `openspec/changes/add-mcp-server/design.md` decisions D1, D2, D9.
9
+ *
10
+ * The `McpServer` + `WebStandardStreamableHTTPServerTransport` pair is
11
+ * instantiated once per process on first request and reused for all
12
+ * subsequent requests (stateless mode — no `sessionIdGenerator`).
13
+ *
14
+ * Tool implementations live in `./toolHandlers.ts` so they can be unit
15
+ * tested with a mock `callApi`. This file just wires them to the SDK.
16
+ */
17
+
18
+ import { z } from "zod";
19
+ import { McpServer, WebStandardStreamableHTTPServerTransport } from "@modelcontextprotocol/server";
20
+ import { setCurrentPort } from "../lib/serverPort";
21
+ import { callApi } from "./loopback";
22
+ import {
23
+ addProviderImpl,
24
+ createSessionKnowledgeImpl,
25
+ getProjectContextImpl,
26
+ getLogChunksImpl,
27
+ getLogImpl,
28
+ getProviderImpl,
29
+ listKnowledgeCandidatesImpl,
30
+ listLogsImpl,
31
+ listModelsImpl,
32
+ listProvidersImpl,
33
+ listSessionsImpl,
34
+ promoteKnowledgeCandidateImpl,
35
+ replayLogImpl,
36
+ safeCall,
37
+ searchKnowledgeImpl,
38
+ testProviderImpl,
39
+ updateProviderImpl,
40
+ } from "./toolHandlers";
41
+
42
+ // ---------------------------------------------------------------------------
43
+ // Lazy singleton: build the McpServer + transport on first use.
44
+ // ---------------------------------------------------------------------------
45
+
46
+ type ServerPair = { server: McpServer; transport: WebStandardStreamableHTTPServerTransport };
47
+
48
+ let initialized: ServerPair | null = null;
49
+ let initPromise: Promise<ServerPair> | null = null;
50
+
51
+ function buildServer(): ServerPair {
52
+ const server = new McpServer(
53
+ { name: "agent-inspector", version: "1.0.0" },
54
+ { capabilities: { tools: {} } },
55
+ );
56
+ registerTools(server);
57
+ const transport = new WebStandardStreamableHTTPServerTransport({
58
+ sessionIdGenerator: undefined, // stateless — see module docstring
59
+ });
60
+ // The connect() call is async but we don't need to await it here; the SDK
61
+ // buffers the first request internally.
62
+ void server.connect(transport);
63
+ return { server, transport };
64
+ }
65
+
66
+ async function getServer(): Promise<ServerPair> {
67
+ if (initialized !== null) return initialized;
68
+ if (initPromise === null) {
69
+ initPromise = Promise.resolve(buildServer()).then((pair) => {
70
+ initialized = pair;
71
+ return pair;
72
+ });
73
+ }
74
+ return initPromise;
75
+ }
76
+
77
+ /** Reset for tests. */
78
+ export async function _resetForTests(): Promise<void> {
79
+ if (initialized !== null) {
80
+ try {
81
+ await initialized.server.close();
82
+ } catch {
83
+ // ignore
84
+ }
85
+ }
86
+ initialized = null;
87
+ initPromise = null;
88
+ }
89
+
90
+ // ---------------------------------------------------------------------------
91
+ // Public entry point for the route handler.
92
+ // ---------------------------------------------------------------------------
93
+
94
+ /**
95
+ * Handle an incoming MCP HTTP request. Suitable as a TanStack Start route
96
+ * handler — accepts a Web `Request`, returns a `Promise<Response>`.
97
+ */
98
+ export async function handleMcpRequest(request: Request): Promise<Response> {
99
+ // Extract port from the incoming request URL so loopback calls work even
100
+ // when PORT env var is unset (e.g. MCP client connected before server init).
101
+ try {
102
+ const url = new URL(request.url);
103
+ const port = Number(url.port);
104
+ if (port > 0) setCurrentPort(port);
105
+ } catch {
106
+ // URL parse failure → fall through to PORT env var in getCurrentPort()
107
+ }
108
+ const { transport } = await getServer();
109
+ return transport.handleRequest(request);
110
+ }
111
+
112
+ // ---------------------------------------------------------------------------
113
+ // Tool descriptions (kept here, not in toolHandlers.ts, because they are
114
+ // only relevant to the wire-level MCP registration).
115
+ // ---------------------------------------------------------------------------
116
+
117
+ const TOOL_LIST_LOGS_DESC = `List recent captured agent/model proxy logs in reverse-chronological order with parsed previews. Useful for "what did I just send?" discovery.
118
+
119
+ REFLEXIVE-LOOP WARNING: this list includes the agent's own recent /proxy calls. If results appear to be the agent's own tool calls (e.g., the agent called inspector_list_logs and now sees itself in the results), filter by clientPid (your own PID) or by timestamp on the client side.
120
+
121
+ Parameters:
122
+ - offset (number, default 0): skip this many entries from the start of the filtered list
123
+ - limit (number, default 3, hard-clamped to 5): how many summaries to return
124
+ - sessionId (string, optional): filter by session/affinity id
125
+ - model (string, optional): filter by model name
126
+
127
+ Returns: array of "thick summary" objects, each containing:
128
+ - id, timestamp, provider, model, apiFormat, method, path, status, isStreaming,
129
+ hasError, latencyMs, tokens { input, output, cacheCreate, cacheRead },
130
+ sessionId, clientPid,
131
+ - lastUserMessagePreview (string|null, ≤500 chars) — first text block of the last user message, parsed via the format-specific schema (NOT a raw body slice)
132
+ - responsePreview (string|null, ≤500 chars) — first text block of the assistant response
133
+ - hasChunks, hasRawRequestBody (booleans)
134
+
135
+ Either preview field is null when the body is unknown format, unparseable, or the relevant content is non-text (e.g., image-only).`;
136
+
137
+ const PROVIDER_WRITE_WARNING =
138
+ "⚠ This tool mutates provider configuration. Confirm with the user before invoking.";
139
+
140
+ // ---------------------------------------------------------------------------
141
+ // Tool registration (thin wiring of impls to the SDK)
142
+ // ---------------------------------------------------------------------------
143
+
144
+ function registerTools(server: McpServer): void {
145
+ // ----- Read tools -----
146
+
147
+ server.registerTool(
148
+ "inspector_list_logs",
149
+ {
150
+ title: "List captured agent/model logs",
151
+ description: TOOL_LIST_LOGS_DESC,
152
+ inputSchema: z.object({
153
+ offset: z.number().int().nonnegative().optional().describe("Skip this many entries."),
154
+ limit: z
155
+ .number()
156
+ .int()
157
+ .positive()
158
+ .optional()
159
+ .describe("How many summaries to return. Hard-capped at 5."),
160
+ sessionId: z.string().optional().describe("Filter by session/affinity id."),
161
+ model: z.string().optional().describe("Filter by model name."),
162
+ }),
163
+ },
164
+ (args) => safeCall(() => listLogsImpl(callApi, args)),
165
+ );
166
+
167
+ server.registerTool(
168
+ "inspector_get_log",
169
+ {
170
+ title: "Get a single captured log by id",
171
+ description:
172
+ "Returns the full CapturedLog for the given id, including rawRequestBody and responseText with no truncation. SSE streaming chunks are NOT included — use inspector_get_log_chunks for those. Returns an error if the id does not exist.",
173
+ inputSchema: z.object({
174
+ id: z.number().int().positive().describe("The log id."),
175
+ }),
176
+ },
177
+ ({ id }) => safeCall(() => getLogImpl(callApi, id)),
178
+ );
179
+
180
+ server.registerTool(
181
+ "inspector_get_log_chunks",
182
+ {
183
+ title: "Get SSE streaming chunks for a captured log",
184
+ description:
185
+ "Returns the SSE chunks array for a streaming log, in the order they were received. Returns an error if the log has no chunks (i.e. was non-streaming or the log id is unknown).",
186
+ inputSchema: z.object({
187
+ id: z.number().int().positive().describe("The log id."),
188
+ }),
189
+ },
190
+ ({ id }) => safeCall(() => getLogChunksImpl(callApi, id)),
191
+ );
192
+
193
+ server.registerTool(
194
+ "inspector_list_sessions",
195
+ {
196
+ title: "List known session ids",
197
+ description:
198
+ "Returns the array of session ids that have been observed in captured logs. Useful for discovering what sessionId values to pass to inspector_list_logs.",
199
+ inputSchema: z.object({}),
200
+ },
201
+ () => safeCall(() => listSessionsImpl(callApi)),
202
+ );
203
+
204
+ server.registerTool(
205
+ "inspector_list_models",
206
+ {
207
+ title: "List distinct model names seen in captured logs",
208
+ description: "Returns the array of distinct model names observed across all captured logs.",
209
+ inputSchema: z.object({}),
210
+ },
211
+ () => safeCall(() => listModelsImpl(callApi)),
212
+ );
213
+
214
+ server.registerTool(
215
+ "inspector_list_providers",
216
+ {
217
+ title: "List configured LLM providers",
218
+ description:
219
+ "Returns the full ProviderConfig array, including apiKey in PLAINTEXT. MCP is localhost-only — any process that can call /api/mcp can also read <dataDir>/providers.json directly, so the apiKey is not redacted. Do not expose this MCP server to non-trusted local processes.",
220
+ inputSchema: z.object({}),
221
+ },
222
+ () => safeCall(() => listProvidersImpl(callApi)),
223
+ );
224
+
225
+ // ----- Action tools -----
226
+
227
+ server.registerTool(
228
+ "inspector_get_provider",
229
+ {
230
+ title: "Get a single provider by id",
231
+ description:
232
+ "Returns the full ProviderConfig for the given id, including apiKey in PLAINTEXT (same posture as inspector_list_providers).",
233
+ inputSchema: z.object({
234
+ id: z.string().describe("The provider id."),
235
+ }),
236
+ },
237
+ ({ id }) => safeCall(() => getProviderImpl(callApi, id)),
238
+ );
239
+
240
+ server.registerTool(
241
+ "inspector_replay_log",
242
+ {
243
+ title: "Replay a captured log against its provider",
244
+ description:
245
+ "Re-sends the captured request body to the upstream LLM and returns the response summary: success flag, status, responseText, input/output token counts, elapsedMs, and whether the response was streaming. Useful for re-running a request after a fix or a transient failure. Returns an error if the log id is unknown or the upstream call fails.",
246
+ inputSchema: z.object({
247
+ id: z.number().int().positive().describe("The log id to replay."),
248
+ }),
249
+ },
250
+ (args) => safeCall(() => replayLogImpl(callApi, args)),
251
+ );
252
+
253
+ // ----- Provider write tools -----
254
+
255
+ server.registerTool(
256
+ "inspector_add_provider",
257
+ {
258
+ title: "Add a new LLM provider",
259
+ description: `${PROVIDER_WRITE_WARNING}\n\nPersists a new provider to <dataDir>/providers.json. Required fields: name, apiKey, format (anthropic|openai), model. Optional: baseUrl, authHeader (default: bearer), apiDocsUrl.`,
260
+ inputSchema: z.object({
261
+ name: z.string().min(1),
262
+ apiKey: z.string().min(1),
263
+ format: z.enum(["anthropic", "openai"]),
264
+ model: z.string().min(1),
265
+ anthropicBaseUrl: z.string().optional(),
266
+ openaiBaseUrl: z.string().optional(),
267
+ authHeader: z.enum(["bearer", "x-api-key"]).optional(),
268
+ apiDocsUrl: z.string().optional(),
269
+ }),
270
+ },
271
+ (provider) => safeCall(() => addProviderImpl(callApi, provider)),
272
+ );
273
+
274
+ server.registerTool(
275
+ "inspector_update_provider",
276
+ {
277
+ title: "Update an existing provider",
278
+ description: `${PROVIDER_WRITE_WARNING} Updating with nonsense values effectively soft-deletes a provider. Confirm with the user before invoking.
279
+
280
+ PATCH-style update: only the fields you supply are changed. Returns the updated ProviderConfig.`,
281
+ inputSchema: z.object({
282
+ id: z.string().describe("The provider id to update."),
283
+ name: z.string().min(1).optional(),
284
+ apiKey: z.string().min(1).optional(),
285
+ format: z.enum(["anthropic", "openai"]).optional(),
286
+ model: z.string().min(1).optional(),
287
+ baseUrl: z.string().min(1).optional(),
288
+ authHeader: z.enum(["bearer", "x-api-key"]).optional(),
289
+ anthropicBaseUrl: z.string().optional(),
290
+ openaiBaseUrl: z.string().optional(),
291
+ apiDocsUrl: z.string().optional(),
292
+ }),
293
+ },
294
+ (input) => safeCall(() => updateProviderImpl(callApi, input)),
295
+ );
296
+
297
+ server.registerTool(
298
+ "inspector_test_provider",
299
+ {
300
+ title: "Test a provider's connectivity",
301
+ description:
302
+ "Runs the same connectivity test the UI's 'Test' button does, against both Anthropic and OpenAI endpoints if configured. Returns the per-endpoint success/failure result. Returns an error if the provider id is unknown.",
303
+ inputSchema: z.object({
304
+ id: z.string().describe("The provider id to test."),
305
+ }),
306
+ },
307
+ ({ id }) => safeCall(() => testProviderImpl(callApi, id)),
308
+ );
309
+
310
+ // ----- Knowledge bridge tools -----
311
+
312
+ server.registerTool(
313
+ "inspector_create_session_knowledge",
314
+ {
315
+ title: "Create knowledge candidates for a session",
316
+ description:
317
+ "Generates sanitized draft knowledge candidates from a captured Inspector session. This does not write to OpenClaw; use inspector_promote_knowledge_candidate after review.",
318
+ inputSchema: z.object({
319
+ sessionId: z.string().min(1).describe("The Inspector session id to distill."),
320
+ }),
321
+ },
322
+ (args) => safeCall(() => createSessionKnowledgeImpl(callApi, args)),
323
+ );
324
+
325
+ server.registerTool(
326
+ "inspector_list_knowledge_candidates",
327
+ {
328
+ title: "List knowledge candidates",
329
+ description:
330
+ "Lists locally stored Inspector knowledge candidates and their draft/promoted/failed status.",
331
+ inputSchema: z.object({}),
332
+ },
333
+ () => safeCall(() => listKnowledgeCandidatesImpl(callApi)),
334
+ );
335
+
336
+ server.registerTool(
337
+ "inspector_promote_knowledge_candidate",
338
+ {
339
+ title: "Promote a knowledge candidate",
340
+ description:
341
+ "Writes a sanitized Inspector knowledge candidate to the configured OpenClaw memory backend. Confirm the candidate is safe before invoking.",
342
+ inputSchema: z.object({
343
+ candidateId: z.string().min(1).describe("The candidate id to promote."),
344
+ }),
345
+ },
346
+ (args) => safeCall(() => promoteKnowledgeCandidateImpl(callApi, args)),
347
+ );
348
+
349
+ server.registerTool(
350
+ "inspector_search_knowledge",
351
+ {
352
+ title: "Search Inspector knowledge",
353
+ description:
354
+ "Searches knowledge through Inspector. OpenClaw backend details are hidden from the agent.",
355
+ inputSchema: z.object({
356
+ query: z.string().min(1).describe("Knowledge search query."),
357
+ project: z.string().optional().describe("Optional project filter."),
358
+ }),
359
+ },
360
+ (args) => safeCall(() => searchKnowledgeImpl(callApi, args)),
361
+ );
362
+
363
+ server.registerTool(
364
+ "inspector_get_project_context",
365
+ {
366
+ title: "Get project context",
367
+ description:
368
+ "Returns relevant Inspector knowledge for a project so an agent can seed task context without calling OpenClaw directly.",
369
+ inputSchema: z.object({
370
+ project: z.string().min(1).describe("Project name or folder."),
371
+ }),
372
+ },
373
+ (args) => safeCall(() => getProjectContextImpl(callApi, args)),
374
+ );
375
+ }
376
+
377
+ // Surface the tool catalog for tests that assert on the tool name set.
378
+ export const TOOL_NAMES = [
379
+ "inspector_list_logs",
380
+ "inspector_get_log",
381
+ "inspector_get_log_chunks",
382
+ "inspector_list_sessions",
383
+ "inspector_list_models",
384
+ "inspector_list_providers",
385
+ "inspector_get_provider",
386
+ "inspector_replay_log",
387
+ "inspector_add_provider",
388
+ "inspector_update_provider",
389
+ "inspector_test_provider",
390
+ "inspector_create_session_knowledge",
391
+ "inspector_list_knowledge_candidates",
392
+ "inspector_promote_knowledge_candidate",
393
+ "inspector_search_knowledge",
394
+ "inspector_get_project_context",
395
+ ] as const;
396
+ export type ToolName = (typeof TOOL_NAMES)[number];