@tonyclaw/agent-inspector 3.0.45 → 3.0.46
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.output/{nitro.json → backend/nitro.json} +3 -3
- package/.output/backend-public/assets/index-D4LX-sw-.js +11 -0
- package/.output/cli.js +2326 -516
- package/.output/server/_libs/extend.mjs +4 -8
- package/.output/server/_libs/jszip.mjs +9 -35
- package/.output/server/_libs/react-dom.mjs +2 -3
- package/.output/server/_libs/react.mjs +1 -27
- package/.output/server/_libs/tanstack__react-router.mjs +1 -329
- package/.output/server/_libs/tanstack__router-core.mjs +42 -100
- package/.output/server/_libs/use-sync-external-store.mjs +1 -64
- package/.output/server/_libs/ws.mjs +1 -1
- package/.output/server/_ssr/index.mjs +4 -4
- package/.output/server/_ssr/{publicBasePathContext-5264L3rX.mjs → publicBasePathContext-IH2ilOfu.mjs} +52 -24
- package/.output/server/_ssr/{router-BJ_ltLim.mjs → router-D18yUq36.mjs} +19770 -19447
- package/.output/server/_ssr/{start-C6MjPjxp.mjs → start-COQu_AgD.mjs} +1 -1
- package/.output/server/_tanstack-start-manifest_v-DnbdNeun.mjs +4 -0
- package/.output/server/index.mjs +5 -145
- package/.output/{public/assets/CompareDrawer-B3_TLTJh.js → ui/assets/CompareDrawer-DAUuIJ6G.js} +1 -1
- package/.output/{public/assets/InspectorPet-Cpn6hv4P.js → ui/assets/InspectorPet-BRBVjOWI.js} +1 -1
- package/.output/ui/assets/ProxyViewerContainer-D7Sq0ctc.js +59 -0
- package/.output/{public/assets/ReplayDialog-B3EKVdJk.js → ui/assets/ReplayDialog-nDLsjOhs.js} +1 -1
- package/.output/{public/assets/RequestAnatomy-COOQjyUC.js → ui/assets/RequestAnatomy-zd4BDgL0.js} +1 -1
- package/.output/ui/assets/ResponseView-AdIXGcSn.js +2 -0
- package/.output/ui/assets/StreamingChunkSequence-CesTz8He.js +1 -0
- package/.output/{public/assets/_sessionId-zbgYl7ZJ.js → ui/assets/_sessionId-BAfzrhSU.js} +1 -1
- package/.output/{public/assets/_sessionId-BJlM3nmt.js → ui/assets/_sessionId-QnBomgPD.js} +1 -1
- package/.output/ui/assets/favicon-DYEkHSNl.svg +21 -0
- package/.output/{public/assets/index-BIK4bPTv.js → ui/assets/index-BcsdxBAd.js} +1 -1
- package/.output/ui/assets/index-BvXp42al.css +1 -0
- package/.output/{public/assets/index-D2Qw6Ri2.js → ui/assets/index-D0rtCN9V.js} +1 -1
- package/.output/ui/assets/index-DHpwr08Z.js +73 -0
- package/.output/{public/assets/index-xF_NY8Yb.js → ui/assets/index-dNuk2dsU.js} +5 -5
- package/.output/ui/assets/json-viewer-BvFHglMb.js +1 -0
- package/.output/{public/assets/jszip.min-B_rfAUCe.js → ui/assets/jszip.min-B5Z7gNZB.js} +1 -1
- package/.output/ui/index.html +229 -0
- package/.output/ui/runtime-config.js +2 -0
- package/.output/workers/logFinalizer.worker.js +979 -414
- package/.output/workers/sessionWorkerEntry.js +979 -414
- package/README.md +175 -43
- package/docs/instance-control.openapi.yaml +59 -4
- package/package.json +25 -5
- package/scripts/generate-theme-scales.mjs +3 -3
- package/src/{router.tsx → backend/router.tsx} +3 -15
- package/src/backend/routes/$.ts +26 -0
- package/src/backend/routes/__root.ts +4 -0
- package/src/{routes → backend/routes}/api/-instances.ts +3 -3
- package/src/{routes → backend/routes}/api/alerts.summary.ts +3 -3
- package/src/{routes → backend/routes}/api/alerts.ts +4 -4
- package/src/{routes → backend/routes}/api/config.paths.ts +1 -1
- package/src/{routes → backend/routes}/api/config.ts +11 -2
- package/src/{routes → backend/routes}/api/ecosystem.packages.$packageId.help.ts +1 -1
- package/src/{routes → backend/routes}/api/ecosystem.packages.$packageId.install.ts +1 -1
- package/src/{routes → backend/routes}/api/ecosystem.packages.$packageId.runner-presets.ts +1 -1
- package/src/{routes → backend/routes}/api/ecosystem.packages.$packageId.upgrade.ts +1 -1
- package/src/{routes → backend/routes}/api/ecosystem.packages.ts +5 -1
- package/src/{routes → backend/routes}/api/ecosystem.recipes.$recipeId.run.ts +1 -1
- package/src/{routes → backend/routes}/api/ecosystem.tasks.$taskId.ts +1 -1
- package/src/{routes → backend/routes}/api/ecosystem.tasks.ts +1 -1
- package/src/{routes → backend/routes}/api/groups.$groupId.evidence.ts +2 -2
- package/src/{routes → backend/routes}/api/groups.$groupId.sessions.ts +2 -2
- package/src/{routes → backend/routes}/api/groups.$groupId.ts +2 -2
- package/src/{routes → backend/routes}/api/groups.ts +2 -2
- package/src/{routes → backend/routes}/api/health.ts +3 -3
- package/src/{routes → backend/routes}/api/instances.$name.connection.ts +1 -1
- package/src/{routes → backend/routes}/api/instances.$name.restart.ts +2 -2
- package/src/{routes → backend/routes}/api/instances.$name.start.ts +2 -2
- package/src/{routes → backend/routes}/api/instances.$name.stop.ts +2 -2
- package/src/{routes → backend/routes}/api/instances.$name.ts +1 -1
- package/src/{routes → backend/routes}/api/instances.ts +1 -1
- package/src/{routes → backend/routes}/api/knowledge.candidates.$candidateId.promote.ts +2 -2
- package/src/{routes → backend/routes}/api/knowledge.candidates.$candidateId.ts +2 -2
- package/src/{routes → backend/routes}/api/knowledge.candidates.ts +1 -1
- package/src/{routes → backend/routes}/api/knowledge.project-context.ts +2 -2
- package/src/{routes → backend/routes}/api/knowledge.search.ts +2 -2
- package/src/{routes → backend/routes}/api/knowledge.sessions.$sessionId.candidates.ts +3 -3
- package/src/{routes → backend/routes}/api/logs.$id.body.ts +6 -6
- package/src/{routes → backend/routes}/api/logs.$id.chunks.ts +5 -4
- package/src/{routes → backend/routes}/api/logs.$id.replay.ts +12 -11
- package/src/{routes → backend/routes}/api/logs.$id.ts +4 -3
- package/src/{routes → backend/routes}/api/logs.import.ts +3 -3
- package/src/{routes → backend/routes}/api/logs.stream.ts +11 -7
- package/src/{routes → backend/routes}/api/logs.ts +17 -9
- package/src/{routes → backend/routes}/api/mcp.ts +1 -1
- package/src/{routes → backend/routes}/api/models.ts +1 -1
- package/src/{routes → backend/routes}/api/pi-agent.ts +2 -2
- package/src/{routes → backend/routes}/api/providers.$providerId.model-metadata.ts +5 -5
- package/src/{routes → backend/routes}/api/providers.$providerId.test.log.ts +7 -7
- package/src/{routes → backend/routes}/api/providers.$providerId.ts +4 -4
- package/src/{routes → backend/routes}/api/providers.export.ts +1 -1
- package/src/{routes → backend/routes}/api/providers.import.ts +3 -3
- package/src/{routes → backend/routes}/api/providers.scan.ts +2 -2
- package/src/{routes → backend/routes}/api/providers.ts +9 -4
- package/src/{routes → backend/routes}/api/runs.$runId.evidence.ts +2 -2
- package/src/{routes → backend/routes}/api/runs.$runId.ts +2 -2
- package/src/{routes → backend/routes}/api/runs.ts +4 -4
- package/src/backend/routes/api/runtime.ts +46 -0
- package/src/{routes → backend/routes}/api/sessions.ts +3 -3
- package/src/{routes → backend/routes}/proxy/$.ts +1 -1
- package/src/{routes → backend/routes}/readyz.ts +1 -1
- package/src/{start.ts → backend/start.ts} +1 -1
- package/src/cli/alias.ts +2 -11
- package/src/cli/doctor.ts +32 -9
- package/src/cli/instance.ts +26 -13
- package/src/cli/instanceArgs.ts +30 -11
- package/src/cli/instanceControl.ts +0 -2
- package/src/cli/instanceModel.ts +9 -17
- package/src/cli/instanceRegistry.ts +0 -9
- package/src/cli/networkHints.ts +27 -14
- package/src/cli/onboard.ts +69 -2
- package/src/cli/onboardTarget.ts +89 -40
- package/src/cli/templates/codex-skill-onboard.ts +44 -14
- package/src/cli/templates/skill-onboard.ts +64 -28
- package/src/cli.ts +184 -61
- package/src/components/ProxyViewer.tsx +11 -9
- package/src/components/ProxyViewerContainer.tsx +12 -11
- package/src/components/pi-agent/PiAgentPanel.tsx +2 -2
- package/src/components/providers/ProviderCard.tsx +1 -1
- package/src/components/providers/ProviderTestResultsView.tsx +1 -1
- package/src/components/providers/SettingsDialog.tsx +159 -144
- package/src/components/proxy-viewer/ApplicationBar.tsx +2 -1
- package/src/components/proxy-viewer/LogEntry.tsx +1 -1
- package/src/components/proxy-viewer/log-formats/index.ts +1 -1
- package/src/contracts/index.ts +5 -0
- package/src/contracts/log.ts +33 -3
- package/src/knowledge/types.ts +3 -2
- package/src/lib/alertContract.ts +2 -2
- package/src/lib/apiClient.ts +30 -7
- package/src/lib/apiFormat.ts +29 -0
- package/src/lib/basePath.ts +29 -11
- package/src/lib/browserRuntimeContract.ts +124 -0
- package/src/lib/browserRuntimeResolver.ts +244 -0
- package/src/{proxy → lib}/claudeCodeStrip.ts +6 -7
- package/src/lib/codingAgentEndpoints.ts +38 -0
- package/src/lib/instanceContract.ts +27 -11
- package/src/lib/piAgentContract.ts +3 -2
- package/src/lib/publicBasePathContext.ts +40 -10
- package/src/lib/resourceLimits.ts +2 -0
- package/src/lib/runContract.ts +3 -3
- package/src/lib/sessionInfoContract.ts +3 -2
- package/src/mcp/instanceHandlers.ts +1 -0
- package/src/mcp/server.ts +19 -24
- package/src/proxy/config.ts +25 -30
- package/src/proxy/dataDir.ts +43 -7
- package/src/proxy/ecosystemTasks.ts +161 -70
- package/src/proxy/formats/registry.ts +6 -21
- package/src/proxy/handler.ts +129 -29
- package/src/proxy/identityProxy.ts +419 -39
- package/src/proxy/jsonlRecovery.ts +554 -0
- package/src/proxy/logFinalizer.ts +25 -10
- package/src/proxy/logImporter.ts +2 -1
- package/src/proxy/logIndex.ts +191 -95
- package/src/proxy/logger.ts +77 -14
- package/src/proxy/platformCommands.ts +41 -0
- package/src/proxy/privateDataPath.ts +310 -88
- package/src/proxy/rawStreamCapture.ts +194 -13
- package/src/proxy/runtimeAdmission.ts +5 -2
- package/src/proxy/runtimeHealth.ts +14 -1
- package/src/proxy/runtimeShutdown.ts +11 -1
- package/src/proxy/schemas.ts +7 -1
- package/src/proxy/sessionArchive.ts +78 -14
- package/src/proxy/sqliteLogIndex.ts +65 -2
- package/src/proxy/store.ts +141 -34
- package/src/proxy/uiAssetServer.ts +106 -0
- package/src/proxy/upstream.ts +29 -2
- package/src/ui/bootstrap.ts +167 -0
- package/src/ui/index.html +38 -0
- package/src/ui/logsStreamClient.ts +20 -0
- package/src/ui/main.tsx +13 -0
- package/src/ui/public/runtime-config.js +2 -0
- package/src/ui/router.tsx +13 -0
- package/src/ui/routes/__root.tsx +69 -0
- package/src/{routes → ui/routes}/index.tsx +2 -3
- package/src/{routes → ui/routes}/session/$sessionId.tsx +5 -11
- package/src/ui/runtimeDiscovery.ts +50 -0
- package/styles/globals.css +1 -0
- package/.output/public/assets/ProxyViewerContainer-BEAhuGOJ.js +0 -126
- package/.output/public/assets/ResponseView-DBCjkwye.js +0 -2
- package/.output/public/assets/StreamingChunkSequence-CuXhDgMo.js +0 -1
- package/.output/public/assets/index-BZo_8koU.js +0 -70
- package/.output/public/assets/index-ZWschkCh.css +0 -1
- package/.output/public/assets/json-viewer-B-Ao6pwW.js +0 -1
- package/.output/server/_libs/@radix-ui/react-accessible-icon+[...].mjs +0 -1
- package/.output/server/_libs/@radix-ui/react-dismissable-layer+[...].mjs +0 -344
- package/.output/server/_libs/@radix-ui/react-navigation-menu+[...].mjs +0 -2
- package/.output/server/_libs/@radix-ui/react-one-time-password-field+[...].mjs +0 -2
- package/.output/server/_libs/@radix-ui/react-password-toggle-field+[...].mjs +0 -2
- package/.output/server/_libs/@radix-ui/react-use-callback-ref+[...].mjs +0 -11
- package/.output/server/_libs/@radix-ui/react-use-controllable-state+[...].mjs +0 -69
- package/.output/server/_libs/@radix-ui/react-use-effect-event+[...].mjs +0 -1
- package/.output/server/_libs/@radix-ui/react-use-is-hydrated+[...].mjs +0 -28
- package/.output/server/_libs/@radix-ui/react-use-layout-effect+[...].mjs +0 -6
- package/.output/server/_libs/@radix-ui/react-visually-hidden+[...].mjs +0 -34
- package/.output/server/_libs/aria-hidden.mjs +0 -122
- package/.output/server/_libs/bail.mjs +0 -8
- package/.output/server/_libs/character-entities.mjs +0 -2130
- package/.output/server/_libs/class-variance-authority.mjs +0 -44
- package/.output/server/_libs/clsx.mjs +0 -16
- package/.output/server/_libs/comma-separated-tokens.mjs +0 -10
- package/.output/server/_libs/decode-named-character-reference+[...].mjs +0 -8
- package/.output/server/_libs/dequal.mjs +0 -27
- package/.output/server/_libs/detect-node-es.mjs +0 -1
- package/.output/server/_libs/devlop.mjs +0 -8
- package/.output/server/_libs/diff.mjs +0 -320
- package/.output/server/_libs/estree-util-is-identifier-name.mjs +0 -11
- package/.output/server/_libs/floating-ui__core.mjs +0 -725
- package/.output/server/_libs/floating-ui__dom.mjs +0 -622
- package/.output/server/_libs/floating-ui__react-dom.mjs +0 -292
- package/.output/server/_libs/floating-ui__utils.mjs +0 -320
- package/.output/server/_libs/get-nonce.mjs +0 -9
- package/.output/server/_libs/hast-util-to-jsx-runtime.mjs +0 -388
- package/.output/server/_libs/hast-util-whitespace.mjs +0 -10
- package/.output/server/_libs/html-url-attributes.mjs +0 -26
- package/.output/server/_libs/inline-style-parser.mjs +0 -142
- package/.output/server/_libs/is-plain-obj.mjs +0 -10
- package/.output/server/_libs/lucide-react.mjs +0 -1027
- package/.output/server/_libs/mdast-util-from-markdown.mjs +0 -717
- package/.output/server/_libs/mdast-util-to-hast.mjs +0 -710
- package/.output/server/_libs/mdast-util-to-string.mjs +0 -38
- package/.output/server/_libs/micromark-core-commonmark.mjs +0 -2259
- package/.output/server/_libs/micromark-factory-destination.mjs +0 -94
- package/.output/server/_libs/micromark-factory-label.mjs +0 -63
- package/.output/server/_libs/micromark-factory-space.mjs +0 -24
- package/.output/server/_libs/micromark-factory-title.mjs +0 -65
- package/.output/server/_libs/micromark-factory-whitespace.mjs +0 -22
- package/.output/server/_libs/micromark-util-character.mjs +0 -44
- package/.output/server/_libs/micromark-util-chunked.mjs +0 -36
- package/.output/server/_libs/micromark-util-classify-character+[...].mjs +0 -12
- package/.output/server/_libs/micromark-util-combine-extensions+[...].mjs +0 -41
- package/.output/server/_libs/micromark-util-decode-numeric-character-reference+[...].mjs +0 -19
- package/.output/server/_libs/micromark-util-decode-string.mjs +0 -21
- package/.output/server/_libs/micromark-util-encode.mjs +0 -1
- package/.output/server/_libs/micromark-util-html-tag-name.mjs +0 -69
- package/.output/server/_libs/micromark-util-normalize-identifier+[...].mjs +0 -6
- package/.output/server/_libs/micromark-util-resolve-all.mjs +0 -15
- package/.output/server/_libs/micromark-util-sanitize-uri.mjs +0 -41
- package/.output/server/_libs/micromark-util-subtokenize.mjs +0 -346
- package/.output/server/_libs/micromark.mjs +0 -906
- package/.output/server/_libs/property-information.mjs +0 -1209
- package/.output/server/_libs/radix-ui.mjs +0 -1
- package/.output/server/_libs/radix-ui__number.mjs +0 -6
- package/.output/server/_libs/radix-ui__primitive.mjs +0 -11
- package/.output/server/_libs/radix-ui__react-accordion.mjs +0 -1
- package/.output/server/_libs/radix-ui__react-alert-dialog.mjs +0 -1
- package/.output/server/_libs/radix-ui__react-arrow.mjs +0 -23
- package/.output/server/_libs/radix-ui__react-aspect-ratio.mjs +0 -1
- package/.output/server/_libs/radix-ui__react-avatar.mjs +0 -1
- package/.output/server/_libs/radix-ui__react-checkbox.mjs +0 -1
- package/.output/server/_libs/radix-ui__react-collapsible.mjs +0 -144
- package/.output/server/_libs/radix-ui__react-collection.mjs +0 -69
- package/.output/server/_libs/radix-ui__react-compose-refs.mjs +0 -38
- package/.output/server/_libs/radix-ui__react-context-menu.mjs +0 -1
- package/.output/server/_libs/radix-ui__react-context.mjs +0 -64
- package/.output/server/_libs/radix-ui__react-dialog.mjs +0 -280
- package/.output/server/_libs/radix-ui__react-direction.mjs +0 -9
- package/.output/server/_libs/radix-ui__react-dropdown-menu.mjs +0 -1
- package/.output/server/_libs/radix-ui__react-focus-guards.mjs +0 -39
- package/.output/server/_libs/radix-ui__react-focus-scope.mjs +0 -210
- package/.output/server/_libs/radix-ui__react-form.mjs +0 -1
- package/.output/server/_libs/radix-ui__react-hover-card.mjs +0 -1
- package/.output/server/_libs/radix-ui__react-id.mjs +0 -14
- package/.output/server/_libs/radix-ui__react-label.mjs +0 -1
- package/.output/server/_libs/radix-ui__react-menu.mjs +0 -1
- package/.output/server/_libs/radix-ui__react-menubar.mjs +0 -1
- package/.output/server/_libs/radix-ui__react-popover.mjs +0 -1
- package/.output/server/_libs/radix-ui__react-popper.mjs +0 -340
- package/.output/server/_libs/radix-ui__react-portal.mjs +0 -16
- package/.output/server/_libs/radix-ui__react-presence.mjs +0 -173
- package/.output/server/_libs/radix-ui__react-primitive.mjs +0 -42
- package/.output/server/_libs/radix-ui__react-progress.mjs +0 -1
- package/.output/server/_libs/radix-ui__react-radio-group.mjs +0 -1
- package/.output/server/_libs/radix-ui__react-roving-focus.mjs +0 -235
- package/.output/server/_libs/radix-ui__react-scroll-area.mjs +0 -731
- package/.output/server/_libs/radix-ui__react-select.mjs +0 -1207
- package/.output/server/_libs/radix-ui__react-separator.mjs +0 -28
- package/.output/server/_libs/radix-ui__react-slider.mjs +0 -1
- package/.output/server/_libs/radix-ui__react-slot.mjs +0 -132
- package/.output/server/_libs/radix-ui__react-switch.mjs +0 -1
- package/.output/server/_libs/radix-ui__react-tabs.mjs +0 -194
- package/.output/server/_libs/radix-ui__react-toast.mjs +0 -2
- package/.output/server/_libs/radix-ui__react-toggle-group.mjs +0 -1
- package/.output/server/_libs/radix-ui__react-toggle.mjs +0 -1
- package/.output/server/_libs/radix-ui__react-toolbar.mjs +0 -1
- package/.output/server/_libs/radix-ui__react-tooltip.mjs +0 -498
- package/.output/server/_libs/radix-ui__react-use-previous.mjs +0 -14
- package/.output/server/_libs/radix-ui__react-use-size.mjs +0 -39
- package/.output/server/_libs/react-markdown.mjs +0 -235
- package/.output/server/_libs/react-remove-scroll-bar.mjs +0 -82
- package/.output/server/_libs/react-remove-scroll.mjs +0 -328
- package/.output/server/_libs/react-style-singleton.mjs +0 -69
- package/.output/server/_libs/remark-parse.mjs +0 -19
- package/.output/server/_libs/remark-rehype.mjs +0 -21
- package/.output/server/_libs/space-separated-tokens.mjs +0 -6
- package/.output/server/_libs/style-to-js.mjs +0 -72
- package/.output/server/_libs/style-to-object.mjs +0 -38
- package/.output/server/_libs/swr.mjs +0 -947
- package/.output/server/_libs/tailwind-merge.mjs +0 -3255
- package/.output/server/_libs/tanstack__react-virtual.mjs +0 -130
- package/.output/server/_libs/tanstack__virtual-core.mjs +0 -1319
- package/.output/server/_libs/three.mjs +0 -26016
- package/.output/server/_libs/trim-lines.mjs +0 -41
- package/.output/server/_libs/trough.mjs +0 -85
- package/.output/server/_libs/tslib.mjs +0 -1
- package/.output/server/_libs/ungap__structured-clone.mjs +0 -212
- package/.output/server/_libs/unified.mjs +0 -661
- package/.output/server/_libs/unist-util-is.mjs +0 -100
- package/.output/server/_libs/unist-util-position.mjs +0 -27
- package/.output/server/_libs/unist-util-stringify-position.mjs +0 -27
- package/.output/server/_libs/unist-util-visit-parents.mjs +0 -82
- package/.output/server/_libs/unist-util-visit.mjs +0 -24
- package/.output/server/_libs/use-callback-ref.mjs +0 -66
- package/.output/server/_libs/use-sidecar.mjs +0 -106
- package/.output/server/_libs/vfile-message.mjs +0 -138
- package/.output/server/_libs/vfile.mjs +0 -467
- package/.output/server/_sessionId-CJ99gZFV.mjs +0 -84
- package/.output/server/_sessionId-DEjScBpK.mjs +0 -146
- package/.output/server/_ssr/CompareDrawer-DtOIMeQB.mjs +0 -1060
- package/.output/server/_ssr/InspectorPet-CXc4oCBQ.mjs +0 -938
- package/.output/server/_ssr/ProxyViewerContainer-DVPlwfkt.mjs +0 -17632
- package/.output/server/_ssr/ReplayDialog-BQEA95qC.mjs +0 -725
- package/.output/server/_ssr/RequestAnatomy-BMyd8B7Q.mjs +0 -837
- package/.output/server/_ssr/ResponseView-qrTaEIM8.mjs +0 -757
- package/.output/server/_ssr/StreamingChunkSequence-BFTL8mIy.mjs +0 -274
- package/.output/server/_ssr/index-Bcj1Hcy4.mjs +0 -135
- package/.output/server/_ssr/index-DW-M7XUG.mjs +0 -84
- package/.output/server/_ssr/json-viewer-DiI0Yjsn.mjs +0 -483
- package/.output/server/_tanstack-start-manifest_v-C6pXXX9R.mjs +0 -4
- package/.output/server/node_modules/tslib/modules/index.js +0 -70
- package/.output/server/node_modules/tslib/modules/package.json +0 -3
- package/.output/server/node_modules/tslib/package.json +0 -47
- package/.output/server/node_modules/tslib/tslib.js +0 -484
- package/.output/server/package.json +0 -9
- package/src/routes/__root.tsx +0 -170
- /package/.output/{public → ui}/assets/agent-inspector-58K1_MsC.ico +0 -0
- /package/.output/{public → ui}/assets/alibaba-TTwafVwX.svg +0 -0
- /package/.output/{public → ui}/assets/minimax-BPMzvuL-.jpeg +0 -0
- /package/.output/{public → ui}/assets/qwen-mMn3f5ul.webp +0 -0
- /package/.output/{public → ui}/assets/zhipuai-BPNAnxo-.svg +0 -0
- /package/src/{routes → backend/routes}/livez.ts +0 -0
|
@@ -500,15 +500,6 @@ export function withRegistryLock<T>(
|
|
|
500
500
|
return runWithLock(acquireRegistryLock(root, options), operation);
|
|
501
501
|
}
|
|
502
502
|
|
|
503
|
-
export function withInstanceLock<T>(
|
|
504
|
-
root: string,
|
|
505
|
-
rawName: string,
|
|
506
|
-
operation: LockedOperation<T>,
|
|
507
|
-
options: InstanceLockOptions = {},
|
|
508
|
-
): Promise<InstanceRegistryResult<T>> {
|
|
509
|
-
return runWithLock(acquireInstanceLock(root, rawName, options), operation);
|
|
510
|
-
}
|
|
511
|
-
|
|
512
503
|
type PathApi = typeof win32;
|
|
513
504
|
|
|
514
505
|
export type CanonicalDataDirectory = {
|
package/src/cli/networkHints.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { networkInterfaces } from "node:os";
|
|
2
|
+
import { isIP } from "node:net";
|
|
2
3
|
import { appendBasePathToOrigin, normalizeBasePath } from "../lib/basePath";
|
|
3
4
|
|
|
4
5
|
export type NetworkInterfaceMap = ReturnType<typeof networkInterfaces>;
|
|
@@ -22,12 +23,12 @@ export function isWildcardHost(host: BindHost): boolean {
|
|
|
22
23
|
export function isLoopbackHost(host: BindHost): boolean {
|
|
23
24
|
const trimmed = trimHost(host);
|
|
24
25
|
if (trimmed === undefined) return false;
|
|
25
|
-
|
|
26
|
-
trimmed
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
);
|
|
26
|
+
const normalized =
|
|
27
|
+
trimmed.startsWith("[") && trimmed.endsWith("]")
|
|
28
|
+
? trimmed.slice(1, -1).toLowerCase()
|
|
29
|
+
: trimmed.toLowerCase();
|
|
30
|
+
if (normalized === "localhost" || normalized === "::1") return true;
|
|
31
|
+
return isIP(normalized) === 4 && normalized.split(".", 1)[0] === "127";
|
|
31
32
|
}
|
|
32
33
|
|
|
33
34
|
function bracketIpv6(host: string): string {
|
|
@@ -112,11 +113,28 @@ function accessUrl(origin: string, path: string, basePath: string): string {
|
|
|
112
113
|
return appendBasePathToOrigin(origin, path, basePath);
|
|
113
114
|
}
|
|
114
115
|
|
|
116
|
+
function appendSurfaceLines(
|
|
117
|
+
lines: string[],
|
|
118
|
+
label: "Local" | "Bound" | "Network",
|
|
119
|
+
origin: string,
|
|
120
|
+
basePath: string,
|
|
121
|
+
uiEnabled: boolean,
|
|
122
|
+
): void {
|
|
123
|
+
const baseUrl = accessUrl(origin, "/", basePath);
|
|
124
|
+
if (uiEnabled) lines.push(` ${label} UI: ${baseUrl}`);
|
|
125
|
+
lines.push(` ${label} control Base: ${baseUrl}`);
|
|
126
|
+
lines.push(` ${label} agent Base: ${baseUrl}`);
|
|
127
|
+
lines.push(` ${label} REST API: ${accessUrl(origin, "/api", basePath)}`);
|
|
128
|
+
lines.push(` ${label} proxy: ${accessUrl(origin, "/proxy", basePath)}`);
|
|
129
|
+
lines.push(` ${label} MCP: ${accessUrl(origin, "/api/mcp", basePath)}`);
|
|
130
|
+
}
|
|
131
|
+
|
|
115
132
|
export function formatAccessHintLines(
|
|
116
133
|
port: number,
|
|
117
134
|
networkUrls: readonly string[],
|
|
118
135
|
host: BindHost = undefined,
|
|
119
136
|
basePath = "",
|
|
137
|
+
uiEnabled = true,
|
|
120
138
|
): string[] {
|
|
121
139
|
const normalizedBasePath = normalizeBasePath(basePath);
|
|
122
140
|
const localUrl = localUrlForPort(port);
|
|
@@ -124,14 +142,10 @@ export function formatAccessHintLines(
|
|
|
124
142
|
const lines = ["Access URLs:", ` Bind host: ${hostLabel}`];
|
|
125
143
|
|
|
126
144
|
if (isLoopbackHost(host) || isWildcardHost(host)) {
|
|
127
|
-
lines
|
|
128
|
-
lines.push(` Local proxy: ${accessUrl(localUrl, "/proxy", normalizedBasePath)}`);
|
|
129
|
-
lines.push(` Local MCP: ${accessUrl(localUrl, "/api/mcp", normalizedBasePath)}`);
|
|
145
|
+
appendSurfaceLines(lines, "Local", localUrl, normalizedBasePath, uiEnabled);
|
|
130
146
|
} else {
|
|
131
147
|
const boundUrl = urlForHost(port, host);
|
|
132
|
-
lines
|
|
133
|
-
lines.push(` Bound proxy: ${accessUrl(boundUrl, "/proxy", normalizedBasePath)}`);
|
|
134
|
-
lines.push(` Bound MCP: ${accessUrl(boundUrl, "/api/mcp", normalizedBasePath)}`);
|
|
148
|
+
appendSurfaceLines(lines, "Bound", boundUrl, normalizedBasePath, uiEnabled);
|
|
135
149
|
lines.push(" Localhost: may not work because the server is bound to a specific host");
|
|
136
150
|
}
|
|
137
151
|
|
|
@@ -141,8 +155,7 @@ export function formatAccessHintLines(
|
|
|
141
155
|
} else if (firstNetworkUrl === undefined) {
|
|
142
156
|
lines.push(" Network: no non-loopback IPv4 address detected");
|
|
143
157
|
} else {
|
|
144
|
-
lines
|
|
145
|
-
lines.push(` Network proxy: ${accessUrl(firstNetworkUrl, "/proxy", normalizedBasePath)}`);
|
|
158
|
+
appendSurfaceLines(lines, "Network", firstNetworkUrl, normalizedBasePath, uiEnabled);
|
|
146
159
|
const moreUrls = networkUrls.slice(1);
|
|
147
160
|
if (moreUrls.length > 0) {
|
|
148
161
|
lines.push(` Other IPs: ${moreUrls.join(", ")}`);
|
package/src/cli/onboard.ts
CHANGED
|
@@ -78,6 +78,9 @@ export type OnboardFlags = {
|
|
|
78
78
|
mimoMcpUrl: string | null;
|
|
79
79
|
instanceName: string | null;
|
|
80
80
|
baseUrl: string | null;
|
|
81
|
+
controlBaseUrl: string | null;
|
|
82
|
+
agentBaseUrl: string | null;
|
|
83
|
+
uiUrl: string | null | undefined;
|
|
81
84
|
mcpName: string | null;
|
|
82
85
|
uninstall: boolean;
|
|
83
86
|
status: boolean;
|
|
@@ -212,6 +215,9 @@ function parseFlags(argv: readonly string[]): OnboardFlags {
|
|
|
212
215
|
mimoMcpUrl: null,
|
|
213
216
|
instanceName: null,
|
|
214
217
|
baseUrl: null,
|
|
218
|
+
controlBaseUrl: null,
|
|
219
|
+
agentBaseUrl: null,
|
|
220
|
+
uiUrl: undefined,
|
|
215
221
|
mcpName: null,
|
|
216
222
|
uninstall: false,
|
|
217
223
|
status: false,
|
|
@@ -360,6 +366,39 @@ function parseFlags(argv: readonly string[]): OnboardFlags {
|
|
|
360
366
|
i++;
|
|
361
367
|
break;
|
|
362
368
|
}
|
|
369
|
+
case "--control-base-url": {
|
|
370
|
+
const next = argv[i + 1];
|
|
371
|
+
if (next === undefined || next.trim().length === 0) {
|
|
372
|
+
process.stderr.write("agent-inspector onboard: --control-base-url requires a URL\n");
|
|
373
|
+
process.exit(2);
|
|
374
|
+
}
|
|
375
|
+
flags.controlBaseUrl = next;
|
|
376
|
+
i++;
|
|
377
|
+
break;
|
|
378
|
+
}
|
|
379
|
+
case "--agent-base-url": {
|
|
380
|
+
const next = argv[i + 1];
|
|
381
|
+
if (next === undefined || next.trim().length === 0) {
|
|
382
|
+
process.stderr.write("agent-inspector onboard: --agent-base-url requires a URL\n");
|
|
383
|
+
process.exit(2);
|
|
384
|
+
}
|
|
385
|
+
flags.agentBaseUrl = next;
|
|
386
|
+
i++;
|
|
387
|
+
break;
|
|
388
|
+
}
|
|
389
|
+
case "--ui-url": {
|
|
390
|
+
const next = argv[i + 1];
|
|
391
|
+
if (next === undefined || next.trim().length === 0) {
|
|
392
|
+
process.stderr.write("agent-inspector onboard: --ui-url requires a URL\n");
|
|
393
|
+
process.exit(2);
|
|
394
|
+
}
|
|
395
|
+
flags.uiUrl = next;
|
|
396
|
+
i++;
|
|
397
|
+
break;
|
|
398
|
+
}
|
|
399
|
+
case "--no-ui":
|
|
400
|
+
flags.uiUrl = null;
|
|
401
|
+
break;
|
|
363
402
|
case "--mcp-name": {
|
|
364
403
|
const next = argv[i + 1];
|
|
365
404
|
if (next === undefined || next.trim().length === 0) {
|
|
@@ -440,7 +479,11 @@ Options:
|
|
|
440
479
|
MiMo Code MCP transport to write (default: local)
|
|
441
480
|
--mimo-mcp-url <url> Agent Inspector MCP endpoint for MiMo Code
|
|
442
481
|
--instance <name> Target a registered named Inspector instance
|
|
443
|
-
--base-url <url> Target an explicit credential-free
|
|
482
|
+
--base-url <url> Target an explicit credential-free backend control/agent Base URL
|
|
483
|
+
--control-base-url <url> Control API Base URL for a separated deployment
|
|
484
|
+
--agent-base-url <url> Proxy and MCP Base URL for Coding Agents
|
|
485
|
+
--ui-url <url> Browser UI URL for a separated deployment
|
|
486
|
+
--no-ui Declare that the explicit target has no browser UI
|
|
444
487
|
--mcp-name <name> MCP config key (named default: agent-inspector-<instance>)
|
|
445
488
|
--uninstall Remove generated files whose version matches this package
|
|
446
489
|
--status Show installed onboarding file versions and suggested action
|
|
@@ -533,7 +576,22 @@ function onboardSelectionArguments(flags: OnboardFlags, target: OnboardTarget):
|
|
|
533
576
|
if (target.kind === "instance" && target.instanceName !== null) {
|
|
534
577
|
args.push("--instance", target.instanceName);
|
|
535
578
|
} else if (target.kind === "base-url") {
|
|
536
|
-
|
|
579
|
+
const usedSharedBaseUrl =
|
|
580
|
+
flags.baseUrl !== null &&
|
|
581
|
+
flags.controlBaseUrl === null &&
|
|
582
|
+
flags.agentBaseUrl === null &&
|
|
583
|
+
flags.uiUrl === undefined;
|
|
584
|
+
if (usedSharedBaseUrl) {
|
|
585
|
+
args.push("--base-url", target.baseUrl);
|
|
586
|
+
} else {
|
|
587
|
+
args.push("--control-base-url", target.controlBaseUrl);
|
|
588
|
+
args.push("--agent-base-url", target.agentBaseUrl);
|
|
589
|
+
if (target.uiUrl === null) {
|
|
590
|
+
args.push("--no-ui");
|
|
591
|
+
} else {
|
|
592
|
+
args.push("--ui-url", target.uiUrl);
|
|
593
|
+
}
|
|
594
|
+
}
|
|
537
595
|
}
|
|
538
596
|
if (flags.mcpName !== null) args.push("--mcp-name", target.mcpName);
|
|
539
597
|
return args.length === 0 ? "" : ` ${args.join(" ")}`;
|
|
@@ -1202,6 +1260,9 @@ function buildPlannedFiles(
|
|
|
1202
1260
|
version,
|
|
1203
1261
|
port: onboardTarget.port,
|
|
1204
1262
|
baseUrl: onboardTarget.baseUrl,
|
|
1263
|
+
controlBaseUrl: onboardTarget.controlBaseUrl,
|
|
1264
|
+
agentBaseUrl: onboardTarget.agentBaseUrl,
|
|
1265
|
+
uiUrl: onboardTarget.uiUrl,
|
|
1205
1266
|
mcpName: onboardTarget.mcpName,
|
|
1206
1267
|
targetKind: onboardTarget.kind,
|
|
1207
1268
|
instanceName: onboardTarget.instanceName,
|
|
@@ -1215,6 +1276,9 @@ function buildPlannedFiles(
|
|
|
1215
1276
|
version,
|
|
1216
1277
|
port: onboardTarget.port,
|
|
1217
1278
|
baseUrl: onboardTarget.baseUrl,
|
|
1279
|
+
controlBaseUrl: onboardTarget.controlBaseUrl,
|
|
1280
|
+
agentBaseUrl: onboardTarget.agentBaseUrl,
|
|
1281
|
+
uiUrl: onboardTarget.uiUrl,
|
|
1218
1282
|
mcpName: onboardTarget.mcpName,
|
|
1219
1283
|
targetKind: onboardTarget.kind,
|
|
1220
1284
|
instanceName: onboardTarget.instanceName,
|
|
@@ -1449,6 +1513,9 @@ function runOnboardSync(argv: readonly string[]): number {
|
|
|
1449
1513
|
const resolvedTarget = resolveOnboardTarget({
|
|
1450
1514
|
instanceName: flags.instanceName,
|
|
1451
1515
|
baseUrl: flags.baseUrl,
|
|
1516
|
+
controlBaseUrl: flags.controlBaseUrl,
|
|
1517
|
+
agentBaseUrl: flags.agentBaseUrl,
|
|
1518
|
+
uiUrl: flags.uiUrl,
|
|
1452
1519
|
mcpName: flags.mcpName,
|
|
1453
1520
|
});
|
|
1454
1521
|
if (!resolvedTarget.ok) {
|
package/src/cli/onboardTarget.ts
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { appendBasePathToOrigin, getConfiguredBasePath } from "../lib/basePath.js";
|
|
2
|
+
import { normalizeBrowserRuntimeBaseUrl } from "../lib/browserRuntimeContract.js";
|
|
2
3
|
import { getInstancesRoot, readInstanceRecord, validateInstanceName } from "./instanceRegistry.js";
|
|
3
4
|
import { urlForHost } from "./networkHints.js";
|
|
4
5
|
|
|
5
6
|
const DEFAULT_PORT = 9527;
|
|
6
7
|
const DEFAULT_ORIGIN = `http://localhost:${String(DEFAULT_PORT)}`;
|
|
8
|
+
const AGENT_INSPECTOR_PUBLIC_ORIGIN_ENV = "AGENT_INSPECTOR_PUBLIC_ORIGIN";
|
|
7
9
|
const MCP_NAME_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/u;
|
|
8
10
|
|
|
9
11
|
type OnboardTargetEnv = Readonly<Record<string, string | undefined>>;
|
|
@@ -15,6 +17,10 @@ export type OnboardTarget = {
|
|
|
15
17
|
instanceName: string | null;
|
|
16
18
|
mcpName: string;
|
|
17
19
|
port: number;
|
|
20
|
+
uiUrl: string | null;
|
|
21
|
+
controlBaseUrl: string;
|
|
22
|
+
agentBaseUrl: string;
|
|
23
|
+
/** @deprecated Compatibility alias for controlBaseUrl. */
|
|
18
24
|
baseUrl: string;
|
|
19
25
|
apiUrl: string;
|
|
20
26
|
healthUrl: string;
|
|
@@ -26,6 +32,9 @@ export type OnboardTarget = {
|
|
|
26
32
|
export type OnboardTargetOptions = {
|
|
27
33
|
instanceName: string | null;
|
|
28
34
|
baseUrl: string | null;
|
|
35
|
+
controlBaseUrl?: string | null;
|
|
36
|
+
agentBaseUrl?: string | null;
|
|
37
|
+
uiUrl?: string | null;
|
|
29
38
|
mcpName: string | null;
|
|
30
39
|
};
|
|
31
40
|
|
|
@@ -33,24 +42,29 @@ export type OnboardTargetResult =
|
|
|
33
42
|
| { ok: true; target: OnboardTarget }
|
|
34
43
|
| { ok: false; message: string };
|
|
35
44
|
|
|
36
|
-
function
|
|
45
|
+
function targetFromSurfaces(
|
|
37
46
|
kind: OnboardTargetKind,
|
|
38
47
|
instanceName: string | null,
|
|
39
48
|
mcpName: string,
|
|
40
49
|
port: number,
|
|
41
|
-
|
|
50
|
+
controlBaseUrl: string,
|
|
51
|
+
agentBaseUrl: string,
|
|
52
|
+
uiUrl: string | null,
|
|
42
53
|
): OnboardTarget {
|
|
43
54
|
return {
|
|
44
55
|
kind,
|
|
45
56
|
instanceName,
|
|
46
57
|
mcpName,
|
|
47
58
|
port,
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
59
|
+
uiUrl,
|
|
60
|
+
controlBaseUrl,
|
|
61
|
+
agentBaseUrl,
|
|
62
|
+
baseUrl: controlBaseUrl,
|
|
63
|
+
apiUrl: `${controlBaseUrl}/api`,
|
|
64
|
+
healthUrl: `${controlBaseUrl}/api/health`,
|
|
65
|
+
anthropicProxyUrl: `${agentBaseUrl}/proxy`,
|
|
66
|
+
openAiProxyUrl: `${agentBaseUrl}/proxy/v1`,
|
|
67
|
+
mcpUrl: `${agentBaseUrl}/api/mcp`,
|
|
54
68
|
};
|
|
55
69
|
}
|
|
56
70
|
|
|
@@ -60,31 +74,33 @@ function validateMcpName(rawName: string): string | null {
|
|
|
60
74
|
}
|
|
61
75
|
|
|
62
76
|
function normalizeExplicitBaseUrl(rawBaseUrl: string): { baseUrl: string; port: number } | null {
|
|
63
|
-
const
|
|
64
|
-
if (
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
77
|
+
const baseUrl = normalizeBrowserRuntimeBaseUrl(rawBaseUrl);
|
|
78
|
+
if (baseUrl === null) return null;
|
|
79
|
+
try {
|
|
80
|
+
const parsed = new URL(baseUrl);
|
|
81
|
+
const defaultPort = parsed.protocol === "https:" ? 443 : 80;
|
|
82
|
+
const port = parsed.port === "" ? defaultPort : Number(parsed.port);
|
|
83
|
+
return Number.isInteger(port) && port >= 1 && port <= 65_535 ? { baseUrl, port } : null;
|
|
84
|
+
} catch {
|
|
70
85
|
return null;
|
|
71
86
|
}
|
|
87
|
+
}
|
|
72
88
|
|
|
89
|
+
function normalizePublicOrigin(rawOrigin: string): string | null {
|
|
90
|
+
if (rawOrigin.trim() !== rawOrigin) return null;
|
|
73
91
|
try {
|
|
74
|
-
const parsed = new URL(
|
|
92
|
+
const parsed = new URL(rawOrigin);
|
|
75
93
|
if (
|
|
76
94
|
(parsed.protocol !== "http:" && parsed.protocol !== "https:") ||
|
|
77
|
-
parsed.hostname.length === 0 ||
|
|
78
95
|
parsed.username.length > 0 ||
|
|
79
|
-
parsed.password.length > 0
|
|
96
|
+
parsed.password.length > 0 ||
|
|
97
|
+
parsed.pathname !== "/" ||
|
|
98
|
+
parsed.search.length > 0 ||
|
|
99
|
+
parsed.hash.length > 0
|
|
80
100
|
) {
|
|
81
101
|
return null;
|
|
82
102
|
}
|
|
83
|
-
|
|
84
|
-
const baseUrl = `${parsed.origin}${pathname === "" ? "" : pathname}`;
|
|
85
|
-
const defaultPort = parsed.protocol === "https:" ? 443 : 80;
|
|
86
|
-
const port = parsed.port === "" ? defaultPort : Number(parsed.port);
|
|
87
|
-
return Number.isInteger(port) && port >= 1 && port <= 65_535 ? { baseUrl, port } : null;
|
|
103
|
+
return parsed.origin;
|
|
88
104
|
} catch {
|
|
89
105
|
return null;
|
|
90
106
|
}
|
|
@@ -94,10 +110,16 @@ export function resolveOnboardTarget(
|
|
|
94
110
|
options: OnboardTargetOptions,
|
|
95
111
|
env: OnboardTargetEnv = process.env,
|
|
96
112
|
): OnboardTargetResult {
|
|
97
|
-
|
|
113
|
+
const hasExplicitSurface =
|
|
114
|
+
options.baseUrl !== null ||
|
|
115
|
+
(options.controlBaseUrl !== null && options.controlBaseUrl !== undefined) ||
|
|
116
|
+
(options.agentBaseUrl !== null && options.agentBaseUrl !== undefined) ||
|
|
117
|
+
options.uiUrl !== undefined;
|
|
118
|
+
if (options.instanceName !== null && hasExplicitSurface) {
|
|
98
119
|
return {
|
|
99
120
|
ok: false,
|
|
100
|
-
message:
|
|
121
|
+
message:
|
|
122
|
+
"--instance and explicit --base-url/--control-base-url/--agent-base-url/--ui-url options are mutually exclusive",
|
|
101
123
|
};
|
|
102
124
|
}
|
|
103
125
|
|
|
@@ -110,23 +132,39 @@ export function resolveOnboardTarget(
|
|
|
110
132
|
};
|
|
111
133
|
}
|
|
112
134
|
|
|
113
|
-
if (
|
|
114
|
-
const
|
|
115
|
-
|
|
135
|
+
if (hasExplicitSurface) {
|
|
136
|
+
const sharedRaw = options.baseUrl;
|
|
137
|
+
const controlRaw = options.controlBaseUrl ?? sharedRaw ?? options.agentBaseUrl;
|
|
138
|
+
const agentRaw = options.agentBaseUrl ?? sharedRaw ?? options.controlBaseUrl;
|
|
139
|
+
const control =
|
|
140
|
+
controlRaw === null || controlRaw === undefined ? null : normalizeExplicitBaseUrl(controlRaw);
|
|
141
|
+
const agent =
|
|
142
|
+
agentRaw === null || agentRaw === undefined ? null : normalizeExplicitBaseUrl(agentRaw);
|
|
143
|
+
const ui =
|
|
144
|
+
options.uiUrl === undefined || options.uiUrl === null
|
|
145
|
+
? null
|
|
146
|
+
: normalizeExplicitBaseUrl(options.uiUrl);
|
|
147
|
+
if (
|
|
148
|
+
control === null ||
|
|
149
|
+
agent === null ||
|
|
150
|
+
(options.uiUrl !== undefined && options.uiUrl !== null && ui === null)
|
|
151
|
+
) {
|
|
116
152
|
return {
|
|
117
153
|
ok: false,
|
|
118
154
|
message:
|
|
119
|
-
"
|
|
155
|
+
"Explicit UI, control, and agent Base URLs must be credential-free HTTP(S) URLs without a query or fragment",
|
|
120
156
|
};
|
|
121
157
|
}
|
|
122
158
|
return {
|
|
123
159
|
ok: true,
|
|
124
|
-
target:
|
|
160
|
+
target: targetFromSurfaces(
|
|
125
161
|
"base-url",
|
|
126
162
|
null,
|
|
127
163
|
explicitMcpName ?? "agent-inspector",
|
|
128
|
-
|
|
129
|
-
|
|
164
|
+
control.port,
|
|
165
|
+
control.baseUrl,
|
|
166
|
+
agent.baseUrl,
|
|
167
|
+
ui?.baseUrl ?? null,
|
|
130
168
|
),
|
|
131
169
|
};
|
|
132
170
|
}
|
|
@@ -150,30 +188,41 @@ export function resolveOnboardTarget(
|
|
|
150
188
|
const baseUrl = appendBasePathToOrigin(origin, "/", record.value.basePath);
|
|
151
189
|
return {
|
|
152
190
|
ok: true,
|
|
153
|
-
target:
|
|
191
|
+
target: targetFromSurfaces(
|
|
154
192
|
"instance",
|
|
155
193
|
record.value.name,
|
|
156
194
|
explicitMcpName ?? `agent-inspector-${record.value.name}`,
|
|
157
195
|
record.value.publicPort,
|
|
158
196
|
baseUrl,
|
|
197
|
+
baseUrl,
|
|
198
|
+
record.value.uiEnabled ? baseUrl : null,
|
|
159
199
|
),
|
|
160
200
|
};
|
|
161
201
|
}
|
|
162
202
|
|
|
163
|
-
const
|
|
203
|
+
const configuredPublicOrigin = env[AGENT_INSPECTOR_PUBLIC_ORIGIN_ENV];
|
|
204
|
+
const publicOrigin =
|
|
205
|
+
configuredPublicOrigin === undefined
|
|
206
|
+
? DEFAULT_ORIGIN
|
|
207
|
+
: normalizePublicOrigin(configuredPublicOrigin);
|
|
208
|
+
if (publicOrigin === null) {
|
|
209
|
+
return {
|
|
210
|
+
ok: false,
|
|
211
|
+
message:
|
|
212
|
+
"AGENT_INSPECTOR_PUBLIC_ORIGIN must be an exact credential-free HTTP(S) origin without a path, query, or fragment",
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
const baseUrl = appendBasePathToOrigin(publicOrigin, "/", getConfiguredBasePath(env));
|
|
164
216
|
return {
|
|
165
217
|
ok: true,
|
|
166
|
-
target:
|
|
218
|
+
target: targetFromSurfaces(
|
|
167
219
|
"default",
|
|
168
220
|
null,
|
|
169
221
|
explicitMcpName ?? "agent-inspector",
|
|
170
222
|
DEFAULT_PORT,
|
|
171
223
|
baseUrl,
|
|
224
|
+
baseUrl,
|
|
225
|
+
env["AGENT_INSPECTOR_BACKEND_ONLY"] === "1" ? null : baseUrl,
|
|
172
226
|
),
|
|
173
227
|
};
|
|
174
228
|
}
|
|
175
|
-
|
|
176
|
-
export const onboardTargetForTests = {
|
|
177
|
-
normalizeExplicitBaseUrl,
|
|
178
|
-
validateMcpName,
|
|
179
|
-
};
|
|
@@ -11,8 +11,14 @@ export type CodexSkillOnboardContext = {
|
|
|
11
11
|
readonly version: string;
|
|
12
12
|
/** The default proxy port (mirrors `DEFAULT_PORT` in `src/cli.ts`). */
|
|
13
13
|
readonly port: number;
|
|
14
|
-
/** Public
|
|
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
|
|
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 = `${
|
|
42
|
-
const
|
|
43
|
-
const
|
|
44
|
-
const
|
|
45
|
-
const
|
|
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 ${
|
|
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
|
|
64
|
-
: `Start or reuse the selected Agent Inspector
|
|
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
|
-
|
|
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
|
|
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,
|
|
293
|
+
For a Provider Test memory probe, first read \`${runtimeUrl}\`. ${providerTestUiGuidance}
|
|
268
294
|
|
|
269
|
-
|
|
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
|