@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
@@ -500,15 +500,6 @@ export function withRegistryLock<T>(
500
500
  return runWithLock(acquireRegistryLock(root, options), operation);
501
501
  }
502
502
 
503
- export function withInstanceLock<T>(
504
- root: string,
505
- rawName: string,
506
- operation: LockedOperation<T>,
507
- options: InstanceLockOptions = {},
508
- ): Promise<InstanceRegistryResult<T>> {
509
- return runWithLock(acquireInstanceLock(root, rawName, options), operation);
510
- }
511
-
512
503
  type PathApi = typeof win32;
513
504
 
514
505
  export type CanonicalDataDirectory = {
@@ -1,4 +1,5 @@
1
1
  import { networkInterfaces } from "node:os";
2
+ import { isIP } from "node:net";
2
3
  import { appendBasePathToOrigin, normalizeBasePath } from "../lib/basePath";
3
4
 
4
5
  export type NetworkInterfaceMap = ReturnType<typeof networkInterfaces>;
@@ -22,12 +23,12 @@ export function isWildcardHost(host: BindHost): boolean {
22
23
  export function isLoopbackHost(host: BindHost): boolean {
23
24
  const trimmed = trimHost(host);
24
25
  if (trimmed === undefined) return false;
25
- return (
26
- trimmed === "localhost" ||
27
- trimmed === "::1" ||
28
- trimmed === "[::1]" ||
29
- trimmed.startsWith("127.")
30
- );
26
+ const normalized =
27
+ trimmed.startsWith("[") && trimmed.endsWith("]")
28
+ ? trimmed.slice(1, -1).toLowerCase()
29
+ : trimmed.toLowerCase();
30
+ if (normalized === "localhost" || normalized === "::1") return true;
31
+ return isIP(normalized) === 4 && normalized.split(".", 1)[0] === "127";
31
32
  }
32
33
 
33
34
  function bracketIpv6(host: string): string {
@@ -112,11 +113,28 @@ function accessUrl(origin: string, path: string, basePath: string): string {
112
113
  return appendBasePathToOrigin(origin, path, basePath);
113
114
  }
114
115
 
116
+ function appendSurfaceLines(
117
+ lines: string[],
118
+ label: "Local" | "Bound" | "Network",
119
+ origin: string,
120
+ basePath: string,
121
+ uiEnabled: boolean,
122
+ ): void {
123
+ const baseUrl = accessUrl(origin, "/", basePath);
124
+ if (uiEnabled) lines.push(` ${label} UI: ${baseUrl}`);
125
+ lines.push(` ${label} control Base: ${baseUrl}`);
126
+ lines.push(` ${label} agent Base: ${baseUrl}`);
127
+ lines.push(` ${label} REST API: ${accessUrl(origin, "/api", basePath)}`);
128
+ lines.push(` ${label} proxy: ${accessUrl(origin, "/proxy", basePath)}`);
129
+ lines.push(` ${label} MCP: ${accessUrl(origin, "/api/mcp", basePath)}`);
130
+ }
131
+
115
132
  export function formatAccessHintLines(
116
133
  port: number,
117
134
  networkUrls: readonly string[],
118
135
  host: BindHost = undefined,
119
136
  basePath = "",
137
+ uiEnabled = true,
120
138
  ): string[] {
121
139
  const normalizedBasePath = normalizeBasePath(basePath);
122
140
  const localUrl = localUrlForPort(port);
@@ -124,14 +142,10 @@ export function formatAccessHintLines(
124
142
  const lines = ["Access URLs:", ` Bind host: ${hostLabel}`];
125
143
 
126
144
  if (isLoopbackHost(host) || isWildcardHost(host)) {
127
- lines.push(` Local UI: ${accessUrl(localUrl, "/", normalizedBasePath)}`);
128
- lines.push(` Local proxy: ${accessUrl(localUrl, "/proxy", normalizedBasePath)}`);
129
- lines.push(` Local MCP: ${accessUrl(localUrl, "/api/mcp", normalizedBasePath)}`);
145
+ appendSurfaceLines(lines, "Local", localUrl, normalizedBasePath, uiEnabled);
130
146
  } else {
131
147
  const boundUrl = urlForHost(port, host);
132
- lines.push(` Bound UI: ${accessUrl(boundUrl, "/", normalizedBasePath)}`);
133
- lines.push(` Bound proxy: ${accessUrl(boundUrl, "/proxy", normalizedBasePath)}`);
134
- lines.push(` Bound MCP: ${accessUrl(boundUrl, "/api/mcp", normalizedBasePath)}`);
148
+ appendSurfaceLines(lines, "Bound", boundUrl, normalizedBasePath, uiEnabled);
135
149
  lines.push(" Localhost: may not work because the server is bound to a specific host");
136
150
  }
137
151
 
@@ -141,8 +155,7 @@ export function formatAccessHintLines(
141
155
  } else if (firstNetworkUrl === undefined) {
142
156
  lines.push(" Network: no non-loopback IPv4 address detected");
143
157
  } else {
144
- lines.push(` Network UI: ${accessUrl(firstNetworkUrl, "/", normalizedBasePath)}`);
145
- lines.push(` Network proxy: ${accessUrl(firstNetworkUrl, "/proxy", normalizedBasePath)}`);
158
+ appendSurfaceLines(lines, "Network", firstNetworkUrl, normalizedBasePath, uiEnabled);
146
159
  const moreUrls = networkUrls.slice(1);
147
160
  if (moreUrls.length > 0) {
148
161
  lines.push(` Other IPs: ${moreUrls.join(", ")}`);
@@ -78,6 +78,9 @@ export type OnboardFlags = {
78
78
  mimoMcpUrl: string | null;
79
79
  instanceName: string | null;
80
80
  baseUrl: string | null;
81
+ controlBaseUrl: string | null;
82
+ agentBaseUrl: string | null;
83
+ uiUrl: string | null | undefined;
81
84
  mcpName: string | null;
82
85
  uninstall: boolean;
83
86
  status: boolean;
@@ -212,6 +215,9 @@ function parseFlags(argv: readonly string[]): OnboardFlags {
212
215
  mimoMcpUrl: null,
213
216
  instanceName: null,
214
217
  baseUrl: null,
218
+ controlBaseUrl: null,
219
+ agentBaseUrl: null,
220
+ uiUrl: undefined,
215
221
  mcpName: null,
216
222
  uninstall: false,
217
223
  status: false,
@@ -360,6 +366,39 @@ function parseFlags(argv: readonly string[]): OnboardFlags {
360
366
  i++;
361
367
  break;
362
368
  }
369
+ case "--control-base-url": {
370
+ const next = argv[i + 1];
371
+ if (next === undefined || next.trim().length === 0) {
372
+ process.stderr.write("agent-inspector onboard: --control-base-url requires a URL\n");
373
+ process.exit(2);
374
+ }
375
+ flags.controlBaseUrl = next;
376
+ i++;
377
+ break;
378
+ }
379
+ case "--agent-base-url": {
380
+ const next = argv[i + 1];
381
+ if (next === undefined || next.trim().length === 0) {
382
+ process.stderr.write("agent-inspector onboard: --agent-base-url requires a URL\n");
383
+ process.exit(2);
384
+ }
385
+ flags.agentBaseUrl = next;
386
+ i++;
387
+ break;
388
+ }
389
+ case "--ui-url": {
390
+ const next = argv[i + 1];
391
+ if (next === undefined || next.trim().length === 0) {
392
+ process.stderr.write("agent-inspector onboard: --ui-url requires a URL\n");
393
+ process.exit(2);
394
+ }
395
+ flags.uiUrl = next;
396
+ i++;
397
+ break;
398
+ }
399
+ case "--no-ui":
400
+ flags.uiUrl = null;
401
+ break;
363
402
  case "--mcp-name": {
364
403
  const next = argv[i + 1];
365
404
  if (next === undefined || next.trim().length === 0) {
@@ -440,7 +479,11 @@ Options:
440
479
  MiMo Code MCP transport to write (default: local)
441
480
  --mimo-mcp-url <url> Agent Inspector MCP endpoint for MiMo Code
442
481
  --instance <name> Target a registered named Inspector instance
443
- --base-url <url> Target an explicit credential-free Inspector Base URL
482
+ --base-url <url> Target an explicit credential-free backend control/agent Base URL
483
+ --control-base-url <url> Control API Base URL for a separated deployment
484
+ --agent-base-url <url> Proxy and MCP Base URL for Coding Agents
485
+ --ui-url <url> Browser UI URL for a separated deployment
486
+ --no-ui Declare that the explicit target has no browser UI
444
487
  --mcp-name <name> MCP config key (named default: agent-inspector-<instance>)
445
488
  --uninstall Remove generated files whose version matches this package
446
489
  --status Show installed onboarding file versions and suggested action
@@ -533,7 +576,22 @@ function onboardSelectionArguments(flags: OnboardFlags, target: OnboardTarget):
533
576
  if (target.kind === "instance" && target.instanceName !== null) {
534
577
  args.push("--instance", target.instanceName);
535
578
  } else if (target.kind === "base-url") {
536
- args.push("--base-url", target.baseUrl);
579
+ const usedSharedBaseUrl =
580
+ flags.baseUrl !== null &&
581
+ flags.controlBaseUrl === null &&
582
+ flags.agentBaseUrl === null &&
583
+ flags.uiUrl === undefined;
584
+ if (usedSharedBaseUrl) {
585
+ args.push("--base-url", target.baseUrl);
586
+ } else {
587
+ args.push("--control-base-url", target.controlBaseUrl);
588
+ args.push("--agent-base-url", target.agentBaseUrl);
589
+ if (target.uiUrl === null) {
590
+ args.push("--no-ui");
591
+ } else {
592
+ args.push("--ui-url", target.uiUrl);
593
+ }
594
+ }
537
595
  }
538
596
  if (flags.mcpName !== null) args.push("--mcp-name", target.mcpName);
539
597
  return args.length === 0 ? "" : ` ${args.join(" ")}`;
@@ -1202,6 +1260,9 @@ function buildPlannedFiles(
1202
1260
  version,
1203
1261
  port: onboardTarget.port,
1204
1262
  baseUrl: onboardTarget.baseUrl,
1263
+ controlBaseUrl: onboardTarget.controlBaseUrl,
1264
+ agentBaseUrl: onboardTarget.agentBaseUrl,
1265
+ uiUrl: onboardTarget.uiUrl,
1205
1266
  mcpName: onboardTarget.mcpName,
1206
1267
  targetKind: onboardTarget.kind,
1207
1268
  instanceName: onboardTarget.instanceName,
@@ -1215,6 +1276,9 @@ function buildPlannedFiles(
1215
1276
  version,
1216
1277
  port: onboardTarget.port,
1217
1278
  baseUrl: onboardTarget.baseUrl,
1279
+ controlBaseUrl: onboardTarget.controlBaseUrl,
1280
+ agentBaseUrl: onboardTarget.agentBaseUrl,
1281
+ uiUrl: onboardTarget.uiUrl,
1218
1282
  mcpName: onboardTarget.mcpName,
1219
1283
  targetKind: onboardTarget.kind,
1220
1284
  instanceName: onboardTarget.instanceName,
@@ -1449,6 +1513,9 @@ function runOnboardSync(argv: readonly string[]): number {
1449
1513
  const resolvedTarget = resolveOnboardTarget({
1450
1514
  instanceName: flags.instanceName,
1451
1515
  baseUrl: flags.baseUrl,
1516
+ controlBaseUrl: flags.controlBaseUrl,
1517
+ agentBaseUrl: flags.agentBaseUrl,
1518
+ uiUrl: flags.uiUrl,
1452
1519
  mcpName: flags.mcpName,
1453
1520
  });
1454
1521
  if (!resolvedTarget.ok) {
@@ -1,9 +1,11 @@
1
1
  import { appendBasePathToOrigin, getConfiguredBasePath } from "../lib/basePath.js";
2
+ import { normalizeBrowserRuntimeBaseUrl } from "../lib/browserRuntimeContract.js";
2
3
  import { getInstancesRoot, readInstanceRecord, validateInstanceName } from "./instanceRegistry.js";
3
4
  import { urlForHost } from "./networkHints.js";
4
5
 
5
6
  const DEFAULT_PORT = 9527;
6
7
  const DEFAULT_ORIGIN = `http://localhost:${String(DEFAULT_PORT)}`;
8
+ const AGENT_INSPECTOR_PUBLIC_ORIGIN_ENV = "AGENT_INSPECTOR_PUBLIC_ORIGIN";
7
9
  const MCP_NAME_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/u;
8
10
 
9
11
  type OnboardTargetEnv = Readonly<Record<string, string | undefined>>;
@@ -15,6 +17,10 @@ export type OnboardTarget = {
15
17
  instanceName: string | null;
16
18
  mcpName: string;
17
19
  port: number;
20
+ uiUrl: string | null;
21
+ controlBaseUrl: string;
22
+ agentBaseUrl: string;
23
+ /** @deprecated Compatibility alias for controlBaseUrl. */
18
24
  baseUrl: string;
19
25
  apiUrl: string;
20
26
  healthUrl: string;
@@ -26,6 +32,9 @@ export type OnboardTarget = {
26
32
  export type OnboardTargetOptions = {
27
33
  instanceName: string | null;
28
34
  baseUrl: string | null;
35
+ controlBaseUrl?: string | null;
36
+ agentBaseUrl?: string | null;
37
+ uiUrl?: string | null;
29
38
  mcpName: string | null;
30
39
  };
31
40
 
@@ -33,24 +42,29 @@ export type OnboardTargetResult =
33
42
  | { ok: true; target: OnboardTarget }
34
43
  | { ok: false; message: string };
35
44
 
36
- function targetFromBase(
45
+ function targetFromSurfaces(
37
46
  kind: OnboardTargetKind,
38
47
  instanceName: string | null,
39
48
  mcpName: string,
40
49
  port: number,
41
- baseUrl: string,
50
+ controlBaseUrl: string,
51
+ agentBaseUrl: string,
52
+ uiUrl: string | null,
42
53
  ): OnboardTarget {
43
54
  return {
44
55
  kind,
45
56
  instanceName,
46
57
  mcpName,
47
58
  port,
48
- baseUrl,
49
- apiUrl: `${baseUrl}/api`,
50
- healthUrl: `${baseUrl}/api/health`,
51
- anthropicProxyUrl: `${baseUrl}/proxy`,
52
- openAiProxyUrl: `${baseUrl}/proxy/v1`,
53
- mcpUrl: `${baseUrl}/api/mcp`,
59
+ uiUrl,
60
+ controlBaseUrl,
61
+ agentBaseUrl,
62
+ baseUrl: controlBaseUrl,
63
+ apiUrl: `${controlBaseUrl}/api`,
64
+ healthUrl: `${controlBaseUrl}/api/health`,
65
+ anthropicProxyUrl: `${agentBaseUrl}/proxy`,
66
+ openAiProxyUrl: `${agentBaseUrl}/proxy/v1`,
67
+ mcpUrl: `${agentBaseUrl}/api/mcp`,
54
68
  };
55
69
  }
56
70
 
@@ -60,31 +74,33 @@ function validateMcpName(rawName: string): string | null {
60
74
  }
61
75
 
62
76
  function normalizeExplicitBaseUrl(rawBaseUrl: string): { baseUrl: string; port: number } | null {
63
- const candidate = rawBaseUrl.trim();
64
- if (
65
- candidate.length === 0 ||
66
- candidate !== rawBaseUrl ||
67
- candidate.includes("?") ||
68
- candidate.includes("#")
69
- ) {
77
+ const baseUrl = normalizeBrowserRuntimeBaseUrl(rawBaseUrl);
78
+ if (baseUrl === null) return null;
79
+ try {
80
+ const parsed = new URL(baseUrl);
81
+ const defaultPort = parsed.protocol === "https:" ? 443 : 80;
82
+ const port = parsed.port === "" ? defaultPort : Number(parsed.port);
83
+ return Number.isInteger(port) && port >= 1 && port <= 65_535 ? { baseUrl, port } : null;
84
+ } catch {
70
85
  return null;
71
86
  }
87
+ }
72
88
 
89
+ function normalizePublicOrigin(rawOrigin: string): string | null {
90
+ if (rawOrigin.trim() !== rawOrigin) return null;
73
91
  try {
74
- const parsed = new URL(candidate);
92
+ const parsed = new URL(rawOrigin);
75
93
  if (
76
94
  (parsed.protocol !== "http:" && parsed.protocol !== "https:") ||
77
- parsed.hostname.length === 0 ||
78
95
  parsed.username.length > 0 ||
79
- parsed.password.length > 0
96
+ parsed.password.length > 0 ||
97
+ parsed.pathname !== "/" ||
98
+ parsed.search.length > 0 ||
99
+ parsed.hash.length > 0
80
100
  ) {
81
101
  return null;
82
102
  }
83
- const pathname = parsed.pathname.replace(/\/+$/u, "");
84
- const baseUrl = `${parsed.origin}${pathname === "" ? "" : pathname}`;
85
- const defaultPort = parsed.protocol === "https:" ? 443 : 80;
86
- const port = parsed.port === "" ? defaultPort : Number(parsed.port);
87
- return Number.isInteger(port) && port >= 1 && port <= 65_535 ? { baseUrl, port } : null;
103
+ return parsed.origin;
88
104
  } catch {
89
105
  return null;
90
106
  }
@@ -94,10 +110,16 @@ export function resolveOnboardTarget(
94
110
  options: OnboardTargetOptions,
95
111
  env: OnboardTargetEnv = process.env,
96
112
  ): OnboardTargetResult {
97
- if (options.instanceName !== null && options.baseUrl !== null) {
113
+ const hasExplicitSurface =
114
+ options.baseUrl !== null ||
115
+ (options.controlBaseUrl !== null && options.controlBaseUrl !== undefined) ||
116
+ (options.agentBaseUrl !== null && options.agentBaseUrl !== undefined) ||
117
+ options.uiUrl !== undefined;
118
+ if (options.instanceName !== null && hasExplicitSurface) {
98
119
  return {
99
120
  ok: false,
100
- message: "--instance and --base-url are mutually exclusive",
121
+ message:
122
+ "--instance and explicit --base-url/--control-base-url/--agent-base-url/--ui-url options are mutually exclusive",
101
123
  };
102
124
  }
103
125
 
@@ -110,23 +132,39 @@ export function resolveOnboardTarget(
110
132
  };
111
133
  }
112
134
 
113
- if (options.baseUrl !== null) {
114
- const explicit = normalizeExplicitBaseUrl(options.baseUrl);
115
- if (explicit === null) {
135
+ if (hasExplicitSurface) {
136
+ const sharedRaw = options.baseUrl;
137
+ const controlRaw = options.controlBaseUrl ?? sharedRaw ?? options.agentBaseUrl;
138
+ const agentRaw = options.agentBaseUrl ?? sharedRaw ?? options.controlBaseUrl;
139
+ const control =
140
+ controlRaw === null || controlRaw === undefined ? null : normalizeExplicitBaseUrl(controlRaw);
141
+ const agent =
142
+ agentRaw === null || agentRaw === undefined ? null : normalizeExplicitBaseUrl(agentRaw);
143
+ const ui =
144
+ options.uiUrl === undefined || options.uiUrl === null
145
+ ? null
146
+ : normalizeExplicitBaseUrl(options.uiUrl);
147
+ if (
148
+ control === null ||
149
+ agent === null ||
150
+ (options.uiUrl !== undefined && options.uiUrl !== null && ui === null)
151
+ ) {
116
152
  return {
117
153
  ok: false,
118
154
  message:
119
- "--base-url must be a credential-free HTTP or HTTPS URL without a query or fragment",
155
+ "Explicit UI, control, and agent Base URLs must be credential-free HTTP(S) URLs without a query or fragment",
120
156
  };
121
157
  }
122
158
  return {
123
159
  ok: true,
124
- target: targetFromBase(
160
+ target: targetFromSurfaces(
125
161
  "base-url",
126
162
  null,
127
163
  explicitMcpName ?? "agent-inspector",
128
- explicit.port,
129
- explicit.baseUrl,
164
+ control.port,
165
+ control.baseUrl,
166
+ agent.baseUrl,
167
+ ui?.baseUrl ?? null,
130
168
  ),
131
169
  };
132
170
  }
@@ -150,30 +188,41 @@ export function resolveOnboardTarget(
150
188
  const baseUrl = appendBasePathToOrigin(origin, "/", record.value.basePath);
151
189
  return {
152
190
  ok: true,
153
- target: targetFromBase(
191
+ target: targetFromSurfaces(
154
192
  "instance",
155
193
  record.value.name,
156
194
  explicitMcpName ?? `agent-inspector-${record.value.name}`,
157
195
  record.value.publicPort,
158
196
  baseUrl,
197
+ baseUrl,
198
+ record.value.uiEnabled ? baseUrl : null,
159
199
  ),
160
200
  };
161
201
  }
162
202
 
163
- const baseUrl = appendBasePathToOrigin(DEFAULT_ORIGIN, "/", getConfiguredBasePath(env));
203
+ const configuredPublicOrigin = env[AGENT_INSPECTOR_PUBLIC_ORIGIN_ENV];
204
+ const publicOrigin =
205
+ configuredPublicOrigin === undefined
206
+ ? DEFAULT_ORIGIN
207
+ : normalizePublicOrigin(configuredPublicOrigin);
208
+ if (publicOrigin === null) {
209
+ return {
210
+ ok: false,
211
+ message:
212
+ "AGENT_INSPECTOR_PUBLIC_ORIGIN must be an exact credential-free HTTP(S) origin without a path, query, or fragment",
213
+ };
214
+ }
215
+ const baseUrl = appendBasePathToOrigin(publicOrigin, "/", getConfiguredBasePath(env));
164
216
  return {
165
217
  ok: true,
166
- target: targetFromBase(
218
+ target: targetFromSurfaces(
167
219
  "default",
168
220
  null,
169
221
  explicitMcpName ?? "agent-inspector",
170
222
  DEFAULT_PORT,
171
223
  baseUrl,
224
+ baseUrl,
225
+ env["AGENT_INSPECTOR_BACKEND_ONLY"] === "1" ? null : baseUrl,
172
226
  ),
173
227
  };
174
228
  }
175
-
176
- export const onboardTargetForTests = {
177
- normalizeExplicitBaseUrl,
178
- validateMcpName,
179
- };
@@ -11,8 +11,14 @@ export type CodexSkillOnboardContext = {
11
11
  readonly version: string;
12
12
  /** The default proxy port (mirrors `DEFAULT_PORT` in `src/cli.ts`). */
13
13
  readonly port: number;
14
- /** Public UI base URL, including the configured base path. */
14
+ /** Public backend control/agent Base URL, including the configured Base Path. */
15
15
  readonly baseUrl: string;
16
+ /** Optional composed or standalone UI URL. Undefined preserves the legacy composed default. */
17
+ readonly uiUrl?: string | null;
18
+ /** REST/SSE Base URL. Falls back to baseUrl for compatibility. */
19
+ readonly controlBaseUrl?: string;
20
+ /** Proxy/MCP Base URL. Falls back to baseUrl for compatibility. */
21
+ readonly agentBaseUrl?: string;
16
22
  /** MCP config key selected by onboarding. */
17
23
  readonly mcpName?: string;
18
24
  /** Selected onboarding target type. */
@@ -33,16 +39,20 @@ export const REQUIRED_CODEX_PHASE_HEADINGS = [
33
39
  ] as const;
34
40
 
35
41
  export function renderCodexSkillOnboard(ctx: CodexSkillOnboardContext): string {
36
- const { version, baseUrl } = ctx;
42
+ const { version } = ctx;
43
+ const controlBaseUrl = ctx.controlBaseUrl ?? ctx.baseUrl;
44
+ const agentBaseUrl = ctx.agentBaseUrl ?? ctx.baseUrl;
45
+ const uiUrl = ctx.uiUrl === undefined ? ctx.baseUrl : ctx.uiUrl;
37
46
  const mcpName = ctx.mcpName ?? "agent-inspector";
38
47
  const targetKind = ctx.targetKind ?? "default";
39
48
  const targetArguments = ctx.onboardTargetArguments ?? "";
40
49
  const instanceName = ctx.instanceName ?? null;
41
- const healthUrl = `${baseUrl}/api/health`;
42
- const configUrl = `${baseUrl}/api/config`;
43
- const anthropicProxyUrl = `${baseUrl}/proxy`;
44
- const openAiProxyUrl = `${baseUrl}/proxy/v1`;
45
- const mcpUrl = `${baseUrl}/api/mcp`;
50
+ const healthUrl = `${controlBaseUrl}/api/health`;
51
+ const runtimeUrl = `${controlBaseUrl}/api/runtime`;
52
+ const configUrl = `${controlBaseUrl}/api/config`;
53
+ const anthropicProxyUrl = `${agentBaseUrl}/proxy`;
54
+ const openAiProxyUrl = `${agentBaseUrl}/proxy/v1`;
55
+ const mcpUrl = `${agentBaseUrl}/api/mcp`;
46
56
  const mcpTomlKey = /^[A-Za-z0-9_-]+$/u.test(mcpName) ? mcpName : JSON.stringify(mcpName);
47
57
  const statusCommand = `agent-inspector onboard --status${targetArguments}`;
48
58
  const refreshCommand = `agent-inspector onboard --force${targetArguments}`;
@@ -50,7 +60,7 @@ export function renderCodexSkillOnboard(ctx: CodexSkillOnboardContext): string {
50
60
  targetKind === "instance" && instanceName !== null
51
61
  ? `agent-inspector instance start ${instanceName}`
52
62
  : targetKind === "base-url"
53
- ? `# Explicit target ${baseUrl}: do not start a replacement local runtime.`
63
+ ? `# Explicit control target ${controlBaseUrl}: do not start a replacement local runtime.`
54
64
  : "agent-inspector --mode simple --background --no-open";
55
65
  const fullModeCommand =
56
66
  targetKind === "instance" && instanceName !== null
@@ -60,8 +70,14 @@ export function renderCodexSkillOnboard(ctx: CodexSkillOnboardContext): string {
60
70
  : "agent-inspector --mode full --force-restart";
61
71
  const startExplanation =
62
72
  targetKind === "base-url"
63
- ? `The selected Inspector target is the explicit Base URL \`${baseUrl}\`. Do not start the default local runtime as a substitute; verify the selected target and ask its operator for help if it is unavailable.`
64
- : `Start or reuse the selected Agent Inspector runtime before wiring MCP. Prefer the installed binary so Windows users get the branded runtime in Task Manager. Use \`${fullModeCommand}\` only when the user needs raw headers, raw response, or SSE chunks.`;
73
+ ? `The selected Inspector target uses control Base URL \`${controlBaseUrl}\` and agent Base URL \`${agentBaseUrl}\`. Do not start the default local runtime as a substitute; verify the selected target and ask its operator for help if it is unavailable.`
74
+ : `Start or reuse the selected Agent Inspector backend before wiring MCP. The default command composes a UI, while backend-only named instances retain proxy, REST, health, and MCP without UI files. Prefer the installed binary so Windows users get the branded runtime in Task Manager. Use \`${fullModeCommand}\` only when the user needs raw headers, raw response, or SSE chunks.`;
75
+ const selectedUi =
76
+ uiUrl === null ? "not supplied (do not infer one from a backend URL)" : `\`${uiUrl}\``;
77
+ const providerTestUiGuidance =
78
+ uiUrl === null
79
+ ? `No UI URL was supplied. Do not open \`${controlBaseUrl}\` or \`${agentBaseUrl}\` as a page; use the MCP Provider Test tools and log/session resources, or ask the operator for a standalone UI URL.`
80
+ : `The operator supplied the explicit composed or standalone UI URL \`${uiUrl}\`. Use that URL for browser steps; do not substitute the control or agent Base URL.`;
65
81
  return `---
66
82
  name: agent-inspector-onboard
67
83
  description: Guide Codex users through connecting Agent Inspector v${version} as a local MCP server.
@@ -74,7 +90,13 @@ metadata:
74
90
 
75
91
  Use this skill when the user wants to set up Agent Inspector inside Codex, connect the Agent Inspector MCP server, inspect captured model traffic from Codex, or turn Inspector sessions into reviewable knowledge candidates.
76
92
 
77
- Agent Inspector runs a local web UI, proxy, REST API, and MCP endpoint on the same port. The default MCP endpoint is:
93
+ The selected deployment has these explicit surfaces:
94
+
95
+ - UI URL: ${selectedUi}
96
+ - Control Base URL: \`${controlBaseUrl}\`
97
+ - Agent Base URL: \`${agentBaseUrl}\`
98
+
99
+ Composed mode may use one URL for all three, but backend-only mode and separately hosted UI deployments do not require UI and backend to share a process, origin, or port. The selected MCP endpoint is:
78
100
 
79
101
  \`\`\`text
80
102
  ${mcpUrl}
@@ -92,6 +114,8 @@ Do not configure both transports in the same MCP client, or the client may show
92
114
 
93
115
  Keep this setup local and explicit. Agent Inspector MCP tools can read captured requests and provider configuration, so only wire it into trusted local Codex environments.
94
116
 
117
+ The backend publishes token-free runtime discovery at \`${runtimeUrl}\`. Treat \`backend-only\` as healthy when REST, proxy, and MCP capabilities are present.
118
+
95
119
  Agent Inspector starts in **Simple mode** by default. Keep Simple mode for everyday capture: requests, responses, tools, timing, and token usage stay available without retaining heavier raw headers, raw response, or detailed SSE chunk artifacts. Use **Full mode** only when the user is debugging provider headers, raw response payloads, or SSE stream details.
96
120
 
97
121
  ---
@@ -134,12 +158,14 @@ ${startExplanation}
134
158
  \`\`\`powershell
135
159
  ${startCommand}
136
160
  Invoke-RestMethod -Uri "${healthUrl}" -TimeoutSec 3
161
+ Invoke-RestMethod -Uri "${runtimeUrl}" -TimeoutSec 3 | Select-Object deploymentMode, capabilities
137
162
  Invoke-RestMethod -Uri "${configUrl}" -TimeoutSec 3 | Select-Object captureMode
138
163
  \`\`\`
139
164
 
140
165
  \`\`\`bash
141
166
  ${startCommand}
142
167
  curl -fsS "${healthUrl}"
168
+ curl -fsS "${runtimeUrl}"
143
169
  curl -fsS "${configUrl}" | grep -o '"captureMode":"[^"]*"'
144
170
  \`\`\`
145
171
 
@@ -183,7 +209,7 @@ When editing:
183
209
  - Keep existing \`mcp_servers.*\`, \`projects.*\`, profiles, sandbox, approval, and model settings intact.
184
210
  - Remove any duplicate Inspector MCP entry that points to the same \`/api/mcp\` endpoint or runs the same \`agent-inspector-mcp stdio\` bridge under another name.
185
211
  - Do not write provider API keys into Codex config.
186
- - Do not expose Agent Inspector MCP beyond localhost.
212
+ - Do not expose a raw Inspector listener to untrusted networks. For remote use, require the operator's authenticated same-origin gateway and keep control credentials in environment variables rather than generated config.
187
213
 
188
214
  ---
189
215
 
@@ -264,14 +290,18 @@ Inspector, \`localhost\` points at the tool's own environment. Replace \`localho
264
290
  address reachable from that environment, then verify the network/firewall path before debugging
265
291
  provider credentials.
266
292
 
267
- For a Provider Test memory probe, run a provider test in the Agent Inspector UI:
293
+ For a Provider Test memory probe, first read \`${runtimeUrl}\`. ${providerTestUiGuidance}
268
294
 
269
- 1. Open \`${baseUrl}\`.
295
+ When an explicit UI URL is available:
296
+
297
+ 1. Open the supplied UI URL.
270
298
  2. Go to Settings -> Providers.
271
299
  3. Add or edit a Provider.
272
300
  4. Run Test.
273
301
  5. Check the \`provider-test\` session.
274
302
 
303
+ If discovery reports \`backend-only\`, do not fail onboarding. A separately hosted UI may still exist only when its URL was explicitly supplied; otherwise use the MCP Provider Test tools and log/session resources. Proxy, REST, health, and MCP remain fully usable without UI files.
304
+
275
305
  Then ask Codex:
276
306
 
277
307
  \`\`\`text