@tonyclaw/agent-inspector 3.0.45 → 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 (338) 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 +2326 -516
  4. package/.output/server/_libs/extend.mjs +4 -8
  5. package/.output/server/_libs/jszip.mjs +9 -35
  6. package/.output/server/_libs/react-dom.mjs +2 -3
  7. package/.output/server/_libs/react.mjs +1 -27
  8. package/.output/server/_libs/tanstack__react-router.mjs +1 -329
  9. package/.output/server/_libs/tanstack__router-core.mjs +42 -100
  10. package/.output/server/_libs/use-sync-external-store.mjs +1 -64
  11. package/.output/server/_libs/ws.mjs +1 -1
  12. package/.output/server/_ssr/index.mjs +4 -4
  13. package/.output/server/_ssr/{publicBasePathContext-5264L3rX.mjs → publicBasePathContext-IH2ilOfu.mjs} +52 -24
  14. package/.output/server/_ssr/{router-BJ_ltLim.mjs → router-D18yUq36.mjs} +19770 -19447
  15. package/.output/server/_ssr/{start-C6MjPjxp.mjs → start-COQu_AgD.mjs} +1 -1
  16. package/.output/server/_tanstack-start-manifest_v-DnbdNeun.mjs +4 -0
  17. package/.output/server/index.mjs +5 -145
  18. package/.output/{public/assets/CompareDrawer-B3_TLTJh.js → ui/assets/CompareDrawer-DAUuIJ6G.js} +1 -1
  19. package/.output/{public/assets/InspectorPet-Cpn6hv4P.js → ui/assets/InspectorPet-BRBVjOWI.js} +1 -1
  20. package/.output/ui/assets/ProxyViewerContainer-D7Sq0ctc.js +59 -0
  21. package/.output/{public/assets/ReplayDialog-B3EKVdJk.js → ui/assets/ReplayDialog-nDLsjOhs.js} +1 -1
  22. package/.output/{public/assets/RequestAnatomy-COOQjyUC.js → ui/assets/RequestAnatomy-zd4BDgL0.js} +1 -1
  23. package/.output/ui/assets/ResponseView-AdIXGcSn.js +2 -0
  24. package/.output/ui/assets/StreamingChunkSequence-CesTz8He.js +1 -0
  25. package/.output/{public/assets/_sessionId-zbgYl7ZJ.js → ui/assets/_sessionId-BAfzrhSU.js} +1 -1
  26. package/.output/{public/assets/_sessionId-BJlM3nmt.js → ui/assets/_sessionId-QnBomgPD.js} +1 -1
  27. package/.output/ui/assets/favicon-DYEkHSNl.svg +21 -0
  28. package/.output/{public/assets/index-BIK4bPTv.js → ui/assets/index-BcsdxBAd.js} +1 -1
  29. package/.output/ui/assets/index-BvXp42al.css +1 -0
  30. package/.output/{public/assets/index-D2Qw6Ri2.js → ui/assets/index-D0rtCN9V.js} +1 -1
  31. package/.output/ui/assets/index-DHpwr08Z.js +73 -0
  32. package/.output/{public/assets/index-xF_NY8Yb.js → ui/assets/index-dNuk2dsU.js} +5 -5
  33. package/.output/ui/assets/json-viewer-BvFHglMb.js +1 -0
  34. package/.output/{public/assets/jszip.min-B_rfAUCe.js → ui/assets/jszip.min-B5Z7gNZB.js} +1 -1
  35. package/.output/ui/index.html +229 -0
  36. package/.output/ui/runtime-config.js +2 -0
  37. package/.output/workers/logFinalizer.worker.js +979 -414
  38. package/.output/workers/sessionWorkerEntry.js +979 -414
  39. package/README.md +175 -43
  40. package/docs/instance-control.openapi.yaml +59 -4
  41. package/package.json +25 -5
  42. package/scripts/generate-theme-scales.mjs +3 -3
  43. package/src/{router.tsx → backend/router.tsx} +3 -15
  44. package/src/backend/routes/$.ts +26 -0
  45. package/src/backend/routes/__root.ts +4 -0
  46. package/src/{routes → backend/routes}/api/-instances.ts +3 -3
  47. package/src/{routes → backend/routes}/api/alerts.summary.ts +3 -3
  48. package/src/{routes → backend/routes}/api/alerts.ts +4 -4
  49. package/src/{routes → backend/routes}/api/config.paths.ts +1 -1
  50. package/src/{routes → backend/routes}/api/config.ts +11 -2
  51. package/src/{routes → backend/routes}/api/ecosystem.packages.$packageId.help.ts +1 -1
  52. package/src/{routes → backend/routes}/api/ecosystem.packages.$packageId.install.ts +1 -1
  53. package/src/{routes → backend/routes}/api/ecosystem.packages.$packageId.runner-presets.ts +1 -1
  54. package/src/{routes → backend/routes}/api/ecosystem.packages.$packageId.upgrade.ts +1 -1
  55. package/src/{routes → backend/routes}/api/ecosystem.packages.ts +5 -1
  56. package/src/{routes → backend/routes}/api/ecosystem.recipes.$recipeId.run.ts +1 -1
  57. package/src/{routes → backend/routes}/api/ecosystem.tasks.$taskId.ts +1 -1
  58. package/src/{routes → backend/routes}/api/ecosystem.tasks.ts +1 -1
  59. package/src/{routes → backend/routes}/api/groups.$groupId.evidence.ts +2 -2
  60. package/src/{routes → backend/routes}/api/groups.$groupId.sessions.ts +2 -2
  61. package/src/{routes → backend/routes}/api/groups.$groupId.ts +2 -2
  62. package/src/{routes → backend/routes}/api/groups.ts +2 -2
  63. package/src/{routes → backend/routes}/api/health.ts +3 -3
  64. package/src/{routes → backend/routes}/api/instances.$name.connection.ts +1 -1
  65. package/src/{routes → backend/routes}/api/instances.$name.restart.ts +2 -2
  66. package/src/{routes → backend/routes}/api/instances.$name.start.ts +2 -2
  67. package/src/{routes → backend/routes}/api/instances.$name.stop.ts +2 -2
  68. package/src/{routes → backend/routes}/api/instances.$name.ts +1 -1
  69. package/src/{routes → backend/routes}/api/instances.ts +1 -1
  70. package/src/{routes → backend/routes}/api/knowledge.candidates.$candidateId.promote.ts +2 -2
  71. package/src/{routes → backend/routes}/api/knowledge.candidates.$candidateId.ts +2 -2
  72. package/src/{routes → backend/routes}/api/knowledge.candidates.ts +1 -1
  73. package/src/{routes → backend/routes}/api/knowledge.project-context.ts +2 -2
  74. package/src/{routes → backend/routes}/api/knowledge.search.ts +2 -2
  75. package/src/{routes → backend/routes}/api/knowledge.sessions.$sessionId.candidates.ts +3 -3
  76. package/src/{routes → backend/routes}/api/logs.$id.body.ts +6 -6
  77. package/src/{routes → backend/routes}/api/logs.$id.chunks.ts +5 -4
  78. package/src/{routes → backend/routes}/api/logs.$id.replay.ts +12 -11
  79. package/src/{routes → backend/routes}/api/logs.$id.ts +4 -3
  80. package/src/{routes → backend/routes}/api/logs.import.ts +3 -3
  81. package/src/{routes → backend/routes}/api/logs.stream.ts +11 -7
  82. package/src/{routes → backend/routes}/api/logs.ts +17 -9
  83. package/src/{routes → backend/routes}/api/mcp.ts +1 -1
  84. package/src/{routes → backend/routes}/api/models.ts +1 -1
  85. package/src/{routes → backend/routes}/api/pi-agent.ts +2 -2
  86. package/src/{routes → backend/routes}/api/providers.$providerId.model-metadata.ts +5 -5
  87. package/src/{routes → backend/routes}/api/providers.$providerId.test.log.ts +7 -7
  88. package/src/{routes → backend/routes}/api/providers.$providerId.ts +4 -4
  89. package/src/{routes → backend/routes}/api/providers.export.ts +1 -1
  90. package/src/{routes → backend/routes}/api/providers.import.ts +3 -3
  91. package/src/{routes → backend/routes}/api/providers.scan.ts +2 -2
  92. package/src/{routes → backend/routes}/api/providers.ts +9 -4
  93. package/src/{routes → backend/routes}/api/runs.$runId.evidence.ts +2 -2
  94. package/src/{routes → backend/routes}/api/runs.$runId.ts +2 -2
  95. package/src/{routes → backend/routes}/api/runs.ts +4 -4
  96. package/src/backend/routes/api/runtime.ts +46 -0
  97. package/src/{routes → backend/routes}/api/sessions.ts +3 -3
  98. package/src/{routes → backend/routes}/proxy/$.ts +1 -1
  99. package/src/{routes → backend/routes}/readyz.ts +1 -1
  100. package/src/{start.ts → backend/start.ts} +1 -1
  101. package/src/cli/alias.ts +2 -11
  102. package/src/cli/doctor.ts +32 -9
  103. package/src/cli/instance.ts +26 -13
  104. package/src/cli/instanceArgs.ts +30 -11
  105. package/src/cli/instanceControl.ts +0 -2
  106. package/src/cli/instanceModel.ts +9 -17
  107. package/src/cli/instanceRegistry.ts +0 -9
  108. package/src/cli/networkHints.ts +27 -14
  109. package/src/cli/onboard.ts +69 -2
  110. package/src/cli/onboardTarget.ts +89 -40
  111. package/src/cli/templates/codex-skill-onboard.ts +44 -14
  112. package/src/cli/templates/skill-onboard.ts +64 -28
  113. package/src/cli.ts +184 -61
  114. package/src/components/ProxyViewer.tsx +11 -9
  115. package/src/components/ProxyViewerContainer.tsx +12 -11
  116. package/src/components/pi-agent/PiAgentPanel.tsx +2 -2
  117. package/src/components/providers/ProviderCard.tsx +1 -1
  118. package/src/components/providers/ProviderTestResultsView.tsx +1 -1
  119. package/src/components/providers/SettingsDialog.tsx +159 -144
  120. package/src/components/proxy-viewer/ApplicationBar.tsx +2 -1
  121. package/src/components/proxy-viewer/LogEntry.tsx +1 -1
  122. package/src/components/proxy-viewer/log-formats/index.ts +1 -1
  123. package/src/contracts/index.ts +5 -0
  124. package/src/contracts/log.ts +33 -3
  125. package/src/knowledge/types.ts +3 -2
  126. package/src/lib/alertContract.ts +2 -2
  127. package/src/lib/apiClient.ts +30 -7
  128. package/src/lib/apiFormat.ts +29 -0
  129. package/src/lib/basePath.ts +29 -11
  130. package/src/lib/browserRuntimeContract.ts +124 -0
  131. package/src/lib/browserRuntimeResolver.ts +244 -0
  132. package/src/{proxy → lib}/claudeCodeStrip.ts +6 -7
  133. package/src/lib/codingAgentEndpoints.ts +38 -0
  134. package/src/lib/instanceContract.ts +27 -11
  135. package/src/lib/piAgentContract.ts +3 -2
  136. package/src/lib/publicBasePathContext.ts +40 -10
  137. package/src/lib/resourceLimits.ts +2 -0
  138. package/src/lib/runContract.ts +3 -3
  139. package/src/lib/sessionInfoContract.ts +3 -2
  140. package/src/mcp/instanceHandlers.ts +1 -0
  141. package/src/mcp/server.ts +19 -24
  142. package/src/proxy/config.ts +25 -30
  143. package/src/proxy/dataDir.ts +43 -7
  144. package/src/proxy/ecosystemTasks.ts +161 -70
  145. package/src/proxy/formats/registry.ts +6 -21
  146. package/src/proxy/handler.ts +129 -29
  147. package/src/proxy/identityProxy.ts +419 -39
  148. package/src/proxy/jsonlRecovery.ts +554 -0
  149. package/src/proxy/logFinalizer.ts +25 -10
  150. package/src/proxy/logImporter.ts +2 -1
  151. package/src/proxy/logIndex.ts +191 -95
  152. package/src/proxy/logger.ts +77 -14
  153. package/src/proxy/platformCommands.ts +41 -0
  154. package/src/proxy/privateDataPath.ts +310 -88
  155. package/src/proxy/rawStreamCapture.ts +194 -13
  156. package/src/proxy/runtimeAdmission.ts +5 -2
  157. package/src/proxy/runtimeHealth.ts +14 -1
  158. package/src/proxy/runtimeShutdown.ts +11 -1
  159. package/src/proxy/schemas.ts +7 -1
  160. package/src/proxy/sessionArchive.ts +78 -14
  161. package/src/proxy/sqliteLogIndex.ts +65 -2
  162. package/src/proxy/store.ts +141 -34
  163. package/src/proxy/uiAssetServer.ts +106 -0
  164. package/src/proxy/upstream.ts +29 -2
  165. package/src/ui/bootstrap.ts +167 -0
  166. package/src/ui/index.html +38 -0
  167. package/src/ui/logsStreamClient.ts +20 -0
  168. package/src/ui/main.tsx +13 -0
  169. package/src/ui/public/runtime-config.js +2 -0
  170. package/src/ui/router.tsx +13 -0
  171. package/src/ui/routes/__root.tsx +69 -0
  172. package/src/{routes → ui/routes}/index.tsx +2 -3
  173. package/src/{routes → ui/routes}/session/$sessionId.tsx +5 -11
  174. package/src/ui/runtimeDiscovery.ts +50 -0
  175. package/styles/globals.css +1 -0
  176. package/.output/public/assets/ProxyViewerContainer-BEAhuGOJ.js +0 -126
  177. package/.output/public/assets/ResponseView-DBCjkwye.js +0 -2
  178. package/.output/public/assets/StreamingChunkSequence-CuXhDgMo.js +0 -1
  179. package/.output/public/assets/index-BZo_8koU.js +0 -70
  180. package/.output/public/assets/index-ZWschkCh.css +0 -1
  181. package/.output/public/assets/json-viewer-B-Ao6pwW.js +0 -1
  182. package/.output/server/_libs/@radix-ui/react-accessible-icon+[...].mjs +0 -1
  183. package/.output/server/_libs/@radix-ui/react-dismissable-layer+[...].mjs +0 -344
  184. package/.output/server/_libs/@radix-ui/react-navigation-menu+[...].mjs +0 -2
  185. package/.output/server/_libs/@radix-ui/react-one-time-password-field+[...].mjs +0 -2
  186. package/.output/server/_libs/@radix-ui/react-password-toggle-field+[...].mjs +0 -2
  187. package/.output/server/_libs/@radix-ui/react-use-callback-ref+[...].mjs +0 -11
  188. package/.output/server/_libs/@radix-ui/react-use-controllable-state+[...].mjs +0 -69
  189. package/.output/server/_libs/@radix-ui/react-use-effect-event+[...].mjs +0 -1
  190. package/.output/server/_libs/@radix-ui/react-use-is-hydrated+[...].mjs +0 -28
  191. package/.output/server/_libs/@radix-ui/react-use-layout-effect+[...].mjs +0 -6
  192. package/.output/server/_libs/@radix-ui/react-visually-hidden+[...].mjs +0 -34
  193. package/.output/server/_libs/aria-hidden.mjs +0 -122
  194. package/.output/server/_libs/bail.mjs +0 -8
  195. package/.output/server/_libs/character-entities.mjs +0 -2130
  196. package/.output/server/_libs/class-variance-authority.mjs +0 -44
  197. package/.output/server/_libs/clsx.mjs +0 -16
  198. package/.output/server/_libs/comma-separated-tokens.mjs +0 -10
  199. package/.output/server/_libs/decode-named-character-reference+[...].mjs +0 -8
  200. package/.output/server/_libs/dequal.mjs +0 -27
  201. package/.output/server/_libs/detect-node-es.mjs +0 -1
  202. package/.output/server/_libs/devlop.mjs +0 -8
  203. package/.output/server/_libs/diff.mjs +0 -320
  204. package/.output/server/_libs/estree-util-is-identifier-name.mjs +0 -11
  205. package/.output/server/_libs/floating-ui__core.mjs +0 -725
  206. package/.output/server/_libs/floating-ui__dom.mjs +0 -622
  207. package/.output/server/_libs/floating-ui__react-dom.mjs +0 -292
  208. package/.output/server/_libs/floating-ui__utils.mjs +0 -320
  209. package/.output/server/_libs/get-nonce.mjs +0 -9
  210. package/.output/server/_libs/hast-util-to-jsx-runtime.mjs +0 -388
  211. package/.output/server/_libs/hast-util-whitespace.mjs +0 -10
  212. package/.output/server/_libs/html-url-attributes.mjs +0 -26
  213. package/.output/server/_libs/inline-style-parser.mjs +0 -142
  214. package/.output/server/_libs/is-plain-obj.mjs +0 -10
  215. package/.output/server/_libs/lucide-react.mjs +0 -1027
  216. package/.output/server/_libs/mdast-util-from-markdown.mjs +0 -717
  217. package/.output/server/_libs/mdast-util-to-hast.mjs +0 -710
  218. package/.output/server/_libs/mdast-util-to-string.mjs +0 -38
  219. package/.output/server/_libs/micromark-core-commonmark.mjs +0 -2259
  220. package/.output/server/_libs/micromark-factory-destination.mjs +0 -94
  221. package/.output/server/_libs/micromark-factory-label.mjs +0 -63
  222. package/.output/server/_libs/micromark-factory-space.mjs +0 -24
  223. package/.output/server/_libs/micromark-factory-title.mjs +0 -65
  224. package/.output/server/_libs/micromark-factory-whitespace.mjs +0 -22
  225. package/.output/server/_libs/micromark-util-character.mjs +0 -44
  226. package/.output/server/_libs/micromark-util-chunked.mjs +0 -36
  227. package/.output/server/_libs/micromark-util-classify-character+[...].mjs +0 -12
  228. package/.output/server/_libs/micromark-util-combine-extensions+[...].mjs +0 -41
  229. package/.output/server/_libs/micromark-util-decode-numeric-character-reference+[...].mjs +0 -19
  230. package/.output/server/_libs/micromark-util-decode-string.mjs +0 -21
  231. package/.output/server/_libs/micromark-util-encode.mjs +0 -1
  232. package/.output/server/_libs/micromark-util-html-tag-name.mjs +0 -69
  233. package/.output/server/_libs/micromark-util-normalize-identifier+[...].mjs +0 -6
  234. package/.output/server/_libs/micromark-util-resolve-all.mjs +0 -15
  235. package/.output/server/_libs/micromark-util-sanitize-uri.mjs +0 -41
  236. package/.output/server/_libs/micromark-util-subtokenize.mjs +0 -346
  237. package/.output/server/_libs/micromark.mjs +0 -906
  238. package/.output/server/_libs/property-information.mjs +0 -1209
  239. package/.output/server/_libs/radix-ui.mjs +0 -1
  240. package/.output/server/_libs/radix-ui__number.mjs +0 -6
  241. package/.output/server/_libs/radix-ui__primitive.mjs +0 -11
  242. package/.output/server/_libs/radix-ui__react-accordion.mjs +0 -1
  243. package/.output/server/_libs/radix-ui__react-alert-dialog.mjs +0 -1
  244. package/.output/server/_libs/radix-ui__react-arrow.mjs +0 -23
  245. package/.output/server/_libs/radix-ui__react-aspect-ratio.mjs +0 -1
  246. package/.output/server/_libs/radix-ui__react-avatar.mjs +0 -1
  247. package/.output/server/_libs/radix-ui__react-checkbox.mjs +0 -1
  248. package/.output/server/_libs/radix-ui__react-collapsible.mjs +0 -144
  249. package/.output/server/_libs/radix-ui__react-collection.mjs +0 -69
  250. package/.output/server/_libs/radix-ui__react-compose-refs.mjs +0 -38
  251. package/.output/server/_libs/radix-ui__react-context-menu.mjs +0 -1
  252. package/.output/server/_libs/radix-ui__react-context.mjs +0 -64
  253. package/.output/server/_libs/radix-ui__react-dialog.mjs +0 -280
  254. package/.output/server/_libs/radix-ui__react-direction.mjs +0 -9
  255. package/.output/server/_libs/radix-ui__react-dropdown-menu.mjs +0 -1
  256. package/.output/server/_libs/radix-ui__react-focus-guards.mjs +0 -39
  257. package/.output/server/_libs/radix-ui__react-focus-scope.mjs +0 -210
  258. package/.output/server/_libs/radix-ui__react-form.mjs +0 -1
  259. package/.output/server/_libs/radix-ui__react-hover-card.mjs +0 -1
  260. package/.output/server/_libs/radix-ui__react-id.mjs +0 -14
  261. package/.output/server/_libs/radix-ui__react-label.mjs +0 -1
  262. package/.output/server/_libs/radix-ui__react-menu.mjs +0 -1
  263. package/.output/server/_libs/radix-ui__react-menubar.mjs +0 -1
  264. package/.output/server/_libs/radix-ui__react-popover.mjs +0 -1
  265. package/.output/server/_libs/radix-ui__react-popper.mjs +0 -340
  266. package/.output/server/_libs/radix-ui__react-portal.mjs +0 -16
  267. package/.output/server/_libs/radix-ui__react-presence.mjs +0 -173
  268. package/.output/server/_libs/radix-ui__react-primitive.mjs +0 -42
  269. package/.output/server/_libs/radix-ui__react-progress.mjs +0 -1
  270. package/.output/server/_libs/radix-ui__react-radio-group.mjs +0 -1
  271. package/.output/server/_libs/radix-ui__react-roving-focus.mjs +0 -235
  272. package/.output/server/_libs/radix-ui__react-scroll-area.mjs +0 -731
  273. package/.output/server/_libs/radix-ui__react-select.mjs +0 -1207
  274. package/.output/server/_libs/radix-ui__react-separator.mjs +0 -28
  275. package/.output/server/_libs/radix-ui__react-slider.mjs +0 -1
  276. package/.output/server/_libs/radix-ui__react-slot.mjs +0 -132
  277. package/.output/server/_libs/radix-ui__react-switch.mjs +0 -1
  278. package/.output/server/_libs/radix-ui__react-tabs.mjs +0 -194
  279. package/.output/server/_libs/radix-ui__react-toast.mjs +0 -2
  280. package/.output/server/_libs/radix-ui__react-toggle-group.mjs +0 -1
  281. package/.output/server/_libs/radix-ui__react-toggle.mjs +0 -1
  282. package/.output/server/_libs/radix-ui__react-toolbar.mjs +0 -1
  283. package/.output/server/_libs/radix-ui__react-tooltip.mjs +0 -498
  284. package/.output/server/_libs/radix-ui__react-use-previous.mjs +0 -14
  285. package/.output/server/_libs/radix-ui__react-use-size.mjs +0 -39
  286. package/.output/server/_libs/react-markdown.mjs +0 -235
  287. package/.output/server/_libs/react-remove-scroll-bar.mjs +0 -82
  288. package/.output/server/_libs/react-remove-scroll.mjs +0 -328
  289. package/.output/server/_libs/react-style-singleton.mjs +0 -69
  290. package/.output/server/_libs/remark-parse.mjs +0 -19
  291. package/.output/server/_libs/remark-rehype.mjs +0 -21
  292. package/.output/server/_libs/space-separated-tokens.mjs +0 -6
  293. package/.output/server/_libs/style-to-js.mjs +0 -72
  294. package/.output/server/_libs/style-to-object.mjs +0 -38
  295. package/.output/server/_libs/swr.mjs +0 -947
  296. package/.output/server/_libs/tailwind-merge.mjs +0 -3255
  297. package/.output/server/_libs/tanstack__react-virtual.mjs +0 -130
  298. package/.output/server/_libs/tanstack__virtual-core.mjs +0 -1319
  299. package/.output/server/_libs/three.mjs +0 -26016
  300. package/.output/server/_libs/trim-lines.mjs +0 -41
  301. package/.output/server/_libs/trough.mjs +0 -85
  302. package/.output/server/_libs/tslib.mjs +0 -1
  303. package/.output/server/_libs/ungap__structured-clone.mjs +0 -212
  304. package/.output/server/_libs/unified.mjs +0 -661
  305. package/.output/server/_libs/unist-util-is.mjs +0 -100
  306. package/.output/server/_libs/unist-util-position.mjs +0 -27
  307. package/.output/server/_libs/unist-util-stringify-position.mjs +0 -27
  308. package/.output/server/_libs/unist-util-visit-parents.mjs +0 -82
  309. package/.output/server/_libs/unist-util-visit.mjs +0 -24
  310. package/.output/server/_libs/use-callback-ref.mjs +0 -66
  311. package/.output/server/_libs/use-sidecar.mjs +0 -106
  312. package/.output/server/_libs/vfile-message.mjs +0 -138
  313. package/.output/server/_libs/vfile.mjs +0 -467
  314. package/.output/server/_sessionId-CJ99gZFV.mjs +0 -84
  315. package/.output/server/_sessionId-DEjScBpK.mjs +0 -146
  316. package/.output/server/_ssr/CompareDrawer-DtOIMeQB.mjs +0 -1060
  317. package/.output/server/_ssr/InspectorPet-CXc4oCBQ.mjs +0 -938
  318. package/.output/server/_ssr/ProxyViewerContainer-DVPlwfkt.mjs +0 -17632
  319. package/.output/server/_ssr/ReplayDialog-BQEA95qC.mjs +0 -725
  320. package/.output/server/_ssr/RequestAnatomy-BMyd8B7Q.mjs +0 -837
  321. package/.output/server/_ssr/ResponseView-qrTaEIM8.mjs +0 -757
  322. package/.output/server/_ssr/StreamingChunkSequence-BFTL8mIy.mjs +0 -274
  323. package/.output/server/_ssr/index-Bcj1Hcy4.mjs +0 -135
  324. package/.output/server/_ssr/index-DW-M7XUG.mjs +0 -84
  325. package/.output/server/_ssr/json-viewer-DiI0Yjsn.mjs +0 -483
  326. package/.output/server/_tanstack-start-manifest_v-C6pXXX9R.mjs +0 -4
  327. package/.output/server/node_modules/tslib/modules/index.js +0 -70
  328. package/.output/server/node_modules/tslib/modules/package.json +0 -3
  329. package/.output/server/node_modules/tslib/package.json +0 -47
  330. package/.output/server/node_modules/tslib/tslib.js +0 -484
  331. package/.output/server/package.json +0 -9
  332. package/src/routes/__root.tsx +0 -170
  333. /package/.output/{public → ui}/assets/agent-inspector-58K1_MsC.ico +0 -0
  334. /package/.output/{public → ui}/assets/alibaba-TTwafVwX.svg +0 -0
  335. /package/.output/{public → ui}/assets/minimax-BPMzvuL-.jpeg +0 -0
  336. /package/.output/{public → ui}/assets/qwen-mMn3f5ul.webp +0 -0
  337. /package/.output/{public → ui}/assets/zhipuai-BPNAnxo-.svg +0 -0
  338. /package/src/{routes → backend/routes}/livez.ts +0 -0
@@ -42,9 +42,12 @@ import {
42
42
  } from "lucide-react";
43
43
 
44
44
  import type { CapturedLog } from "../contracts";
45
+ import { withBasePath } from "../lib/basePath";
45
46
  import { exportLogsAsZip, type ExportMode } from "../lib/export-logs";
46
- import { getConfiguredBasePath, withBasePath } from "../lib/basePath";
47
- import { deriveCodingAgentEndpoints } from "../lib/codingAgentEndpoints";
47
+ import {
48
+ subscribeCodingAgentEndpoints,
49
+ type CodingAgentEndpoints,
50
+ } from "../lib/codingAgentEndpoints";
48
51
  import type { ImportLogsResponse } from "../lib/logImportContract";
49
52
  import { copyTextToClipboard } from "../lib/clipboard";
50
53
  import type { InspectorGroupEvidence, InspectorGroupMember } from "../lib/groupContract";
@@ -1213,7 +1216,7 @@ function SessionContextBar({
1213
1216
  <div className="flex flex-wrap items-center gap-2">
1214
1217
  {showBackLink && (
1215
1218
  <a
1216
- href="/"
1219
+ href={withBasePath("/")}
1217
1220
  className="bg-white/[0.035] hover:bg-white/[0.065] inline-flex size-8 shrink-0 items-center justify-center rounded-md text-muted-foreground shadow-[inset_0_0_0_1px_rgba(255,255,255,0.06)] transition-colors hover:text-foreground"
1218
1221
  aria-label="Back to all sessions"
1219
1222
  title="Back to all sessions"
@@ -1385,10 +1388,9 @@ export function ProxyViewer({
1385
1388
  const exportRequestIdRef = useRef(0);
1386
1389
  const detailsPanelResizeRef = useRef<DetailsPanelResizeState | null>(null);
1387
1390
  useKeyboardNavigation(logListRef, logListWrapperRef, { pageWide: true });
1388
- const connectionEndpoints = useMemo(() => {
1389
- const origin = typeof window === "undefined" ? "http://localhost:9527" : window.location.origin;
1390
- return deriveCodingAgentEndpoints(origin, getConfiguredBasePath());
1391
- }, []);
1391
+ const [connectionEndpoints, setConnectionEndpoints] = useState<CodingAgentEndpoints | null>(null);
1392
+
1393
+ useEffect(() => subscribeCodingAgentEndpoints(setConnectionEndpoints), []);
1392
1394
 
1393
1395
  const cancelTransientTasks = useCallback(() => {
1394
1396
  exportRequestIdRef.current += 1;
@@ -2112,7 +2114,7 @@ export function ProxyViewer({
2112
2114
  )}
2113
2115
  {hideSessionFilter ? (
2114
2116
  <a
2115
- href="/"
2117
+ href={withBasePath("/")}
2116
2118
  className="inline-flex h-8 items-center rounded-md px-3 text-xs text-muted-foreground underline transition-colors hover:text-foreground focus-visible:ring-1 focus-visible:ring-ring focus-visible:outline-none"
2117
2119
  >
2118
2120
  Back to all sessions
@@ -2143,7 +2145,7 @@ export function ProxyViewer({
2143
2145
  Pick a session from the filter panel to load stored logs on demand.
2144
2146
  </p>
2145
2147
  )}
2146
- {liveEmptyStateCopy.showConnectionCommands && (
2148
+ {liveEmptyStateCopy.showConnectionCommands && connectionEndpoints !== null && (
2147
2149
  <>
2148
2150
  <div className="flex flex-col items-center gap-2">
2149
2151
  <CopyableCommand
@@ -2,7 +2,6 @@ import { useState, useEffect, useCallback, useRef, useMemo, useTransition, type
2
2
  import { z } from "zod";
3
3
  import { CapturedLogSchema, type CapturedLog } from "../contracts";
4
4
  import { fetchJson, fetchJsonWithTimeout } from "../lib/apiClient";
5
- import { withBasePath } from "../lib/basePath";
6
5
  import {
7
6
  DeleteInspectorGroupsResponseSchema,
8
7
  InspectorGroupsListResponseSchema,
@@ -29,6 +28,7 @@ import {
29
28
  reduceLiveConnectionState,
30
29
  } from "./proxy-viewer/liveConnectionState";
31
30
  import { TransientToast, useTransientToast } from "./ui/transient-toast";
31
+ import { openLogsEventSource } from "../ui/logsStreamClient";
32
32
 
33
33
  type SSEUpdate =
34
34
  | {
@@ -134,15 +134,6 @@ const SESSION_MEMBERSHIP_FETCH_TIMEOUT_MS = 10_000;
134
134
  const SSE_RECONNECT_DELAY_MS = 3_000;
135
135
  const SSE_STALE_AFTER_MS = 10_000;
136
136
 
137
- function buildLogsStreamUrl(sessionId: string | undefined): string {
138
- const params = new URLSearchParams({ compact: "1" });
139
- if (sessionId !== undefined) {
140
- params.set("sessionId", sessionId);
141
- }
142
- const query = params.toString();
143
- return withBasePath(query.length > 0 ? `/api/logs/stream?${query}` : "/api/logs/stream");
144
- }
145
-
146
137
  function buildSessionLogsPageUrl(
147
138
  sessionId: string,
148
139
  request: SessionPageRequest,
@@ -396,7 +387,17 @@ export function ProxyViewerContainer({
396
387
  reconnectTimeoutRef.current = null;
397
388
  }
398
389
  setLiveConnection((state) => reduceLiveConnectionState(state, { type: "connect-requested" }));
399
- const es = new EventSource(buildLogsStreamUrl(initialSessionId));
390
+ const es = openLogsEventSource(initialSessionId);
391
+ if (es === null) {
392
+ setLiveConnection((state) =>
393
+ reduceLiveConnectionState(state, {
394
+ type: "recoverable-error",
395
+ message: "The browser runtime does not provide a valid log stream endpoint.",
396
+ }),
397
+ );
398
+ showErrorToast("Failed to resolve the live stream endpoint");
399
+ return;
400
+ }
400
401
  eventSourceRef.current = es;
401
402
 
402
403
  es.onmessage = (event: MessageEvent) => {
@@ -12,7 +12,7 @@ import {
12
12
  type PiAgentResponseView,
13
13
  } from "./piAgentChatLogic";
14
14
  import { useProviders } from "../../lib/useProviders";
15
- import { withBasePath } from "../../lib/basePath";
15
+ import { fetchControl } from "../../lib/apiClient";
16
16
  import { dispatchLogFocusRequest } from "../proxy-viewer/logFocus";
17
17
  import { AnswerMarkdown } from "../proxy-viewer/AnswerMarkdown";
18
18
  import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "../ui/select";
@@ -274,7 +274,7 @@ export function PiAgentPanel({
274
274
  logLimit: 16,
275
275
  };
276
276
 
277
- void fetch(withBasePath("/api/pi-agent"), {
277
+ void fetchControl("/api/pi-agent", {
278
278
  method: "POST",
279
279
  headers: {
280
280
  "content-type": "application/json",
@@ -11,7 +11,7 @@ import {
11
11
  ChevronDown,
12
12
  ChevronRight,
13
13
  } from "lucide-react";
14
- import type { ProviderConfig } from "../../proxy/providers";
14
+ import type { ProviderConfig } from "../../lib/providerContract";
15
15
  import {
16
16
  findProviderModelMetadata,
17
17
  providerHasContextMetadata,
@@ -22,7 +22,7 @@ import type {
22
22
  ProviderTestResults as TestResults,
23
23
  ProviderTestState,
24
24
  } from "../../lib/providerTestContract";
25
- import type { ProviderConfig } from "../../proxy/providers";
25
+ import type { ProviderConfig } from "../../lib/providerContract";
26
26
  import { cn } from "../../lib/utils";
27
27
  import {
28
28
  Dialog,
@@ -10,8 +10,10 @@ import { useProviders } from "../../lib/useProviders";
10
10
  import { useStripConfig } from "../../lib/useStripConfig";
11
11
  import { copyTextToClipboard } from "../../lib/clipboard";
12
12
  import { fetchJsonWithTimeout } from "../../lib/apiClient";
13
- import { getConfiguredBasePath, withBasePath } from "../../lib/basePath";
14
- import { deriveCodingAgentEndpoints } from "../../lib/codingAgentEndpoints";
13
+ import {
14
+ subscribeCodingAgentEndpoints,
15
+ type CodingAgentEndpoints,
16
+ } from "../../lib/codingAgentEndpoints";
15
17
  import {
16
18
  MAX_PROVIDER_TEST_TIMEOUT_SECONDS,
17
19
  MAX_SLOW_RESPONSE_THRESHOLD_SECONDS,
@@ -330,14 +332,8 @@ function CopyableSetupValue({
330
332
 
331
333
  function OnboardingSettingsTab(): JSX.Element {
332
334
  const [copiedId, setCopiedId] = useState<string | null>(null);
333
- const origin = useMemo(() => {
334
- if (typeof window === "undefined") return "http://localhost:9527";
335
- return window.location.origin;
336
- }, []);
337
- const endpoints = useMemo(
338
- () => deriveCodingAgentEndpoints(origin, getConfiguredBasePath()),
339
- [origin],
340
- );
335
+ const [endpoints, setEndpoints] = useState<CodingAgentEndpoints | null>(null);
336
+ useEffect(() => subscribeCodingAgentEndpoints(setEndpoints), []);
341
337
  const values = useMemo(
342
338
  () => [
343
339
  { id: "status", label: "Check onboarding", value: "agent-inspector onboard --status" },
@@ -369,11 +365,6 @@ function OnboardingSettingsTab(): JSX.Element {
369
365
  value: "agent-inspector onboard --status --opencode-only",
370
366
  },
371
367
  { id: "opencode-verify", label: "OpenCode verify", value: "opencode mcp list" },
372
- {
373
- id: "opencode-proxy",
374
- label: "OpenCode proxy",
375
- value: `LLM_BASE_URL=${endpoints.proxy}`,
376
- },
377
368
  {
378
369
  id: "mimo-config",
379
370
  label: "MiMo Code config",
@@ -385,23 +376,32 @@ function OnboardingSettingsTab(): JSX.Element {
385
376
  value: "agent-inspector onboard --status --mimo-only",
386
377
  },
387
378
  { id: "mimo-verify", label: "MiMo Code verify", value: "mimo mcp list" },
388
- {
389
- id: "mimo-proxy",
390
- label: "MiMo Code proxy",
391
- value: `OPENAI_BASE_URL=${endpoints.proxy}`,
392
- },
393
- { id: "mcp", label: "MCP URL", value: endpoints.mcp },
394
- { id: "proxy", label: "Proxy URL", value: endpoints.proxy },
395
- {
396
- id: "anthropic",
397
- label: "Anthropic base",
398
- value: `ANTHROPIC_BASE_URL=${endpoints.proxy}`,
399
- },
400
- {
401
- id: "openai",
402
- label: "OpenAI base",
403
- value: `OPENAI_BASE_URL=${endpoints.openAiV1}`,
404
- },
379
+ ...(endpoints === null
380
+ ? []
381
+ : [
382
+ {
383
+ id: "opencode-proxy",
384
+ label: "OpenCode proxy",
385
+ value: `LLM_BASE_URL=${endpoints.proxy}`,
386
+ },
387
+ {
388
+ id: "mimo-proxy",
389
+ label: "MiMo Code proxy",
390
+ value: `OPENAI_BASE_URL=${endpoints.openAiV1}`,
391
+ },
392
+ { id: "mcp", label: "MCP URL", value: endpoints.mcp },
393
+ { id: "proxy", label: "Proxy URL", value: endpoints.proxy },
394
+ {
395
+ id: "anthropic",
396
+ label: "Anthropic base",
397
+ value: `ANTHROPIC_BASE_URL=${endpoints.proxy}`,
398
+ },
399
+ {
400
+ id: "openai",
401
+ label: "OpenAI base",
402
+ value: `OPENAI_BASE_URL=${endpoints.openAiV1}`,
403
+ },
404
+ ]),
405
405
  ],
406
406
  [endpoints],
407
407
  );
@@ -501,111 +501,117 @@ function OnboardingSettingsTab(): JSX.Element {
501
501
 
502
502
  function McpSettingsTab(): JSX.Element {
503
503
  const [copiedId, setCopiedId] = useState<string | null>(null);
504
- const origin = useMemo(() => {
505
- if (typeof window === "undefined") return "http://localhost:9527";
506
- return window.location.origin;
507
- }, []);
508
- const endpoint = `${origin}${withBasePath("/api/mcp")}`;
504
+ const [endpoint, setEndpoint] = useState<string | null>(null);
505
+ useEffect(
506
+ () =>
507
+ subscribeCodingAgentEndpoints((endpoints) => {
508
+ setEndpoint(endpoints?.mcp ?? null);
509
+ }),
510
+ [],
511
+ );
509
512
  const values = useMemo(
510
- () => [
511
- { id: "mcp-url", label: "Streamable HTTP MCP URL", value: endpoint },
512
- {
513
- id: "stdio",
514
- label: "Stdio bridge command",
515
- value: `agent-inspector-mcp stdio --url ${endpoint}`,
516
- },
517
- {
518
- id: "doctor",
519
- label: "Bridge doctor",
520
- value: `agent-inspector-mcp doctor --url ${endpoint}`,
521
- },
522
- {
523
- id: "writes",
524
- label: "Enable write tools",
525
- value: "AGENT_INSPECTOR_MCP_WRITES=1 agent-inspector",
526
- },
527
- {
528
- id: "capabilities",
529
- label: "Capabilities resource",
530
- value: "inspector://mcp/capabilities",
531
- },
532
- {
533
- id: "context",
534
- label: "Current context resource",
535
- value: "inspector://context/current",
536
- },
537
- {
538
- id: "streamable-json",
539
- label: "Streamable HTTP JSON",
540
- value: JSON.stringify(
541
- {
542
- mcpServers: {
543
- "agent-inspector": {
544
- type: "streamableHttp",
545
- url: endpoint,
546
- },
513
+ () =>
514
+ endpoint === null
515
+ ? []
516
+ : [
517
+ { id: "mcp-url", label: "Streamable HTTP MCP URL", value: endpoint },
518
+ {
519
+ id: "stdio",
520
+ label: "Stdio bridge command",
521
+ value: `agent-inspector-mcp stdio --url ${endpoint}`,
547
522
  },
548
- },
549
- null,
550
- 2,
551
- ),
552
- },
553
- {
554
- id: "stdio-json",
555
- label: "Stdio MCP JSON",
556
- value: JSON.stringify(
557
- {
558
- mcpServers: {
559
- "agent-inspector": {
560
- command: "agent-inspector-mcp",
561
- args: ["stdio", "--url", endpoint],
562
- },
523
+ {
524
+ id: "doctor",
525
+ label: "Bridge doctor",
526
+ value: `agent-inspector-mcp doctor --url ${endpoint}`,
563
527
  },
564
- },
565
- null,
566
- 2,
567
- ),
568
- },
569
- {
570
- id: "opencode-local",
571
- label: "OpenCode local MCP",
572
- value: JSON.stringify(
573
- {
574
- mcp: {
575
- "agent-inspector": {
576
- type: "local",
577
- command: ["agent-inspector-mcp", "stdio", "--url", endpoint],
578
- enabled: true,
579
- },
528
+ {
529
+ id: "writes",
530
+ label: "Enable write tools",
531
+ value: "AGENT_INSPECTOR_MCP_WRITES=1 agent-inspector",
580
532
  },
581
- },
582
- null,
583
- 2,
584
- ),
585
- },
586
- {
587
- id: "mimo-local",
588
- label: "MiMo Code local MCP",
589
- value: JSON.stringify(
590
- {
591
- mcp: {
592
- "agent-inspector": {
593
- type: "local",
594
- command: ["agent-inspector-mcp", "stdio", "--url", endpoint],
595
- enabled: true,
596
- },
533
+ {
534
+ id: "capabilities",
535
+ label: "Capabilities resource",
536
+ value: "inspector://mcp/capabilities",
597
537
  },
598
- },
599
- null,
600
- 2,
601
- ),
602
- },
603
- {
604
- id: "codex-toml",
605
- label: "Codex TOML",
606
- value: `[mcp_servers.agent-inspector]\ncommand = "agent-inspector-mcp"\nargs = ["stdio", "--url", "${endpoint}"]`,
607
- },
608
- ],
538
+ {
539
+ id: "context",
540
+ label: "Current context resource",
541
+ value: "inspector://context/current",
542
+ },
543
+ {
544
+ id: "streamable-json",
545
+ label: "Streamable HTTP JSON",
546
+ value: JSON.stringify(
547
+ {
548
+ mcpServers: {
549
+ "agent-inspector": {
550
+ type: "streamableHttp",
551
+ url: endpoint,
552
+ },
553
+ },
554
+ },
555
+ null,
556
+ 2,
557
+ ),
558
+ },
559
+ {
560
+ id: "stdio-json",
561
+ label: "Stdio MCP JSON",
562
+ value: JSON.stringify(
563
+ {
564
+ mcpServers: {
565
+ "agent-inspector": {
566
+ command: "agent-inspector-mcp",
567
+ args: ["stdio", "--url", endpoint],
568
+ },
569
+ },
570
+ },
571
+ null,
572
+ 2,
573
+ ),
574
+ },
575
+ {
576
+ id: "opencode-local",
577
+ label: "OpenCode local MCP",
578
+ value: JSON.stringify(
579
+ {
580
+ mcp: {
581
+ "agent-inspector": {
582
+ type: "local",
583
+ command: ["agent-inspector-mcp", "stdio", "--url", endpoint],
584
+ enabled: true,
585
+ },
586
+ },
587
+ },
588
+ null,
589
+ 2,
590
+ ),
591
+ },
592
+ {
593
+ id: "mimo-local",
594
+ label: "MiMo Code local MCP",
595
+ value: JSON.stringify(
596
+ {
597
+ mcp: {
598
+ "agent-inspector": {
599
+ type: "local",
600
+ command: ["agent-inspector-mcp", "stdio", "--url", endpoint],
601
+ enabled: true,
602
+ },
603
+ },
604
+ },
605
+ null,
606
+ 2,
607
+ ),
608
+ },
609
+ {
610
+ id: "codex-toml",
611
+ label: "Codex TOML",
612
+ value: `[mcp_servers.agent-inspector]\ncommand = "agent-inspector-mcp"\nargs = ["stdio", "--url", "${endpoint}"]`,
613
+ },
614
+ ],
609
615
  [endpoint],
610
616
  );
611
617
 
@@ -633,18 +639,27 @@ function McpSettingsTab(): JSX.Element {
633
639
  host/IP and verify the network path.
634
640
  </div>
635
641
  </div>
636
- <div className="grid gap-2">
637
- {values.map((item) => (
638
- <CopyableSetupValue
639
- key={item.id}
640
- id={item.id}
641
- label={item.label}
642
- value={item.value}
643
- copiedId={copiedId}
644
- onCopy={handleCopy}
645
- />
646
- ))}
647
- </div>
642
+ {endpoint === null ? (
643
+ <div
644
+ role="alert"
645
+ className="rounded-md bg-destructive/10 px-3 py-2 text-xs text-destructive"
646
+ >
647
+ The browser runtime does not provide a valid agent-facing MCP endpoint.
648
+ </div>
649
+ ) : (
650
+ <div className="grid gap-2">
651
+ {values.map((item) => (
652
+ <CopyableSetupValue
653
+ key={item.id}
654
+ id={item.id}
655
+ label={item.label}
656
+ value={item.value}
657
+ copiedId={copiedId}
658
+ onCopy={handleCopy}
659
+ />
660
+ ))}
661
+ </div>
662
+ )}
648
663
  </div>
649
664
  );
650
665
  }
@@ -1,6 +1,7 @@
1
1
  import { Maximize2, Minimize2 } from "lucide-react";
2
2
  import { type JSX, type ReactNode, useCallback, useEffect, useState } from "react";
3
3
  import packageJson from "../../../package.json";
4
+ import { withBasePath } from "../../lib/basePath";
4
5
  import { Button } from "../ui/button";
5
6
  import { CrabLogo } from "../ui/crab-logo";
6
7
  import { INSPECTOR_ICON_TRIGGER_CLASS } from "../ui/icon-trigger";
@@ -78,7 +79,7 @@ export function ApplicationBar({
78
79
  >
79
80
  <div className="grid min-w-0 grid-cols-[minmax(0,1fr)_auto] items-center gap-x-3 gap-y-2 sm:grid-cols-[minmax(0,1fr)_auto_minmax(0,1fr)]">
80
81
  <a
81
- href="/"
82
+ href={withBasePath("/")}
82
83
  aria-label="Agent Inspector home"
83
84
  className="flex min-w-0 items-center gap-2 rounded-md focus-visible:ring-1 focus-visible:ring-ring focus-visible:outline-none"
84
85
  >
@@ -11,7 +11,7 @@ import { ApiTimeoutError, fetchJsonWithTimeout } from "../../lib/apiClient";
11
11
  import type { TimeDisplayFormat } from "../../lib/runtimeConfig";
12
12
  import { cn } from "../../lib/utils";
13
13
  import { LazyFeatureBoundary } from "../errors/SafeErrorBoundary";
14
- import { stripClaudeCodeBillingHeader } from "../../proxy/claudeCodeStrip";
14
+ import { stripClaudeCodeBillingHeader } from "../../lib/claudeCodeStrip";
15
15
  import { Button } from "../ui/button";
16
16
  import { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider } from "../ui/tooltip";
17
17
  import { useJsonBulkExpansion } from "../ui/json-viewer-bulk";
@@ -1,4 +1,4 @@
1
- import { apiFormatForPath } from "../../../proxy/formats";
1
+ import { apiFormatForPath } from "../../../lib/apiFormat";
2
2
  import type { ApiFormat, CapturedLog } from "../../../contracts";
3
3
  import { anthropicLogFormatAdapter } from "./anthropic";
4
4
  import { openAILogFormatAdapter } from "./openai";
@@ -2,15 +2,20 @@ export { JsonValueSchema, trustAsJsonValue } from "./json";
2
2
  export type { JsonValue } from "./json";
3
3
 
4
4
  export {
5
+ CaptureIncompleteReasonSchema,
5
6
  CapturedLogSchema,
6
7
  LogBodyChunkSchema,
8
+ LogIdSchema,
7
9
  LogBodyPartSchema,
10
+ parseLogId,
8
11
  StreamingChunkSchema,
9
12
  } from "./log";
10
13
  export type {
11
14
  ApiFormat,
15
+ CaptureIncompleteReason,
12
16
  CapturedLog,
13
17
  LogBodyChunk,
18
+ LogId,
14
19
  LogBodyPart,
15
20
  StreamingChunk,
16
21
  TokenUsage,
@@ -3,6 +3,32 @@ import { JsonValueSchema } from "./json";
3
3
 
4
4
  export type ApiFormat = "anthropic" | "openai" | "unknown";
5
5
 
6
+ /**
7
+ * Persisted log ID contract. New captures allocate positive IDs, while zero
8
+ * remains readable for legacy data. Unsafe integers are never valid IDs.
9
+ */
10
+ export const LogIdSchema = z.number().int().nonnegative().max(Number.MAX_SAFE_INTEGER);
11
+
12
+ export type LogId = z.infer<typeof LogIdSchema>;
13
+
14
+ /** Parse a decimal path/query/header value using the persisted log ID contract. */
15
+ export function parseLogId(value: string): LogId | null {
16
+ if (!/^\d+$/.test(value)) return null;
17
+ const result = LogIdSchema.safeParse(Number(value));
18
+ return result.success ? result.data : null;
19
+ }
20
+
21
+ export const CaptureIncompleteReasonSchema = z.enum([
22
+ "capacity-exceeded",
23
+ "pipeline-closed",
24
+ "write-failed",
25
+ "finalize-failed",
26
+ "upstream-stream-error",
27
+ "shutdown",
28
+ ]);
29
+
30
+ export type CaptureIncompleteReason = z.infer<typeof CaptureIncompleteReasonSchema>;
31
+
6
32
  /**
7
33
  * A single SSE event from a streaming response.
8
34
  */
@@ -24,7 +50,7 @@ export const LogBodyPartSchema = z.enum(["request", "response"]);
24
50
  export type LogBodyPart = z.infer<typeof LogBodyPartSchema>;
25
51
 
26
52
  export const LogBodyChunkSchema = z.object({
27
- logId: z.number().int().positive(),
53
+ logId: LogIdSchema,
28
54
  part: LogBodyPartSchema,
29
55
  text: z.string(),
30
56
  offset: z.number().int().nonnegative(),
@@ -39,7 +65,7 @@ export const LogBodyChunkSchema = z.object({
39
65
  export type LogBodyChunk = z.infer<typeof LogBodyChunkSchema>;
40
66
 
41
67
  export const CapturedLogSchema = z.object({
42
- id: z.number(),
68
+ id: LogIdSchema,
43
69
  timestamp: z.string(),
44
70
  method: z.string(),
45
71
  path: z.string(),
@@ -64,7 +90,7 @@ export const CapturedLogSchema = z.object({
64
90
  headers: z.record(z.string(), z.string()).optional(),
65
91
  apiFormat: z.enum(["anthropic", "openai", "unknown"]).default("unknown"),
66
92
  isTest: z.boolean().optional().default(false),
67
- replayOfLogId: z.number().nullable().optional(),
93
+ replayOfLogId: LogIdSchema.nullable().optional(),
68
94
  providerName: z.string().nullable().optional(),
69
95
  clientPort: z.number().nullable().optional(),
70
96
  clientPid: z.number().nullable().optional(),
@@ -75,6 +101,10 @@ export const CapturedLogSchema = z.object({
75
101
  rawRequestBodyBytes: z.number().int().nonnegative().nullable().optional(),
76
102
  responseTextBytes: z.number().int().nonnegative().nullable().optional(),
77
103
  bodyContentMode: z.enum(["full", "compact", "truncated"]).optional(),
104
+ captureIncomplete: z.boolean().optional(),
105
+ droppedChunks: z.number().int().nonnegative().optional(),
106
+ droppedBytes: z.number().int().nonnegative().optional(),
107
+ captureIncompleteReason: CaptureIncompleteReasonSchema.nullable().optional(),
78
108
  warnings: z.array(z.string()).optional(),
79
109
  /** Error message from streaming response (e.g., SSE error event) */
80
110
  error: z.string().nullable().optional(),
@@ -1,4 +1,5 @@
1
1
  import { z } from "zod";
2
+ import { LogIdSchema } from "../contracts";
2
3
 
3
4
  export const KnowledgeCandidateTypeSchema = z.enum([
4
5
  "episode",
@@ -16,7 +17,7 @@ export type KnowledgeCandidateStatus = z.infer<typeof KnowledgeCandidateStatusSc
16
17
  export const KnowledgeEvidenceSchema = z.object({
17
18
  source: z.literal("agent-inspector"),
18
19
  sessionId: z.string(),
19
- logIds: z.array(z.number().int().positive()),
20
+ logIds: z.array(LogIdSchema),
20
21
  project: z.string().nullable(),
21
22
  models: z.array(z.string()),
22
23
  });
@@ -36,7 +37,7 @@ export const KnowledgeCandidateSchema = z.object({
36
37
  tags: z.array(z.string()),
37
38
  source: z.literal("agent-inspector"),
38
39
  sessionId: z.string(),
39
- logIds: z.array(z.number().int().positive()),
40
+ logIds: z.array(LogIdSchema),
40
41
  evidence: KnowledgeEvidenceSchema,
41
42
  status: KnowledgeCandidateStatusSchema,
42
43
  createdAt: z.string(),
@@ -1,5 +1,5 @@
1
1
  import { z } from "zod";
2
- import { JsonValueSchema } from "../contracts";
2
+ import { JsonValueSchema, LogIdSchema } from "../contracts";
3
3
 
4
4
  export const AlertSeveritySchema = z.enum(["critical", "warning", "notice"]);
5
5
  export const AlertStatusSchema = z.enum(["open"]);
@@ -35,7 +35,7 @@ export const AlertSchema = z.object({
35
35
  count: z.number().int().positive(),
36
36
  firstSeenAt: z.string(),
37
37
  lastSeenAt: z.string(),
38
- logIds: z.array(z.number().int().positive()),
38
+ logIds: z.array(LogIdSchema),
39
39
  sessionIds: z.array(z.string()),
40
40
  runIds: z.array(z.string()),
41
41
  groupIds: z.array(z.string()),