@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
@@ -1,6 +1,6 @@
1
1
  import { createFileRoute } from "@tanstack/react-router";
2
- import { PiAgentRequestSchema } from "../../lib/piAgentContract";
3
- import { runPiAgent } from "../../services/piAgent";
2
+ import { PiAgentRequestSchema } from "../../../lib/piAgentContract";
3
+ import { runPiAgent } from "../../../services/piAgent";
4
4
 
5
5
  export const Route = createFileRoute("/api/pi-agent")({
6
6
  server: {
@@ -1,15 +1,15 @@
1
1
  import { createFileRoute } from "@tanstack/react-router";
2
2
  import { z } from "zod";
3
- import { getProvider, updateProvider } from "../../proxy/providers";
4
- import { toRedactedProviderDto } from "../../lib/providerContract";
3
+ import { getProvider, updateProvider } from "../../../proxy/providers";
4
+ import { toRedactedProviderDto } from "../../../lib/providerContract";
5
5
  import {
6
6
  applyBuiltinProviderModelMetadata,
7
7
  applyProviderModelRegistry,
8
8
  BUILTIN_MODEL_METADATA_SOURCE_URL,
9
9
  ProviderModelRegistrySchema,
10
- } from "../../lib/providerModelMetadata";
11
- import { safeFetch } from "../../lib/safeFetch";
12
- import { MAX_PROVIDER_MODELS, resourceLimitResponse } from "../../lib/resourceLimits";
10
+ } from "../../../lib/providerModelMetadata";
11
+ import { safeFetch } from "../../../lib/safeFetch";
12
+ import { MAX_PROVIDER_MODELS, resourceLimitResponse } from "../../../lib/resourceLimits";
13
13
 
14
14
  const RefreshModelMetadataInputSchema = z.object({
15
15
  url: z.string().optional(),
@@ -1,17 +1,17 @@
1
1
  import { createFileRoute } from "@tanstack/react-router";
2
2
  import { basename } from "node:path";
3
- import { getProvider, getModelUsageName } from "../../proxy/providers";
4
- import { addTestLogEntry } from "../../proxy/store";
5
- import { getConfig } from "../../proxy/config";
6
- import { buildProviderTestSessionId } from "../../proxy/sessionSupervisor";
7
- import { buildProviderTestRequestBody } from "../../lib/providerTestPrompt";
3
+ import { getProvider, getModelUsageName } from "../../../proxy/providers";
4
+ import { addTestLogEntry } from "../../../proxy/store";
5
+ import { getConfig } from "../../../proxy/config";
6
+ import { buildProviderTestSessionId } from "../../../proxy/sessionSupervisor";
7
+ import { buildProviderTestRequestBody } from "../../../lib/providerTestPrompt";
8
8
  import {
9
9
  ProviderTestResultsSchema,
10
10
  type ProviderModelTestResults,
11
11
  type ProviderTestResult as TestResult,
12
12
  type ProviderTestState,
13
- } from "../../lib/providerTestContract";
14
- import { computeTokensPerSecond, firstChunkMsFromChunks } from "../../proxy/streamTiming";
13
+ } from "../../../lib/providerTestContract";
14
+ import { computeTokensPerSecond, firstChunkMsFromChunks } from "../../../proxy/streamTiming";
15
15
 
16
16
  function hasSuccessField(result: ProviderTestState): result is TestResult {
17
17
  return Object.prototype.hasOwnProperty.call(result, "success");
@@ -5,15 +5,15 @@ import {
5
5
  updateProvider,
6
6
  deleteProvider,
7
7
  redactProvider,
8
- } from "../../proxy/providers";
8
+ } from "../../../proxy/providers";
9
9
  import {
10
10
  getProviderModelLimitViolation,
11
11
  ProviderModelMetadataListSchema,
12
12
  ProviderModelNameSchema,
13
13
  ProviderModelsSchema,
14
- } from "../../lib/providerContract";
15
- import { evaluateUpstreamUrl } from "../../lib/ssrfGuard";
16
- import { resourceLimitResponse } from "../../lib/resourceLimits";
14
+ } from "../../../lib/providerContract";
15
+ import { evaluateUpstreamUrl } from "../../../lib/ssrfGuard";
16
+ import { resourceLimitResponse } from "../../../lib/resourceLimits";
17
17
 
18
18
  const ALLOW_LOOPBACK = process.env["AGENT_INSPECTOR_ALLOW_LOOPBACK"] === "1";
19
19
 
@@ -1,6 +1,6 @@
1
1
  import { createFileRoute } from "@tanstack/react-router";
2
2
  import { z } from "zod";
3
- import { exportProviders, exportProvidersWithKeys } from "../../proxy/providers";
3
+ import { exportProviders, exportProvidersWithKeys } from "../../../proxy/providers";
4
4
 
5
5
  const SecretExportRequestSchema = z.object({
6
6
  confirmation: z.literal("EXPORT_PROVIDER_KEYS"),
@@ -1,9 +1,9 @@
1
1
  import { createFileRoute } from "@tanstack/react-router";
2
2
  import { z } from "zod";
3
3
  import { randomUUID } from "node:crypto";
4
- import { ProviderScanImportRequestSchema } from "../../lib/providerImportContract";
5
- import { consumeProviderScan } from "../../proxy/providerScanStore";
6
- import { importProviders } from "../../proxy/providers";
4
+ import { ProviderScanImportRequestSchema } from "../../../lib/providerImportContract";
5
+ import { consumeProviderScan } from "../../../proxy/providerScanStore";
6
+ import { importProviders } from "../../../proxy/providers";
7
7
 
8
8
  const ProviderFileImportSchema = z.union([z.string(), z.object({ providers: z.unknown() })]);
9
9
 
@@ -1,6 +1,6 @@
1
1
  import { createFileRoute } from "@tanstack/react-router";
2
- import { scanExternalProviders } from "../../proxy/providerImporters";
3
- import { createProviderScan } from "../../proxy/providerScanStore";
2
+ import { scanExternalProviders } from "../../../proxy/providerImporters";
3
+ import { createProviderScan } from "../../../proxy/providerScanStore";
4
4
 
5
5
  export const Route = createFileRoute("/api/providers/scan")({
6
6
  server: {
@@ -1,14 +1,19 @@
1
1
  import { createFileRoute } from "@tanstack/react-router";
2
2
  import { z } from "zod";
3
- import { getProviders, addProvider, redactProvider, redactProviders } from "../../proxy/providers";
3
+ import {
4
+ getProviders,
5
+ addProvider,
6
+ redactProvider,
7
+ redactProviders,
8
+ } from "../../../proxy/providers";
4
9
  import {
5
10
  getProviderModelLimitViolation,
6
11
  ProviderModelMetadataListSchema,
7
12
  ProviderModelNameSchema,
8
13
  ProviderModelsSchema,
9
- } from "../../lib/providerContract";
10
- import { evaluateUpstreamUrl } from "../../lib/ssrfGuard";
11
- import { resourceLimitResponse } from "../../lib/resourceLimits";
14
+ } from "../../../lib/providerContract";
15
+ import { evaluateUpstreamUrl } from "../../../lib/ssrfGuard";
16
+ import { resourceLimitResponse } from "../../../lib/resourceLimits";
12
17
 
13
18
  const ALLOW_LOOPBACK = process.env["AGENT_INSPECTOR_ALLOW_LOOPBACK"] === "1";
14
19
 
@@ -1,6 +1,6 @@
1
1
  import { createFileRoute } from "@tanstack/react-router";
2
- import { EvidenceExportOptionsSchema } from "../../lib/runContract";
3
- import { exportInspectorRunEvidence, readInspectorRunEvidence } from "../../services/runs";
2
+ import { EvidenceExportOptionsSchema } from "../../../lib/runContract";
3
+ import { exportInspectorRunEvidence, readInspectorRunEvidence } from "../../../services/runs";
4
4
 
5
5
  type JsonBodyResult = { ok: true; value: unknown } | { ok: false };
6
6
 
@@ -1,6 +1,6 @@
1
1
  import { createFileRoute } from "@tanstack/react-router";
2
- import { UpdateInspectorRunInputSchema } from "../../lib/runContract";
3
- import { getInspectorRun, updateInspectorRun } from "../../services/runs";
2
+ import { UpdateInspectorRunInputSchema } from "../../../lib/runContract";
3
+ import { getInspectorRun, updateInspectorRun } from "../../../services/runs";
4
4
 
5
5
  type JsonBodyResult = { ok: true; value: unknown } | { ok: false };
6
6
 
@@ -1,13 +1,13 @@
1
1
  import { createFileRoute } from "@tanstack/react-router";
2
- import { CreateInspectorRunInputSchema } from "../../lib/runContract";
2
+ import { CreateInspectorRunInputSchema } from "../../../lib/runContract";
3
3
  import {
4
4
  RECENT_FAILURES_DEFAULT_LIMIT,
5
5
  createInspectorRun,
6
6
  listInspectorRecentFailures,
7
7
  listInspectorRuns,
8
- } from "../../services/runs";
9
- import { RECENT_FAILURES_MAX_LIMIT } from "../../proxy/runFailures";
10
- import { parseBoundedIntegerParameter } from "../../lib/resourceLimits";
8
+ } from "../../../services/runs";
9
+ import { RECENT_FAILURES_MAX_LIMIT } from "../../../proxy/runFailures";
10
+ import { parseBoundedIntegerParameter } from "../../../lib/resourceLimits";
11
11
 
12
12
  type JsonBodyResult = { ok: true; value: unknown } | { ok: false };
13
13
 
@@ -0,0 +1,46 @@
1
+ import { createFileRoute } from "@tanstack/react-router";
2
+ import { appendBasePathToOrigin } from "../../../lib/basePath";
3
+ import {
4
+ BROWSER_RUNTIME_SCHEMA_VERSION,
5
+ type BrowserRuntimeDeployment,
6
+ } from "../../../lib/browserRuntimeContract";
7
+ import { getPublicBasePath, getPublicOrigin } from "../../../lib/publicBasePathContext";
8
+
9
+ type RuntimeEnvironment = Readonly<Record<string, string | undefined>>;
10
+
11
+ export const AGENT_INSPECTOR_BACKEND_ONLY_ENV = "AGENT_INSPECTOR_BACKEND_ONLY";
12
+
13
+ export function runtimeDiscoveryDocument(
14
+ env: RuntimeEnvironment = process.env,
15
+ ): BrowserRuntimeDeployment {
16
+ const basePath = getPublicBasePath(env);
17
+ const baseUrl = appendBasePathToOrigin(getPublicOrigin(), "/", basePath);
18
+
19
+ return {
20
+ schemaVersion: BROWSER_RUNTIME_SCHEMA_VERSION,
21
+ deploymentMode: env[AGENT_INSPECTOR_BACKEND_ONLY_ENV] === "1" ? "backend-only" : "composed",
22
+ ui: { basePath: basePath.length === 0 ? "/" : basePath },
23
+ control: { baseUrl },
24
+ agent: { baseUrl },
25
+ capabilities: {
26
+ rest: true,
27
+ sse: true,
28
+ proxy: true,
29
+ mcp: true,
30
+ },
31
+ };
32
+ }
33
+
34
+ export function runtimeDiscoveryResponse(env: RuntimeEnvironment = process.env): Response {
35
+ return Response.json(runtimeDiscoveryDocument(env), {
36
+ headers: { "cache-control": "no-store" },
37
+ });
38
+ }
39
+
40
+ export const Route = createFileRoute("/api/runtime")({
41
+ server: {
42
+ handlers: {
43
+ GET: () => runtimeDiscoveryResponse(),
44
+ },
45
+ },
46
+ });
@@ -1,10 +1,10 @@
1
1
  import { createFileRoute } from "@tanstack/react-router";
2
- import { getSessionInfo, getSessionSnapshots, listSessions } from "../../proxy/store";
2
+ import { getSessionInfo, getSessionSnapshots, listSessions } from "../../../proxy/store";
3
3
  import {
4
4
  SESSION_INFO_DEFAULT_LATEST_LOG_LIMIT,
5
5
  SESSION_INFO_MAX_LATEST_LOG_LIMIT,
6
- } from "../../proxy/sessionInfo";
7
- import { parseBoundedIntegerParameter } from "../../lib/resourceLimits";
6
+ } from "../../../proxy/sessionInfo";
7
+ import { parseBoundedIntegerParameter } from "../../../lib/resourceLimits";
8
8
 
9
9
  function parseBooleanFlag(value: string | null): boolean {
10
10
  return value === "1" || value === "true";
@@ -1,5 +1,5 @@
1
1
  import { createFileRoute } from "@tanstack/react-router";
2
- import { handleProxy } from "../../proxy/handler";
2
+ import { handleProxy } from "../../../proxy/handler";
3
3
 
4
4
  export const Route = createFileRoute("/proxy/$")({
5
5
  server: {
@@ -1,5 +1,5 @@
1
1
  import { createFileRoute } from "@tanstack/react-router";
2
- import { getRuntimeReadiness } from "../proxy/runtimeHealth";
2
+ import { getRuntimeReadiness } from "../../proxy/runtimeHealth";
3
3
 
4
4
  export async function readinessResponse(): Promise<Response> {
5
5
  const readiness = await getRuntimeReadiness();
@@ -1,7 +1,7 @@
1
1
  import { createMiddleware, createStart } from "@tanstack/react-start";
2
2
 
3
3
  const publicBasePathMiddleware = createMiddleware().server(async ({ next, request }) => {
4
- const { runWithRequestPublicBasePath } = await import("./lib/publicBasePathContext");
4
+ const { runWithRequestPublicBasePath } = await import("../lib/publicBasePathContext");
5
5
  return runWithRequestPublicBasePath(request, () => next());
6
6
  });
7
7
 
package/src/cli/alias.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { normalizeBasePath } from "../lib/basePath";
1
+ import { normalizeBasePath, normalizePublicBasePath } from "../lib/basePath";
2
2
 
3
3
  const DEFAULT_ALIAS_HOST = "localhost";
4
4
  const DEFAULT_ALIAS_PORT = 9527;
@@ -67,16 +67,7 @@ function parsePort(raw: string | undefined): number | null {
67
67
  }
68
68
 
69
69
  function normalizeAliasPath(raw: string): string | null {
70
- const trimmed = raw.trim();
71
- if (
72
- !trimmed.startsWith("/") ||
73
- trimmed.includes("?") ||
74
- trimmed.includes("#") ||
75
- trimmed.includes("\\")
76
- ) {
77
- return null;
78
- }
79
- return normalizeBasePath(trimmed);
70
+ return normalizePublicBasePath(raw);
80
71
  }
81
72
 
82
73
  function isValidHost(host: string): boolean {
package/src/cli/doctor.ts CHANGED
@@ -249,7 +249,7 @@ function checkProviderConfig(options: DoctorOptions, deps: DoctorDeps): DoctorCh
249
249
  "Provider config",
250
250
  "warn",
251
251
  `Provider config exists but no providers were found: ${candidate}`,
252
- "Add a provider in Settings or import provider settings.",
252
+ "Add a provider through the control API/MCP, or use Settings when a UI is available.",
253
253
  );
254
254
  }
255
255
 
@@ -257,29 +257,51 @@ function checkProviderConfig(options: DoctorOptions, deps: DoctorDeps): DoctorCh
257
257
  "Provider config",
258
258
  "warn",
259
259
  "No provider config was found.",
260
- "Add a provider in the web UI, import providers, or pass --providers for this check.",
260
+ "Add a provider through the control API/MCP, use Settings when a UI is available, or pass --providers for this check.",
261
261
  );
262
262
  }
263
263
 
264
+ function publicOriginForDoctor(port: number, env: DoctorDeps["env"]): string {
265
+ const configured = env["AGENT_INSPECTOR_PUBLIC_ORIGIN"];
266
+ if (configured !== undefined && configured.trim() === configured) {
267
+ try {
268
+ const parsed = new URL(configured);
269
+ if (
270
+ (parsed.protocol === "http:" || parsed.protocol === "https:") &&
271
+ parsed.username.length === 0 &&
272
+ parsed.password.length === 0 &&
273
+ parsed.pathname === "/" &&
274
+ parsed.search.length === 0 &&
275
+ parsed.hash.length === 0
276
+ ) {
277
+ return parsed.origin;
278
+ }
279
+ } catch {
280
+ // Startup reports invalid public-origin configuration; doctor keeps a safe local hint.
281
+ }
282
+ }
283
+ return `http://localhost:${String(port)}`;
284
+ }
285
+
264
286
  async function checkProxyHealth(port: number, deps: DoctorDeps): Promise<DoctorCheck> {
265
287
  const basePath = getConfiguredBasePath(deps.env);
266
288
  const health = await deps.fetchHealth(port, basePath);
267
- const url = `http://localhost:${port}`;
289
+ const url = publicOriginForDoctor(port, deps.env);
268
290
  const proxyUrl = appendBasePathToOrigin(url, "/proxy", basePath);
269
291
  const healthPath = appendBasePathToOrigin("", "/api/health", basePath);
270
292
  if (health.ok) {
271
293
  return check(
272
- "Proxy health",
294
+ "Backend health",
273
295
  "pass",
274
- `agent-inspector is healthy at ${appendBasePathToOrigin(url, "/", basePath)}.`,
275
- `Proxy URL: ${proxyUrl}`,
296
+ `Agent Inspector backend is healthy at ${appendBasePathToOrigin(url, "/", basePath)}.`,
297
+ `Agent proxy URL: ${proxyUrl}. UI availability is not part of this backend check.`,
276
298
  );
277
299
  }
278
300
 
279
301
  if (await deps.isPortOpen(port)) {
280
302
  const suffix = health.status === null ? "" : ` (HTTP ${health.status})`;
281
303
  return check(
282
- "Proxy health",
304
+ "Backend health",
283
305
  "fail",
284
306
  `Port ${port} is accepting connections, but ${healthPath} is not healthy${suffix}.`,
285
307
  "Stop that process, choose --port <n>, or start agent-inspector with --force-restart.",
@@ -287,7 +309,7 @@ async function checkProxyHealth(port: number, deps: DoctorDeps): Promise<DoctorC
287
309
  }
288
310
 
289
311
  return check(
290
- "Proxy health",
312
+ "Backend health",
291
313
  "warn",
292
314
  `No process is listening on port ${port}.`,
293
315
  "Start with `agent-inspector`, `agent-inspector --background`, or `bun run dev`.",
@@ -578,7 +600,8 @@ export function doctorHelp(): string {
578
600
  "Usage:",
579
601
  " agent-inspector doctor [--port <port>] [--config-dir <dir>] [--providers <json>] [--fix] [--json] [--verbose] [--chrome-extension]",
580
602
  "",
581
- "Checks local proxy health, provider config presence, and package metadata.",
603
+ "Checks local backend health, provider config presence, and package metadata.",
604
+ "The backend check probes the local health endpoint and does not require a composed Web UI.",
582
605
  "Pass --fix to run safe local repairs before checks, including legacy data-dir migration.",
583
606
  "Pass --json to emit a machine-readable report for CI, scripts, and Jenkins.",
584
607
  "Pass --verbose to include local paths, capture mode, and log storage checks.",
@@ -4,7 +4,7 @@ import {
4
4
  AGENT_INSPECTOR_BASE_PATH_ENV,
5
5
  appendBasePathToOrigin,
6
6
  getConfiguredBasePath,
7
- normalizeBasePath,
7
+ normalizePublicBasePath,
8
8
  } from "../lib/basePath";
9
9
  import {
10
10
  type InstanceConnectionOutput,
@@ -171,6 +171,8 @@ function statusOutput(
171
171
  upstreamPort: record.upstreamPort,
172
172
  basePath: displayBasePath(record.basePath),
173
173
  captureMode: record.captureMode,
174
+ backend: record.backend,
175
+ uiEnabled: record.uiEnabled,
174
176
  dataDir: record.dataDir,
175
177
  supervisorPid: live.supervisorPid,
176
178
  urls: recordUrls(record),
@@ -194,7 +196,16 @@ function connectionOutput(instance: InstanceStatusOutput): InstanceConnectionOut
194
196
  const serverName = `agent-inspector-${instance.name}`;
195
197
  return {
196
198
  schemaVersion: INSTANCE_API_SCHEMA_VERSION,
199
+ uiEnabled: instance.uiEnabled,
197
200
  instance,
201
+ surfaces: {
202
+ ui: {
203
+ enabled: instance.uiEnabled,
204
+ baseUrl: instance.uiEnabled ? instance.urls.ui : null,
205
+ },
206
+ control: { baseUrl: instance.urls.ui },
207
+ agent: { baseUrl: instance.urls.ui },
208
+ },
198
209
  baseUrl: instance.urls.ui,
199
210
  endpoints: instance.urls,
200
211
  environment: {
@@ -218,6 +229,7 @@ function connectionOutput(instance: InstanceStatusOutput): InstanceConnectionOut
218
229
 
219
230
  function expectedIdentity(record: InstanceRecord): ExpectedInstanceControlIdentity {
220
231
  return {
232
+ backend: record.backend,
221
233
  instanceId: record.instanceId,
222
234
  launchId: record.launch.launchId,
223
235
  controlToken: record.launch.controlToken,
@@ -271,10 +283,12 @@ function defaultOpenUrl(targetUrl: string): void {
271
283
  child.unref();
272
284
  }
273
285
 
274
- function launchArgs(record: InstanceRecord, open: boolean): string[] {
286
+ export function buildInstanceLaunchArgs(record: InstanceRecord, open: boolean): string[] {
275
287
  const args = [
276
288
  "--background",
277
289
  "--no-open",
290
+ "--backend",
291
+ record.backend,
278
292
  "--port",
279
293
  String(record.publicPort),
280
294
  "--host",
@@ -282,7 +296,8 @@ function launchArgs(record: InstanceRecord, open: boolean): string[] {
282
296
  "--mode",
283
297
  record.captureMode,
284
298
  ];
285
- if (open) args.push("--open");
299
+ if (!record.uiEnabled) args.push("--backend-only");
300
+ if (open && record.uiEnabled) args.push("--open");
286
301
  return args;
287
302
  }
288
303
 
@@ -291,7 +306,7 @@ async function defaultLaunch(
291
306
  open: boolean,
292
307
  cliEntry: string,
293
308
  ): Promise<boolean> {
294
- const child = spawn(process.execPath, [cliEntry, ...launchArgs(record, open)], {
309
+ const child = spawn(process.execPath, [cliEntry, ...buildInstanceLaunchArgs(record, open)], {
295
310
  stdio: "ignore",
296
311
  windowsHide: true,
297
312
  env: {
@@ -299,6 +314,7 @@ async function defaultLaunch(
299
314
  [AGENT_INSPECTOR_CLI_ENTRY_ENV]: cliEntry,
300
315
  AGENT_INSPECTOR_DATA_DIR: record.dataDir,
301
316
  [AGENT_INSPECTOR_BASE_PATH_ENV]: displayBasePath(record.basePath),
317
+ [MANAGED_INSTANCE_ENV.backend]: record.backend,
302
318
  [MANAGED_INSTANCE_ENV.name]: record.name,
303
319
  [MANAGED_INSTANCE_ENV.instanceId]: record.instanceId,
304
320
  [MANAGED_INSTANCE_ENV.launchId]: record.launch.launchId,
@@ -464,10 +480,12 @@ function overridesDiffer(
464
480
  action: Extract<InstanceAction, { kind: "start" | "restart" }>,
465
481
  ): boolean {
466
482
  const { overrides } = action;
483
+ if (overrides.backend !== null && overrides.backend !== record.backend) return true;
467
484
  if (overrides.port !== null && overrides.port !== record.publicPort) return true;
468
485
  if (overrides.basePath !== null && overrides.basePath !== record.basePath) return true;
469
486
  if (overrides.host !== null && overrides.host !== record.host) return true;
470
487
  if (overrides.captureMode !== null && overrides.captureMode !== record.captureMode) return true;
488
+ if (overrides.uiEnabled !== null && overrides.uiEnabled !== record.uiEnabled) return true;
471
489
  if (overrides.dataDir !== null) {
472
490
  const requested = canonicalizeDataDirectory(overrides.dataDir);
473
491
  const saved = canonicalizeDataDirectory(record.dataDir);
@@ -495,6 +513,8 @@ function updatedRecord(
495
513
  upstreamPort: pair.upstreamPort,
496
514
  basePath: action.overrides.basePath ?? record.basePath,
497
515
  captureMode: action.overrides.captureMode ?? record.captureMode,
516
+ backend: action.overrides.backend ?? record.backend,
517
+ uiEnabled: action.overrides.uiEnabled ?? record.uiEnabled,
498
518
  dataDir,
499
519
  };
500
520
  const parsed = InstanceRecordSchema.safeParse(candidate);
@@ -556,6 +576,8 @@ async function createNewRecord(
556
576
  upstreamPort: pairResult.value.upstreamPort,
557
577
  basePath: action.overrides.basePath ?? getConfiguredBasePath(process.env),
558
578
  captureMode: action.overrides.captureMode ?? DEFAULT_INSTANCE_CAPTURE_MODE,
579
+ backend: action.overrides.backend ?? "typescript",
580
+ uiEnabled: action.overrides.uiEnabled ?? true,
559
581
  dataDir: dataDirResult.value,
560
582
  });
561
583
  return created.kind === "error" ? fromRegistry(created) : saveRecord(root, created.value);
@@ -609,7 +631,9 @@ async function startAction(
609
631
  }
610
632
  const live = await classifyRecord(record, deps);
611
633
  if (live.state === "running") {
612
- if (action.overrides.open) (deps.openUrl ?? defaultOpenUrl)(recordUrls(record).ui);
634
+ if (action.overrides.open && record.uiEnabled) {
635
+ (deps.openUrl ?? defaultOpenUrl)(recordUrls(record).ui);
636
+ }
613
637
  return success(operationOutput("start", "already_running", statusOutput(record, live)));
614
638
  }
615
639
  if (live.state === "conflict") {
@@ -792,10 +816,12 @@ function requestActionOverrides(
792
816
  input: InstanceStartRequest,
793
817
  ): Extract<InstanceAction, { kind: "start" }>["overrides"] {
794
818
  return {
819
+ backend: input.backend ?? null,
795
820
  port: input.port ?? null,
796
- basePath: input.basePath === undefined ? null : normalizeBasePath(input.basePath),
821
+ basePath: input.basePath === undefined ? null : normalizePublicBasePath(input.basePath),
797
822
  host: input.host ?? null,
798
823
  captureMode: input.captureMode ?? null,
824
+ uiEnabled: input.uiEnabled ?? null,
799
825
  dataDir: input.dataDir ?? null,
800
826
  open: false,
801
827
  };
@@ -873,8 +899,10 @@ export async function listNamedInstances(
873
899
  function formatStatus(output: InstanceStatusOutput): string {
874
900
  const pid = output.supervisorPid === null ? "-" : String(output.supervisorPid);
875
901
  const reason = output.stateReason === null ? "-" : output.stateReason;
902
+ const ui = output.uiEnabled ? output.urls.ui : `disabled (configured URL: ${output.urls.ui})`;
876
903
  return `Instance ${output.name}: ${output.state}
877
- UI: ${output.urls.ui}
904
+ UI: ${ui}
905
+ UI enabled: ${output.uiEnabled ? "yes" : "no"}
878
906
  Proxy: ${output.urls.proxy}
879
907
  OpenAI /v1: ${output.urls.openai}
880
908
  MCP: ${output.urls.mcp}
@@ -882,6 +910,7 @@ function formatStatus(output: InstanceStatusOutput): string {
882
910
  Port pair: ${String(output.publicPort)} / ${String(output.upstreamPort)} (private)
883
911
  Base Path: ${output.basePath}
884
912
  Capture mode: ${output.captureMode}
913
+ Backend: ${output.backend}
885
914
  Data directory: ${output.dataDir}
886
915
  Supervisor PID: ${pid}
887
916
  State reason: ${reason}
@@ -1029,9 +1058,3 @@ export async function runInstance(
1029
1058
  }
1030
1059
  }
1031
1060
  }
1032
-
1033
- export const instanceLifecycleForTests = {
1034
- classifyRecord,
1035
- launchArgs,
1036
- statusOutput,
1037
- };