@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,7 +1,7 @@
1
- import { createLog, finalizeLogUpdate, getNextLogId, type CapturedLog } from "./store";
1
+ import { Buffer } from "node:buffer";
2
+ import { createLog, getNextLogId, persistFinalizedLogUpdate, type CapturedLog } from "./store";
2
3
  import { appendLogEntry, logger } from "./logger";
3
4
  import { extractRequestMetadata } from "./schemas";
4
- import { registry } from "./formats";
5
5
  import { findProviderByModel } from "./providers";
6
6
  import { getClientInfo } from "./socketTracker";
7
7
  import { formatForPath } from "./formats";
@@ -25,18 +25,26 @@ import { getConfig } from "./config";
25
25
  import { safeFetch } from "../lib/safeFetch";
26
26
 
27
27
  const ALLOW_LOOPBACK = process.env["AGENT_INSPECTOR_ALLOW_LOOPBACK"] === "1";
28
- import { stripClaudeCodeBillingHeader } from "./claudeCodeStrip";
28
+ const EMPTY_UPSTREAM_BODY_ERROR = "Upstream response did not include a body";
29
+ const UPSTREAM_STREAM_ERROR = "Upstream stream terminated unexpectedly";
30
+ import { stripClaudeCodeBillingHeader } from "../lib/claudeCodeStrip";
29
31
  import { stripOpenAIOrphanToolMessages } from "./openaiOrphanToolStrip";
30
32
  import { maskApiKey } from "../lib/mask";
31
33
  import { buildFileLogEntry, type FinalizeLogJob } from "./logFinalizer";
32
34
  import { enqueueFinalizeLogJob } from "./sessionRuntime";
33
35
  import { RawStreamCapture } from "./rawStreamCapture";
34
- import { acquireRuntimeRequest, type RuntimeRequestLease } from "./runtimeAdmission";
36
+ import {
37
+ acquireRuntimeRequest,
38
+ getRuntimeAdmissionState,
39
+ type RuntimeRequestLease,
40
+ } from "./runtimeAdmission";
41
+ import { resourceLimitResponse } from "../lib/resourceLimits";
35
42
  import {
36
43
  buildUpstreamUrl,
37
44
  describeApiRoute,
38
45
  getProxyApiPath,
39
46
  injectProviderAuth,
47
+ providerSupportsApiRoute,
40
48
  selectUpstreamBase,
41
49
  setUpstreamHost,
42
50
  } from "./upstream";
@@ -181,31 +189,81 @@ function handleNonStreamingResponse(
181
189
  });
182
190
  }
183
191
 
184
- function handleStreamingResponse(
192
+ function applyRawStreamCaptureStatus(log: CapturedLog, capture: RawStreamCapture): void {
193
+ const status = capture.status;
194
+ log.captureIncomplete = status.incomplete;
195
+ log.droppedChunks = status.droppedChunks;
196
+ log.droppedBytes = status.droppedBytes;
197
+ log.captureIncompleteReason = status.reason;
198
+ }
199
+
200
+ function applyUpstreamStreamError(log: CapturedLog): void {
201
+ log.captureIncomplete = true;
202
+ log.captureIncompleteReason = "upstream-stream-error";
203
+ log.error = UPSTREAM_STREAM_ERROR;
204
+ }
205
+
206
+ async function handleStreamingResponse(
185
207
  upstreamRes: Response,
186
208
  req: Request,
187
209
  startTime: number,
188
210
  upstreamUrl: string,
189
211
  log: CapturedLog,
190
212
  collectStreamingChunks: boolean,
191
- ): Response {
213
+ ): Promise<Response> {
192
214
  log.streaming = true;
193
215
  log.responseStatus = upstreamRes.status;
194
216
 
217
+ if (upstreamRes.body === null) {
218
+ log.elapsedMs = Date.now() - startTime;
219
+ log.responseStatus = STATUS_BAD_GATEWAY;
220
+ log.responseText = EMPTY_UPSTREAM_BODY_ERROR;
221
+ log.captureIncomplete = true;
222
+ log.droppedChunks = 0;
223
+ log.droppedBytes = 0;
224
+ log.captureIncompleteReason = "upstream-stream-error";
225
+ log.error = EMPTY_UPSTREAM_BODY_ERROR;
226
+ appendLogEntry({ ...buildFileLogEntry(log, upstreamUrl), error: EMPTY_UPSTREAM_BODY_ERROR });
227
+ await persistFinalizedLogUpdate(log);
228
+ return new Response("No response body", { status: STATUS_BAD_GATEWAY });
229
+ }
230
+
195
231
  const capture = new RawStreamCapture();
196
232
  const decoder = new TextDecoder();
197
233
  let finalizationScheduled = false;
198
234
  let firstChunkMs: number | null = null;
235
+ let pendingDecoderBytes = 0;
236
+ let downstreamCancelled = false;
237
+
238
+ const submitDecodedText = (text: string, flush: boolean = false): void => {
239
+ const observedBytes = flush
240
+ ? pendingDecoderBytes
241
+ : Math.min(pendingDecoderBytes, Buffer.byteLength(text, "utf-8"));
242
+ pendingDecoderBytes -= observedBytes;
243
+ if (text === "" && observedBytes === 0) return;
244
+ capture.tryAppend(text, observedBytes);
245
+ applyRawStreamCaptureStatus(log, capture);
246
+ };
199
247
 
200
- const scheduleStreamingFinalization = (type: "streaming" | "stream-abort"): void => {
248
+ const scheduleStreamingFinalization = (
249
+ type: "streaming" | "stream-abort",
250
+ upstreamStreamFailed: boolean = false,
251
+ ): void => {
201
252
  if (finalizationScheduled) return;
202
253
  finalizationScheduled = true;
203
254
 
255
+ if (pendingDecoderBytes > 0) {
256
+ capture.recordDroppedObservation("pipeline-closed", pendingDecoderBytes);
257
+ pendingDecoderBytes = 0;
258
+ }
259
+
204
260
  const totalStreamMs = Date.now() - startTime;
205
261
  const elapsedMs = totalStreamMs;
206
262
  void capture
207
263
  .finalize()
208
264
  .then((rawStream) => {
265
+ applyRawStreamCaptureStatus(log, capture);
266
+ if (upstreamStreamFailed) applyUpstreamStreamError(log);
209
267
  switch (type) {
210
268
  case "streaming":
211
269
  scheduleLogFinalization({
@@ -218,6 +276,7 @@ function handleStreamingResponse(
218
276
  collectStreamingChunks,
219
277
  firstChunkMs,
220
278
  totalStreamMs,
279
+ terminalError: upstreamStreamFailed ? UPSTREAM_STREAM_ERROR : null,
221
280
  });
222
281
  return;
223
282
  case "stream-abort":
@@ -237,6 +296,10 @@ function handleStreamingResponse(
237
296
  })
238
297
  .catch((error: unknown) => {
239
298
  const message = error instanceof Error ? error.message : String(error);
299
+ applyRawStreamCaptureStatus(log, capture);
300
+ if (upstreamStreamFailed) applyUpstreamStreamError(log);
301
+ log.captureIncomplete = true;
302
+ log.captureIncompleteReason ??= "finalize-failed";
240
303
  logger.error(
241
304
  `[handler] Raw stream finalization failed for log #${String(log.id)}:`,
242
305
  message,
@@ -256,28 +319,48 @@ function handleStreamingResponse(
256
319
  };
257
320
 
258
321
  const transform = new TransformStream<Uint8Array, Uint8Array>({
259
- async transform(chunk, controller) {
322
+ transform(chunk, controller) {
260
323
  if (firstChunkMs === null) firstChunkMs = Date.now() - startTime;
261
324
  controller.enqueue(chunk);
262
- await capture.append(decoder.decode(chunk, { stream: true }));
325
+ pendingDecoderBytes += chunk.byteLength;
326
+ submitDecodedText(decoder.decode(chunk, { stream: true }));
263
327
  },
264
- async flush() {
265
- await capture.append(decoder.decode());
328
+ flush() {
329
+ submitDecodedText(decoder.decode(), true);
266
330
  scheduleStreamingFinalization("streaming");
267
331
  },
268
332
  });
269
333
 
270
- if (upstreamRes.body === null) {
271
- return new Response("No response body", { status: STATUS_BAD_GATEWAY });
272
- }
273
-
274
334
  // pipeTo returns a promise that rejects when either side errors. Without
275
335
  // this catch, an upstream connection drop skips flush() and leaves the log
276
336
  // permanently un-finalized with a leaked temp file.
277
337
  void upstreamRes.body.pipeTo(transform.writable).catch(() => {
278
- scheduleStreamingFinalization("streaming");
338
+ if (downstreamCancelled || req.signal?.aborted === true) {
339
+ scheduleStreamingFinalization("stream-abort");
340
+ return;
341
+ }
342
+ scheduleStreamingFinalization("streaming", true);
343
+ });
344
+ const transformedReader = transform.readable.getReader();
345
+ const loggedStream = new ReadableStream<Uint8Array>({
346
+ async pull(controller) {
347
+ try {
348
+ const next = await transformedReader.read();
349
+ if (next.done) {
350
+ controller.close();
351
+ return;
352
+ }
353
+ controller.enqueue(next.value);
354
+ } catch (error) {
355
+ controller.error(error);
356
+ }
357
+ },
358
+ async cancel(reason) {
359
+ downstreamCancelled = true;
360
+ scheduleStreamingFinalization("stream-abort");
361
+ await transformedReader.cancel(reason);
362
+ },
279
363
  });
280
- const loggedStream = transform.readable;
281
364
 
282
365
  if (req.signal === undefined) {
283
366
  logger.warn("[handler] req.signal is undefined; abort detection disabled for this request");
@@ -361,6 +444,19 @@ async function handleAdmittedProxy(req: Request): Promise<Response> {
361
444
  // Find provider config using already-extracted model (not calling extractModelFromBody again)
362
445
  const matchedProviderConfig = model !== null ? findProviderByModel(model) : null;
363
446
  const route = describeApiRoute(parsed.apiPath);
447
+
448
+ // Model matching is necessary but not sufficient: the Provider must explicitly expose the
449
+ // protocol selected by the request path. This guard stays before log creation and fetch so a
450
+ // protocol mismatch has the same zero-side-effect contract as an unconfigured model.
451
+ if (
452
+ model === null ||
453
+ matchedProviderConfig === null ||
454
+ !providerSupportsApiRoute(route, matchedProviderConfig)
455
+ ) {
456
+ logger.warn(`[handler] Unsupported provider: model=${model}`);
457
+ return new Response("Forbidden: unsupported provider", { status: STATUS_FORBIDDEN });
458
+ }
459
+
364
460
  const upstreamBase = selectUpstreamBase(route, matchedProviderConfig);
365
461
  const upstreamUrl = buildUpstreamUrl(upstreamBase, parsed.normalizedPath);
366
462
 
@@ -374,15 +470,7 @@ async function handleAdmittedProxy(req: Request): Promise<Response> {
374
470
  setUpstreamHost(upstreamHeaders, upstreamBase);
375
471
  injectProviderAuth(upstreamHeaders, matchedProviderConfig);
376
472
 
377
- const provider = model !== null ? registry.findProvider(model) : null;
378
-
379
- // Only proxy requests matching a registered provider
380
- if (model === null || provider === null) {
381
- logger.warn(`[handler] Unsupported provider: model=${model}`);
382
- return new Response("Forbidden: unsupported provider", { status: STATUS_FORBIDDEN });
383
- }
384
-
385
- // Pick the format handler from the request path. provider.format is only a
473
+ // Pick the format handler from the request path. ProviderConfig.format is only a
386
474
  // hint used as a fallback when no anthropicBaseUrl/openaiBaseUrl is set, and
387
475
  // does NOT describe what the upstream actually returns: a provider configured
388
476
  // with format="openai" may still expose an Anthropic-compatible endpoint
@@ -441,7 +529,7 @@ async function handleAdmittedProxy(req: Request): Promise<Response> {
441
529
  log.responseStatus = status;
442
530
  log.responseText = fetchResult.reason;
443
531
  appendLogEntry({ ...buildFileLogEntry(log, upstreamUrl), error: fetchResult.reason });
444
- finalizeLogUpdate(log);
532
+ await persistFinalizedLogUpdate(log);
445
533
  return new Response(
446
534
  fetchResult.kind === "network-policy"
447
535
  ? "Forbidden: upstream URL is not permitted"
@@ -458,14 +546,14 @@ async function handleAdmittedProxy(req: Request): Promise<Response> {
458
546
  log.responseStatus = 499; // Client Closed Request (non-standard but descriptive)
459
547
  log.responseText = "Client aborted";
460
548
  appendLogEntry({ ...buildFileLogEntry(log, upstreamUrl), error: "Client aborted" });
461
- finalizeLogUpdate(log);
549
+ await persistFinalizedLogUpdate(log);
462
550
  return new Response("Client aborted", { status: 499 });
463
551
  }
464
552
  logger.error(`[handler] Proxy error: ${req.method} ${parsed.apiPath}`, String(err));
465
553
  log.responseStatus = STATUS_BAD_GATEWAY;
466
554
  log.responseText = String(err);
467
555
  appendLogEntry({ ...buildFileLogEntry(log, upstreamUrl), error: String(err) });
468
- finalizeLogUpdate(log);
556
+ await persistFinalizedLogUpdate(log);
469
557
  return new Response(`Proxy error: ${err}`, { status: STATUS_BAD_GATEWAY });
470
558
  }
471
559
 
@@ -527,6 +615,18 @@ function responseWithRuntimeLease(response: Response, lease: RuntimeRequestLease
527
615
  export async function handleProxy(req: Request): Promise<Response> {
528
616
  const lease = acquireRuntimeRequest();
529
617
  if (lease === null) {
618
+ const admission = getRuntimeAdmissionState();
619
+ if (admission.acceptingRequests) {
620
+ return resourceLimitResponse({
621
+ error: `Proxy request capacity reached. At most ${String(admission.capacity)} active requests are allowed; retry after a response completes.`,
622
+ code: "proxy-capacity-exceeded",
623
+ status: 503,
624
+ resource: "proxy-requests",
625
+ limit: admission.capacity,
626
+ retryable: true,
627
+ retryAfterSeconds: 1,
628
+ });
629
+ }
530
630
  return Response.json(
531
631
  { error: "Agent Inspector is shutting down" },
532
632
  { status: 503, headers: { "cache-control": "no-store", "retry-after": "5" } },