@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,467 @@
1
+ import type { JSX } from "react";
2
+ import { cn } from "../../lib/utils";
3
+
4
+ type CrabVariantProps = { className?: string; style?: React.CSSProperties };
5
+
6
+ function SvgShell({
7
+ className,
8
+ style,
9
+ d,
10
+ eyeStalks,
11
+ eyes,
12
+ legs,
13
+ extras,
14
+ }: CrabVariantProps & {
15
+ d: string;
16
+ eyeStalks: JSX.Element;
17
+ eyes: JSX.Element;
18
+ legs: JSX.Element;
19
+ extras?: JSX.Element;
20
+ }): JSX.Element {
21
+ return (
22
+ <svg
23
+ viewBox="0 0 24 24"
24
+ fill="none"
25
+ stroke="currentColor"
26
+ strokeWidth="1.5"
27
+ strokeLinecap="round"
28
+ strokeLinejoin="round"
29
+ aria-hidden="true"
30
+ style={style}
31
+ className={cn("inline-block size-5", className)}
32
+ >
33
+ <path d={d} />
34
+ {eyeStalks}
35
+ {eyes}
36
+ {legs}
37
+ {extras}
38
+ </svg>
39
+ );
40
+ }
41
+
42
+ // Shared legs
43
+ const StdLegs = (
44
+ <>
45
+ <line x1="6.5" y1="16" x2="4.5" y2="19.5" />
46
+ <line x1="9" y1="17.5" x2="8" y2="20.5" />
47
+ <line x1="15" y1="17.5" x2="16" y2="20.5" />
48
+ <line x1="17.5" y1="16" x2="19.5" y2="19.5" />
49
+ </>
50
+ );
51
+
52
+ const ShortLegs = (
53
+ <>
54
+ <line x1="7" y1="16" x2="5.5" y2="18.5" />
55
+ <line x1="9.5" y1="17" x2="8.5" y2="19.5" />
56
+ <line x1="14.5" y1="17" x2="15.5" y2="19.5" />
57
+ <line x1="17" y1="16" x2="18.5" y2="18.5" />
58
+ </>
59
+ );
60
+
61
+ // ── 1. Classic ──
62
+ function Crab1({ className }: CrabVariantProps): JSX.Element {
63
+ return (
64
+ <SvgShell
65
+ className={className}
66
+ d="M5 13 C5 9 8 7 12 7 C16 7 19 9 19 13 C19 16 16 18 12 18 C8 18 5 16 5 13 Z"
67
+ eyeStalks={
68
+ <>
69
+ <line x1="10" y1="7" x2="9.5" y2="5" />
70
+ <line x1="14" y1="7" x2="14.5" y2="5" />
71
+ </>
72
+ }
73
+ eyes={
74
+ <>
75
+ <circle cx="9.5" cy="4.5" r="0.9" fill="currentColor" stroke="none" />
76
+ <circle cx="14.5" cy="4.5" r="0.9" fill="currentColor" stroke="none" />
77
+ </>
78
+ }
79
+ legs={StdLegs}
80
+ extras={
81
+ <>
82
+ <path d="M5 11 C3.5 9.5 1.5 10 2 12.5 C2.5 14 4 13.5 5 12.5" />
83
+ <path d="M19 11 C20.5 9.5 22.5 10 22 12.5 C21.5 14 20 13.5 19 12.5" />
84
+ </>
85
+ }
86
+ />
87
+ );
88
+ }
89
+
90
+ // ── 2. Round (chubby) ──
91
+ function Crab2({ className }: CrabVariantProps): JSX.Element {
92
+ return (
93
+ <SvgShell
94
+ className={className}
95
+ d="M4 13 C4 7 7.5 5.5 12 5.5 C16.5 5.5 20 7 20 13 C20 17.5 16.5 19 12 19 C7.5 19 4 17.5 4 13 Z"
96
+ eyeStalks={
97
+ <>
98
+ <line x1="9.5" y1="6.5" x2="9.5" y2="4.5" />
99
+ <line x1="14.5" y1="6.5" x2="14.5" y2="4.5" />
100
+ </>
101
+ }
102
+ eyes={
103
+ <>
104
+ <circle cx="9.5" cy="4" r="1.1" fill="currentColor" stroke="none" />
105
+ <circle cx="14.5" cy="4" r="1.1" fill="currentColor" stroke="none" />
106
+ </>
107
+ }
108
+ legs={ShortLegs}
109
+ extras={
110
+ <>
111
+ <path d="M5 11 C4 9.5 2.5 10 3 12 C3.5 13.5 4.5 13 5 12" />
112
+ <path d="M19 11 C20 9.5 21.5 10 21 12 C20.5 13.5 19.5 13 19 12" />
113
+ </>
114
+ }
115
+ />
116
+ );
117
+ }
118
+
119
+ // ── 3. Wide (pancake) ──
120
+ function Crab3({ className }: CrabVariantProps): JSX.Element {
121
+ return (
122
+ <SvgShell
123
+ className={className}
124
+ d="M3 13.5 C3 8 7 6 12 6 C17 6 21 8 21 13.5 C21 17 17 19 12 19 C7 19 3 17 3 13.5 Z"
125
+ eyeStalks={
126
+ <>
127
+ <line x1="7" y1="7" x2="6.5" y2="4.5" />
128
+ <line x1="17" y1="7" x2="17.5" y2="4.5" />
129
+ </>
130
+ }
131
+ eyes={
132
+ <>
133
+ <circle cx="6.5" cy="4" r="0.8" fill="currentColor" stroke="none" />
134
+ <circle cx="17.5" cy="4" r="0.8" fill="currentColor" stroke="none" />
135
+ </>
136
+ }
137
+ legs={StdLegs}
138
+ extras={
139
+ <>
140
+ <path d="M4 12 C2.5 10.5 1 11 1.5 13 C2 14.5 3.5 14 4.5 13" />
141
+ <path d="M20 12 C21.5 10.5 23 11 22.5 13 C22 14.5 20.5 14 19.5 13" />
142
+ </>
143
+ }
144
+ />
145
+ );
146
+ }
147
+
148
+ // ── 4. Tall (stretch) ──
149
+ function Crab4({ className }: CrabVariantProps): JSX.Element {
150
+ return (
151
+ <SvgShell
152
+ className={className}
153
+ d="M6 14 C6 8 9 5.5 12 5.5 C15 5.5 18 8 18 14 C18 18 15 20 12 20 C9 20 6 18 6 14 Z"
154
+ eyeStalks={
155
+ <>
156
+ <line x1="10" y1="6.5" x2="10" y2="3.5" />
157
+ <line x1="14" y1="6.5" x2="14" y2="3.5" />
158
+ </>
159
+ }
160
+ eyes={
161
+ <>
162
+ <circle cx="10" cy="3" r="0.7" fill="currentColor" stroke="none" />
163
+ <circle cx="14" cy="3" r="0.7" fill="currentColor" stroke="none" />
164
+ </>
165
+ }
166
+ legs={
167
+ <>
168
+ <line x1="7" y1="17" x2="5" y2="20.5" />
169
+ <line x1="9.5" y1="18.5" x2="8.5" y2="21.5" />
170
+ <line x1="14.5" y1="18.5" x2="15.5" y2="21.5" />
171
+ <line x1="17" y1="17" x2="19" y2="20.5" />
172
+ </>
173
+ }
174
+ extras={
175
+ <>
176
+ <path d="M6.5 11 C5 8.5 3 9 3.5 11.5 C4 13.5 5 13 6 12" />
177
+ <path d="M17.5 11 C19 8.5 21 9 20.5 11.5 C20 13.5 19 13 18 12" />
178
+ </>
179
+ }
180
+ />
181
+ );
182
+ }
183
+
184
+ // ── 5. Spiky ──
185
+ function Crab5({ className }: CrabVariantProps): JSX.Element {
186
+ return (
187
+ <SvgShell
188
+ className={className}
189
+ d="M5 13 C5 9 8 7 12 7 L13 4 L14 7 C16 7 19 9 19 13 C19 16 16 18 13 18 L12 21 L11 18 C8 18 5 16 5 13 Z"
190
+ eyeStalks={
191
+ <>
192
+ <line x1="10" y1="7" x2="9.5" y2="5" />
193
+ <line x1="14" y1="7" x2="14.5" y2="5" />
194
+ </>
195
+ }
196
+ eyes={
197
+ <>
198
+ <circle cx="9.5" cy="4.5" r="0.8" fill="currentColor" stroke="none" />
199
+ <circle cx="14.5" cy="4.5" r="0.8" fill="currentColor" stroke="none" />
200
+ </>
201
+ }
202
+ legs={StdLegs}
203
+ extras={
204
+ <>
205
+ <path d="M5 11 C3.5 9.5 1.5 10 2 12.5 C2.5 14 4 13.5 5 12.5" />
206
+ <path d="M19 11 C20.5 9.5 22.5 10 22 12.5 C21.5 14 20 13.5 19 12.5" />
207
+ </>
208
+ }
209
+ />
210
+ );
211
+ }
212
+
213
+ // ── 6. Wink ──
214
+ function Crab6({ className }: CrabVariantProps): JSX.Element {
215
+ return (
216
+ <SvgShell
217
+ className={className}
218
+ d="M5 13 C5 9 8 7 12 7 C16 7 19 9 19 13 C19 16 16 18 12 18 C8 18 5 16 5 13 Z"
219
+ eyeStalks={
220
+ <>
221
+ <line x1="10" y1="7" x2="9.5" y2="5" />
222
+ <line x1="14" y1="7" x2="14.5" y2="5" />
223
+ </>
224
+ }
225
+ eyes={
226
+ <>
227
+ <circle cx="9.5" cy="4.5" r="0.9" fill="currentColor" stroke="none" />
228
+ <line x1="13.5" y1="4" x2="15.5" y2="5" />
229
+ </>
230
+ }
231
+ legs={StdLegs}
232
+ extras={
233
+ <>
234
+ <path d="M5 11 C3.5 9.5 1.5 10 2 12.5 C2.5 14 4 13.5 5 12.5" />
235
+ <path d="M19 11 C20.5 9.5 22.5 10 22 12.5 C21.5 14 20 13.5 19 12.5" />
236
+ </>
237
+ }
238
+ />
239
+ );
240
+ }
241
+
242
+ // ── 7. Sleepy ──
243
+ function Crab7({ className }: CrabVariantProps): JSX.Element {
244
+ return (
245
+ <SvgShell
246
+ className={className}
247
+ d="M5.5 13.5 C5.5 10 8.5 8 12 8 C15.5 8 18.5 10 18.5 13.5 C18.5 16 15.5 17.5 12 17.5 C8.5 17.5 5.5 16 5.5 13.5 Z"
248
+ eyeStalks={
249
+ <>
250
+ <line x1="10" y1="8" x2="10" y2="6" />
251
+ <line x1="14" y1="8" x2="14" y2="6" />
252
+ </>
253
+ }
254
+ eyes={
255
+ <>
256
+ <line x1="9" y1="6" x2="11" y2="6.5" />
257
+ <line x1="13" y1="6" x2="15" y2="6.5" />
258
+ </>
259
+ }
260
+ legs={ShortLegs}
261
+ extras={
262
+ <>
263
+ <path d="M6 11.5 C4.5 10.5 3 11 3.5 12.5 C4 13.5 5 13 5.5 12.5" />
264
+ <path d="M18 11.5 C19.5 10.5 21 11 20.5 12.5 C20 13.5 19 13 18.5 12.5" />
265
+ </>
266
+ }
267
+ />
268
+ );
269
+ }
270
+
271
+ // ── 8. Grumpy (angry brows) ──
272
+ function Crab8({ className }: CrabVariantProps): JSX.Element {
273
+ return (
274
+ <SvgShell
275
+ className={className}
276
+ d="M5 13 C5 9 8 7 12 7 C16 7 19 9 19 13 C19 16 16 18 12 18 C8 18 5 16 5 13 Z"
277
+ eyeStalks={
278
+ <>
279
+ <line x1="10" y1="7" x2="9.5" y2="5" />
280
+ <line x1="14" y1="7" x2="14.5" y2="5" />
281
+ </>
282
+ }
283
+ eyes={
284
+ <>
285
+ <circle cx="9.5" cy="4.5" r="0.7" fill="currentColor" stroke="none" />
286
+ <circle cx="14.5" cy="4.5" r="0.7" fill="currentColor" stroke="none" />
287
+ </>
288
+ }
289
+ legs={StdLegs}
290
+ extras={
291
+ <>
292
+ <path d="M5 11 C3.5 9.5 1.5 10 2 12.5 C2.5 14 4 13.5 5 12.5" />
293
+ <path d="M19 11 C20.5 9.5 22.5 10 22 12.5 C21.5 14 20 13.5 19 12.5" />
294
+ {/* Angry brows */}
295
+ <line x1="8.5" y1="4" x2="10.5" y2="4.5" />
296
+ <line x1="15.5" y1="4" x2="13.5" y2="4.5" />
297
+ {/* Frown */}
298
+ <path d="M9 15.5 C10 14.5 14 14.5 15 15.5" />
299
+ </>
300
+ }
301
+ />
302
+ );
303
+ }
304
+
305
+ // ── 9. Surprised ──
306
+ function Crab9({ className }: CrabVariantProps): JSX.Element {
307
+ return (
308
+ <SvgShell
309
+ className={className}
310
+ d="M5 13 C5 9 8 7 12 7 C16 7 19 9 19 13 C19 16 16 18 12 18 C8 18 5 16 5 13 Z"
311
+ eyeStalks={
312
+ <>
313
+ <line x1="10" y1="7" x2="9.5" y2="5" />
314
+ <line x1="14" y1="7" x2="14.5" y2="5" />
315
+ </>
316
+ }
317
+ eyes={
318
+ <>
319
+ <circle cx="9.5" cy="4.5" r="1.2" fill="none" stroke="currentColor" />
320
+ <circle cx="14.5" cy="4.5" r="1.2" fill="none" stroke="currentColor" />
321
+ </>
322
+ }
323
+ legs={StdLegs}
324
+ extras={
325
+ <>
326
+ <path d="M5 11 C3.5 9.5 1.5 10 2 12.5 C2.5 14 4 13.5 5 12.5" />
327
+ <path d="M19 11 C20.5 9.5 22.5 10 22 12.5 C21.5 14 20 13.5 19 12.5" />
328
+ {/* Open mouth */}
329
+ <ellipse cx="12" cy="15" rx="2" ry="1.5" fill="currentColor" stroke="none" />
330
+ </>
331
+ }
332
+ />
333
+ );
334
+ }
335
+
336
+ // ── 10. Happy (big smile) ──
337
+ function Crab10({ className }: CrabVariantProps): JSX.Element {
338
+ return (
339
+ <SvgShell
340
+ className={className}
341
+ d="M4.5 13 C4.5 8 7.5 6 12 6 C16.5 6 19.5 8 19.5 13 C19.5 17 16.5 18.5 12 18.5 C7.5 18.5 4.5 17 4.5 13 Z"
342
+ eyeStalks={
343
+ <>
344
+ <line x1="9.5" y1="7" x2="9" y2="5" />
345
+ <line x1="14.5" y1="7" x2="15" y2="5" />
346
+ </>
347
+ }
348
+ eyes={
349
+ <>
350
+ <circle cx="9" cy="4.5" r="1" fill="currentColor" stroke="none" />
351
+ <circle cx="15" cy="4.5" r="1" fill="currentColor" stroke="none" />
352
+ </>
353
+ }
354
+ legs={StdLegs}
355
+ extras={
356
+ <>
357
+ <path d="M5 11 C3.5 9 2 9.5 2.5 12 C3 14 4 13 5 12" />
358
+ <path d="M19 11 C20.5 9 22 9.5 21.5 12 C21 14 20 13 19 12" />
359
+ {/* Smile */}
360
+ <path d="M9 14.5 C10 16 14 16 15 14.5" />
361
+ {/* Rosy cheeks */}
362
+ <circle cx="7" cy="13" r="1" fill="currentColor" stroke="none" opacity="0.3" />
363
+ <circle cx="17" cy="13" r="1" fill="currentColor" stroke="none" opacity="0.3" />
364
+ </>
365
+ }
366
+ />
367
+ );
368
+ }
369
+
370
+ // ── 11. Cool (sunglasses) ──
371
+ function Crab11({ className }: CrabVariantProps): JSX.Element {
372
+ return (
373
+ <SvgShell
374
+ className={className}
375
+ d="M5 13 C5 9 8 7 12 7 C16 7 19 9 19 13 C19 16 16 18 12 18 C8 18 5 16 5 13 Z"
376
+ eyeStalks={
377
+ <>
378
+ <line x1="10" y1="7" x2="9.5" y2="5.5" />
379
+ <line x1="14" y1="7" x2="14.5" y2="5.5" />
380
+ </>
381
+ }
382
+ eyes={
383
+ <>
384
+ {/* Sunglasses bar */}
385
+ <line x1="7.5" y1="5.5" x2="16.5" y2="5.5" />
386
+ <rect x="7" y="5" width="4" height="2" rx="0.5" fill="currentColor" stroke="none" />
387
+ <rect x="13" y="5" width="4" height="2" rx="0.5" fill="currentColor" stroke="none" />
388
+ </>
389
+ }
390
+ legs={StdLegs}
391
+ extras={
392
+ <>
393
+ <path d="M5 11 C3.5 9.5 1.5 10 2 12.5 C2.5 14 4 13.5 5 12.5" />
394
+ <path d="M19 11 C20.5 9.5 22.5 10 22 12.5 C21.5 14 20 13.5 19 12.5" />
395
+ {/* Cool smile */}
396
+ <path d="M9.5 15 C10.5 16 13.5 16 14.5 15" />
397
+ </>
398
+ }
399
+ />
400
+ );
401
+ }
402
+
403
+ // ── 12. Baby (tiny, cute) ──
404
+ function Crab12({ className }: CrabVariantProps): JSX.Element {
405
+ return (
406
+ <SvgShell
407
+ className={className}
408
+ d="M7 13.5 C7 10.5 9.5 9 12 9 C14.5 9 17 10.5 17 13.5 C17 16 14.5 17.5 12 17.5 C9.5 17.5 7 16 7 13.5 Z"
409
+ eyeStalks={
410
+ <>
411
+ <line x1="10.5" y1="9.5" x2="10.5" y2="8" />
412
+ <line x1="13.5" y1="9.5" x2="13.5" y2="8" />
413
+ </>
414
+ }
415
+ eyes={
416
+ <>
417
+ <circle cx="10.5" cy="7.5" r="0.8" fill="currentColor" stroke="none" />
418
+ <circle cx="13.5" cy="7.5" r="0.8" fill="currentColor" stroke="none" />
419
+ </>
420
+ }
421
+ legs={
422
+ <>
423
+ <line x1="8" y1="16" x2="6.5" y2="18" />
424
+ <line x1="10" y1="17" x2="9.5" y2="19" />
425
+ <line x1="14" y1="17" x2="14.5" y2="19" />
426
+ <line x1="16" y1="16" x2="17.5" y2="18" />
427
+ </>
428
+ }
429
+ extras={
430
+ <>
431
+ <path d="M7.5 12 C6.5 11 5.5 11.5 6 13 C6.5 14 7 13.5 7.5 13" />
432
+ <path d="M16.5 12 C17.5 11 18.5 11.5 18 13 C17.5 14 17 13.5 16.5 13" />
433
+ </>
434
+ }
435
+ />
436
+ );
437
+ }
438
+
439
+ export const crabVariants: ((props: CrabVariantProps) => JSX.Element)[] = [
440
+ Crab1,
441
+ Crab2,
442
+ Crab3,
443
+ Crab4,
444
+ Crab5,
445
+ Crab6,
446
+ Crab7,
447
+ Crab8,
448
+ Crab9,
449
+ Crab10,
450
+ Crab11,
451
+ Crab12,
452
+ ];
453
+
454
+ export function getCrabVariant(index: number): (props: CrabVariantProps) => JSX.Element {
455
+ return crabVariants[Math.abs(index) % crabVariants.length] ?? Crab1;
456
+ }
457
+
458
+ export function getInteriorCrabVariantIndex(seed: number): number {
459
+ const interiorCount = crabVariants.length - 2;
460
+ if (interiorCount <= 0) return 0;
461
+ const normalizedSeed = Number.isFinite(seed) ? Math.trunc(seed) : 0;
462
+ return 1 + (((normalizedSeed % interiorCount) + interiorCount) % interiorCount);
463
+ }
464
+
465
+ export function getInteriorCrabVariant(seed: number): (props: CrabVariantProps) => JSX.Element {
466
+ return getCrabVariant(getInteriorCrabVariantIndex(seed));
467
+ }
@@ -0,0 +1,129 @@
1
+ "use client";
2
+
3
+ import * as DialogPrimitive from "@radix-ui/react-dialog";
4
+ import { X } from "lucide-react";
5
+ import * as React from "react";
6
+
7
+ import { cn } from "../../lib/utils";
8
+
9
+ function Dialog({
10
+ ...props
11
+ }: React.ComponentProps<typeof DialogPrimitive.Root>): React.JSX.Element {
12
+ return <DialogPrimitive.Root data-slot="dialog" {...props} />;
13
+ }
14
+
15
+ function DialogTrigger({
16
+ ...props
17
+ }: React.ComponentProps<typeof DialogPrimitive.Trigger>): React.JSX.Element {
18
+ return <DialogPrimitive.Trigger data-slot="dialog-trigger" {...props} />;
19
+ }
20
+
21
+ function DialogPortal({
22
+ ...props
23
+ }: React.ComponentProps<typeof DialogPrimitive.Portal>): React.JSX.Element {
24
+ return <DialogPrimitive.Portal data-slot="dialog-portal" {...props} />;
25
+ }
26
+
27
+ function DialogClose({
28
+ ...props
29
+ }: React.ComponentProps<typeof DialogPrimitive.Close>): React.JSX.Element {
30
+ return <DialogPrimitive.Close data-slot="dialog-close" {...props} />;
31
+ }
32
+
33
+ function DialogOverlay({
34
+ className,
35
+ ...props
36
+ }: React.ComponentProps<typeof DialogPrimitive.Overlay>): React.JSX.Element {
37
+ return (
38
+ <DialogPrimitive.Overlay
39
+ data-slot="dialog-overlay"
40
+ className={cn(
41
+ "fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
42
+ className,
43
+ )}
44
+ {...props}
45
+ />
46
+ );
47
+ }
48
+
49
+ function DialogContent({
50
+ className,
51
+ children,
52
+ ...props
53
+ }: React.ComponentProps<typeof DialogPrimitive.Content>): React.JSX.Element {
54
+ return (
55
+ <DialogPortal>
56
+ <DialogOverlay />
57
+ <DialogPrimitive.Content
58
+ data-slot="dialog-content"
59
+ className={cn(
60
+ "fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] rounded-lg",
61
+ className,
62
+ )}
63
+ {...props}
64
+ >
65
+ {children}
66
+ <DialogPrimitive.Close className="absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground">
67
+ <X className="size-4" />
68
+ <span className="sr-only">Close</span>
69
+ </DialogPrimitive.Close>
70
+ </DialogPrimitive.Content>
71
+ </DialogPortal>
72
+ );
73
+ }
74
+
75
+ function DialogHeader({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element {
76
+ return (
77
+ <div
78
+ data-slot="dialog-header"
79
+ className={cn("flex flex-col space-y-1.5 text-center sm:text-left", className)}
80
+ {...props}
81
+ />
82
+ );
83
+ }
84
+
85
+ function DialogFooter({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element {
86
+ return (
87
+ <div
88
+ data-slot="dialog-footer"
89
+ className={cn("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2", className)}
90
+ {...props}
91
+ />
92
+ );
93
+ }
94
+
95
+ function DialogTitle({
96
+ className,
97
+ ...props
98
+ }: React.ComponentProps<typeof DialogPrimitive.Title>): React.JSX.Element {
99
+ return (
100
+ <DialogPrimitive.Title
101
+ data-slot="dialog-title"
102
+ className={cn("text-lg font-semibold leading-none tracking-tight", className)}
103
+ {...props}
104
+ />
105
+ );
106
+ }
107
+
108
+ function DialogDescription({
109
+ className,
110
+ ...props
111
+ }: React.ComponentProps<typeof DialogPrimitive.Description>): React.JSX.Element {
112
+ return (
113
+ <DialogPrimitive.Description
114
+ data-slot="dialog-description"
115
+ className={cn("text-sm text-muted-foreground", className)}
116
+ {...props}
117
+ />
118
+ );
119
+ }
120
+
121
+ export {
122
+ Dialog,
123
+ DialogPortal,
124
+ DialogOverlay,
125
+ DialogTrigger,
126
+ DialogContent,
127
+ DialogHeader,
128
+ DialogTitle,
129
+ };
@@ -0,0 +1,56 @@
1
+ import { ChevronsDown, ChevronsUp } from "lucide-react";
2
+ import type { JSX } from "react";
3
+ import { Button } from "./button";
4
+ import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "./tooltip";
5
+ import type { JsonExpansionPolicy } from "./json-viewer-bulk";
6
+
7
+ /**
8
+ * Toggle the JSON bulk-expansion state of a request body. Split into its own
9
+ * module (instead of living next to `JsonViewer`) so the bundler can put
10
+ * `JsonViewer` into a lazy chunk — the static import of the toolbar button
11
+ * used to drag the whole viewer into the main bundle.
12
+ */
13
+ export function JsonExpansionButton({
14
+ policy,
15
+ isExpanded,
16
+ isPending,
17
+ onToggle,
18
+ }: {
19
+ policy: JsonExpansionPolicy | null;
20
+ isExpanded: boolean;
21
+ isPending: boolean;
22
+ onToggle: () => void;
23
+ }): JSX.Element | null {
24
+ if (policy === null) return null;
25
+
26
+ const label = isPending ? "Updating..." : isExpanded ? "Collapse all" : "Expand all";
27
+ const tooltip = isExpanded ? "Collapse all JSON nodes" : "Expand all JSON nodes";
28
+
29
+ return (
30
+ <TooltipProvider>
31
+ <Tooltip>
32
+ <TooltipTrigger asChild>
33
+ <Button
34
+ variant="outline"
35
+ size="sm"
36
+ className="h-8 text-xs"
37
+ onClick={(e) => {
38
+ e.stopPropagation();
39
+ onToggle();
40
+ }}
41
+ disabled={isPending}
42
+ aria-pressed={isExpanded}
43
+ >
44
+ {isExpanded ? (
45
+ <ChevronsUp className="size-3.5 mr-1" />
46
+ ) : (
47
+ <ChevronsDown className="size-3.5 mr-1" />
48
+ )}
49
+ {label}
50
+ </Button>
51
+ </TooltipTrigger>
52
+ <TooltipContent>{tooltip}</TooltipContent>
53
+ </Tooltip>
54
+ </TooltipProvider>
55
+ );
56
+ }