@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
@@ -0,0 +1,450 @@
1
+ import { spawnSync } from "node:child_process";
2
+ import { Buffer } from "node:buffer";
3
+ import { createHash } from "node:crypto";
4
+ import { existsSync, readFileSync, statSync } from "node:fs";
5
+ import { createRequire } from "node:module";
6
+ import { dirname, isAbsolute, relative, resolve } from "node:path";
7
+ import { fileURLToPath } from "node:url";
8
+ import { z } from "zod";
9
+
10
+ export const RUST_BACKEND_IDENTITY_FLAG = "--agent-inspector-package-identity";
11
+ export const RUST_BACKEND_CLI_PROTOCOL = "agent-inspector-cli-backend-v1";
12
+ export const RUST_BACKEND_IDENTITY_TIMEOUT_MS = 2_000;
13
+
14
+ export type RustBackendLibc = "glibc" | "musl" | "unknown" | "not-applicable";
15
+
16
+ export type RustBackendTarget = {
17
+ packageName: string;
18
+ target: string;
19
+ binary: string;
20
+ os: "win32" | "linux" | "darwin";
21
+ cpu: "x64" | "arm64";
22
+ libc: "glibc" | null;
23
+ };
24
+
25
+ export type RustBackendPackageErrorCode =
26
+ | "binary_invalid"
27
+ | "binary_missing"
28
+ | "hash_mismatch"
29
+ | "identity_failed"
30
+ | "identity_mismatch"
31
+ | "manifest_invalid"
32
+ | "package_invalid"
33
+ | "package_missing"
34
+ | "target_mismatch"
35
+ | "unsupported_platform"
36
+ | "version_mismatch";
37
+
38
+ export type RustBackendPackageError = {
39
+ code: RustBackendPackageErrorCode;
40
+ message: string;
41
+ };
42
+
43
+ export type RustBackendPackageResolution =
44
+ | {
45
+ kind: "success";
46
+ value: {
47
+ command: string;
48
+ args: readonly string[];
49
+ packageName: string;
50
+ packageVersion: string;
51
+ target: string;
52
+ sha256: string;
53
+ };
54
+ }
55
+ | { kind: "error"; error: RustBackendPackageError };
56
+
57
+ export type RustBackendTargetResolution =
58
+ | { kind: "success"; value: RustBackendTarget }
59
+ | { kind: "error"; error: RustBackendPackageError };
60
+
61
+ const RustBackendIdentitySchema = z
62
+ .object({
63
+ schemaVersion: z.literal(1),
64
+ name: z.literal("agent-inspector-backend"),
65
+ packageVersion: z.string().min(1),
66
+ target: z.string().min(1),
67
+ binary: z.string().min(1),
68
+ cliProtocol: z.literal(RUST_BACKEND_CLI_PROTOCOL),
69
+ productionReady: z.literal(true),
70
+ capabilities: z
71
+ .object({
72
+ nodeProtectedIngress: z.literal(true),
73
+ basePath: z.literal(true),
74
+ namedInstances: z.literal(true),
75
+ gracefulShutdown: z.literal(true),
76
+ })
77
+ .strict(),
78
+ })
79
+ .strict();
80
+
81
+ export type RustBackendIdentity = z.infer<typeof RustBackendIdentitySchema>;
82
+
83
+ const RustBackendPackageJsonSchema = z
84
+ .object({
85
+ name: z.string().min(1),
86
+ version: z.string().min(1),
87
+ os: z.array(z.string()).min(1),
88
+ cpu: z.array(z.string()).min(1),
89
+ libc: z.array(z.string()).optional(),
90
+ agentInspectorRustBackend: z
91
+ .object({
92
+ schemaVersion: z.literal(1),
93
+ target: z.string().min(1),
94
+ binary: z.string().min(1),
95
+ manifest: z.string().min(1),
96
+ identityFlag: z.literal(RUST_BACKEND_IDENTITY_FLAG),
97
+ cliProtocol: z.literal(RUST_BACKEND_CLI_PROTOCOL),
98
+ })
99
+ .strict(),
100
+ })
101
+ .passthrough();
102
+
103
+ const RustBackendBinaryManifestSchema = z
104
+ .object({
105
+ schemaVersion: z.literal(1),
106
+ packageName: z.string().min(1),
107
+ packageVersion: z.string().min(1),
108
+ target: z.string().min(1),
109
+ binary: z.string().min(1),
110
+ sha256: z.string().regex(/^[a-f0-9]{64}$/u),
111
+ identity: RustBackendIdentitySchema,
112
+ })
113
+ .strict();
114
+
115
+ type IdentityProbeResult =
116
+ | { kind: "success"; value: RustBackendIdentity }
117
+ | { kind: "error"; message: string };
118
+
119
+ export type ResolveRustBackendPackageOptions = {
120
+ rootVersion: string;
121
+ platform?: string;
122
+ arch?: string;
123
+ libc?: RustBackendLibc;
124
+ resolvePackageJson?: (specifier: string) => string;
125
+ identityProbe?: (binaryPath: string, identityFlag: string) => IdentityProbeResult;
126
+ };
127
+
128
+ function packageFailure(
129
+ code: RustBackendPackageErrorCode,
130
+ message: string,
131
+ ): RustBackendPackageResolution {
132
+ return { kind: "error", error: { code, message } };
133
+ }
134
+
135
+ function targetFailure(message: string): RustBackendTargetResolution {
136
+ return { kind: "error", error: { code: "unsupported_platform", message } };
137
+ }
138
+
139
+ function detectLinuxLibc(): RustBackendLibc {
140
+ if (process.platform !== "linux") return "not-applicable";
141
+ const report = process.report.getReport();
142
+ const header = objectProperty(report, "header");
143
+ const glibcVersion = objectProperty(header, "glibcVersionRuntime");
144
+ if (typeof glibcVersion === "string" && glibcVersion.length > 0) {
145
+ return "glibc";
146
+ }
147
+ const sharedObjects = objectProperty(report, "sharedObjects");
148
+ return Array.isArray(sharedObjects) &&
149
+ sharedObjects.some((path) => typeof path === "string" && path.toLowerCase().includes("musl"))
150
+ ? "musl"
151
+ : "unknown";
152
+ }
153
+
154
+ function objectProperty(value: unknown, name: string): unknown {
155
+ if (typeof value !== "object" || value === null || Array.isArray(value)) return undefined;
156
+ return Object.getOwnPropertyDescriptor(value, name)?.value;
157
+ }
158
+
159
+ export function resolveRustBackendTarget(
160
+ platform: string = process.platform,
161
+ arch: string = process.arch,
162
+ libc: RustBackendLibc = platform === "linux" ? detectLinuxLibc() : "not-applicable",
163
+ ): RustBackendTargetResolution {
164
+ switch (platform) {
165
+ case "win32":
166
+ return arch === "x64"
167
+ ? {
168
+ kind: "success",
169
+ value: {
170
+ packageName: "@tonyclaw/agent-inspector-backend-win32-x64-msvc",
171
+ target: "x86_64-pc-windows-msvc",
172
+ binary: "bin/agent-inspector-backend.exe",
173
+ os: "win32",
174
+ cpu: "x64",
175
+ libc: null,
176
+ },
177
+ }
178
+ : targetFailure(`Rust backend packages do not support Windows ${arch}.`);
179
+ case "linux":
180
+ if (arch !== "x64")
181
+ return targetFailure(`Rust backend packages do not support Linux ${arch}.`);
182
+ if (libc !== "glibc") {
183
+ return targetFailure(
184
+ `The Linux Rust backend package requires glibc; detected ${libc}. No binary was started.`,
185
+ );
186
+ }
187
+ return {
188
+ kind: "success",
189
+ value: {
190
+ packageName: "@tonyclaw/agent-inspector-backend-linux-x64-gnu",
191
+ target: "x86_64-unknown-linux-gnu",
192
+ binary: "bin/agent-inspector-backend",
193
+ os: "linux",
194
+ cpu: "x64",
195
+ libc: "glibc",
196
+ },
197
+ };
198
+ case "darwin":
199
+ return arch === "arm64"
200
+ ? {
201
+ kind: "success",
202
+ value: {
203
+ packageName: "@tonyclaw/agent-inspector-backend-darwin-arm64",
204
+ target: "aarch64-apple-darwin",
205
+ binary: "bin/agent-inspector-backend",
206
+ os: "darwin",
207
+ cpu: "arm64",
208
+ libc: null,
209
+ },
210
+ }
211
+ : targetFailure(`Rust backend packages do not support macOS ${arch}.`);
212
+ default:
213
+ return targetFailure(`Rust backend packages do not support ${platform} ${arch}.`);
214
+ }
215
+ }
216
+
217
+ function readJson(path: string): { kind: "success"; value: unknown } | { kind: "error" } {
218
+ try {
219
+ const value: unknown = JSON.parse(readFileSync(path, "utf8"));
220
+ return { kind: "success", value };
221
+ } catch {
222
+ return { kind: "error" };
223
+ }
224
+ }
225
+
226
+ function isConfinedPath(root: string, candidate: string): boolean {
227
+ const child = relative(root, candidate);
228
+ return child.length > 0 && !child.startsWith("..") && !isAbsolute(child);
229
+ }
230
+
231
+ function identitiesMatch(left: RustBackendIdentity, right: RustBackendIdentity): boolean {
232
+ return (
233
+ left.schemaVersion === right.schemaVersion &&
234
+ left.name === right.name &&
235
+ left.packageVersion === right.packageVersion &&
236
+ left.target === right.target &&
237
+ left.binary === right.binary &&
238
+ left.cliProtocol === right.cliProtocol &&
239
+ left.productionReady === right.productionReady &&
240
+ left.capabilities.nodeProtectedIngress === right.capabilities.nodeProtectedIngress &&
241
+ left.capabilities.basePath === right.capabilities.basePath &&
242
+ left.capabilities.namedInstances === right.capabilities.namedInstances &&
243
+ left.capabilities.gracefulShutdown === right.capabilities.gracefulShutdown
244
+ );
245
+ }
246
+
247
+ function probeBinaryIdentity(binaryPath: string, identityFlag: string): IdentityProbeResult {
248
+ const result = spawnSync(binaryPath, [identityFlag], {
249
+ encoding: "utf8",
250
+ windowsHide: true,
251
+ timeout: RUST_BACKEND_IDENTITY_TIMEOUT_MS,
252
+ maxBuffer: 64 * 1024,
253
+ });
254
+ if (result.error !== undefined) {
255
+ return { kind: "error", message: result.error.message };
256
+ }
257
+ if (result.status !== 0) {
258
+ return {
259
+ kind: "error",
260
+ message: `identity command exited with status ${String(result.status)}`,
261
+ };
262
+ }
263
+ let raw: unknown;
264
+ try {
265
+ raw = JSON.parse(result.stdout);
266
+ } catch {
267
+ return { kind: "error", message: "identity command did not return JSON" };
268
+ }
269
+ const parsed = RustBackendIdentitySchema.safeParse(raw);
270
+ return parsed.success
271
+ ? { kind: "success", value: parsed.data }
272
+ : { kind: "error", message: "identity command returned an unsupported contract" };
273
+ }
274
+
275
+ const packageRequire = createRequire(import.meta.url);
276
+
277
+ function defaultResolvePackageJson(specifier: string): string {
278
+ try {
279
+ return packageRequire.resolve(specifier);
280
+ } catch {
281
+ const suffix = "/package.json";
282
+ const packageName = specifier.endsWith(suffix) ? specifier.slice(0, -suffix.length) : "";
283
+ const directoryName = packageName.split("/").at(-1);
284
+ if (directoryName !== undefined && directoryName.length > 0) {
285
+ const localPackageJson = resolve(
286
+ dirname(fileURLToPath(import.meta.url)),
287
+ "../packages",
288
+ directoryName,
289
+ "package.json",
290
+ );
291
+ if (existsSync(localPackageJson)) return localPackageJson;
292
+ }
293
+ return packageRequire.resolve(specifier);
294
+ }
295
+ }
296
+
297
+ export function resolveRustBackendPackage(
298
+ options: ResolveRustBackendPackageOptions,
299
+ ): RustBackendPackageResolution {
300
+ const target = resolveRustBackendTarget(options.platform, options.arch, options.libc);
301
+ if (target.kind === "error") return { kind: "error", error: target.error };
302
+
303
+ const packageJsonSpecifier = `${target.value.packageName}/package.json`;
304
+ let packageJsonPath: string;
305
+ try {
306
+ packageJsonPath = (options.resolvePackageJson ?? defaultResolvePackageJson)(
307
+ packageJsonSpecifier,
308
+ );
309
+ } catch {
310
+ return packageFailure(
311
+ "package_missing",
312
+ `Rust backend ${target.value.target} was requested, but optional package ${target.value.packageName}@${options.rootVersion} is not installed. Reinstall without omitting optional dependencies; no TypeScript fallback was used.`,
313
+ );
314
+ }
315
+
316
+ const rawPackage = readJson(packageJsonPath);
317
+ if (rawPackage.kind === "error") {
318
+ return packageFailure("package_invalid", `Cannot read ${packageJsonSpecifier}.`);
319
+ }
320
+ const packageJson = RustBackendPackageJsonSchema.safeParse(rawPackage.value);
321
+ if (!packageJson.success) {
322
+ return packageFailure(
323
+ "package_invalid",
324
+ `Package ${target.value.packageName} does not contain the Rust backend package contract.`,
325
+ );
326
+ }
327
+ if (
328
+ packageJson.data.name !== target.value.packageName ||
329
+ packageJson.data.version !== options.rootVersion
330
+ ) {
331
+ return packageFailure(
332
+ "version_mismatch",
333
+ `Rust backend package must exactly match @tonyclaw/agent-inspector@${options.rootVersion}; found ${packageJson.data.name}@${packageJson.data.version}.`,
334
+ );
335
+ }
336
+
337
+ const metadata = packageJson.data.agentInspectorRustBackend;
338
+ const expectedLibc = target.value.libc === null ? undefined : [target.value.libc];
339
+ if (
340
+ metadata.target !== target.value.target ||
341
+ metadata.binary !== target.value.binary ||
342
+ metadata.manifest !== "binary-manifest.json" ||
343
+ packageJson.data.os.length !== 1 ||
344
+ packageJson.data.os[0] !== target.value.os ||
345
+ packageJson.data.cpu.length !== 1 ||
346
+ packageJson.data.cpu[0] !== target.value.cpu ||
347
+ JSON.stringify(packageJson.data.libc) !== JSON.stringify(expectedLibc)
348
+ ) {
349
+ return packageFailure(
350
+ "target_mismatch",
351
+ `Package ${target.value.packageName} does not match target ${target.value.target}.`,
352
+ );
353
+ }
354
+
355
+ const packageRoot = dirname(packageJsonPath);
356
+ const manifestPath = resolve(packageRoot, metadata.manifest);
357
+ const binaryPath = resolve(packageRoot, metadata.binary);
358
+ if (!isConfinedPath(packageRoot, manifestPath) || !isConfinedPath(packageRoot, binaryPath)) {
359
+ return packageFailure(
360
+ "package_invalid",
361
+ `Package ${target.value.packageName} contains an unsafe artifact path.`,
362
+ );
363
+ }
364
+
365
+ const rawManifest = readJson(manifestPath);
366
+ if (rawManifest.kind === "error") {
367
+ return packageFailure(
368
+ "manifest_invalid",
369
+ `Rust backend package ${target.value.packageName} is incomplete: binary-manifest.json is missing or invalid.`,
370
+ );
371
+ }
372
+ const manifest = RustBackendBinaryManifestSchema.safeParse(rawManifest.value);
373
+ if (!manifest.success) {
374
+ return packageFailure(
375
+ "manifest_invalid",
376
+ `Rust backend package ${target.value.packageName} has an invalid target manifest.`,
377
+ );
378
+ }
379
+ if (
380
+ manifest.data.packageName !== target.value.packageName ||
381
+ manifest.data.packageVersion !== options.rootVersion ||
382
+ manifest.data.identity.packageVersion !== options.rootVersion
383
+ ) {
384
+ return packageFailure(
385
+ "version_mismatch",
386
+ `Rust backend manifest must exactly match @tonyclaw/agent-inspector@${options.rootVersion}.`,
387
+ );
388
+ }
389
+ if (
390
+ manifest.data.target !== target.value.target ||
391
+ manifest.data.binary !== target.value.binary ||
392
+ manifest.data.identity.target !== target.value.target ||
393
+ manifest.data.identity.binary !== target.value.binary
394
+ ) {
395
+ return packageFailure(
396
+ "target_mismatch",
397
+ `Rust backend manifest identity does not match target ${target.value.target}.`,
398
+ );
399
+ }
400
+
401
+ let binaryBytes: Buffer;
402
+ try {
403
+ const stats = statSync(binaryPath);
404
+ if (!stats.isFile()) {
405
+ return packageFailure("binary_invalid", `Rust backend artifact is not a regular file.`);
406
+ }
407
+ if (target.value.os !== "win32" && (stats.mode & 0o111) === 0) {
408
+ return packageFailure("binary_invalid", `Rust backend artifact is not executable.`);
409
+ }
410
+ binaryBytes = readFileSync(binaryPath);
411
+ } catch {
412
+ return packageFailure(
413
+ "binary_missing",
414
+ `Rust backend binary ${target.value.binary} is missing from ${target.value.packageName}.`,
415
+ );
416
+ }
417
+ const sha256 = createHash("sha256").update(binaryBytes).digest("hex");
418
+ if (sha256 !== manifest.data.sha256) {
419
+ return packageFailure(
420
+ "hash_mismatch",
421
+ `Rust backend binary integrity check failed for ${target.value.packageName}; no binary was started.`,
422
+ );
423
+ }
424
+
425
+ const probed = (options.identityProbe ?? probeBinaryIdentity)(binaryPath, metadata.identityFlag);
426
+ if (probed.kind === "error") {
427
+ return packageFailure(
428
+ "identity_failed",
429
+ `Rust backend binary did not pass the production identity gate: ${probed.message}. No TypeScript fallback was used.`,
430
+ );
431
+ }
432
+ if (!identitiesMatch(probed.value, manifest.data.identity)) {
433
+ return packageFailure(
434
+ "identity_mismatch",
435
+ `Rust backend binary identity differs from its signed package manifest; no binary was started.`,
436
+ );
437
+ }
438
+
439
+ return {
440
+ kind: "success",
441
+ value: {
442
+ command: binaryPath,
443
+ args: [],
444
+ packageName: target.value.packageName,
445
+ packageVersion: options.rootVersion,
446
+ target: target.value.target,
447
+ sha256,
448
+ },
449
+ };
450
+ }
@@ -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