@tonyclaw/agent-inspector 3.0.44 → 3.0.46

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 (347) hide show
  1. package/.output/{nitro.json → backend/nitro.json} +3 -3
  2. package/.output/backend-public/assets/index-D4LX-sw-.js +11 -0
  3. package/.output/cli.js +22707 -17099
  4. package/.output/server/_libs/extend.mjs +4 -8
  5. package/.output/server/_libs/jszip.mjs +9 -35
  6. package/.output/server/_libs/modelcontextprotocol__core.mjs +25 -25
  7. package/.output/server/_libs/modelcontextprotocol__server.mjs +2 -2
  8. package/.output/server/_libs/react-dom.mjs +2 -3
  9. package/.output/server/_libs/react.mjs +1 -27
  10. package/.output/server/_libs/tanstack__react-router.mjs +1 -329
  11. package/.output/server/_libs/tanstack__router-core.mjs +42 -100
  12. package/.output/server/_libs/use-sync-external-store.mjs +1 -64
  13. package/.output/server/_libs/ws.mjs +1 -1
  14. package/.output/server/_libs/zod.mjs +6 -6
  15. package/.output/server/_ssr/index.mjs +5 -4
  16. package/.output/server/_ssr/publicBasePathContext-IH2ilOfu.mjs +176 -0
  17. package/.output/server/_ssr/{router-DWcUFPR3.mjs → router-D18yUq36.mjs} +7877 -5597
  18. package/.output/server/_ssr/start-COQu_AgD.mjs +57 -0
  19. package/.output/server/_tanstack-start-manifest_v-DnbdNeun.mjs +4 -0
  20. package/.output/server/index.mjs +5 -145
  21. package/.output/{public/assets/CompareDrawer-DQHjxFO6.js → ui/assets/CompareDrawer-DAUuIJ6G.js} +1 -1
  22. package/.output/{public/assets/InspectorPet-D1A4505B.js → ui/assets/InspectorPet-BRBVjOWI.js} +1 -1
  23. package/.output/ui/assets/ProxyViewerContainer-D7Sq0ctc.js +59 -0
  24. package/.output/{public/assets/ReplayDialog-C5vmbecv.js → ui/assets/ReplayDialog-nDLsjOhs.js} +1 -1
  25. package/.output/{public/assets/RequestAnatomy-CPGNB8lk.js → ui/assets/RequestAnatomy-zd4BDgL0.js} +1 -1
  26. package/.output/ui/assets/ResponseView-AdIXGcSn.js +2 -0
  27. package/.output/ui/assets/StreamingChunkSequence-CesTz8He.js +1 -0
  28. package/.output/{public/assets/_sessionId-CDhRgzf6.js → ui/assets/_sessionId-BAfzrhSU.js} +1 -1
  29. package/.output/{public/assets/_sessionId-mw3aA8Bp.js → ui/assets/_sessionId-QnBomgPD.js} +1 -1
  30. package/.output/ui/assets/favicon-DYEkHSNl.svg +21 -0
  31. package/.output/{public/assets/index-B2eoeT-Z.js → ui/assets/index-BcsdxBAd.js} +1 -1
  32. package/.output/ui/assets/index-BvXp42al.css +1 -0
  33. package/.output/{public/assets/index-CX7_rf7o.js → ui/assets/index-D0rtCN9V.js} +1 -1
  34. package/.output/ui/assets/index-DHpwr08Z.js +73 -0
  35. package/.output/{public/assets/index-BfRhTvOd.js → ui/assets/index-dNuk2dsU.js} +1 -1
  36. package/.output/ui/assets/json-viewer-BvFHglMb.js +1 -0
  37. package/.output/{public/assets/jszip.min-C9rCFoU3.js → ui/assets/jszip.min-B5Z7gNZB.js} +1 -1
  38. package/.output/ui/index.html +229 -0
  39. package/.output/ui/runtime-config.js +2 -0
  40. package/.output/workers/logFinalizer.worker.js +983 -414
  41. package/.output/workers/sessionWorkerEntry.js +983 -414
  42. package/README.md +363 -35
  43. package/docs/instance-control.openapi.yaml +361 -0
  44. package/package.json +28 -5
  45. package/scripts/generate-theme-scales.mjs +3 -3
  46. package/src/{router.tsx → backend/router.tsx} +3 -15
  47. package/src/backend/routes/$.ts +26 -0
  48. package/src/backend/routes/__root.ts +4 -0
  49. package/src/backend/routes/api/-instances.ts +109 -0
  50. package/src/{routes → backend/routes}/api/alerts.summary.ts +3 -3
  51. package/src/{routes → backend/routes}/api/alerts.ts +4 -4
  52. package/src/{routes → backend/routes}/api/config.paths.ts +1 -1
  53. package/src/{routes → backend/routes}/api/config.ts +11 -2
  54. package/src/{routes → backend/routes}/api/ecosystem.packages.$packageId.help.ts +1 -1
  55. package/src/{routes → backend/routes}/api/ecosystem.packages.$packageId.install.ts +1 -1
  56. package/src/{routes → backend/routes}/api/ecosystem.packages.$packageId.runner-presets.ts +1 -1
  57. package/src/{routes → backend/routes}/api/ecosystem.packages.$packageId.upgrade.ts +1 -1
  58. package/src/{routes → backend/routes}/api/ecosystem.packages.ts +5 -1
  59. package/src/{routes → backend/routes}/api/ecosystem.recipes.$recipeId.run.ts +1 -1
  60. package/src/{routes → backend/routes}/api/ecosystem.tasks.$taskId.ts +1 -1
  61. package/src/{routes → backend/routes}/api/ecosystem.tasks.ts +1 -1
  62. package/src/{routes → backend/routes}/api/groups.$groupId.evidence.ts +2 -2
  63. package/src/{routes → backend/routes}/api/groups.$groupId.sessions.ts +2 -2
  64. package/src/{routes → backend/routes}/api/groups.$groupId.ts +2 -2
  65. package/src/{routes → backend/routes}/api/groups.ts +2 -2
  66. package/src/{routes → backend/routes}/api/health.ts +3 -3
  67. package/src/backend/routes/api/instances.$name.connection.ts +12 -0
  68. package/src/backend/routes/api/instances.$name.restart.ts +23 -0
  69. package/src/backend/routes/api/instances.$name.start.ts +18 -0
  70. package/src/backend/routes/api/instances.$name.stop.ts +23 -0
  71. package/src/backend/routes/api/instances.$name.ts +12 -0
  72. package/src/backend/routes/api/instances.ts +16 -0
  73. package/src/{routes → backend/routes}/api/knowledge.candidates.$candidateId.promote.ts +2 -2
  74. package/src/{routes → backend/routes}/api/knowledge.candidates.$candidateId.ts +2 -2
  75. package/src/{routes → backend/routes}/api/knowledge.candidates.ts +1 -1
  76. package/src/{routes → backend/routes}/api/knowledge.project-context.ts +2 -2
  77. package/src/{routes → backend/routes}/api/knowledge.search.ts +2 -2
  78. package/src/{routes → backend/routes}/api/knowledge.sessions.$sessionId.candidates.ts +3 -3
  79. package/src/{routes → backend/routes}/api/logs.$id.body.ts +6 -6
  80. package/src/{routes → backend/routes}/api/logs.$id.chunks.ts +5 -4
  81. package/src/{routes → backend/routes}/api/logs.$id.replay.ts +12 -11
  82. package/src/{routes → backend/routes}/api/logs.$id.ts +4 -3
  83. package/src/{routes → backend/routes}/api/logs.import.ts +3 -3
  84. package/src/{routes → backend/routes}/api/logs.stream.ts +11 -7
  85. package/src/{routes → backend/routes}/api/logs.ts +17 -9
  86. package/src/{routes → backend/routes}/api/mcp.ts +1 -1
  87. package/src/{routes → backend/routes}/api/models.ts +1 -1
  88. package/src/{routes → backend/routes}/api/pi-agent.ts +2 -2
  89. package/src/{routes → backend/routes}/api/providers.$providerId.model-metadata.ts +5 -5
  90. package/src/{routes → backend/routes}/api/providers.$providerId.test.log.ts +7 -7
  91. package/src/{routes → backend/routes}/api/providers.$providerId.ts +4 -4
  92. package/src/{routes → backend/routes}/api/providers.export.ts +1 -1
  93. package/src/{routes → backend/routes}/api/providers.import.ts +3 -3
  94. package/src/{routes → backend/routes}/api/providers.scan.ts +2 -2
  95. package/src/{routes → backend/routes}/api/providers.ts +9 -4
  96. package/src/{routes → backend/routes}/api/runs.$runId.evidence.ts +2 -2
  97. package/src/{routes → backend/routes}/api/runs.$runId.ts +2 -2
  98. package/src/{routes → backend/routes}/api/runs.ts +4 -4
  99. package/src/backend/routes/api/runtime.ts +46 -0
  100. package/src/{routes → backend/routes}/api/sessions.ts +3 -3
  101. package/src/{routes → backend/routes}/proxy/$.ts +1 -1
  102. package/src/{routes → backend/routes}/readyz.ts +1 -1
  103. package/src/backend/start.ts +10 -0
  104. package/src/cli/alias.ts +431 -0
  105. package/src/cli/doctor.ts +32 -9
  106. package/src/cli/instance.ts +1050 -0
  107. package/src/cli/instanceArgs.ts +285 -0
  108. package/src/cli/instanceControl.ts +181 -0
  109. package/src/cli/instanceModel.ts +267 -0
  110. package/src/cli/instanceRegistry.ts +731 -0
  111. package/src/cli/networkHints.ts +27 -14
  112. package/src/cli/onboard.ts +190 -35
  113. package/src/cli/onboardTarget.ts +228 -0
  114. package/src/cli/templates/codex-skill-onboard.ts +109 -31
  115. package/src/cli/templates/skill-onboard.ts +140 -70
  116. package/src/cli.ts +338 -77
  117. package/src/components/ProxyViewer.tsx +20 -10
  118. package/src/components/ProxyViewerContainer.tsx +12 -11
  119. package/src/components/pi-agent/PiAgentPanel.tsx +2 -2
  120. package/src/components/providers/ProviderCard.tsx +1 -1
  121. package/src/components/providers/ProviderTestResultsView.tsx +1 -1
  122. package/src/components/providers/SettingsDialog.tsx +160 -140
  123. package/src/components/proxy-viewer/ApplicationBar.tsx +2 -1
  124. package/src/components/proxy-viewer/LogEntry.tsx +1 -1
  125. package/src/components/proxy-viewer/log-formats/index.ts +1 -1
  126. package/src/contracts/index.ts +5 -0
  127. package/src/contracts/log.ts +33 -3
  128. package/src/knowledge/types.ts +3 -2
  129. package/src/lib/alertContract.ts +2 -2
  130. package/src/lib/apiClient.ts +30 -7
  131. package/src/lib/apiFormat.ts +29 -0
  132. package/src/lib/basePath.ts +31 -7
  133. package/src/lib/browserRuntimeContract.ts +124 -0
  134. package/src/lib/browserRuntimeResolver.ts +244 -0
  135. package/src/{proxy → lib}/claudeCodeStrip.ts +6 -7
  136. package/src/lib/codingAgentEndpoints.ts +54 -0
  137. package/src/lib/instanceContract.ts +236 -0
  138. package/src/lib/managedInstance.ts +104 -0
  139. package/src/lib/piAgentContract.ts +3 -2
  140. package/src/lib/publicBasePathContext.ts +137 -0
  141. package/src/lib/resourceLimits.ts +2 -0
  142. package/src/lib/runContract.ts +3 -3
  143. package/src/lib/sessionInfoContract.ts +3 -2
  144. package/src/mcp/instanceHandlers.ts +150 -0
  145. package/src/mcp/loopback.ts +16 -5
  146. package/src/mcp/mode.ts +25 -0
  147. package/src/mcp/server.ts +274 -39
  148. package/src/mcp/toolHandlers.ts +2 -2
  149. package/src/proxy/config.ts +25 -30
  150. package/src/proxy/dataDir.ts +43 -7
  151. package/src/proxy/ecosystemTasks.ts +161 -70
  152. package/src/proxy/formats/registry.ts +6 -21
  153. package/src/proxy/handler.ts +129 -29
  154. package/src/proxy/identityProxy.ts +1049 -50
  155. package/src/proxy/jsonlRecovery.ts +554 -0
  156. package/src/proxy/logFinalizer.ts +25 -10
  157. package/src/proxy/logImporter.ts +2 -1
  158. package/src/proxy/logIndex.ts +191 -95
  159. package/src/proxy/logger.ts +77 -14
  160. package/src/proxy/platformCommands.ts +41 -0
  161. package/src/proxy/privateDataPath.ts +310 -88
  162. package/src/proxy/rawStreamCapture.ts +194 -13
  163. package/src/proxy/runtimeAdmission.ts +5 -2
  164. package/src/proxy/runtimeHealth.ts +14 -1
  165. package/src/proxy/runtimeShutdown.ts +84 -2
  166. package/src/proxy/schemas.ts +7 -1
  167. package/src/proxy/sessionArchive.ts +78 -14
  168. package/src/proxy/sessionInfo.ts +5 -4
  169. package/src/proxy/sqliteLogIndex.ts +65 -2
  170. package/src/proxy/store.ts +141 -34
  171. package/src/proxy/uiAssetServer.ts +106 -0
  172. package/src/proxy/upstream.ts +29 -2
  173. package/src/ui/bootstrap.ts +167 -0
  174. package/src/ui/index.html +38 -0
  175. package/src/ui/logsStreamClient.ts +20 -0
  176. package/src/ui/main.tsx +13 -0
  177. package/src/ui/public/runtime-config.js +2 -0
  178. package/src/ui/router.tsx +13 -0
  179. package/src/ui/routes/__root.tsx +69 -0
  180. package/src/{routes → ui/routes}/index.tsx +2 -3
  181. package/src/{routes → ui/routes}/session/$sessionId.tsx +5 -11
  182. package/src/ui/runtimeDiscovery.ts +50 -0
  183. package/styles/globals.css +1 -0
  184. package/.output/public/assets/ProxyViewerContainer-BhpIgfBi.js +0 -126
  185. package/.output/public/assets/ResponseView-DUfrajCm.js +0 -2
  186. package/.output/public/assets/StreamingChunkSequence-nbeCQqOz.js +0 -1
  187. package/.output/public/assets/index-BWjeqxbk.css +0 -1
  188. package/.output/public/assets/index-C6qZwYlR.js +0 -70
  189. package/.output/public/assets/json-viewer-BLmF1sOZ.js +0 -1
  190. package/.output/server/_libs/@radix-ui/react-accessible-icon+[...].mjs +0 -1
  191. package/.output/server/_libs/@radix-ui/react-dismissable-layer+[...].mjs +0 -344
  192. package/.output/server/_libs/@radix-ui/react-navigation-menu+[...].mjs +0 -2
  193. package/.output/server/_libs/@radix-ui/react-one-time-password-field+[...].mjs +0 -2
  194. package/.output/server/_libs/@radix-ui/react-password-toggle-field+[...].mjs +0 -2
  195. package/.output/server/_libs/@radix-ui/react-use-callback-ref+[...].mjs +0 -11
  196. package/.output/server/_libs/@radix-ui/react-use-controllable-state+[...].mjs +0 -69
  197. package/.output/server/_libs/@radix-ui/react-use-effect-event+[...].mjs +0 -1
  198. package/.output/server/_libs/@radix-ui/react-use-is-hydrated+[...].mjs +0 -28
  199. package/.output/server/_libs/@radix-ui/react-use-layout-effect+[...].mjs +0 -6
  200. package/.output/server/_libs/@radix-ui/react-visually-hidden+[...].mjs +0 -34
  201. package/.output/server/_libs/aria-hidden.mjs +0 -122
  202. package/.output/server/_libs/bail.mjs +0 -8
  203. package/.output/server/_libs/character-entities.mjs +0 -2130
  204. package/.output/server/_libs/class-variance-authority.mjs +0 -44
  205. package/.output/server/_libs/clsx.mjs +0 -16
  206. package/.output/server/_libs/comma-separated-tokens.mjs +0 -10
  207. package/.output/server/_libs/decode-named-character-reference+[...].mjs +0 -8
  208. package/.output/server/_libs/dequal.mjs +0 -27
  209. package/.output/server/_libs/detect-node-es.mjs +0 -1
  210. package/.output/server/_libs/devlop.mjs +0 -8
  211. package/.output/server/_libs/diff.mjs +0 -320
  212. package/.output/server/_libs/estree-util-is-identifier-name.mjs +0 -11
  213. package/.output/server/_libs/floating-ui__core.mjs +0 -725
  214. package/.output/server/_libs/floating-ui__dom.mjs +0 -622
  215. package/.output/server/_libs/floating-ui__react-dom.mjs +0 -292
  216. package/.output/server/_libs/floating-ui__utils.mjs +0 -320
  217. package/.output/server/_libs/get-nonce.mjs +0 -9
  218. package/.output/server/_libs/hast-util-to-jsx-runtime.mjs +0 -388
  219. package/.output/server/_libs/hast-util-whitespace.mjs +0 -10
  220. package/.output/server/_libs/html-url-attributes.mjs +0 -26
  221. package/.output/server/_libs/inline-style-parser.mjs +0 -142
  222. package/.output/server/_libs/is-plain-obj.mjs +0 -10
  223. package/.output/server/_libs/lucide-react.mjs +0 -1027
  224. package/.output/server/_libs/mdast-util-from-markdown.mjs +0 -717
  225. package/.output/server/_libs/mdast-util-to-hast.mjs +0 -710
  226. package/.output/server/_libs/mdast-util-to-string.mjs +0 -38
  227. package/.output/server/_libs/micromark-core-commonmark.mjs +0 -2259
  228. package/.output/server/_libs/micromark-factory-destination.mjs +0 -94
  229. package/.output/server/_libs/micromark-factory-label.mjs +0 -63
  230. package/.output/server/_libs/micromark-factory-space.mjs +0 -24
  231. package/.output/server/_libs/micromark-factory-title.mjs +0 -65
  232. package/.output/server/_libs/micromark-factory-whitespace.mjs +0 -22
  233. package/.output/server/_libs/micromark-util-character.mjs +0 -44
  234. package/.output/server/_libs/micromark-util-chunked.mjs +0 -36
  235. package/.output/server/_libs/micromark-util-classify-character+[...].mjs +0 -12
  236. package/.output/server/_libs/micromark-util-combine-extensions+[...].mjs +0 -41
  237. package/.output/server/_libs/micromark-util-decode-numeric-character-reference+[...].mjs +0 -19
  238. package/.output/server/_libs/micromark-util-decode-string.mjs +0 -21
  239. package/.output/server/_libs/micromark-util-encode.mjs +0 -1
  240. package/.output/server/_libs/micromark-util-html-tag-name.mjs +0 -69
  241. package/.output/server/_libs/micromark-util-normalize-identifier+[...].mjs +0 -6
  242. package/.output/server/_libs/micromark-util-resolve-all.mjs +0 -15
  243. package/.output/server/_libs/micromark-util-sanitize-uri.mjs +0 -41
  244. package/.output/server/_libs/micromark-util-subtokenize.mjs +0 -346
  245. package/.output/server/_libs/micromark.mjs +0 -906
  246. package/.output/server/_libs/property-information.mjs +0 -1209
  247. package/.output/server/_libs/radix-ui.mjs +0 -1
  248. package/.output/server/_libs/radix-ui__number.mjs +0 -6
  249. package/.output/server/_libs/radix-ui__primitive.mjs +0 -11
  250. package/.output/server/_libs/radix-ui__react-accordion.mjs +0 -1
  251. package/.output/server/_libs/radix-ui__react-alert-dialog.mjs +0 -1
  252. package/.output/server/_libs/radix-ui__react-arrow.mjs +0 -23
  253. package/.output/server/_libs/radix-ui__react-aspect-ratio.mjs +0 -1
  254. package/.output/server/_libs/radix-ui__react-avatar.mjs +0 -1
  255. package/.output/server/_libs/radix-ui__react-checkbox.mjs +0 -1
  256. package/.output/server/_libs/radix-ui__react-collapsible.mjs +0 -144
  257. package/.output/server/_libs/radix-ui__react-collection.mjs +0 -69
  258. package/.output/server/_libs/radix-ui__react-compose-refs.mjs +0 -38
  259. package/.output/server/_libs/radix-ui__react-context-menu.mjs +0 -1
  260. package/.output/server/_libs/radix-ui__react-context.mjs +0 -64
  261. package/.output/server/_libs/radix-ui__react-dialog.mjs +0 -280
  262. package/.output/server/_libs/radix-ui__react-direction.mjs +0 -9
  263. package/.output/server/_libs/radix-ui__react-dropdown-menu.mjs +0 -1
  264. package/.output/server/_libs/radix-ui__react-focus-guards.mjs +0 -39
  265. package/.output/server/_libs/radix-ui__react-focus-scope.mjs +0 -210
  266. package/.output/server/_libs/radix-ui__react-form.mjs +0 -1
  267. package/.output/server/_libs/radix-ui__react-hover-card.mjs +0 -1
  268. package/.output/server/_libs/radix-ui__react-id.mjs +0 -14
  269. package/.output/server/_libs/radix-ui__react-label.mjs +0 -1
  270. package/.output/server/_libs/radix-ui__react-menu.mjs +0 -1
  271. package/.output/server/_libs/radix-ui__react-menubar.mjs +0 -1
  272. package/.output/server/_libs/radix-ui__react-popover.mjs +0 -1
  273. package/.output/server/_libs/radix-ui__react-popper.mjs +0 -340
  274. package/.output/server/_libs/radix-ui__react-portal.mjs +0 -16
  275. package/.output/server/_libs/radix-ui__react-presence.mjs +0 -173
  276. package/.output/server/_libs/radix-ui__react-primitive.mjs +0 -42
  277. package/.output/server/_libs/radix-ui__react-progress.mjs +0 -1
  278. package/.output/server/_libs/radix-ui__react-radio-group.mjs +0 -1
  279. package/.output/server/_libs/radix-ui__react-roving-focus.mjs +0 -235
  280. package/.output/server/_libs/radix-ui__react-scroll-area.mjs +0 -731
  281. package/.output/server/_libs/radix-ui__react-select.mjs +0 -1207
  282. package/.output/server/_libs/radix-ui__react-separator.mjs +0 -28
  283. package/.output/server/_libs/radix-ui__react-slider.mjs +0 -1
  284. package/.output/server/_libs/radix-ui__react-slot.mjs +0 -132
  285. package/.output/server/_libs/radix-ui__react-switch.mjs +0 -1
  286. package/.output/server/_libs/radix-ui__react-tabs.mjs +0 -194
  287. package/.output/server/_libs/radix-ui__react-toast.mjs +0 -2
  288. package/.output/server/_libs/radix-ui__react-toggle-group.mjs +0 -1
  289. package/.output/server/_libs/radix-ui__react-toggle.mjs +0 -1
  290. package/.output/server/_libs/radix-ui__react-toolbar.mjs +0 -1
  291. package/.output/server/_libs/radix-ui__react-tooltip.mjs +0 -498
  292. package/.output/server/_libs/radix-ui__react-use-previous.mjs +0 -14
  293. package/.output/server/_libs/radix-ui__react-use-size.mjs +0 -39
  294. package/.output/server/_libs/react-markdown.mjs +0 -235
  295. package/.output/server/_libs/react-remove-scroll-bar.mjs +0 -82
  296. package/.output/server/_libs/react-remove-scroll.mjs +0 -328
  297. package/.output/server/_libs/react-style-singleton.mjs +0 -69
  298. package/.output/server/_libs/remark-parse.mjs +0 -19
  299. package/.output/server/_libs/remark-rehype.mjs +0 -21
  300. package/.output/server/_libs/space-separated-tokens.mjs +0 -6
  301. package/.output/server/_libs/style-to-js.mjs +0 -72
  302. package/.output/server/_libs/style-to-object.mjs +0 -38
  303. package/.output/server/_libs/swr.mjs +0 -947
  304. package/.output/server/_libs/tailwind-merge.mjs +0 -3255
  305. package/.output/server/_libs/tanstack__react-virtual.mjs +0 -130
  306. package/.output/server/_libs/tanstack__virtual-core.mjs +0 -1319
  307. package/.output/server/_libs/three.mjs +0 -26016
  308. package/.output/server/_libs/trim-lines.mjs +0 -41
  309. package/.output/server/_libs/trough.mjs +0 -85
  310. package/.output/server/_libs/tslib.mjs +0 -1
  311. package/.output/server/_libs/ungap__structured-clone.mjs +0 -212
  312. package/.output/server/_libs/unified.mjs +0 -661
  313. package/.output/server/_libs/unist-util-is.mjs +0 -100
  314. package/.output/server/_libs/unist-util-position.mjs +0 -27
  315. package/.output/server/_libs/unist-util-stringify-position.mjs +0 -27
  316. package/.output/server/_libs/unist-util-visit-parents.mjs +0 -82
  317. package/.output/server/_libs/unist-util-visit.mjs +0 -24
  318. package/.output/server/_libs/use-callback-ref.mjs +0 -66
  319. package/.output/server/_libs/use-sidecar.mjs +0 -106
  320. package/.output/server/_libs/vfile-message.mjs +0 -138
  321. package/.output/server/_libs/vfile.mjs +0 -467
  322. package/.output/server/_sessionId-E_Dmopc-.mjs +0 -144
  323. package/.output/server/_sessionId-U54BAqdp.mjs +0 -82
  324. package/.output/server/_ssr/CompareDrawer-CksatPed.mjs +0 -1058
  325. package/.output/server/_ssr/InspectorPet-DNc4GQ7z.mjs +0 -936
  326. package/.output/server/_ssr/ProxyViewerContainer-B02Ey0p_.mjs +0 -17607
  327. package/.output/server/_ssr/ReplayDialog-DdMvHJF1.mjs +0 -723
  328. package/.output/server/_ssr/RequestAnatomy--vh2Z8__.mjs +0 -835
  329. package/.output/server/_ssr/ResponseView-Dhxc-cKC.mjs +0 -755
  330. package/.output/server/_ssr/StreamingChunkSequence-BG0EQmaD.mjs +0 -272
  331. package/.output/server/_ssr/index-D0At9nfd.mjs +0 -82
  332. package/.output/server/_ssr/index-lcfulIXa.mjs +0 -133
  333. package/.output/server/_ssr/json-viewer-My1J1_5R.mjs +0 -481
  334. package/.output/server/_ssr/start-HYkvq4Ni.mjs +0 -4
  335. package/.output/server/_tanstack-start-manifest_v-B2chR8ef.mjs +0 -4
  336. package/.output/server/node_modules/tslib/modules/index.js +0 -70
  337. package/.output/server/node_modules/tslib/modules/package.json +0 -3
  338. package/.output/server/node_modules/tslib/package.json +0 -47
  339. package/.output/server/node_modules/tslib/tslib.js +0 -484
  340. package/.output/server/package.json +0 -9
  341. package/src/routes/__root.tsx +0 -170
  342. /package/.output/{public → ui}/assets/agent-inspector-58K1_MsC.ico +0 -0
  343. /package/.output/{public → ui}/assets/alibaba-TTwafVwX.svg +0 -0
  344. /package/.output/{public → ui}/assets/minimax-BPMzvuL-.jpeg +0 -0
  345. /package/.output/{public → ui}/assets/qwen-mMn3f5ul.webp +0 -0
  346. /package/.output/{public → ui}/assets/zhipuai-BPNAnxo-.svg +0 -0
  347. /package/src/{routes → backend/routes}/livez.ts +0 -0
@@ -1,835 +0,0 @@
1
- import { r as reactExports, j as jsxRuntimeExports } from "../_libs/react.mjs";
2
- import { y as formatTokens, m as cn, Y as formatContextWindowTokens } from "./router-DWcUFPR3.mjs";
3
- import { u as useProviders, o as analyzeContextIntelligence, j as TooltipProvider, k as Tooltip, l as TooltipTrigger, m as TooltipContent, S as SegmentBar, R as ROLE_COLOR_CLASSES, p as ANATOMY_ROLE_LABELS, C as CONTEXT_USAGE_THRESHOLDS } from "./ProxyViewerContainer-B02Ey0p_.mjs";
4
- import "node:crypto";
5
- import "node:path";
6
- import "node:fs";
7
- import "node:child_process";
8
- import "node:buffer";
9
- import "node:url";
10
- import "crypto";
11
- import "node:util";
12
- import "node:net";
13
- import "../_libs/modelcontextprotocol__server.mjs";
14
- import "../_libs/jszip.mjs";
15
- import "node:os";
16
- import { I as Info, c as ChevronDown, t as ChevronRight } from "../_libs/lucide-react.mjs";
17
- import "../_libs/tanstack__react-router.mjs";
18
- import "../_libs/tanstack__router-core.mjs";
19
- import "../_libs/cookie-es.mjs";
20
- import "../_libs/seroval.mjs";
21
- import "../_libs/seroval-plugins.mjs";
22
- import "node:stream";
23
- import "../_libs/tanstack__history.mjs";
24
- import "node:stream/web";
25
- import "../_libs/react-dom.mjs";
26
- import "util";
27
- import "async_hooks";
28
- import "stream";
29
- import "../_libs/isbot.mjs";
30
- import "../_libs/swr.mjs";
31
- import "../_libs/use-sync-external-store.mjs";
32
- import "../_libs/dequal.mjs";
33
- import "../_libs/class-variance-authority.mjs";
34
- import "../_libs/clsx.mjs";
35
- import "../_libs/tailwind-merge.mjs";
36
- import "node:fs/promises";
37
- import "node:worker_threads";
38
- import "node:readline";
39
- import "../_libs/conf.mjs";
40
- import "node:process";
41
- import "node:assert";
42
- import "../_libs/dot-prop.mjs";
43
- import "../_libs/env-paths.mjs";
44
- import "../_libs/atomically.mjs";
45
- import "node:events";
46
- import "../_libs/stubborn-fs.mjs";
47
- import "../_libs/stubborn-utils.mjs";
48
- import "../_libs/when-exit.mjs";
49
- import "../_libs/ajv.mjs";
50
- import "../_libs/fast-deep-equal.mjs";
51
- import "../_libs/json-schema-traverse.mjs";
52
- import "../_libs/fast-uri.mjs";
53
- import "../_libs/ajv-formats.mjs";
54
- import "../_libs/debounce-fn.mjs";
55
- import "../_libs/mimic-function.mjs";
56
- import "../_libs/semver.mjs";
57
- import "../_libs/uint8array-extras.mjs";
58
- import "node:dns/promises";
59
- import "node:assert/strict";
60
- import "../_libs/zod.mjs";
61
- import "../_libs/modelcontextprotocol__core.mjs";
62
- import "../_libs/readable-stream.mjs";
63
- import "events";
64
- import "node:string_decoder";
65
- import "../_libs/process-nextick-args.mjs";
66
- import "../_libs/isarray.mjs";
67
- import "../_libs/safe-buffer.mjs";
68
- import "buffer";
69
- import "../_libs/core-util-is.mjs";
70
- import "../_libs/inherits.mjs";
71
- import "../_libs/util-deprecate.mjs";
72
- import "../_libs/lie.mjs";
73
- import "../_libs/immediate.mjs";
74
- import "../_libs/setimmediate.mjs";
75
- import "../_libs/pako.mjs";
76
- import "../_libs/tanstack__react-virtual.mjs";
77
- import "../_libs/tanstack__virtual-core.mjs";
78
- import "../_libs/diff.mjs";
79
- import "../_libs/radix-ui__react-dialog.mjs";
80
- import "../_libs/radix-ui__primitive.mjs";
81
- import "../_libs/radix-ui__react-compose-refs.mjs";
82
- import "../_libs/radix-ui__react-context.mjs";
83
- import "../_libs/radix-ui__react-id.mjs";
84
- import "../_libs/@radix-ui/react-use-layout-effect+[...].mjs";
85
- import "../_libs/@radix-ui/react-use-controllable-state+[...].mjs";
86
- import "../_libs/@radix-ui/react-dismissable-layer+[...].mjs";
87
- import "../_libs/radix-ui__react-primitive.mjs";
88
- import "../_libs/radix-ui__react-slot.mjs";
89
- import "../_libs/@radix-ui/react-use-callback-ref+[...].mjs";
90
- import "../_libs/radix-ui__react-focus-scope.mjs";
91
- import "../_libs/radix-ui__react-portal.mjs";
92
- import "../_libs/radix-ui__react-presence.mjs";
93
- import "../_libs/radix-ui__react-focus-guards.mjs";
94
- import "../_libs/react-remove-scroll.mjs";
95
- import "tslib";
96
- import "../_libs/react-remove-scroll-bar.mjs";
97
- import "../_libs/react-style-singleton.mjs";
98
- import "../_libs/get-nonce.mjs";
99
- import "../_libs/use-sidecar.mjs";
100
- import "../_libs/use-callback-ref.mjs";
101
- import "../_libs/aria-hidden.mjs";
102
- import "../_libs/radix-ui__react-tabs.mjs";
103
- import "../_libs/radix-ui__react-roving-focus.mjs";
104
- import "../_libs/radix-ui__react-collection.mjs";
105
- import "../_libs/radix-ui__react-direction.mjs";
106
- import "../_libs/@radix-ui/react-use-is-hydrated+[...].mjs";
107
- import "../_libs/radix-ui__react-select.mjs";
108
- import "../_libs/radix-ui__number.mjs";
109
- import "../_libs/radix-ui__react-popper.mjs";
110
- import "../_libs/floating-ui__react-dom.mjs";
111
- import "../_libs/floating-ui__dom.mjs";
112
- import "../_libs/floating-ui__core.mjs";
113
- import "../_libs/floating-ui__utils.mjs";
114
- import "../_libs/radix-ui__react-arrow.mjs";
115
- import "../_libs/radix-ui__react-use-size.mjs";
116
- import "../_libs/radix-ui__react-use-previous.mjs";
117
- import "../_libs/@radix-ui/react-visually-hidden+[...].mjs";
118
- import "../_libs/radix-ui__react-tooltip.mjs";
119
- import "../_libs/radix-ui__react-collapsible.mjs";
120
- import "../_libs/radix-ui__react-scroll-area.mjs";
121
- const DIVERGENCE_AMBER_THRESHOLD = 0.25;
122
- const TOP_CONTRIBUTOR_COUNT = 5;
123
- const DUPLICATE_GROUP_DISPLAY_COUNT = 4;
124
- const DUPLICATE_SEGMENT_DISPLAY_COUNT = 6;
125
- const TOOL_SCHEMA_SAVINGS_RATIO = 0.25;
126
- const SYSTEM_PROMPT_SAVINGS_RATIO = 0.2;
127
- const HISTORY_SAVINGS_RATIO = 0.2;
128
- const ROLE_ORDER = ["system", "user", "assistant", "tool", "tools"];
129
- const ROLE_DESCRIPTIONS = {
130
- system: "instructions",
131
- user: "user turns",
132
- assistant: "assistant turns",
133
- tool: "tool results",
134
- tools: "tool schemas"
135
- };
136
- const VIEW_MODE_OPTIONS = [
137
- { value: "role", label: "By Role" },
138
- { value: "segment", label: "By Segment" }
139
- ];
140
- const RISK_CLASS = {
141
- unknown: "bg-muted-foreground/50",
142
- ok: "bg-emerald-500/70",
143
- watch: "bg-amber-400/75",
144
- danger: "bg-red-500/80"
145
- };
146
- const RISK_TEXT_CLASS = {
147
- unknown: "text-muted-foreground",
148
- ok: "text-emerald-400",
149
- watch: "text-amber-300",
150
- danger: "text-red-300"
151
- };
152
- const HEALTH_BADGE_CLASS = {
153
- ok: "border-emerald-400/30 bg-emerald-400/8 text-emerald-200",
154
- optimizable: "border-amber-400/30 bg-amber-400/8 text-amber-100",
155
- risk: "border-red-400/35 bg-red-500/10 text-red-100"
156
- };
157
- const HEALTH_LABEL = {
158
- ok: "OK",
159
- optimizable: "Optimizable",
160
- risk: "Risk"
161
- };
162
- function formatPercent(value) {
163
- if (value >= 10) return `${value.toFixed(0)}%`;
164
- if (value >= 1) return `${value.toFixed(1)}%`;
165
- if (value > 0) return "<1%";
166
- return "0%";
167
- }
168
- function formatUsagePercent(value) {
169
- if (value === null) return "Unknown";
170
- return formatPercent(value * 100);
171
- }
172
- function formatRemainingTokens(value) {
173
- if (value === null) return "Unknown";
174
- if (value < 0) return `-${formatTokens(Math.abs(value))}`;
175
- return formatTokens(value);
176
- }
177
- function formatContextLimit(intelligence) {
178
- if (intelligence.contextWindow.tokens === null) return "Unknown";
179
- return formatContextWindowTokens(intelligence.contextWindow.tokens);
180
- }
181
- function formatContextSource(intelligence) {
182
- switch (intelligence.contextWindow.source) {
183
- case "request":
184
- return intelligence.contextWindow.label;
185
- case "provider":
186
- return intelligence.contextWindow.label;
187
- case "model-rule":
188
- return intelligence.contextWindow.label;
189
- case "unknown":
190
- return intelligence.model === null ? intelligence.contextWindow.label : `${intelligence.contextWindow.label}: ${intelligence.model}`;
191
- }
192
- }
193
- function advisorTone(severity) {
194
- switch (severity) {
195
- case "watch":
196
- return "border-amber-400/30 bg-amber-400/8 text-amber-100";
197
- case "danger":
198
- return "border-red-400/35 bg-red-500/10 text-red-100";
199
- }
200
- }
201
- function formatContextHealth(health) {
202
- const label = HEALTH_LABEL[health.level];
203
- if (health.level === "ok") return label;
204
- const countLabel = health.level === "risk" ? `${String(health.opportunityCount)} signal${health.opportunityCount === 1 ? "" : "s"}` : `${String(health.opportunityCount)} opportunit${health.opportunityCount === 1 ? "y" : "ies"}`;
205
- if (health.reclaimableTokens <= 0) return `${label} | ${countLabel}`;
206
- return `${label} | ${countLabel} | ~${formatTokens(health.reclaimableTokens)} tokens`;
207
- }
208
- function ContextHealthBadge({ health }) {
209
- return /* @__PURE__ */ jsxRuntimeExports.jsx(
210
- "span",
211
- {
212
- className: cn(
213
- "inline-flex h-5 max-w-full items-center rounded border px-1.5 font-mono text-[10px]",
214
- HEALTH_BADGE_CLASS[health.level]
215
- ),
216
- "aria-label": `Context health ${formatContextHealth(health)}`,
217
- children: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "truncate", children: formatContextHealth(health) })
218
- }
219
- );
220
- }
221
- function roleUsageTokens(intelligence, role) {
222
- return intelligence.roleUsages.find((usage) => usage.role === role)?.tokens ?? 0;
223
- }
224
- function roleUsagePercent(intelligence, role) {
225
- return intelligence.roleUsages.find((usage) => usage.role === role)?.percent ?? 0;
226
- }
227
- function estimatedSaving(tokens, ratio) {
228
- if (tokens <= 0) return null;
229
- const saving = Math.round(tokens * ratio);
230
- return saving > 0 ? saving : null;
231
- }
232
- function largestSegmentForRole(segments, role) {
233
- return [...segments].filter((segment) => segment.role === role).sort((left, right) => right.size - left.size)[0] ?? null;
234
- }
235
- function largestSegmentForHistory(segments) {
236
- return [...segments].filter(
237
- (segment) => segment.role === "user" || segment.role === "assistant" || segment.role === "tool"
238
- ).sort((left, right) => right.size - left.size)[0] ?? null;
239
- }
240
- function firstDuplicateTarget(groups, segments) {
241
- const firstGroup = groups[0] ?? null;
242
- if (firstGroup === null) return null;
243
- const firstSegment = firstGroup.segments[0] ?? null;
244
- if (firstSegment === null) return null;
245
- return resolveDuplicateSegment(firstSegment, segments);
246
- }
247
- function duplicateSaving(groups) {
248
- const saving = groups.reduce((sum, group) => sum + group.repeatedTokens, 0);
249
- return saving > 0 ? saving : null;
250
- }
251
- function historyTokens(intelligence) {
252
- return roleUsageTokens(intelligence, "user") + roleUsageTokens(intelligence, "assistant") + roleUsageTokens(intelligence, "tool");
253
- }
254
- function advisorItemFromDiagnostic({
255
- diagnostic,
256
- intelligence,
257
- segments
258
- }) {
259
- switch (diagnostic.kind) {
260
- case "duplicate":
261
- return {
262
- key: "duplicate",
263
- kind: "duplicate",
264
- severity: diagnostic.severity,
265
- title: "Duplicate content",
266
- impact: diagnostic.detail,
267
- action: "Remove repeated blocks or keep one canonical copy in the next request.",
268
- savingTokens: duplicateSaving(intelligence.duplicateGroups),
269
- target: firstDuplicateTarget(intelligence.duplicateGroups, segments)
270
- };
271
- case "tool-schema": {
272
- const tokens = roleUsageTokens(intelligence, "tools");
273
- const percent = roleUsagePercent(intelligence, "tools");
274
- return {
275
- key: "tool-schema",
276
- kind: "tool-schema",
277
- severity: diagnostic.severity,
278
- title: "Tool schema pressure",
279
- impact: `Tool definitions use ~${formatTokens(tokens)} tokens (${formatPercent(
280
- percent * 100
281
- )}).`,
282
- action: "Disable unused tools or shorten verbose schema descriptions.",
283
- savingTokens: estimatedSaving(tokens, TOOL_SCHEMA_SAVINGS_RATIO),
284
- target: largestSegmentForRole(segments, "tools")
285
- };
286
- }
287
- case "system-heavy": {
288
- const tokens = roleUsageTokens(intelligence, "system");
289
- const percent = roleUsagePercent(intelligence, "system");
290
- return {
291
- key: "system-heavy",
292
- kind: "system-heavy",
293
- severity: diagnostic.severity,
294
- title: "Large system prompt",
295
- impact: `System instructions use ~${formatTokens(tokens)} tokens (${formatPercent(
296
- percent * 100
297
- )}).`,
298
- action: "Compress repeated policy text and move stable guidance into reusable memory.",
299
- savingTokens: estimatedSaving(tokens, SYSTEM_PROMPT_SAVINGS_RATIO),
300
- target: largestSegmentForRole(segments, "system")
301
- };
302
- }
303
- case "history-bloat": {
304
- const tokens = historyTokens(intelligence);
305
- return {
306
- key: "history-bloat",
307
- kind: "history-bloat",
308
- severity: diagnostic.severity,
309
- title: "Conversation history growth",
310
- impact: diagnostic.detail,
311
- action: "Summarize older turns and trim resolved tool outputs before continuing.",
312
- savingTokens: estimatedSaving(tokens, HISTORY_SAVINGS_RATIO),
313
- target: largestSegmentForHistory(segments)
314
- };
315
- }
316
- }
317
- }
318
- function buildContextAdvisorItems({
319
- intelligence,
320
- segments
321
- }) {
322
- const items = [];
323
- if (intelligence.riskLevel === "watch" || intelligence.riskLevel === "danger") {
324
- items.push({
325
- key: "context-pressure",
326
- kind: "context-pressure",
327
- severity: intelligence.riskLevel === "danger" ? "danger" : "watch",
328
- title: "Context window pressure",
329
- impact: `${formatUsagePercent(intelligence.usagePercent)} used, ${formatRemainingTokens(
330
- intelligence.remainingAfterReserveTokens
331
- )} remaining after output reserve.`,
332
- action: "Start with the largest context block, then remove duplicates or summarize history.",
333
- savingTokens: null,
334
- target: [...segments].sort((left, right) => right.size - left.size)[0] ?? null
335
- });
336
- }
337
- if (intelligence.contextWindow.source === "unknown") {
338
- items.push({
339
- key: "context-window",
340
- kind: "context-window",
341
- severity: "watch",
342
- title: "Context window unknown",
343
- impact: "Agent Inspector cannot calculate remaining space for this model.",
344
- action: "Add model metadata in Provider settings so risk and remaining space are accurate.",
345
- savingTokens: null,
346
- target: null
347
- });
348
- }
349
- intelligence.diagnostics.forEach((diagnostic) => {
350
- items.push(advisorItemFromDiagnostic({ diagnostic, intelligence, segments }));
351
- });
352
- return items;
353
- }
354
- function ContextAdvisorPanel({
355
- items,
356
- onSegmentActivate
357
- }) {
358
- if (items.length === 0) return null;
359
- return /* @__PURE__ */ jsxRuntimeExports.jsxs("section", { className: "space-y-2 rounded border border-border/70 bg-muted/15 p-2", children: [
360
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-wrap items-center justify-between gap-2", children: [
361
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-xs font-medium text-foreground", children: "Context Advisor" }),
362
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "font-mono text-[11px] text-muted-foreground", children: [
363
- String(items.length),
364
- " issue",
365
- items.length === 1 ? "" : "s"
366
- ] })
367
- ] }),
368
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "grid gap-2", children: items.map((item) => {
369
- const target = item.target;
370
- const canJump = target !== null && onSegmentActivate !== void 0;
371
- return /* @__PURE__ */ jsxRuntimeExports.jsx(
372
- "div",
373
- {
374
- className: cn("rounded border px-2 py-1.5 text-xs", advisorTone(item.severity)),
375
- children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex min-w-0 flex-wrap items-start justify-between gap-2", children: [
376
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "min-w-0", children: [
377
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "font-medium", children: item.title }),
378
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mt-0.5 text-[11px] text-muted-foreground", children: [
379
- "Impact: ",
380
- item.impact
381
- ] }),
382
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mt-0.5 text-[11px] text-muted-foreground", children: [
383
- "Action: ",
384
- item.action
385
- ] })
386
- ] }),
387
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex shrink-0 items-center gap-1.5", children: [
388
- item.savingTokens !== null && /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "font-mono text-[11px] text-muted-foreground", children: [
389
- "Save ~",
390
- formatTokens(item.savingTokens)
391
- ] }),
392
- canJump && target !== null && onSegmentActivate !== void 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs(
393
- "button",
394
- {
395
- type: "button",
396
- onClick: () => onSegmentActivate(target),
397
- className: "inline-flex h-6 items-center gap-1 rounded border border-border/60 px-1.5 text-[11px] text-muted-foreground hover:border-border hover:bg-muted/40 hover:text-foreground",
398
- title: "Jump to the most relevant context block",
399
- children: [
400
- /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronRight, { className: "size-3" }),
401
- "Jump"
402
- ]
403
- }
404
- )
405
- ] })
406
- ] })
407
- },
408
- item.key
409
- );
410
- }) })
411
- ] });
412
- }
413
- function ContextIntelligenceStrip({
414
- intelligence,
415
- segments,
416
- onSegmentActivate
417
- }) {
418
- const usageWidth = intelligence.usagePercent === null ? 0 : Math.max(1, intelligence.usagePercent * 100);
419
- const outputReserveLabel = intelligence.outputReserveTokens === null ? "No output reserve" : `Output reserve ${formatTokens(intelligence.outputReserveTokens)}`;
420
- const largestRole = intelligence.largestRole;
421
- const advisorItems = buildContextAdvisorItems({ intelligence, segments });
422
- return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-2", children: [
423
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid gap-x-4 gap-y-2 border-y border-border/60 py-2 text-xs sm:grid-cols-4", children: [
424
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "min-w-0", children: [
425
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-[10px] font-medium uppercase text-muted-foreground", children: "Window" }),
426
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mt-0.5 truncate font-mono text-foreground", children: formatContextLimit(intelligence) }),
427
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "truncate text-[11px] text-muted-foreground", children: formatContextSource(intelligence) })
428
- ] }),
429
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "min-w-0", children: [
430
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-[10px] font-medium uppercase text-muted-foreground", children: "Used" }),
431
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: cn("mt-0.5 font-mono", RISK_TEXT_CLASS[intelligence.riskLevel]), children: formatUsagePercent(intelligence.usagePercent) }),
432
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "truncate text-[11px] text-muted-foreground", children: outputReserveLabel })
433
- ] }),
434
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "min-w-0", children: [
435
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-[10px] font-medium uppercase text-muted-foreground", children: "Remaining" }),
436
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mt-0.5 font-mono text-foreground", children: formatRemainingTokens(intelligence.remainingAfterReserveTokens) }),
437
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "truncate text-[11px] text-muted-foreground", children: [
438
- "Input only ",
439
- formatRemainingTokens(intelligence.remainingInputTokens)
440
- ] })
441
- ] }),
442
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "min-w-0", children: [
443
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-[10px] font-medium uppercase text-muted-foreground", children: "Largest" }),
444
- largestRole === null ? /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mt-0.5 text-muted-foreground", children: "Unknown" }) : /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
445
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mt-0.5 flex min-w-0 items-center gap-1.5", children: [
446
- /* @__PURE__ */ jsxRuntimeExports.jsx(
447
- "span",
448
- {
449
- "aria-hidden": "true",
450
- className: cn(
451
- "size-2.5 shrink-0 rounded-[2px]",
452
- ROLE_COLOR_CLASSES[largestRole.role]
453
- )
454
- }
455
- ),
456
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "truncate text-foreground", children: largestRole.label })
457
- ] }),
458
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "truncate font-mono text-[11px] text-muted-foreground", children: [
459
- formatPercent(largestRole.percent * 100),
460
- " | ~",
461
- formatTokens(largestRole.tokens)
462
- ] })
463
- ] })
464
- ] })
465
- ] }),
466
- intelligence.contextWindow.tokens !== null && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-1.5", children: [
467
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "relative h-2 overflow-hidden rounded-full bg-muted/40", children: [
468
- /* @__PURE__ */ jsxRuntimeExports.jsx(
469
- "div",
470
- {
471
- className: cn("h-full rounded-full", RISK_CLASS[intelligence.riskLevel]),
472
- style: { width: `${String(usageWidth)}%` }
473
- }
474
- ),
475
- /* @__PURE__ */ jsxRuntimeExports.jsx(
476
- "div",
477
- {
478
- "aria-hidden": "true",
479
- className: "absolute top-0 h-full w-px bg-amber-200/70",
480
- style: { left: `${String(CONTEXT_USAGE_THRESHOLDS.watch * 100)}%` }
481
- }
482
- ),
483
- /* @__PURE__ */ jsxRuntimeExports.jsx(
484
- "div",
485
- {
486
- "aria-hidden": "true",
487
- className: "absolute top-0 h-full w-px bg-red-200/80",
488
- style: { left: `${String(CONTEXT_USAGE_THRESHOLDS.danger * 100)}%` }
489
- }
490
- )
491
- ] }),
492
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex justify-between text-[10px] text-muted-foreground", children: [
493
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Context window" }),
494
- /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { children: [
495
- "Watch ",
496
- formatUsagePercent(CONTEXT_USAGE_THRESHOLDS.watch),
497
- " / Danger",
498
- " ",
499
- formatUsagePercent(CONTEXT_USAGE_THRESHOLDS.danger)
500
- ] })
501
- ] })
502
- ] }),
503
- /* @__PURE__ */ jsxRuntimeExports.jsx(ContextAdvisorPanel, { items: advisorItems, onSegmentActivate })
504
- ] });
505
- }
506
- function resolveDuplicateSegment(duplicateSegment, segments) {
507
- return segments.find((segment) => segment.path === duplicateSegment.path) ?? null;
508
- }
509
- function DuplicateContentPanel({
510
- groups,
511
- segments,
512
- onSegmentActivate
513
- }) {
514
- const [expanded, setExpanded] = reactExports.useState(false);
515
- if (groups.length === 0) return null;
516
- const visibleGroups = groups.slice(0, DUPLICATE_GROUP_DISPLAY_COUNT);
517
- const hiddenGroupCount = groups.length - visibleGroups.length;
518
- const totalRepeatedTokens = groups.reduce((sum, group) => sum + group.repeatedTokens, 0);
519
- return /* @__PURE__ */ jsxRuntimeExports.jsxs("section", { className: "space-y-2 rounded border border-border/70 bg-muted/15 p-2", children: [
520
- /* @__PURE__ */ jsxRuntimeExports.jsxs(
521
- "button",
522
- {
523
- type: "button",
524
- onClick: () => setExpanded((current) => !current),
525
- "aria-expanded": expanded,
526
- className: "flex w-full flex-wrap items-center justify-between gap-2 rounded px-1 py-0.5 text-left transition-colors hover:bg-muted/30 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1",
527
- children: [
528
- /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "inline-flex min-w-0 items-center gap-1.5", children: [
529
- expanded ? /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronDown, { className: "size-3.5 shrink-0 text-muted-foreground" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronRight, { className: "size-3.5 shrink-0 text-muted-foreground" }),
530
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "truncate text-xs font-medium text-foreground", children: "Duplicate Content" })
531
- ] }),
532
- /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "font-mono text-[11px] text-muted-foreground", children: [
533
- String(groups.length),
534
- " group",
535
- groups.length === 1 ? "" : "s",
536
- " | ~",
537
- formatTokens(totalRepeatedTokens),
538
- " repeated"
539
- ] })
540
- ]
541
- }
542
- ),
543
- expanded && /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
544
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "space-y-2", children: visibleGroups.map((group, groupIndex) => {
545
- const visibleSegments = group.segments.slice(0, DUPLICATE_SEGMENT_DISPLAY_COUNT);
546
- const hiddenSegmentCount = group.segments.length - visibleSegments.length;
547
- return /* @__PURE__ */ jsxRuntimeExports.jsxs(
548
- "div",
549
- {
550
- className: "space-y-1.5 border-t border-border/50 pt-2 first:border-t-0 first:pt-0",
551
- children: [
552
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex min-w-0 items-center gap-2 text-xs", children: [
553
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "w-5 shrink-0 text-right font-mono text-muted-foreground/70", children: String(groupIndex + 1) }),
554
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "min-w-0 flex-1 truncate text-foreground", children: group.firstLabel }),
555
- /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "shrink-0 font-mono text-muted-foreground", children: [
556
- "x",
557
- String(group.count),
558
- " | ~",
559
- formatTokens(group.repeatedTokens),
560
- " saved"
561
- ] })
562
- ] }),
563
- group.preview.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "ml-7 line-clamp-2 break-words rounded bg-background/40 px-2 py-1 font-mono text-[11px] leading-4 text-muted-foreground", children: group.preview }),
564
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "ml-7 flex flex-wrap gap-1", children: [
565
- visibleSegments.map((duplicateSegment, segmentIndex) => {
566
- const target = resolveDuplicateSegment(duplicateSegment, segments);
567
- const activate = target === null || onSegmentActivate === void 0 ? void 0 : onSegmentActivate;
568
- const label = `${duplicateSegment.label} ~${formatTokens(
569
- duplicateSegment.tokens
570
- )}`;
571
- if (activate === void 0 || target === null) {
572
- return /* @__PURE__ */ jsxRuntimeExports.jsx(
573
- "span",
574
- {
575
- className: "inline-flex h-6 max-w-40 items-center rounded border border-border/60 px-1.5 text-[11px] text-muted-foreground",
576
- title: label,
577
- children: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "truncate", children: label })
578
- },
579
- `${duplicateSegment.path}-${segmentIndex}`
580
- );
581
- }
582
- return /* @__PURE__ */ jsxRuntimeExports.jsx(
583
- "button",
584
- {
585
- type: "button",
586
- onClick: () => activate(target),
587
- className: "inline-flex h-6 max-w-40 items-center rounded border border-border/60 px-1.5 text-[11px] text-muted-foreground hover:border-border hover:bg-muted/40 hover:text-foreground",
588
- title: "Jump to this duplicate block",
589
- children: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "truncate", children: label })
590
- },
591
- `${duplicateSegment.path}-${segmentIndex}`
592
- );
593
- }),
594
- hiddenSegmentCount > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "inline-flex h-6 items-center rounded border border-border/40 px-1.5 font-mono text-[11px] text-muted-foreground/70", children: [
595
- "+",
596
- String(hiddenSegmentCount)
597
- ] })
598
- ] })
599
- ]
600
- },
601
- group.key
602
- );
603
- }) }),
604
- hiddenGroupCount > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "border-t border-border/50 pt-2 font-mono text-[11px] text-muted-foreground", children: [
605
- "+",
606
- String(hiddenGroupCount),
607
- " more duplicate group",
608
- hiddenGroupCount === 1 ? "" : "s"
609
- ] })
610
- ] })
611
- ] });
612
- }
613
- function aggregateByRole(segments) {
614
- const result = [];
615
- for (const role of ROLE_ORDER) {
616
- const matching = segments.filter((segment) => segment.role === role);
617
- if (matching.length === 0) continue;
618
- const size = matching.reduce((sum, segment) => sum + segment.size, 0);
619
- const characters = matching.reduce((sum, segment) => sum + segment.characters, 0);
620
- const label = ANATOMY_ROLE_LABELS[role];
621
- const text = `${matching.length} segment${matching.length === 1 ? "" : "s"} grouped as ${ROLE_DESCRIPTIONS[role]}`;
622
- result.push({
623
- role,
624
- label,
625
- size,
626
- characters,
627
- text,
628
- path: `role:${role}`
629
- });
630
- }
631
- return result;
632
- }
633
- function topContributors(segments) {
634
- return [...segments].sort((a, b) => b.size - a.size).slice(0, TOP_CONTRIBUTOR_COUNT);
635
- }
636
- function RequestAnatomy({
637
- parsed,
638
- inputTokens,
639
- model = null,
640
- onSegmentActivate,
641
- segments: providedSegments
642
- }) {
643
- const { providers } = useProviders();
644
- const [viewMode, setViewMode] = reactExports.useState("role");
645
- const segments = reactExports.useMemo(() => providedSegments ?? null, [providedSegments]);
646
- const total = reactExports.useMemo(
647
- () => (segments ?? []).reduce((sum, segment) => sum + segment.size, 0),
648
- [segments]
649
- );
650
- const roleSegments = reactExports.useMemo(
651
- () => segments === null ? [] : aggregateByRole(segments),
652
- [segments]
653
- );
654
- const topSegments = reactExports.useMemo(
655
- () => segments === null ? [] : topContributors(segments),
656
- [segments]
657
- );
658
- const intelligence = reactExports.useMemo(
659
- () => segments === null ? null : analyzeContextIntelligence({
660
- segments,
661
- inputTokens,
662
- parsed,
663
- model,
664
- providers
665
- }),
666
- [inputTokens, model, parsed, providers, segments]
667
- );
668
- const showDivergenceWarning = reactExports.useMemo(() => {
669
- if (segments === null) return false;
670
- if (inputTokens === null) return false;
671
- if (total === 0) return false;
672
- const ratio = Math.abs(inputTokens - total) / Math.max(inputTokens, total);
673
- return ratio >= DIVERGENCE_AMBER_THRESHOLD;
674
- }, [inputTokens, segments, total]);
675
- if (segments === null) return null;
676
- if (segments.length === 0) return null;
677
- if (parsed === null && providedSegments === void 0) return null;
678
- const summaryColorClass = inputTokens !== null && showDivergenceWarning ? "text-amber-400" : "text-muted-foreground";
679
- const displayedSegments = viewMode === "role" ? roleSegments : segments;
680
- const displayedTotal = total > 0 ? total : displayedSegments.reduce((sum, item) => sum + item.size, 0);
681
- const activateSegment = viewMode === "segment" ? onSegmentActivate : void 0;
682
- const segmentCountLabel = `${String(segments.length)} segment${segments.length === 1 ? "" : "s"}`;
683
- const providerInputLabel = inputTokens === null ? "Provider input unknown" : `Provider input ${formatTokens(inputTokens)}`;
684
- const contextLimitLabel = intelligence === null ? "Limit unknown" : `Limit ${formatContextLimit(intelligence)}`;
685
- const usageLabel = intelligence === null ? "Usage unknown" : `${formatUsagePercent(intelligence.usagePercent)} used`;
686
- return /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipProvider, { delayDuration: 150, children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "px-4 py-3 space-y-3", "data-testid": "anatomy-root", children: [
687
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-wrap items-start justify-between gap-3", children: [
688
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "min-w-0", children: [
689
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex min-w-0 flex-wrap items-center gap-2", children: [
690
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-sm font-semibold text-foreground", children: "Request Context" }),
691
- intelligence !== null && /* @__PURE__ */ jsxRuntimeExports.jsx(ContextHealthBadge, { health: intelligence.health })
692
- ] }),
693
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: cn("mt-0.5 text-xs font-mono tabular-nums", summaryColorClass), children: [
694
- "Estimated ~",
695
- formatTokens(total),
696
- " tokens | ",
697
- providerInputLabel,
698
- " | ",
699
- contextLimitLabel,
700
- " |",
701
- " ",
702
- usageLabel,
703
- " | ",
704
- segmentCountLabel
705
- ] })
706
- ] }),
707
- /* @__PURE__ */ jsxRuntimeExports.jsx(
708
- "div",
709
- {
710
- className: "inline-flex shrink-0 rounded border border-border bg-muted/20 p-0.5",
711
- role: "group",
712
- "aria-label": "Context breakdown mode",
713
- children: VIEW_MODE_OPTIONS.map((option) => /* @__PURE__ */ jsxRuntimeExports.jsx(
714
- "button",
715
- {
716
- type: "button",
717
- "aria-pressed": viewMode === option.value,
718
- onClick: () => setViewMode(option.value),
719
- className: cn(
720
- "h-6 rounded-sm px-2 text-[11px] font-medium transition-colors",
721
- viewMode === option.value ? "bg-background text-foreground shadow-sm" : "text-muted-foreground hover:text-foreground"
722
- ),
723
- children: option.label
724
- },
725
- option.value
726
- ))
727
- }
728
- )
729
- ] }),
730
- showDivergenceWarning && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "inline-flex items-center gap-1.5 text-xs text-amber-400", children: [
731
- /* @__PURE__ */ jsxRuntimeExports.jsxs(Tooltip, { children: [
732
- /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntimeExports.jsx(
733
- "button",
734
- {
735
- type: "button",
736
- className: "inline-flex items-center hover:text-amber-300",
737
- "aria-label": "Token estimate differs from provider input",
738
- children: /* @__PURE__ */ jsxRuntimeExports.jsx(Info, { className: "size-3.5" })
739
- }
740
- ) }),
741
- /* @__PURE__ */ jsxRuntimeExports.jsx(TooltipContent, { className: "max-w-xs text-xs", children: "The bar uses a local token estimate. Provider input tokens remain the source of truth for billing and context-window usage." })
742
- ] }),
743
- "Estimate differs from provider-reported input."
744
- ] }),
745
- intelligence !== null && /* @__PURE__ */ jsxRuntimeExports.jsx(
746
- ContextIntelligenceStrip,
747
- {
748
- intelligence,
749
- segments,
750
- onSegmentActivate
751
- }
752
- ),
753
- intelligence !== null && /* @__PURE__ */ jsxRuntimeExports.jsx(
754
- DuplicateContentPanel,
755
- {
756
- groups: intelligence.duplicateGroups,
757
- segments,
758
- onSegmentActivate
759
- }
760
- ),
761
- /* @__PURE__ */ jsxRuntimeExports.jsx(
762
- SegmentBar,
763
- {
764
- segments: displayedSegments,
765
- totalTokens: displayedTotal,
766
- showLabels: viewMode === "segment",
767
- onActivate: activateSegment
768
- }
769
- ),
770
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex flex-wrap items-center gap-x-3 gap-y-1.5 text-[11px] text-muted-foreground", children: roleSegments.map((segment) => {
771
- const percent = total > 0 ? segment.size / total * 100 : 0;
772
- return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "inline-flex items-center gap-1.5", children: [
773
- /* @__PURE__ */ jsxRuntimeExports.jsx(
774
- "span",
775
- {
776
- "aria-hidden": "true",
777
- className: cn("size-2.5 rounded-[2px]", ROLE_COLOR_CLASSES[segment.role])
778
- }
779
- ),
780
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: segment.label }),
781
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono text-muted-foreground/70", children: formatPercent(percent) })
782
- ] }, segment.role);
783
- }) }),
784
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-1.5", children: [
785
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-xs font-medium text-foreground", children: "Top Contributors" }),
786
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "grid gap-1", children: topSegments.map((segment, index) => {
787
- const percent = total > 0 ? segment.size / total * 100 : 0;
788
- const activate = onSegmentActivate;
789
- const content = /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
790
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "w-5 shrink-0 text-right font-mono text-muted-foreground/70", children: String(index + 1) }),
791
- /* @__PURE__ */ jsxRuntimeExports.jsx(
792
- "span",
793
- {
794
- "aria-hidden": "true",
795
- className: cn(
796
- "size-2.5 shrink-0 rounded-[2px]",
797
- ROLE_COLOR_CLASSES[segment.role]
798
- )
799
- }
800
- ),
801
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "min-w-0 flex-1 truncate text-left", children: segment.label }),
802
- /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "shrink-0 font-mono text-muted-foreground", children: [
803
- formatPercent(percent),
804
- " | ~",
805
- formatTokens(segment.size)
806
- ] })
807
- ] });
808
- if (activate !== void 0) {
809
- return /* @__PURE__ */ jsxRuntimeExports.jsx(
810
- "button",
811
- {
812
- type: "button",
813
- onClick: () => activate(segment),
814
- className: "flex h-7 items-center gap-2 rounded px-1.5 text-xs text-muted-foreground hover:bg-muted/40 hover:text-foreground",
815
- title: "Jump to this request block",
816
- children: content
817
- },
818
- `${segment.path}-${index}`
819
- );
820
- }
821
- return /* @__PURE__ */ jsxRuntimeExports.jsx(
822
- "div",
823
- {
824
- className: "flex h-7 items-center gap-2 rounded px-1.5 text-xs text-muted-foreground",
825
- children: content
826
- },
827
- `${segment.path}-${index}`
828
- );
829
- }) })
830
- ] })
831
- ] }) });
832
- }
833
- export {
834
- RequestAnatomy
835
- };