@tonyclaw/agent-inspector 3.0.45 → 3.0.47

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 (343) 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 +8018 -5451
  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-BwZEsYfS.mjs} +19794 -19444
  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-V-8lPASC.js} +1 -1
  19. package/.output/{public/assets/InspectorPet-Cpn6hv4P.js → ui/assets/InspectorPet-D4CVnfdf.js} +1 -1
  20. package/.output/ui/assets/ProxyViewerContainer-CO3ZVHLX.js +59 -0
  21. package/.output/{public/assets/ReplayDialog-B3EKVdJk.js → ui/assets/ReplayDialog-CpGyTLtt.js} +1 -1
  22. package/.output/{public/assets/RequestAnatomy-COOQjyUC.js → ui/assets/RequestAnatomy-BLuJL9dZ.js} +1 -1
  23. package/.output/ui/assets/ResponseView-BuSC-CH7.js +2 -0
  24. package/.output/ui/assets/StreamingChunkSequence-DeA-JJKa.js +1 -0
  25. package/.output/{public/assets/_sessionId-zbgYl7ZJ.js → ui/assets/_sessionId-8HuHFhjo.js} +1 -1
  26. package/.output/{public/assets/_sessionId-BJlM3nmt.js → ui/assets/_sessionId-Chp67th6.js} +1 -1
  27. package/.output/ui/assets/favicon-DYEkHSNl.svg +21 -0
  28. package/.output/ui/assets/index-BvXp42al.css +1 -0
  29. package/.output/{public/assets/index-xF_NY8Yb.js → ui/assets/index-DPmKK_5d.js} +5 -5
  30. package/.output/{public/assets/index-BIK4bPTv.js → ui/assets/index-atoQrlb8.js} +1 -1
  31. package/.output/ui/assets/index-nY3E1vxV.js +73 -0
  32. package/.output/{public/assets/index-D2Qw6Ri2.js → ui/assets/index-nl9-dpZn.js} +1 -1
  33. package/.output/ui/assets/json-viewer-B9kIzqeX.js +1 -0
  34. package/.output/{public/assets/jszip.min-B_rfAUCe.js → ui/assets/jszip.min-B7tfyE-I.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 +182 -43
  40. package/docs/instance-control.openapi.yaml +59 -4
  41. package/package.json +40 -6
  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/backend/routes/api/-instances.ts +7 -0
  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 +36 -13
  104. package/src/cli/instanceApi.ts +213 -0
  105. package/src/cli/instanceArgs.ts +46 -11
  106. package/src/cli/instanceControl.ts +10 -2
  107. package/src/cli/instanceModel.ts +18 -17
  108. package/src/cli/instanceRegistry.ts +0 -9
  109. package/src/cli/networkHints.ts +27 -14
  110. package/src/cli/onboard.ts +69 -2
  111. package/src/cli/onboardTarget.ts +89 -40
  112. package/src/cli/rustBackendPackage.ts +450 -0
  113. package/src/cli/templates/codex-skill-onboard.ts +44 -14
  114. package/src/cli/templates/skill-onboard.ts +64 -28
  115. package/src/cli.ts +341 -75
  116. package/src/components/ProxyViewer.tsx +11 -9
  117. package/src/components/ProxyViewerContainer.tsx +12 -11
  118. package/src/components/pi-agent/PiAgentPanel.tsx +2 -2
  119. package/src/components/providers/ProviderCard.tsx +1 -1
  120. package/src/components/providers/ProviderTestResultsView.tsx +1 -1
  121. package/src/components/providers/SettingsDialog.tsx +159 -144
  122. package/src/components/proxy-viewer/ApplicationBar.tsx +2 -1
  123. package/src/components/proxy-viewer/LogEntry.tsx +1 -1
  124. package/src/components/proxy-viewer/log-formats/index.ts +1 -1
  125. package/src/contracts/index.ts +5 -0
  126. package/src/contracts/log.ts +33 -3
  127. package/src/knowledge/types.ts +3 -2
  128. package/src/lib/alertContract.ts +2 -2
  129. package/src/lib/apiClient.ts +30 -7
  130. package/src/lib/apiFormat.ts +29 -0
  131. package/src/lib/backendImplementation.ts +16 -0
  132. package/src/lib/basePath.ts +29 -11
  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 +38 -0
  137. package/src/lib/instanceContract.ts +30 -11
  138. package/src/lib/managedInstance.ts +9 -1
  139. package/src/lib/piAgentContract.ts +3 -2
  140. package/src/lib/publicBasePathContext.ts +40 -10
  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 +2 -0
  145. package/src/mcp/server.ts +19 -24
  146. package/src/proxy/config.ts +25 -30
  147. package/src/proxy/dataDir.ts +43 -7
  148. package/src/proxy/ecosystemTasks.ts +161 -70
  149. package/src/proxy/formats/registry.ts +6 -21
  150. package/src/proxy/handler.ts +129 -29
  151. package/src/proxy/identityProxy.ts +567 -39
  152. package/src/proxy/jsonlRecovery.ts +554 -0
  153. package/src/proxy/logFinalizer.ts +25 -10
  154. package/src/proxy/logImporter.ts +2 -1
  155. package/src/proxy/logIndex.ts +191 -95
  156. package/src/proxy/logger.ts +77 -14
  157. package/src/proxy/platformCommands.ts +41 -0
  158. package/src/proxy/privateDataPath.ts +310 -88
  159. package/src/proxy/rawStreamCapture.ts +194 -13
  160. package/src/proxy/runtimeAdmission.ts +5 -2
  161. package/src/proxy/runtimeHealth.ts +14 -1
  162. package/src/proxy/runtimeShutdown.ts +11 -1
  163. package/src/proxy/schemas.ts +7 -1
  164. package/src/proxy/sessionArchive.ts +70 -14
  165. package/src/proxy/sqliteLogIndex.ts +65 -42
  166. package/src/proxy/store.ts +141 -34
  167. package/src/proxy/uiAssetServer.ts +106 -0
  168. package/src/proxy/upstream.ts +29 -2
  169. package/src/ui/bootstrap.ts +167 -0
  170. package/src/ui/index.html +38 -0
  171. package/src/ui/logsStreamClient.ts +20 -0
  172. package/src/ui/main.tsx +13 -0
  173. package/src/ui/public/runtime-config.js +2 -0
  174. package/src/ui/router.tsx +13 -0
  175. package/src/ui/routes/__root.tsx +69 -0
  176. package/src/{routes → ui/routes}/index.tsx +2 -3
  177. package/src/{routes → ui/routes}/session/$sessionId.tsx +5 -11
  178. package/src/ui/runtimeDiscovery.ts +50 -0
  179. package/styles/globals.css +1 -0
  180. package/.output/public/assets/ProxyViewerContainer-BEAhuGOJ.js +0 -126
  181. package/.output/public/assets/ResponseView-DBCjkwye.js +0 -2
  182. package/.output/public/assets/StreamingChunkSequence-CuXhDgMo.js +0 -1
  183. package/.output/public/assets/index-BZo_8koU.js +0 -70
  184. package/.output/public/assets/index-ZWschkCh.css +0 -1
  185. package/.output/public/assets/json-viewer-B-Ao6pwW.js +0 -1
  186. package/.output/server/_libs/@radix-ui/react-accessible-icon+[...].mjs +0 -1
  187. package/.output/server/_libs/@radix-ui/react-dismissable-layer+[...].mjs +0 -344
  188. package/.output/server/_libs/@radix-ui/react-navigation-menu+[...].mjs +0 -2
  189. package/.output/server/_libs/@radix-ui/react-one-time-password-field+[...].mjs +0 -2
  190. package/.output/server/_libs/@radix-ui/react-password-toggle-field+[...].mjs +0 -2
  191. package/.output/server/_libs/@radix-ui/react-use-callback-ref+[...].mjs +0 -11
  192. package/.output/server/_libs/@radix-ui/react-use-controllable-state+[...].mjs +0 -69
  193. package/.output/server/_libs/@radix-ui/react-use-effect-event+[...].mjs +0 -1
  194. package/.output/server/_libs/@radix-ui/react-use-is-hydrated+[...].mjs +0 -28
  195. package/.output/server/_libs/@radix-ui/react-use-layout-effect+[...].mjs +0 -6
  196. package/.output/server/_libs/@radix-ui/react-visually-hidden+[...].mjs +0 -34
  197. package/.output/server/_libs/aria-hidden.mjs +0 -122
  198. package/.output/server/_libs/bail.mjs +0 -8
  199. package/.output/server/_libs/character-entities.mjs +0 -2130
  200. package/.output/server/_libs/class-variance-authority.mjs +0 -44
  201. package/.output/server/_libs/clsx.mjs +0 -16
  202. package/.output/server/_libs/comma-separated-tokens.mjs +0 -10
  203. package/.output/server/_libs/decode-named-character-reference+[...].mjs +0 -8
  204. package/.output/server/_libs/dequal.mjs +0 -27
  205. package/.output/server/_libs/detect-node-es.mjs +0 -1
  206. package/.output/server/_libs/devlop.mjs +0 -8
  207. package/.output/server/_libs/diff.mjs +0 -320
  208. package/.output/server/_libs/estree-util-is-identifier-name.mjs +0 -11
  209. package/.output/server/_libs/floating-ui__core.mjs +0 -725
  210. package/.output/server/_libs/floating-ui__dom.mjs +0 -622
  211. package/.output/server/_libs/floating-ui__react-dom.mjs +0 -292
  212. package/.output/server/_libs/floating-ui__utils.mjs +0 -320
  213. package/.output/server/_libs/get-nonce.mjs +0 -9
  214. package/.output/server/_libs/hast-util-to-jsx-runtime.mjs +0 -388
  215. package/.output/server/_libs/hast-util-whitespace.mjs +0 -10
  216. package/.output/server/_libs/html-url-attributes.mjs +0 -26
  217. package/.output/server/_libs/inline-style-parser.mjs +0 -142
  218. package/.output/server/_libs/is-plain-obj.mjs +0 -10
  219. package/.output/server/_libs/lucide-react.mjs +0 -1027
  220. package/.output/server/_libs/mdast-util-from-markdown.mjs +0 -717
  221. package/.output/server/_libs/mdast-util-to-hast.mjs +0 -710
  222. package/.output/server/_libs/mdast-util-to-string.mjs +0 -38
  223. package/.output/server/_libs/micromark-core-commonmark.mjs +0 -2259
  224. package/.output/server/_libs/micromark-factory-destination.mjs +0 -94
  225. package/.output/server/_libs/micromark-factory-label.mjs +0 -63
  226. package/.output/server/_libs/micromark-factory-space.mjs +0 -24
  227. package/.output/server/_libs/micromark-factory-title.mjs +0 -65
  228. package/.output/server/_libs/micromark-factory-whitespace.mjs +0 -22
  229. package/.output/server/_libs/micromark-util-character.mjs +0 -44
  230. package/.output/server/_libs/micromark-util-chunked.mjs +0 -36
  231. package/.output/server/_libs/micromark-util-classify-character+[...].mjs +0 -12
  232. package/.output/server/_libs/micromark-util-combine-extensions+[...].mjs +0 -41
  233. package/.output/server/_libs/micromark-util-decode-numeric-character-reference+[...].mjs +0 -19
  234. package/.output/server/_libs/micromark-util-decode-string.mjs +0 -21
  235. package/.output/server/_libs/micromark-util-encode.mjs +0 -1
  236. package/.output/server/_libs/micromark-util-html-tag-name.mjs +0 -69
  237. package/.output/server/_libs/micromark-util-normalize-identifier+[...].mjs +0 -6
  238. package/.output/server/_libs/micromark-util-resolve-all.mjs +0 -15
  239. package/.output/server/_libs/micromark-util-sanitize-uri.mjs +0 -41
  240. package/.output/server/_libs/micromark-util-subtokenize.mjs +0 -346
  241. package/.output/server/_libs/micromark.mjs +0 -906
  242. package/.output/server/_libs/property-information.mjs +0 -1209
  243. package/.output/server/_libs/radix-ui.mjs +0 -1
  244. package/.output/server/_libs/radix-ui__number.mjs +0 -6
  245. package/.output/server/_libs/radix-ui__primitive.mjs +0 -11
  246. package/.output/server/_libs/radix-ui__react-accordion.mjs +0 -1
  247. package/.output/server/_libs/radix-ui__react-alert-dialog.mjs +0 -1
  248. package/.output/server/_libs/radix-ui__react-arrow.mjs +0 -23
  249. package/.output/server/_libs/radix-ui__react-aspect-ratio.mjs +0 -1
  250. package/.output/server/_libs/radix-ui__react-avatar.mjs +0 -1
  251. package/.output/server/_libs/radix-ui__react-checkbox.mjs +0 -1
  252. package/.output/server/_libs/radix-ui__react-collapsible.mjs +0 -144
  253. package/.output/server/_libs/radix-ui__react-collection.mjs +0 -69
  254. package/.output/server/_libs/radix-ui__react-compose-refs.mjs +0 -38
  255. package/.output/server/_libs/radix-ui__react-context-menu.mjs +0 -1
  256. package/.output/server/_libs/radix-ui__react-context.mjs +0 -64
  257. package/.output/server/_libs/radix-ui__react-dialog.mjs +0 -280
  258. package/.output/server/_libs/radix-ui__react-direction.mjs +0 -9
  259. package/.output/server/_libs/radix-ui__react-dropdown-menu.mjs +0 -1
  260. package/.output/server/_libs/radix-ui__react-focus-guards.mjs +0 -39
  261. package/.output/server/_libs/radix-ui__react-focus-scope.mjs +0 -210
  262. package/.output/server/_libs/radix-ui__react-form.mjs +0 -1
  263. package/.output/server/_libs/radix-ui__react-hover-card.mjs +0 -1
  264. package/.output/server/_libs/radix-ui__react-id.mjs +0 -14
  265. package/.output/server/_libs/radix-ui__react-label.mjs +0 -1
  266. package/.output/server/_libs/radix-ui__react-menu.mjs +0 -1
  267. package/.output/server/_libs/radix-ui__react-menubar.mjs +0 -1
  268. package/.output/server/_libs/radix-ui__react-popover.mjs +0 -1
  269. package/.output/server/_libs/radix-ui__react-popper.mjs +0 -340
  270. package/.output/server/_libs/radix-ui__react-portal.mjs +0 -16
  271. package/.output/server/_libs/radix-ui__react-presence.mjs +0 -173
  272. package/.output/server/_libs/radix-ui__react-primitive.mjs +0 -42
  273. package/.output/server/_libs/radix-ui__react-progress.mjs +0 -1
  274. package/.output/server/_libs/radix-ui__react-radio-group.mjs +0 -1
  275. package/.output/server/_libs/radix-ui__react-roving-focus.mjs +0 -235
  276. package/.output/server/_libs/radix-ui__react-scroll-area.mjs +0 -731
  277. package/.output/server/_libs/radix-ui__react-select.mjs +0 -1207
  278. package/.output/server/_libs/radix-ui__react-separator.mjs +0 -28
  279. package/.output/server/_libs/radix-ui__react-slider.mjs +0 -1
  280. package/.output/server/_libs/radix-ui__react-slot.mjs +0 -132
  281. package/.output/server/_libs/radix-ui__react-switch.mjs +0 -1
  282. package/.output/server/_libs/radix-ui__react-tabs.mjs +0 -194
  283. package/.output/server/_libs/radix-ui__react-toast.mjs +0 -2
  284. package/.output/server/_libs/radix-ui__react-toggle-group.mjs +0 -1
  285. package/.output/server/_libs/radix-ui__react-toggle.mjs +0 -1
  286. package/.output/server/_libs/radix-ui__react-toolbar.mjs +0 -1
  287. package/.output/server/_libs/radix-ui__react-tooltip.mjs +0 -498
  288. package/.output/server/_libs/radix-ui__react-use-previous.mjs +0 -14
  289. package/.output/server/_libs/radix-ui__react-use-size.mjs +0 -39
  290. package/.output/server/_libs/react-markdown.mjs +0 -235
  291. package/.output/server/_libs/react-remove-scroll-bar.mjs +0 -82
  292. package/.output/server/_libs/react-remove-scroll.mjs +0 -328
  293. package/.output/server/_libs/react-style-singleton.mjs +0 -69
  294. package/.output/server/_libs/remark-parse.mjs +0 -19
  295. package/.output/server/_libs/remark-rehype.mjs +0 -21
  296. package/.output/server/_libs/space-separated-tokens.mjs +0 -6
  297. package/.output/server/_libs/style-to-js.mjs +0 -72
  298. package/.output/server/_libs/style-to-object.mjs +0 -38
  299. package/.output/server/_libs/swr.mjs +0 -947
  300. package/.output/server/_libs/tailwind-merge.mjs +0 -3255
  301. package/.output/server/_libs/tanstack__react-virtual.mjs +0 -130
  302. package/.output/server/_libs/tanstack__virtual-core.mjs +0 -1319
  303. package/.output/server/_libs/three.mjs +0 -26016
  304. package/.output/server/_libs/trim-lines.mjs +0 -41
  305. package/.output/server/_libs/trough.mjs +0 -85
  306. package/.output/server/_libs/tslib.mjs +0 -1
  307. package/.output/server/_libs/ungap__structured-clone.mjs +0 -212
  308. package/.output/server/_libs/unified.mjs +0 -661
  309. package/.output/server/_libs/unist-util-is.mjs +0 -100
  310. package/.output/server/_libs/unist-util-position.mjs +0 -27
  311. package/.output/server/_libs/unist-util-stringify-position.mjs +0 -27
  312. package/.output/server/_libs/unist-util-visit-parents.mjs +0 -82
  313. package/.output/server/_libs/unist-util-visit.mjs +0 -24
  314. package/.output/server/_libs/use-callback-ref.mjs +0 -66
  315. package/.output/server/_libs/use-sidecar.mjs +0 -106
  316. package/.output/server/_libs/vfile-message.mjs +0 -138
  317. package/.output/server/_libs/vfile.mjs +0 -467
  318. package/.output/server/_sessionId-CJ99gZFV.mjs +0 -84
  319. package/.output/server/_sessionId-DEjScBpK.mjs +0 -146
  320. package/.output/server/_ssr/CompareDrawer-DtOIMeQB.mjs +0 -1060
  321. package/.output/server/_ssr/InspectorPet-CXc4oCBQ.mjs +0 -938
  322. package/.output/server/_ssr/ProxyViewerContainer-DVPlwfkt.mjs +0 -17632
  323. package/.output/server/_ssr/ReplayDialog-BQEA95qC.mjs +0 -725
  324. package/.output/server/_ssr/RequestAnatomy-BMyd8B7Q.mjs +0 -837
  325. package/.output/server/_ssr/ResponseView-qrTaEIM8.mjs +0 -757
  326. package/.output/server/_ssr/StreamingChunkSequence-BFTL8mIy.mjs +0 -274
  327. package/.output/server/_ssr/index-Bcj1Hcy4.mjs +0 -135
  328. package/.output/server/_ssr/index-DW-M7XUG.mjs +0 -84
  329. package/.output/server/_ssr/json-viewer-DiI0Yjsn.mjs +0 -483
  330. package/.output/server/_tanstack-start-manifest_v-C6pXXX9R.mjs +0 -4
  331. package/.output/server/node_modules/tslib/modules/index.js +0 -70
  332. package/.output/server/node_modules/tslib/modules/package.json +0 -3
  333. package/.output/server/node_modules/tslib/package.json +0 -47
  334. package/.output/server/node_modules/tslib/tslib.js +0 -484
  335. package/.output/server/package.json +0 -9
  336. package/src/routes/__root.tsx +0 -170
  337. package/src/routes/api/-instances.ts +0 -109
  338. /package/.output/{public → ui}/assets/agent-inspector-58K1_MsC.ico +0 -0
  339. /package/.output/{public → ui}/assets/alibaba-TTwafVwX.svg +0 -0
  340. /package/.output/{public → ui}/assets/minimax-BPMzvuL-.jpeg +0 -0
  341. /package/.output/{public → ui}/assets/qwen-mMn3f5ul.webp +0 -0
  342. /package/.output/{public → ui}/assets/zhipuai-BPNAnxo-.svg +0 -0
  343. /package/src/{routes → backend/routes}/livez.ts +0 -0
@@ -29,6 +29,7 @@ import {
29
29
  listFilteredIndexEntries,
30
30
  listIndexEntries,
31
31
  rebuildIndex,
32
+ updateLogIndexEntryMetadata,
32
33
  type LogIndexEntry,
33
34
  type LogIndexSummary,
34
35
  } from "./logIndex";
@@ -42,7 +43,7 @@ import { CapturedLogSchema } from "./schemas";
42
43
  import { apiFormatForPath } from "./formats/registry";
43
44
  import type { ImportedLogDraft } from "./logImporter";
44
45
  import {
45
- archiveSessionLog,
46
+ archiveSessionLogs,
46
47
  clearSessionArchives,
47
48
  deleteArchivedLogsByIds,
48
49
  findArchivedLogById,
@@ -55,6 +56,7 @@ import {
55
56
  PRIVATE_FILE_MODE,
56
57
  securePrivateFileSync,
57
58
  } from "./privateDataPath";
59
+ import { recoverCapturedLogStorage } from "./jsonlRecovery";
58
60
  import {
59
61
  clearSessionRegistry,
60
62
  getLogSessionId,
@@ -162,6 +164,43 @@ type LogCursorPageIndex = {
162
164
  const logCursorPageIndexes: Map<string, LogCursorPageIndex> = new Map();
163
165
  let logCursorPageIndexBuildCount = 0;
164
166
  let sessionArchiveQueue: Promise<void> = Promise.resolve();
167
+ const SESSION_ARCHIVE_BATCH_SIZE = 128;
168
+ const SESSION_ARCHIVE_FLUSH_DELAY_MS = 10;
169
+ let sessionArchiveBuffer: CapturedLog[] = [];
170
+ let sessionArchiveFlushTimeout: ReturnType<typeof setTimeout> | null = null;
171
+
172
+ function drainSessionArchiveBuffer(): CapturedLog[] {
173
+ const logs = sessionArchiveBuffer;
174
+ sessionArchiveBuffer = [];
175
+ return logs;
176
+ }
177
+
178
+ function queueSessionArchiveFlush(): void {
179
+ const logs = drainSessionArchiveBuffer();
180
+ if (logs.length === 0) return;
181
+ sessionArchiveQueue = sessionArchiveQueue
182
+ .catch(() => undefined)
183
+ .then(async () => {
184
+ await archiveSessionLogs(logs);
185
+ })
186
+ .catch((err: unknown) => {
187
+ logger.warn("[store] Failed to archive session logs:", String(err));
188
+ });
189
+ }
190
+
191
+ function cancelSessionArchiveFlushTimer(): void {
192
+ if (sessionArchiveFlushTimeout === null) return;
193
+ clearTimeout(sessionArchiveFlushTimeout);
194
+ sessionArchiveFlushTimeout = null;
195
+ }
196
+
197
+ function scheduleSessionArchiveFlush(): void {
198
+ if (sessionArchiveFlushTimeout !== null) return;
199
+ sessionArchiveFlushTimeout = setTimeout(() => {
200
+ sessionArchiveFlushTimeout = null;
201
+ queueSessionArchiveFlush();
202
+ }, SESSION_ARCHIVE_FLUSH_DELAY_MS);
203
+ }
165
204
 
166
205
  function cursorPageIndexKey(
167
206
  options: Pick<ListLogsCursorPageOptions, "sessionId" | "model" | "clientPid">,
@@ -233,8 +272,29 @@ function normalizeLog(log: CapturedLog): CapturedLog {
233
272
  const sessionId = getLogSessionId(log);
234
273
  const pathFormat = apiFormatForPath(log.path);
235
274
  const apiFormat = pathFormat === "unknown" ? log.apiFormat : pathFormat;
236
- if (sessionId === log.sessionId && apiFormat === log.apiFormat) return log;
237
- return { ...log, sessionId, apiFormat };
275
+ const captureIncomplete = log.captureIncomplete ?? false;
276
+ const droppedChunks = log.droppedChunks ?? 0;
277
+ const droppedBytes = log.droppedBytes ?? 0;
278
+ const captureIncompleteReason = log.captureIncompleteReason ?? null;
279
+ if (
280
+ sessionId === log.sessionId &&
281
+ apiFormat === log.apiFormat &&
282
+ log.captureIncomplete !== undefined &&
283
+ log.droppedChunks !== undefined &&
284
+ log.droppedBytes !== undefined &&
285
+ log.captureIncompleteReason !== undefined
286
+ ) {
287
+ return log;
288
+ }
289
+ return {
290
+ ...log,
291
+ sessionId,
292
+ apiFormat,
293
+ captureIncomplete,
294
+ droppedChunks,
295
+ droppedBytes,
296
+ captureIncompleteReason,
297
+ };
238
298
  }
239
299
 
240
300
  function addToCache(log: CapturedLog): void {
@@ -249,19 +309,20 @@ function addToCache(log: CapturedLog): void {
249
309
  }
250
310
 
251
311
  function archiveLogSnapshot(log: CapturedLog): void {
252
- const archivedLog = normalizeLog(log);
253
- sessionArchiveQueue = sessionArchiveQueue
254
- .catch(() => undefined)
255
- .then(async () => {
256
- await archiveSessionLog(archivedLog);
257
- })
258
- .catch((err: unknown) => {
259
- logger.warn("[store] Failed to archive session log:", String(err));
260
- });
312
+ sessionArchiveBuffer.push(normalizeLog(log));
313
+ if (sessionArchiveBuffer.length >= SESSION_ARCHIVE_BATCH_SIZE) {
314
+ cancelSessionArchiveFlushTimer();
315
+ queueSessionArchiveFlush();
316
+ } else if (sessionArchiveBuffer.length === 1) {
317
+ scheduleSessionArchiveFlush();
318
+ }
261
319
  }
262
320
 
263
321
  export async function flushSessionArchiveWrites(): Promise<void> {
322
+ cancelSessionArchiveFlushTimer();
323
+ if (sessionArchiveBuffer.length > 0) queueSessionArchiveFlush();
264
324
  await sessionArchiveQueue;
325
+ if (sessionArchiveBuffer.length > 0) await flushSessionArchiveWrites();
265
326
  }
266
327
 
267
328
  function removeFromCache(id: number): void {
@@ -317,6 +378,10 @@ function compactLogFromIndexSummary(summary: LogIndexSummary): CapturedLog {
317
378
  rawRequestBodyBytes: summary.rawRequestBodyBytes,
318
379
  responseTextBytes: summary.responseTextBytes,
319
380
  bodyContentMode: "compact",
381
+ captureIncomplete: summary.captureIncomplete,
382
+ droppedChunks: summary.droppedChunks,
383
+ droppedBytes: summary.droppedBytes,
384
+ captureIncompleteReason: summary.captureIncompleteReason,
320
385
  warnings: summary.warnings,
321
386
  error: summary.error,
322
387
  });
@@ -441,6 +506,10 @@ export async function createLog(
441
506
  clientCwd: clientInfo?.cwd ?? null,
442
507
  clientProjectFolder: clientInfo?.projectFolder ?? null,
443
508
  streamingChunksPath: null,
509
+ captureIncomplete: false,
510
+ droppedChunks: 0,
511
+ droppedBytes: 0,
512
+ captureIncompleteReason: null,
444
513
  });
445
514
 
446
515
  // Write to disk and update index
@@ -466,6 +535,12 @@ export function finalizeLogUpdate(log: CapturedLog): void {
466
535
  emitLogUpdate(log);
467
536
  }
468
537
 
538
+ /** Persist the terminal cache/session state and refresh both JSON and SQLite index summaries. */
539
+ export async function persistFinalizedLogUpdate(log: CapturedLog): Promise<void> {
540
+ finalizeLogUpdate(log);
541
+ await updateLogIndexEntryMetadata(log);
542
+ }
543
+
469
544
  async function getArchivedLogByIdForStore(id: number): Promise<CapturedLog | null> {
470
545
  await flushSessionArchiveWrites();
471
546
  const archivedLog = await findArchivedLogById(id);
@@ -543,24 +618,31 @@ async function scanLogFileForId(filePath: string, id: number): Promise<CapturedL
543
618
  crlfDelay: Infinity,
544
619
  });
545
620
 
621
+ let lineNumber = 0;
546
622
  for await (const line of fileStream) {
623
+ lineNumber += 1;
547
624
  if (line.trim() === "") continue;
625
+ let parsed: unknown;
548
626
  try {
549
- const parsed: unknown = JSON.parse(line);
550
- if (typeof parsed === "object" && parsed !== null) {
551
- const desc = Object.getOwnPropertyDescriptor(parsed, "id");
552
- if (desc !== undefined && typeof desc.value === "number" && desc.value === id) {
553
- const result = CapturedLogSchema.safeParse(parsed);
554
- if (result.success) {
555
- lastMatch = normalizeLog(result.data);
556
- if (result.data.responseStatus !== null) {
557
- return lastMatch;
558
- }
559
- }
560
- }
627
+ parsed = JSON.parse(line);
628
+ } catch (error) {
629
+ return await Promise.reject(
630
+ new Error(
631
+ `Malformed JSONL record in ${filePath} at line ${String(lineNumber)}: ${String(error)}`,
632
+ ),
633
+ );
634
+ }
635
+ const result = CapturedLogSchema.safeParse(parsed);
636
+ if (!result.success) {
637
+ return await Promise.reject(
638
+ new Error(`Invalid captured-log record in ${filePath} at line ${String(lineNumber)}`),
639
+ );
640
+ }
641
+ if (result.data.id === id) {
642
+ lastMatch = normalizeLog(result.data);
643
+ if (result.data.responseStatus !== null) {
644
+ return lastMatch;
561
645
  }
562
- } catch {
563
- // Skip malformed lines
564
646
  }
565
647
  }
566
648
 
@@ -597,6 +679,13 @@ async function visitPersistedLogs(visitor: PersistedLogVisitor): Promise<void> {
597
679
  const logDir = resolveLogDir();
598
680
  if (!existsSync(logDir)) return;
599
681
 
682
+ const recovery = await recoverCapturedLogStorage(logDir);
683
+ if (recovery.level === "unavailable") {
684
+ return await Promise.reject(
685
+ new Error(recovery.diagnostic ?? "Captured-log recovery blocked persisted-log reads"),
686
+ );
687
+ }
688
+
600
689
  try {
601
690
  const entries = await readdirCallback(logDir);
602
691
  const files = entries.filter((file) => file.endsWith(".jsonl")).sort();
@@ -605,6 +694,9 @@ async function visitPersistedLogs(visitor: PersistedLogVisitor): Promise<void> {
605
694
  }
606
695
  } catch (err) {
607
696
  logger.error("[store] Failed to list persisted logs:", String(err));
697
+ return await Promise.reject(
698
+ err instanceof Error ? err : new Error(`Failed to list persisted logs: ${String(err)}`),
699
+ );
608
700
  }
609
701
  }
610
702
 
@@ -620,21 +712,36 @@ async function visitPersistedLogFile(
620
712
  crlfDelay: Infinity,
621
713
  });
622
714
 
715
+ let lineNumber = 0;
623
716
  for await (const line of fileStream) {
717
+ lineNumber += 1;
624
718
  if (line.trim() === "") continue;
719
+ let parsed: unknown;
625
720
  try {
626
- const parsed: unknown = JSON.parse(line);
627
- const result = CapturedLogSchema.safeParse(parsed);
628
- if (result.success) {
629
- const log = normalizeLog(result.data);
630
- visitor(log);
631
- }
632
- } catch {
633
- // Skip malformed lines.
721
+ parsed = JSON.parse(line);
722
+ } catch (error) {
723
+ return await Promise.reject(
724
+ new Error(
725
+ `Malformed JSONL record in ${filePath} at line ${String(lineNumber)}: ${String(error)}`,
726
+ ),
727
+ );
634
728
  }
729
+ const result = CapturedLogSchema.safeParse(parsed);
730
+ if (!result.success) {
731
+ return await Promise.reject(
732
+ new Error(`Invalid captured-log record in ${filePath} at line ${String(lineNumber)}`),
733
+ );
734
+ }
735
+ const log = normalizeLog(result.data);
736
+ visitor(log);
635
737
  }
636
738
  } catch (err) {
637
739
  logger.error("[store] Failed to read persisted log file:", filePath, String(err));
740
+ return await Promise.reject(
741
+ err instanceof Error
742
+ ? err
743
+ : new Error(`Failed to read persisted log file ${filePath}: ${String(err)}`),
744
+ );
638
745
  }
639
746
  }
640
747
 
@@ -0,0 +1,106 @@
1
+ import { Buffer } from "node:buffer";
2
+ import { readFile } from "node:fs/promises";
3
+ import { extname, relative, resolve, sep } from "node:path";
4
+
5
+ const CONTENT_TYPES: Readonly<Record<string, string>> = {
6
+ ".css": "text/css; charset=utf-8",
7
+ ".html": "text/html; charset=utf-8",
8
+ ".ico": "image/x-icon",
9
+ ".jpeg": "image/jpeg",
10
+ ".jpg": "image/jpeg",
11
+ ".js": "text/javascript; charset=utf-8",
12
+ ".json": "application/json; charset=utf-8",
13
+ ".map": "application/json; charset=utf-8",
14
+ ".png": "image/png",
15
+ ".svg": "image/svg+xml",
16
+ ".webp": "image/webp",
17
+ ".woff": "font/woff",
18
+ ".woff2": "font/woff2",
19
+ };
20
+
21
+ export type UiAsset = {
22
+ body: Buffer;
23
+ cacheControl: string;
24
+ contentType: string;
25
+ document: boolean;
26
+ };
27
+
28
+ function safeDecodedPath(pathname: string): string | null {
29
+ let decoded: string;
30
+ try {
31
+ decoded = decodeURIComponent(pathname);
32
+ } catch {
33
+ return null;
34
+ }
35
+ if (decoded.includes("\\") || decoded.includes("\0")) return null;
36
+ if (decoded.split("/").some((segment) => segment === "." || segment === "..")) return null;
37
+ return decoded;
38
+ }
39
+
40
+ function isInsideDirectory(path: string, directory: string): boolean {
41
+ const child = relative(directory, path);
42
+ return child === "" || (!child.startsWith("..") && !child.startsWith(sep));
43
+ }
44
+
45
+ function assetPath(uiDirectory: string, pathname: string): string | null {
46
+ const decoded = safeDecodedPath(pathname);
47
+ if (decoded === null) return null;
48
+ const target = resolve(uiDirectory, `.${decoded}`);
49
+ return isInsideDirectory(target, resolve(uiDirectory)) ? target : null;
50
+ }
51
+
52
+ async function readAsset(path: string): Promise<Buffer | null> {
53
+ try {
54
+ return await readFile(path);
55
+ } catch {
56
+ return null;
57
+ }
58
+ }
59
+
60
+ function contentTypeFor(path: string): string {
61
+ return CONTENT_TYPES[extname(path).toLowerCase()] ?? "application/octet-stream";
62
+ }
63
+
64
+ function isBackendNamespace(pathname: string): boolean {
65
+ return (
66
+ pathname === "/api" ||
67
+ pathname.startsWith("/api/") ||
68
+ pathname === "/proxy" ||
69
+ pathname.startsWith("/proxy/") ||
70
+ pathname === "/livez" ||
71
+ pathname === "/readyz"
72
+ );
73
+ }
74
+
75
+ function shouldUseDocumentFallback(pathname: string): boolean {
76
+ if (pathname === "/" || pathname.length === 0) return true;
77
+ const lastSegment = pathname.split("/").at(-1) ?? "";
78
+ return !lastSegment.includes(".");
79
+ }
80
+
81
+ export async function loadUiAsset(uiDirectory: string, pathname: string): Promise<UiAsset | null> {
82
+ if (isBackendNamespace(pathname)) return null;
83
+ const requestedPath = assetPath(uiDirectory, pathname);
84
+ if (requestedPath === null) return null;
85
+ const requestedBody = await readAsset(requestedPath);
86
+ if (requestedBody !== null) {
87
+ return {
88
+ body: requestedBody,
89
+ cacheControl: pathname.startsWith("/assets/")
90
+ ? "public, max-age=31536000, immutable"
91
+ : "no-cache",
92
+ contentType: contentTypeFor(requestedPath),
93
+ document: extname(requestedPath).toLowerCase() === ".html",
94
+ };
95
+ }
96
+ if (!shouldUseDocumentFallback(pathname)) return null;
97
+ const indexPath = resolve(uiDirectory, "index.html");
98
+ const indexBody = await readAsset(indexPath);
99
+ if (indexBody === null) return null;
100
+ return {
101
+ body: indexBody,
102
+ cacheControl: "no-store",
103
+ contentType: CONTENT_TYPES[".html"] ?? "text/html; charset=utf-8",
104
+ document: true,
105
+ };
106
+ }
@@ -55,8 +55,9 @@ export function selectUpstreamBase(route: ApiRoute, provider: ProviderConfig | n
55
55
  if (formatSpecificUrl !== undefined && formatSpecificUrl !== "") {
56
56
  return formatSpecificUrl;
57
57
  }
58
- if (provider.baseUrl !== undefined && provider.baseUrl !== "") {
59
- return provider.baseUrl;
58
+ const legacyBaseUrl = selectLegacyBaseUrl(route, provider);
59
+ if (legacyBaseUrl !== undefined) {
60
+ return legacyBaseUrl;
60
61
  }
61
62
 
62
63
  // Legacy records may only contain format. Keep this fallback for compatibility,
@@ -68,6 +69,22 @@ function nonEmptyUrl(value: string | undefined): string | undefined {
68
69
  return value !== undefined && value !== "" ? value : undefined;
69
70
  }
70
71
 
72
+ function hasFormatSpecificUrlFields(provider: ProviderConfig): boolean {
73
+ return (
74
+ provider.anthropicBaseUrl !== undefined ||
75
+ provider.openaiBaseUrl !== undefined ||
76
+ provider.openaiResponsesBaseUrl !== undefined
77
+ );
78
+ }
79
+
80
+ function selectLegacyBaseUrl(route: ApiRoute, provider: ProviderConfig): string | undefined {
81
+ if (hasFormatSpecificUrlFields(provider)) return undefined;
82
+ const baseUrl = nonEmptyUrl(provider.baseUrl);
83
+ if (baseUrl === undefined) return undefined;
84
+ if (route.isOpenAI) return provider.format === "openai" ? baseUrl : undefined;
85
+ return provider.format === "anthropic" ? baseUrl : undefined;
86
+ }
87
+
71
88
  function selectFormatSpecificUrl(route: ApiRoute, provider: ProviderConfig): string | undefined {
72
89
  if (!route.isOpenAI) return provider.anthropicBaseUrl;
73
90
  if (route.isResponses) {
@@ -76,6 +93,16 @@ function selectFormatSpecificUrl(route: ApiRoute, provider: ProviderConfig): str
76
93
  return provider.openaiBaseUrl;
77
94
  }
78
95
 
96
+ /**
97
+ * Whether a model-matched Provider explicitly supports the protocol selected by the request path.
98
+ * Empty current-schema fields are deliberate opt-outs. Only a legacy record with no protocol URL
99
+ * fields may use baseUrl, and then only for the protocol declared by provider.format.
100
+ */
101
+ export function providerSupportsApiRoute(route: ApiRoute, provider: ProviderConfig): boolean {
102
+ if (nonEmptyUrl(selectFormatSpecificUrl(route, provider)) !== undefined) return true;
103
+ return selectLegacyBaseUrl(route, provider) !== undefined;
104
+ }
105
+
79
106
  export function setUpstreamHost(headers: Headers, upstreamBase: string): void {
80
107
  try {
81
108
  headers.set(HEADER_HOST, new URL(upstreamBase).host);
@@ -0,0 +1,167 @@
1
+ import { AGENT_INSPECTOR_BASE_PATH_META_NAME } from "../lib/basePath";
2
+ import { THEME_MODE_STORAGE_KEY } from "../lib/themeMode";
3
+ import {
4
+ UI_SCALE_AUTO_LARGE_WIDTH,
5
+ UI_SCALE_AUTO_MAX_DPR,
6
+ UI_SCALE_AUTO_MEDIUM_WIDTH,
7
+ UI_SCALE_MINIMUM_COMPACT_FONT_SIZE,
8
+ UI_SCALE_STORAGE_KEY,
9
+ } from "../lib/uiScale";
10
+
11
+ export const UI_BASE_PATH_BOOTSTRAP_PLACEHOLDER = "__AGENT_INSPECTOR_BASE_PATH_BOOTSTRAP__";
12
+ export const UI_BASE_PATH_META_PLACEHOLDER = "__AGENT_INSPECTOR_BASE_PATH__";
13
+ export const UI_RUNTIME_CSP_BOOTSTRAP_PLACEHOLDER = "__AGENT_INSPECTOR_RUNTIME_CSP_BOOTSTRAP__";
14
+ export const UI_THEME_BOOTSTRAP_PLACEHOLDER = "__AGENT_INSPECTOR_THEME_BOOTSTRAP__";
15
+ export const UI_SCALE_BOOTSTRAP_PLACEHOLDER = "__AGENT_INSPECTOR_UI_SCALE_BOOTSTRAP__";
16
+
17
+ export const basePathBootstrapScript = `
18
+ (function () {
19
+ var placeholder = "__AGENT_INSPECTOR_" + "BASE_PATH__";
20
+ var meta = document.querySelector('meta[name="${AGENT_INSPECTOR_BASE_PATH_META_NAME}"]');
21
+ var base = document.querySelector("base");
22
+
23
+ function normalize(value) {
24
+ var trimmed = typeof value === "string" ? value.trim() : "";
25
+ if (trimmed === "" || trimmed === "/") return "";
26
+ return "/" + trimmed.replace(/^\\/+|\\/+$/g, "");
27
+ }
28
+
29
+ function inferFromKnownUiRoute() {
30
+ var pathname = window.location.pathname;
31
+ var sessionMarker = "/session/";
32
+ var sessionIndex = pathname.indexOf(sessionMarker);
33
+ if (sessionIndex >= 0) return normalize(pathname.slice(0, sessionIndex));
34
+ return normalize(pathname.replace(/\\/index\\.html$/, ""));
35
+ }
36
+
37
+ function runtimeBasePath() {
38
+ var runtime = window.__AGENT_INSPECTOR_RUNTIME__;
39
+ if (
40
+ runtime !== null &&
41
+ typeof runtime === "object" &&
42
+ runtime.ui !== null &&
43
+ typeof runtime.ui === "object" &&
44
+ typeof runtime.ui.basePath === "string"
45
+ ) {
46
+ return runtime.ui.basePath;
47
+ }
48
+ return null;
49
+ }
50
+
51
+ var configured = meta === null ? placeholder : meta.getAttribute("content");
52
+ var runtimePath = runtimeBasePath();
53
+ var basePath = configured !== null && configured !== placeholder
54
+ ? normalize(configured)
55
+ : runtimePath === null
56
+ ? inferFromKnownUiRoute()
57
+ : normalize(runtimePath);
58
+ var baseHref = basePath === "" ? "/" : basePath + "/";
59
+
60
+ if (meta !== null) meta.setAttribute("content", basePath === "" ? "/" : basePath);
61
+ if (base !== null) base.setAttribute("href", baseHref);
62
+ })();
63
+ `;
64
+
65
+ export const runtimeCspBootstrapScript = `
66
+ (function () {
67
+ var runtime = window.__AGENT_INSPECTOR_RUNTIME__;
68
+ var controlBaseUrl = runtime !== null && typeof runtime === "object" &&
69
+ runtime.control !== null && typeof runtime.control === "object" &&
70
+ typeof runtime.control.baseUrl === "string"
71
+ ? runtime.control.baseUrl
72
+ : null;
73
+ var controlOrigin = null;
74
+ if (controlBaseUrl !== null) {
75
+ try {
76
+ var parsed = new URL(controlBaseUrl);
77
+ if (parsed.protocol === "http:" || parsed.protocol === "https:") {
78
+ controlOrigin = parsed.origin;
79
+ }
80
+ } catch (error) {}
81
+ }
82
+ var uiOrigin = new URL(document.baseURI).origin;
83
+ var connectSources = controlOrigin === null || controlOrigin === uiOrigin
84
+ ? "'self'"
85
+ : "'self' " + controlOrigin;
86
+ var policy = [
87
+ "default-src 'self'",
88
+ "base-uri 'self'",
89
+ "connect-src " + connectSources,
90
+ "font-src 'self' data:",
91
+ "form-action 'self'",
92
+ "img-src 'self' data: blob:",
93
+ "object-src 'none'",
94
+ "script-src 'self' 'unsafe-inline'",
95
+ "style-src 'self' 'unsafe-inline'",
96
+ "worker-src 'self' blob:"
97
+ ].join("; ");
98
+ var meta = document.querySelector('meta[http-equiv="Content-Security-Policy"]');
99
+ if (meta === null) {
100
+ meta = document.createElement("meta");
101
+ meta.setAttribute("http-equiv", "Content-Security-Policy");
102
+ document.head.appendChild(meta);
103
+ }
104
+ meta.setAttribute("content", policy);
105
+ })();
106
+ `;
107
+
108
+ export const themeModeBootstrapScript = `
109
+ (function () {
110
+ try {
111
+ var storedThemeMode = window.localStorage.getItem("${THEME_MODE_STORAGE_KEY}");
112
+ var themeMode = storedThemeMode === "light" || storedThemeMode === "eye-care"
113
+ ? storedThemeMode
114
+ : "dark";
115
+ document.documentElement.dataset.theme = themeMode;
116
+ } catch (error) {
117
+ document.documentElement.dataset.theme = "dark";
118
+ }
119
+ })();
120
+ `;
121
+
122
+ export const uiScaleBootstrapScript = `
123
+ (function () {
124
+ try {
125
+ var storedUiScale = window.localStorage.getItem("${UI_SCALE_STORAGE_KEY}");
126
+ var uiScalePreference = storedUiScale === "100" || storedUiScale === "125" || storedUiScale === "150"
127
+ ? storedUiScale
128
+ : "auto";
129
+ var resolvedUiScale = 1;
130
+ if (uiScalePreference === "125") resolvedUiScale = 1.25;
131
+ if (uiScalePreference === "150") resolvedUiScale = 1.5;
132
+ if (uiScalePreference === "auto") {
133
+ var viewportWidth = Number.isFinite(window.innerWidth) && window.innerWidth > 0
134
+ ? window.innerWidth
135
+ : 1280;
136
+ var rawScreenWidth = typeof window.screen === "undefined"
137
+ ? viewportWidth
138
+ : window.screen.availWidth;
139
+ var screenWidth = Number.isFinite(rawScreenWidth) && rawScreenWidth > 0
140
+ ? rawScreenWidth
141
+ : viewportWidth;
142
+ var rawDevicePixelRatio = window.devicePixelRatio;
143
+ var devicePixelRatio = Number.isFinite(rawDevicePixelRatio) && rawDevicePixelRatio > 0
144
+ ? rawDevicePixelRatio
145
+ : 1;
146
+ var availableWidth = Math.min(viewportWidth, screenWidth);
147
+ if (devicePixelRatio <= ${String(UI_SCALE_AUTO_MAX_DPR)} && availableWidth >= ${String(UI_SCALE_AUTO_LARGE_WIDTH)}) {
148
+ resolvedUiScale = 1.25;
149
+ } else if (devicePixelRatio <= ${String(UI_SCALE_AUTO_MAX_DPR)} && availableWidth >= ${String(UI_SCALE_AUTO_MEDIUM_WIDTH)}) {
150
+ resolvedUiScale = 1.125;
151
+ }
152
+ }
153
+ var root = document.documentElement;
154
+ root.dataset.uiScale = uiScalePreference;
155
+ root.dataset.uiScaleResolved = String(Math.round(resolvedUiScale * 100));
156
+ root.style.setProperty("--inspector-ui-scale", String(resolvedUiScale));
157
+ root.style.setProperty("--inspector-root-font-size", String(16 * resolvedUiScale) + "px");
158
+ root.style.setProperty("--inspector-font-9", String(Math.max(${String(UI_SCALE_MINIMUM_COMPACT_FONT_SIZE)}, 9 * resolvedUiScale)) + "px");
159
+ root.style.setProperty("--inspector-font-10", String(Math.max(${String(UI_SCALE_MINIMUM_COMPACT_FONT_SIZE)}, 10 * resolvedUiScale)) + "px");
160
+ root.style.setProperty("--inspector-font-11", String(Math.max(${String(UI_SCALE_MINIMUM_COMPACT_FONT_SIZE)}, 11 * resolvedUiScale)) + "px");
161
+ root.style.setProperty("--inspector-font-13", String(13 * resolvedUiScale) + "px");
162
+ } catch (error) {
163
+ document.documentElement.dataset.uiScale = "auto";
164
+ document.documentElement.dataset.uiScaleResolved = "100";
165
+ }
166
+ })();
167
+ `;
@@ -0,0 +1,38 @@
1
+ <!doctype html>
2
+ <html lang="en" data-theme="dark">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <meta name="agent-inspector-base-path" content="__AGENT_INSPECTOR_BASE_PATH__" />
7
+ <base href="/" />
8
+ <script>
9
+ __AGENT_INSPECTOR_BASE_PATH_BOOTSTRAP__
10
+ </script>
11
+ <script vite-ignore src="./runtime-config.js"></script>
12
+ <script>
13
+ try {
14
+ window.__AGENT_INSPECTOR_RUNTIME__ = __AGENT_INSPECTOR_RUNTIME_JSON__;
15
+ } catch (error) {
16
+ window.__AGENT_INSPECTOR_RUNTIME__ = window.__AGENT_INSPECTOR_RUNTIME_CONFIG__ || {};
17
+ }
18
+ </script>
19
+ <script>
20
+ __AGENT_INSPECTOR_RUNTIME_CSP_BOOTSTRAP__
21
+ </script>
22
+ <script>
23
+ __AGENT_INSPECTOR_BASE_PATH_BOOTSTRAP__
24
+ </script>
25
+ <script>
26
+ __AGENT_INSPECTOR_THEME_BOOTSTRAP__
27
+ </script>
28
+ <script>
29
+ __AGENT_INSPECTOR_UI_SCALE_BOOTSTRAP__
30
+ </script>
31
+ <link rel="icon" type="image/svg+xml" href="../assets/favicon.svg" />
32
+ <title>Agent Inspector</title>
33
+ </head>
34
+ <body>
35
+ <div id="root"><p role="status">Connecting to Agent Inspector…</p></div>
36
+ <script type="module" src="./main.tsx"></script>
37
+ </body>
38
+ </html>
@@ -0,0 +1,20 @@
1
+ import {
2
+ buildControlRuntimeUrl,
3
+ resolveBrowserRuntimeForDocument,
4
+ } from "../lib/browserRuntimeResolver";
5
+
6
+ export function buildLogsStreamUrl(sessionId: string | undefined): string | null {
7
+ const params = new URLSearchParams({ compact: "1" });
8
+ if (sessionId !== undefined) {
9
+ params.set("sessionId", sessionId);
10
+ }
11
+ const runtime = resolveBrowserRuntimeForDocument();
12
+ if (!runtime.ok) return null;
13
+ return buildControlRuntimeUrl(runtime.runtime, `/api/logs/stream?${params.toString()}`);
14
+ }
15
+
16
+ export function openLogsEventSource(sessionId: string | undefined): EventSource | null {
17
+ const url = buildLogsStreamUrl(sessionId);
18
+ if (url === null) return null;
19
+ return new EventSource(url);
20
+ }
@@ -0,0 +1,13 @@
1
+ import { RouterProvider } from "@tanstack/react-router";
2
+ import { createRoot } from "react-dom/client";
3
+ import "../index.css";
4
+ import { router } from "./router";
5
+ import { validateBrowserRuntimeForStartup } from "./runtimeDiscovery";
6
+
7
+ const rootElement = document.getElementById("root");
8
+
9
+ if (rootElement !== null) {
10
+ createRoot(rootElement).render(<RouterProvider router={router} />);
11
+ }
12
+
13
+ void validateBrowserRuntimeForStartup();
@@ -0,0 +1,2 @@
1
+ /* global window */
2
+ window.__AGENT_INSPECTOR_RUNTIME_CONFIG__ = window.__AGENT_INSPECTOR_RUNTIME_CONFIG__ || {};