@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
package/src/cli.ts ADDED
@@ -0,0 +1,345 @@
1
+ #!/usr/bin/env node
2
+ import { spawn, execSync, type ChildProcess } from "node:child_process";
3
+ import { createConnection } from "node:net";
4
+ import { fileURLToPath } from "node:url";
5
+ import { dirname, join, resolve as resolvePath } from "node:path";
6
+ import { existsSync } from "node:fs";
7
+
8
+ const __filename = fileURLToPath(import.meta.url);
9
+ const __dirname = dirname(__filename);
10
+
11
+ const DEFAULT_PORT = 25947;
12
+ const LOCAL_PROBE_TIMEOUT_MS = 2000;
13
+
14
+ /**
15
+ * Subcommand router. The legacy one-liner UX (`agent-inspector` with no args,
16
+ * or `agent-inspector start`) starts the proxy. `agent-inspector onboard` runs
17
+ * the guided skill install. Unknown subcommands fall back to the legacy
18
+ * behavior so a stray positional arg doesn't break an old invocation.
19
+ */
20
+ const subcommand = process.argv[2];
21
+
22
+ if (subcommand === "onboard") {
23
+ const { runOnboard } = await import("./cli/onboard.js");
24
+ const code = await runOnboard(process.argv.slice(3));
25
+ process.exit(code);
26
+ }
27
+
28
+ if (subcommand === "doctor") {
29
+ const { runDoctor } = await import("./cli/doctor.js");
30
+ const code = await runDoctor(process.argv.slice(3));
31
+ process.exit(code);
32
+ }
33
+
34
+ await runStart(process.argv.slice(2));
35
+
36
+ // -----------------------------------------------------------------------------
37
+ // Legacy `start` behavior — start the proxy on the configured port. Extracted
38
+ // into a function so the router above can keep the top-level flow readable.
39
+ // -----------------------------------------------------------------------------
40
+ async function isInspectorHealthy(port: number): Promise<boolean> {
41
+ const controller = new AbortController();
42
+ const timeout = setTimeout(() => controller.abort(), LOCAL_PROBE_TIMEOUT_MS);
43
+ try {
44
+ const response = await fetch(`http://127.0.0.1:${port}/api/health`, {
45
+ cache: "no-store",
46
+ signal: controller.signal,
47
+ });
48
+ return response.ok;
49
+ } catch {
50
+ return false;
51
+ } finally {
52
+ clearTimeout(timeout);
53
+ }
54
+ }
55
+
56
+ function isPortAcceptingConnections(port: number): Promise<boolean> {
57
+ return new Promise((resolve) => {
58
+ const socket = createConnection({ host: "127.0.0.1", port });
59
+ const finish = (value: boolean): void => {
60
+ socket.removeAllListeners();
61
+ socket.destroy();
62
+ resolve(value);
63
+ };
64
+
65
+ socket.setTimeout(LOCAL_PROBE_TIMEOUT_MS);
66
+ socket.once("connect", () => finish(true));
67
+ socket.once("timeout", () => finish(false));
68
+ socket.once("error", () => finish(false));
69
+ });
70
+ }
71
+
72
+ function sleep(ms: number): Promise<void> {
73
+ return new Promise((resolve) => {
74
+ setTimeout(resolve, ms);
75
+ });
76
+ }
77
+
78
+ async function waitForInspectorHealthy(port: number, timeoutMs: number): Promise<boolean> {
79
+ const start = Date.now();
80
+ while (Date.now() - start < timeoutMs) {
81
+ if (await isInspectorHealthy(port)) return true;
82
+ await sleep(250);
83
+ }
84
+ return false;
85
+ }
86
+
87
+ function openBrowser(targetUrl: string): void {
88
+ let command: string[] | undefined;
89
+ // eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check
90
+ switch (process.platform) {
91
+ case "darwin":
92
+ command = ["open", targetUrl];
93
+ break;
94
+ case "linux":
95
+ command = ["xdg-open", targetUrl];
96
+ break;
97
+ case "win32":
98
+ command = ["cmd", "/c", "start", "", targetUrl];
99
+ break;
100
+ default:
101
+ // Unsupported platform - do nothing
102
+ break;
103
+ }
104
+ if (command === undefined) return;
105
+ const [bin, ...cmdArgs] = command;
106
+ if (bin === undefined) return;
107
+ const browserProcess = spawn(bin, cmdArgs, {
108
+ stdio: "ignore",
109
+ detached: true,
110
+ windowsHide: true,
111
+ });
112
+ browserProcess.unref();
113
+ }
114
+
115
+ function waitForProcessExit(child: ChildProcess): Promise<number> {
116
+ return new Promise((resolve) => {
117
+ child.once("exit", (code) => {
118
+ resolve(code ?? 1);
119
+ });
120
+ child.once("error", () => {
121
+ resolve(1);
122
+ });
123
+ });
124
+ }
125
+
126
+ async function runStart(args: string[]): Promise<void> {
127
+ const envPort = process.env["PORT"];
128
+ const portDefault = envPort !== undefined ? Number(envPort) : DEFAULT_PORT;
129
+
130
+ let port = portDefault;
131
+ let open = true;
132
+ let openWasSpecified = false;
133
+ let background = false;
134
+ let forceRestart = false;
135
+ let configDir: string | undefined;
136
+ let providersJson: string | undefined;
137
+
138
+ for (let i = 0; i < args.length; i++) {
139
+ const arg = args[i] ?? "";
140
+ switch (arg) {
141
+ case "--port":
142
+ case "-p":
143
+ port = Number(args[i + 1]);
144
+ i++;
145
+ break;
146
+ case "--no-open":
147
+ open = false;
148
+ openWasSpecified = true;
149
+ break;
150
+ case "--open":
151
+ open = true;
152
+ openWasSpecified = true;
153
+ break;
154
+ case "--force-restart":
155
+ case "--restart":
156
+ forceRestart = true;
157
+ break;
158
+ case "--background":
159
+ background = true;
160
+ break;
161
+ case "--config-dir":
162
+ configDir = args[i + 1];
163
+ i++;
164
+ break;
165
+ case "--providers":
166
+ providersJson = args[i + 1];
167
+ i++;
168
+ break;
169
+ default:
170
+ break;
171
+ }
172
+ }
173
+
174
+ if (!Number.isInteger(port) || port <= 0 || port > 65535) {
175
+ console.error(`Invalid port: ${String(port)}. Use --port <1-65535>.`);
176
+ process.exitCode = 1;
177
+ return;
178
+ }
179
+
180
+ /**
181
+ * Check if a port is in use and kill the process using it
182
+ */
183
+ function killProcessOnPort(targetPort: number): void {
184
+ const platform = process.platform;
185
+
186
+ try {
187
+ let pids: number[] = [];
188
+
189
+ if (platform === "win32") {
190
+ // Windows: use netstat to find PID, then taskkill
191
+ const output = execSync(`netstat -ano | findstr :${targetPort}`, {
192
+ encoding: "utf8",
193
+ timeout: 5000,
194
+ windowsHide: true,
195
+ });
196
+ const lines = output.trim().split("\n");
197
+ for (const line of lines) {
198
+ const parts = line.trim().split(/\s+/);
199
+ if (parts.length >= 5) {
200
+ const localAddress = parts[1] ?? "";
201
+ const pidStr = parts[4] ?? "";
202
+ if (localAddress !== "" && pidStr !== "" && localAddress.includes(`:${targetPort}`)) {
203
+ const pid = parseInt(pidStr, 10);
204
+ if (!isNaN(pid) && pid > 0) {
205
+ pids.push(pid);
206
+ }
207
+ }
208
+ }
209
+ }
210
+ // Remove duplicates
211
+ pids = [...new Set(pids)];
212
+
213
+ for (const pid of pids) {
214
+ try {
215
+ console.log(`Killing process ${pid} on port ${targetPort}...`);
216
+ execSync(`taskkill /PID ${pid} /F`, {
217
+ encoding: "utf8",
218
+ timeout: 5000,
219
+ windowsHide: true,
220
+ });
221
+ } catch {
222
+ // Process may have already exited
223
+ }
224
+ }
225
+ } else {
226
+ // Unix-like: use lsof
227
+ const output = execSync(`lsof -ti:${targetPort}`, { encoding: "utf8", timeout: 5000 });
228
+ const lines = output.trim().split("\n");
229
+ for (const line of lines) {
230
+ const pid = parseInt(line.trim(), 10);
231
+ if (!isNaN(pid) && pid > 0) {
232
+ pids.push(pid);
233
+ }
234
+ }
235
+ // Remove duplicates
236
+ pids = [...new Set(pids)];
237
+
238
+ for (const pid of pids) {
239
+ try {
240
+ console.log(`Killing process ${pid} on port ${targetPort}...`);
241
+ execSync(`kill -9 ${pid}`, { encoding: "utf8", timeout: 5000 });
242
+ } catch {
243
+ // Process may have already exited
244
+ }
245
+ }
246
+ }
247
+ } catch {
248
+ // No process found on port, which is fine
249
+ }
250
+ }
251
+
252
+ process.env["PORT"] = String(port);
253
+
254
+ const url = `http://localhost:${port}`;
255
+
256
+ if (!forceRestart && (await isInspectorHealthy(port))) {
257
+ console.log(`agent-inspector is already running at ${url}`);
258
+ console.log(`Use --force-restart to restart the existing instance.`);
259
+ if (open && openWasSpecified) {
260
+ openBrowser(url);
261
+ }
262
+ return;
263
+ }
264
+
265
+ if (!forceRestart && (await isPortAcceptingConnections(port))) {
266
+ console.error(`Port ${port} is already in use, but it is not a healthy agent-inspector.`);
267
+ console.error(`Stop that process, choose --port <n>, or re-run with --force-restart.`);
268
+ process.exitCode = 1;
269
+ return;
270
+ }
271
+
272
+ if (forceRestart) {
273
+ killProcessOnPort(port);
274
+ }
275
+
276
+ console.log(`Server running at ${url}`);
277
+ console.log(` Proxy: ${url}/proxy`);
278
+ console.log(``);
279
+ console.log(`Route AI coding tools through the proxy:`);
280
+ console.log(` Claude Code: ANTHROPIC_BASE_URL=${url}/proxy claude`);
281
+ console.log(` OpenCode: LLM_BASE_URL=${url}/proxy opencode`);
282
+ console.log(` MiMo Code: OPENAI_BASE_URL=${url}/proxy mimo`);
283
+ console.log(
284
+ ` Direct HTTP: curl ${url}/proxy/v1/messages -d '{"model":"...","messages":[...]}'`,
285
+ );
286
+ console.log(``);
287
+ console.log(`Routing environment variables:`);
288
+ console.log(` ROUTES JSON map of model prefix -> upstream URL`);
289
+ console.log(` DEFAULT_UPSTREAM Fallback upstream for unmatched models`);
290
+ console.log(
291
+ ` Example: ROUTES='{"claude-":"https://api.anthropic.com","MiniMax":"https://api.minimaxi.com/anthropic"}'`,
292
+ );
293
+
294
+ if (open) {
295
+ openBrowser(url);
296
+ }
297
+
298
+ // Compute server path
299
+ const outputDir = __dirname;
300
+ const serverPath = join(outputDir, "../.output/server/index.mjs");
301
+
302
+ // Start server with node
303
+ const serverEnv = { ...process.env };
304
+ if (configDir !== undefined) {
305
+ // Normalize MSYS / Git Bash paths to Windows native form.
306
+ // On Windows, `path.join('/c/Users/foo')` becomes `\c\Users\foo`
307
+ // (leading slash converted to backslash).
308
+ // Child processes spawned by `spawn()` won't follow that style, so
309
+ // rewrite `\c\...` (or any `\x\...` drive) to `C:\...` before
310
+ // handing the path to the proxy server. No-op on already-native
311
+ // Windows paths and on non-Windows platforms.
312
+ let resolvedPath = join(configDir);
313
+ const msysMatch = /^\\([a-z])\\(.*)$/i.exec(resolvedPath);
314
+ if (msysMatch !== null) {
315
+ const drive = (msysMatch[1] ?? "").toUpperCase();
316
+ const rest = msysMatch[2] ?? "";
317
+ resolvedPath = `${drive}:\\${rest}`;
318
+ } else {
319
+ resolvedPath = resolvePath(resolvedPath);
320
+ }
321
+ serverEnv["AGENT_INSPECTOR_CONFIG_DIR"] = resolvedPath;
322
+ }
323
+ if (providersJson !== undefined) {
324
+ serverEnv["AGENT_INSPECTOR_PROVIDERS_JSON"] = providersJson;
325
+ }
326
+ const serverProcess = spawn(process.execPath, [serverPath], {
327
+ stdio: background ? ["ignore", "ignore", "ignore"] : "inherit",
328
+ detached: background,
329
+ env: serverEnv,
330
+ windowsHide: background,
331
+ });
332
+
333
+ if (background) {
334
+ serverProcess.unref();
335
+ if (await waitForInspectorHealthy(port, 5000)) {
336
+ console.log(`agent-inspector background server is ready at ${url}`);
337
+ return;
338
+ }
339
+ console.error(`agent-inspector background server did not become ready at ${url}.`);
340
+ process.exitCode = 1;
341
+ return;
342
+ }
343
+
344
+ process.exitCode = await waitForProcessExit(serverProcess);
345
+ }
@@ -0,0 +1,67 @@
1
+ import { Check, X } from "lucide-react";
2
+ import type { JSX } from "react";
3
+ import { useOnboarding } from "../lib/useOnboarding";
4
+
5
+ /**
6
+ * First-launch onboarding banner. Shows once on a fresh install (or
7
+ * any user who hasn't yet dismissed it), explains the per-tab data
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.
13
+ */
14
+ export function OnboardingBanner(): JSX.Element | null {
15
+ const { hasSeenOnboarding, isLoading, markSeen } = useOnboarding();
16
+
17
+ if (isLoading || hasSeenOnboarding) return null;
18
+
19
+ return (
20
+ <div
21
+ role="note"
22
+ aria-label="Onboarding tip"
23
+ 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
+ >
25
+ <div className="flex-1 min-w-0">
26
+ <div className="font-medium text-amber-600 dark:text-amber-400 mb-1">
27
+ Quick tour of the log tabs
28
+ </div>
29
+ <ul className="space-y-0.5 text-muted-foreground text-xs leading-relaxed">
30
+ <li>
31
+ <strong>Request</strong> / <strong>Response</strong> — structured views of what the
32
+ proxy sent and received.
33
+ </li>
34
+ <li>
35
+ <strong>Headers</strong> — request and response headers after proxy processing.
36
+ </li>
37
+ <li>
38
+ <strong>Raw Headers</strong> / <strong>Raw Request</strong> /{" "}
39
+ <strong>Raw Response</strong> — exact bytes from the upstream provider (visible in Full
40
+ mode).
41
+ </li>
42
+ </ul>
43
+ </div>
44
+ <button
45
+ type="button"
46
+ onClick={() => {
47
+ void markSeen();
48
+ }}
49
+ className="inline-flex items-center gap-1.5 text-xs h-8 px-3 rounded-md border border-amber-500/40 text-amber-700 dark:text-amber-300 hover:bg-amber-500/10 transition-colors shrink-0"
50
+ aria-label="Dismiss onboarding tip"
51
+ >
52
+ <Check className="size-3.5" />
53
+ Got it
54
+ </button>
55
+ <button
56
+ type="button"
57
+ onClick={() => {
58
+ void markSeen();
59
+ }}
60
+ className="text-muted-foreground hover:text-foreground transition-colors shrink-0 p-1 -m-1"
61
+ aria-label="Dismiss"
62
+ >
63
+ <X className="size-3.5" />
64
+ </button>
65
+ </div>
66
+ );
67
+ }