@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,107 @@
1
+ import { useState, memo, useMemo } from "react";
2
+ import type { JSX } from "react";
3
+ import type { CapturedLog } from "../../proxy/schemas";
4
+ import {
5
+ ConversationHeader,
6
+ getGroupApiFormat,
7
+ hasMixedApiFormat,
8
+ type ConversationGroupData,
9
+ } from "./ConversationHeader";
10
+ import { TurnGroup } from "./TurnGroup";
11
+ import type { CacheTrendEntry } from "./cacheTrend";
12
+ import { buildTurnGroups, shouldRenderConversationContent } from "./viewerState";
13
+
14
+ export type ConversationGroupProps = {
15
+ group: ConversationGroupData;
16
+ viewMode?: "simple" | "full";
17
+ /** Live strip-Claude-Code-billing-header flag from the viewer container. */
18
+ strip: boolean;
19
+ /** Slow-response threshold in seconds. `0` disables the warning indicator. */
20
+ slowResponseThresholdSeconds: number;
21
+ /**
22
+ * Pre-computed per-log cache token trend map (keyed by `log.id`) shared
23
+ * across the whole viewer. Each `LogEntry` looks up its own entry.
24
+ */
25
+ cacheTrends?: Map<number, CacheTrendEntry>;
26
+ /** Callback to open CompareDrawer with a log and its immediate predecessor. */
27
+ onCompareWithPrevious: (log: CapturedLog) => void;
28
+ comparisonPredecessors: Map<number, CapturedLog>;
29
+ /** When true, skip the group header and render content directly. */
30
+ standalone?: boolean;
31
+ /** Clear all logs that belong to this group. */
32
+ onClearGroup: (ids: number[]) => void;
33
+ };
34
+
35
+ function computeStats(logs: CapturedLog[]): {
36
+ totalInputTokens: number;
37
+ totalOutputTokens: number;
38
+ } {
39
+ let totalInput = 0;
40
+ let totalOutput = 0;
41
+ for (const log of logs) {
42
+ if (log.inputTokens !== null) totalInput += log.inputTokens;
43
+ if (log.outputTokens !== null) totalOutput += log.outputTokens;
44
+ }
45
+ return { totalInputTokens: totalInput, totalOutputTokens: totalOutput };
46
+ }
47
+
48
+ export const ConversationGroup = memo(function ({
49
+ group,
50
+ viewMode = "simple",
51
+ strip,
52
+ slowResponseThresholdSeconds,
53
+ cacheTrends,
54
+ onCompareWithPrevious,
55
+ comparisonPredecessors,
56
+ onClearGroup,
57
+ standalone = false,
58
+ }: ConversationGroupProps): JSX.Element {
59
+ const [expanded, setExpanded] = useState(false);
60
+ const stats = useMemo(() => computeStats(group.logs), [group.logs]);
61
+ const startTime = group.logs[0]?.timestamp ?? new Date().toISOString();
62
+ const endTime = group.logs[group.logs.length - 1]?.timestamp ?? new Date().toISOString();
63
+ const mixed = hasMixedApiFormat(group.logs);
64
+ const isLoading = group.logs.some((log) => log.responseStatus === null);
65
+
66
+ // Pre-compute stop reasons for each log — used by turnIndices
67
+ const turnGroups = useMemo(() => buildTurnGroups(group.logs), [group.logs]);
68
+ return (
69
+ <div className="mb-2">
70
+ {!standalone && (
71
+ <ConversationHeader
72
+ conversationId={group.conversationId}
73
+ startTime={startTime}
74
+ endTime={endTime}
75
+ totalCalls={group.logs.length}
76
+ totalInputTokens={stats.totalInputTokens}
77
+ totalOutputTokens={stats.totalOutputTokens}
78
+ apiFormat={getGroupApiFormat(group.logs)}
79
+ expanded={expanded}
80
+ onToggle={() => setExpanded(!expanded)}
81
+ hideApiFormat={mixed}
82
+ isLoading={isLoading}
83
+ userAgent={group.logs[0]?.userAgent ?? null}
84
+ onClear={() => onClearGroup(group.logs.map((l) => l.id))}
85
+ />
86
+ )}
87
+
88
+ {shouldRenderConversationContent(standalone, expanded) && (
89
+ <div>
90
+ {turnGroups.map((tg) => (
91
+ <TurnGroup
92
+ key={tg.turnIndex}
93
+ entries={tg.entries}
94
+ viewMode={viewMode}
95
+ strip={strip}
96
+ slowResponseThresholdSeconds={slowResponseThresholdSeconds}
97
+ cacheTrends={cacheTrends}
98
+ onCompareWithPrevious={onCompareWithPrevious}
99
+ comparisonPredecessors={comparisonPredecessors}
100
+ turnIndex={tg.turnIndex}
101
+ />
102
+ ))}
103
+ </div>
104
+ )}
105
+ </div>
106
+ );
107
+ });
@@ -0,0 +1,300 @@
1
+ import { useCallback, useState } from "react";
2
+ import {
3
+ ChevronDown,
4
+ ChevronRight,
5
+ Clock,
6
+ ExternalLink,
7
+ Loader2,
8
+ MessageSquare,
9
+ Trash2,
10
+ User,
11
+ Zap,
12
+ } from "lucide-react";
13
+ import type { JSX } from "react";
14
+ import { getSessionPath } from "../../lib/sessionUrl";
15
+ import { cn, formatTokens } from "../../lib/utils";
16
+ import type { CapturedLog } from "../../proxy/schemas";
17
+ import { Badge } from "../ui/badge";
18
+ import { ConfirmDialog } from "../ui/confirm-dialog";
19
+
20
+ const API_FORMAT_LABELS: Record<"anthropic" | "openai" | "unknown", string> = {
21
+ anthropic: "Anthropic",
22
+ openai: "OpenAI",
23
+ unknown: "Unknown",
24
+ };
25
+
26
+ export type ViewMode = "flat" | "thread";
27
+
28
+ export type ConversationHeaderProps = {
29
+ conversationId: string;
30
+ startTime: string;
31
+ endTime: string;
32
+ totalCalls: number;
33
+ totalInputTokens: number;
34
+ totalOutputTokens: number;
35
+ apiFormat: "anthropic" | "openai" | "unknown";
36
+ expanded: boolean;
37
+ onToggle: () => void;
38
+ /** Hide the API format badge on the header (used when the group contains
39
+ * mixed formats - the per-log badges are shown instead). */
40
+ hideApiFormat?: boolean;
41
+ /** When true and the group is collapsed, show a spinner instead of the
42
+ * expand chevron to indicate an in-flight request inside the group. */
43
+ isLoading?: boolean;
44
+ /** User-Agent string from the first log in the group. */
45
+ userAgent?: string | null;
46
+ /** Clear all logs in this group. After confirmation the parent removes them
47
+ * from the in-memory store; this header is then unmounted. */
48
+ onClear?: () => void;
49
+ };
50
+
51
+ function formatTimestamp(iso: string): string {
52
+ const date = new Date(iso);
53
+ return date.toLocaleTimeString([], { hour: "2-digit", minute: "2-digit", second: "2-digit" });
54
+ }
55
+
56
+ export function ConversationHeader({
57
+ conversationId,
58
+ startTime,
59
+ endTime,
60
+ totalCalls,
61
+ totalInputTokens,
62
+ totalOutputTokens,
63
+ apiFormat,
64
+ expanded,
65
+ onToggle,
66
+ hideApiFormat = false,
67
+ isLoading = false,
68
+ userAgent,
69
+ onClear,
70
+ }: ConversationHeaderProps): JSX.Element {
71
+ const [confirmOpen, setConfirmOpen] = useState(false);
72
+
73
+ const handleClearClick = (e: React.MouseEvent | React.KeyboardEvent): void => {
74
+ e.stopPropagation();
75
+ if (onClear === undefined) return;
76
+ setConfirmOpen(true);
77
+ };
78
+
79
+ const handleOpenInNewTab = useCallback(
80
+ (e: React.MouseEvent | React.KeyboardEvent): void => {
81
+ e.stopPropagation();
82
+ window.open(getSessionPath(conversationId), "_blank", "noopener,noreferrer");
83
+ },
84
+ [conversationId],
85
+ );
86
+
87
+ return (
88
+ <div
89
+ role="button"
90
+ tabIndex={0}
91
+ data-nav-id={`conv-${conversationId}`}
92
+ data-nav-action={expanded ? "collapse" : "expand"}
93
+ className={cn(
94
+ "flex items-center gap-3 px-3 py-2 cursor-pointer transition-colors",
95
+ "hover:bg-muted/50",
96
+ "select-none",
97
+ "border border-border rounded-lg mb-2 bg-background sticky top-0 z-10",
98
+ "focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:outline-none",
99
+ )}
100
+ onClick={onToggle}
101
+ onKeyDown={(e) => {
102
+ if (e.target !== e.currentTarget) return;
103
+ if (e.key === "Enter" || e.key === " ") {
104
+ e.preventDefault();
105
+ onToggle();
106
+ }
107
+ }}
108
+ >
109
+ {/* Expand chevron - shows spinner when collapsed and group has pending logs */}
110
+ {expanded ? (
111
+ <ChevronDown className="size-4 text-muted-foreground shrink-0" />
112
+ ) : isLoading ? (
113
+ <Loader2 className="size-4 animate-spin text-muted-foreground shrink-0" />
114
+ ) : (
115
+ <ChevronRight className="size-4 text-muted-foreground shrink-0" />
116
+ )}
117
+
118
+ {/* Conversation ID */}
119
+ <span
120
+ className="text-purple-400/90 font-mono text-xs font-semibold shrink-0"
121
+ title={conversationId}
122
+ >
123
+ {conversationId.startsWith("PID:") || conversationId.includes("|")
124
+ ? conversationId
125
+ : conversationId.length > 24
126
+ ? conversationId.slice(0, 12) + "..." + conversationId.slice(-12)
127
+ : conversationId}
128
+ </span>
129
+
130
+ {/* User-Agent */}
131
+ {userAgent !== null && userAgent !== undefined && userAgent !== "" && (
132
+ <span
133
+ className="flex items-center gap-1 text-muted-foreground text-xs shrink-0"
134
+ title={userAgent}
135
+ >
136
+ <User className="size-3" />
137
+ <span className="font-mono tabular-nums truncate max-w-[120px]">{userAgent}</span>
138
+ </span>
139
+ )}
140
+
141
+ {/* API Format Badge */}
142
+ {!hideApiFormat && (
143
+ <Badge
144
+ variant="outline"
145
+ className={cn(
146
+ "text-[10px] px-1.5 py-0 h-5 font-mono shrink-0",
147
+ apiFormat === "openai" && "border-blue-500/40 text-blue-400",
148
+ apiFormat === "anthropic" && "border-orange-500/40 text-orange-400",
149
+ apiFormat === "unknown" && "border-muted text-muted-foreground",
150
+ )}
151
+ >
152
+ {API_FORMAT_LABELS[apiFormat]}
153
+ </Badge>
154
+ )}
155
+
156
+ {/* Time range */}
157
+ <span className="flex items-center gap-1 text-muted-foreground text-xs shrink-0">
158
+ <Clock className="size-3" />
159
+ <span className="font-mono tabular-nums">
160
+ {formatTimestamp(startTime)} - {formatTimestamp(endTime)}
161
+ </span>
162
+ </span>
163
+
164
+ {/* Total calls */}
165
+ <span className="flex items-center gap-1 text-muted-foreground text-xs shrink-0">
166
+ <MessageSquare className="size-3" />
167
+ <span className="font-mono tabular-nums">
168
+ {totalCalls} call{totalCalls !== 1 ? "s" : ""}
169
+ </span>
170
+ </span>
171
+
172
+ {/* Token counts */}
173
+ <span className="flex items-center gap-1 text-xs shrink-0">
174
+ <Zap className="size-3 text-muted-foreground" />
175
+ <span className="font-mono tabular-nums">
176
+ <span className="text-blue-400">{formatTokens(totalInputTokens)}</span>
177
+ {" / "}
178
+ <span className="text-amber-400">{formatTokens(totalOutputTokens)}</span>
179
+ </span>
180
+ </span>
181
+
182
+ {/* Spacer */}
183
+ <span className="flex-1 min-w-0" />
184
+
185
+ {/* Open this session in a new tab - deep link to /session/$id */}
186
+ <button
187
+ type="button"
188
+ onClick={handleOpenInNewTab}
189
+ onKeyDown={(e) => {
190
+ if (e.key === "Enter" || e.key === " ") {
191
+ handleOpenInNewTab(e);
192
+ }
193
+ }}
194
+ aria-label={`Open session ${conversationId} in a new tab`}
195
+ title="Open this session in a new tab"
196
+ className="text-muted-foreground hover:text-foreground transition-colors shrink-0 inline-flex items-center justify-center size-8 rounded hover:bg-muted cursor-pointer"
197
+ >
198
+ <ExternalLink className="size-3.5" />
199
+ </button>
200
+
201
+ {/* Per-group Clear - does not toggle the group's expand state */}
202
+ {onClear !== undefined && (
203
+ <button
204
+ type="button"
205
+ onClick={handleClearClick}
206
+ aria-label={`Clear group (${totalCalls} request${totalCalls !== 1 ? "s" : ""})`}
207
+ title="Clear this group"
208
+ className="text-muted-foreground hover:text-foreground transition-colors shrink-0 inline-flex items-center justify-center size-8 rounded hover:bg-muted cursor-pointer"
209
+ >
210
+ <Trash2 className="size-3.5" />
211
+ </button>
212
+ )}
213
+
214
+ <ConfirmDialog
215
+ open={confirmOpen}
216
+ onOpenChange={setConfirmOpen}
217
+ title="Clear this group?"
218
+ description={`This will remove ${totalCalls} request${totalCalls !== 1 ? "s" : ""} from this conversation. This action cannot be undone.`}
219
+ confirmLabel="Clear"
220
+ variant="destructive"
221
+ onConfirm={() => {
222
+ onClear?.();
223
+ }}
224
+ />
225
+ </div>
226
+ );
227
+ }
228
+
229
+ export type ConversationGroupData = {
230
+ id: string;
231
+ conversationId: string;
232
+ logs: CapturedLog[];
233
+ };
234
+
235
+ export function getGroupApiFormat(logs: CapturedLog[]): "anthropic" | "openai" | "unknown" {
236
+ const firstNonUnknown = logs.find((l) => l.apiFormat !== "unknown");
237
+ if (firstNonUnknown !== undefined) {
238
+ return firstNonUnknown.apiFormat;
239
+ }
240
+ return logs[0]?.apiFormat ?? "unknown";
241
+ }
242
+
243
+ /**
244
+ * Returns true when a group contains logs of BOTH Anthropic and OpenAI
245
+ * formats. Used to decide whether to render the per-row API format badge
246
+ * inside a group (the badge is normally hidden because the group header
247
+ * already shows the format).
248
+ */
249
+ export function hasMixedApiFormat(logs: CapturedLog[]): boolean {
250
+ let hasAnthropic = false;
251
+ let hasOpenai = false;
252
+ for (const log of logs) {
253
+ if (log.apiFormat === "anthropic") hasAnthropic = true;
254
+ else if (log.apiFormat === "openai") hasOpenai = true;
255
+ if (hasAnthropic && hasOpenai) return true;
256
+ }
257
+ return false;
258
+ }
259
+
260
+ export function getConversationId(log: CapturedLog): string {
261
+ if (log.isTest === true) return "provider-test";
262
+ if (log.sessionId !== null && log.sessionId !== "" && log.sessionId !== undefined) {
263
+ return log.sessionId;
264
+ }
265
+ const hasPid = log.clientPid !== null && log.clientPid !== undefined;
266
+ const hasFolder = log.clientProjectFolder !== null && log.clientProjectFolder !== undefined;
267
+ if (!hasPid && !hasFolder) return "default";
268
+ const pid = hasPid ? `PID:${log.clientPid}` : "unknown";
269
+ const folder = hasFolder ? log.clientProjectFolder : "no-folder";
270
+ return `${pid}|${folder}`;
271
+ }
272
+
273
+ export function groupLogsByConversation(logs: CapturedLog[]): ConversationGroupData[] {
274
+ const groups = new Map<string, CapturedLog[]>();
275
+
276
+ for (const log of logs) {
277
+ const convId = getConversationId(log);
278
+ const existing = groups.get(convId);
279
+ if (existing !== undefined) {
280
+ existing.push(log);
281
+ } else {
282
+ groups.set(convId, [log]);
283
+ }
284
+ }
285
+
286
+ const result: ConversationGroupData[] = [];
287
+
288
+ for (const [conversationId, groupLogs] of groups) {
289
+ const sorted = [...groupLogs].sort((a, b) => a.timestamp.localeCompare(b.timestamp));
290
+ result.push({
291
+ id: conversationId,
292
+ conversationId,
293
+ logs: sorted,
294
+ });
295
+ }
296
+
297
+ result.sort((a, b) => (a.logs[0]?.timestamp ?? "").localeCompare(b.logs[0]?.timestamp ?? ""));
298
+
299
+ return result;
300
+ }