@tonyclaw/agent-inspector 3.0.44 → 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 +22707 -17099
- package/.output/server/_libs/extend.mjs +4 -8
- package/.output/server/_libs/jszip.mjs +9 -35
- package/.output/server/_libs/modelcontextprotocol__core.mjs +25 -25
- package/.output/server/_libs/modelcontextprotocol__server.mjs +2 -2
- 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/_libs/zod.mjs +6 -6
- package/.output/server/_ssr/index.mjs +5 -4
- package/.output/server/_ssr/publicBasePathContext-IH2ilOfu.mjs +176 -0
- package/.output/server/_ssr/{router-DWcUFPR3.mjs → router-D18yUq36.mjs} +7877 -5597
- package/.output/server/_ssr/start-COQu_AgD.mjs +57 -0
- package/.output/server/_tanstack-start-manifest_v-DnbdNeun.mjs +4 -0
- package/.output/server/index.mjs +5 -145
- package/.output/{public/assets/CompareDrawer-DQHjxFO6.js → ui/assets/CompareDrawer-DAUuIJ6G.js} +1 -1
- package/.output/{public/assets/InspectorPet-D1A4505B.js → ui/assets/InspectorPet-BRBVjOWI.js} +1 -1
- package/.output/ui/assets/ProxyViewerContainer-D7Sq0ctc.js +59 -0
- package/.output/{public/assets/ReplayDialog-C5vmbecv.js → ui/assets/ReplayDialog-nDLsjOhs.js} +1 -1
- package/.output/{public/assets/RequestAnatomy-CPGNB8lk.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-CDhRgzf6.js → ui/assets/_sessionId-BAfzrhSU.js} +1 -1
- package/.output/{public/assets/_sessionId-mw3aA8Bp.js → ui/assets/_sessionId-QnBomgPD.js} +1 -1
- package/.output/ui/assets/favicon-DYEkHSNl.svg +21 -0
- package/.output/{public/assets/index-B2eoeT-Z.js → ui/assets/index-BcsdxBAd.js} +1 -1
- package/.output/ui/assets/index-BvXp42al.css +1 -0
- package/.output/{public/assets/index-CX7_rf7o.js → ui/assets/index-D0rtCN9V.js} +1 -1
- package/.output/ui/assets/index-DHpwr08Z.js +73 -0
- package/.output/{public/assets/index-BfRhTvOd.js → ui/assets/index-dNuk2dsU.js} +1 -1
- package/.output/ui/assets/json-viewer-BvFHglMb.js +1 -0
- package/.output/{public/assets/jszip.min-C9rCFoU3.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 +983 -414
- package/.output/workers/sessionWorkerEntry.js +983 -414
- package/README.md +363 -35
- package/docs/instance-control.openapi.yaml +361 -0
- package/package.json +28 -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/backend/routes/api/-instances.ts +109 -0
- 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/backend/routes/api/instances.$name.connection.ts +12 -0
- package/src/backend/routes/api/instances.$name.restart.ts +23 -0
- package/src/backend/routes/api/instances.$name.start.ts +18 -0
- package/src/backend/routes/api/instances.$name.stop.ts +23 -0
- package/src/backend/routes/api/instances.$name.ts +12 -0
- package/src/backend/routes/api/instances.ts +16 -0
- 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/backend/start.ts +10 -0
- package/src/cli/alias.ts +431 -0
- package/src/cli/doctor.ts +32 -9
- package/src/cli/instance.ts +1050 -0
- package/src/cli/instanceArgs.ts +285 -0
- package/src/cli/instanceControl.ts +181 -0
- package/src/cli/instanceModel.ts +267 -0
- package/src/cli/instanceRegistry.ts +731 -0
- package/src/cli/networkHints.ts +27 -14
- package/src/cli/onboard.ts +190 -35
- package/src/cli/onboardTarget.ts +228 -0
- package/src/cli/templates/codex-skill-onboard.ts +109 -31
- package/src/cli/templates/skill-onboard.ts +140 -70
- package/src/cli.ts +338 -77
- package/src/components/ProxyViewer.tsx +20 -10
- 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 +160 -140
- 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 +31 -7
- 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 +54 -0
- package/src/lib/instanceContract.ts +236 -0
- package/src/lib/managedInstance.ts +104 -0
- package/src/lib/piAgentContract.ts +3 -2
- package/src/lib/publicBasePathContext.ts +137 -0
- 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 +150 -0
- package/src/mcp/loopback.ts +16 -5
- package/src/mcp/mode.ts +25 -0
- package/src/mcp/server.ts +274 -39
- package/src/mcp/toolHandlers.ts +2 -2
- 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 +1049 -50
- 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 +84 -2
- package/src/proxy/schemas.ts +7 -1
- package/src/proxy/sessionArchive.ts +78 -14
- package/src/proxy/sessionInfo.ts +5 -4
- 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-BhpIgfBi.js +0 -126
- package/.output/public/assets/ResponseView-DUfrajCm.js +0 -2
- package/.output/public/assets/StreamingChunkSequence-nbeCQqOz.js +0 -1
- package/.output/public/assets/index-BWjeqxbk.css +0 -1
- package/.output/public/assets/index-C6qZwYlR.js +0 -70
- package/.output/public/assets/json-viewer-BLmF1sOZ.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-E_Dmopc-.mjs +0 -144
- package/.output/server/_sessionId-U54BAqdp.mjs +0 -82
- package/.output/server/_ssr/CompareDrawer-CksatPed.mjs +0 -1058
- package/.output/server/_ssr/InspectorPet-DNc4GQ7z.mjs +0 -936
- package/.output/server/_ssr/ProxyViewerContainer-B02Ey0p_.mjs +0 -17607
- package/.output/server/_ssr/ReplayDialog-DdMvHJF1.mjs +0 -723
- package/.output/server/_ssr/RequestAnatomy--vh2Z8__.mjs +0 -835
- package/.output/server/_ssr/ResponseView-Dhxc-cKC.mjs +0 -755
- package/.output/server/_ssr/StreamingChunkSequence-BG0EQmaD.mjs +0 -272
- package/.output/server/_ssr/index-D0At9nfd.mjs +0 -82
- package/.output/server/_ssr/index-lcfulIXa.mjs +0 -133
- package/.output/server/_ssr/json-viewer-My1J1_5R.mjs +0 -481
- package/.output/server/_ssr/start-HYkvq4Ni.mjs +0 -4
- package/.output/server/_tanstack-start-manifest_v-B2chR8ef.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
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { normalizePublicBasePath } from "./basePath";
|
|
3
|
+
|
|
4
|
+
export const INSTANCE_API_SCHEMA_VERSION = 1;
|
|
5
|
+
|
|
6
|
+
function isCanonicalPublicBasePath(value: string): boolean {
|
|
7
|
+
const normalized = normalizePublicBasePath(value);
|
|
8
|
+
return normalized !== null && (normalized.length === 0 ? "/" : normalized) === value;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export const InstanceStateSchema = z.enum(["running", "stopped", "conflict"]);
|
|
12
|
+
export const InstanceStateReasonSchema = z.enum(["identity_mismatch", "port_conflict"]);
|
|
13
|
+
|
|
14
|
+
export const InstanceUrlsSchema = z
|
|
15
|
+
.object({
|
|
16
|
+
ui: z.url(),
|
|
17
|
+
api: z.url(),
|
|
18
|
+
health: z.url(),
|
|
19
|
+
proxy: z.url(),
|
|
20
|
+
openai: z.url(),
|
|
21
|
+
mcp: z.url(),
|
|
22
|
+
})
|
|
23
|
+
.strict();
|
|
24
|
+
|
|
25
|
+
export const InstanceStatusOutputSchema = z
|
|
26
|
+
.object({
|
|
27
|
+
schemaVersion: z.literal(INSTANCE_API_SCHEMA_VERSION),
|
|
28
|
+
name: z.string().min(1),
|
|
29
|
+
instanceId: z.string().min(1),
|
|
30
|
+
state: InstanceStateSchema,
|
|
31
|
+
stateReason: InstanceStateReasonSchema.nullable(),
|
|
32
|
+
checkedAt: z.iso.datetime(),
|
|
33
|
+
createdAt: z.iso.datetime(),
|
|
34
|
+
updatedAt: z.iso.datetime(),
|
|
35
|
+
launch: z
|
|
36
|
+
.object({
|
|
37
|
+
launchId: z.string().min(1),
|
|
38
|
+
startedAt: z.iso.datetime(),
|
|
39
|
+
})
|
|
40
|
+
.strict(),
|
|
41
|
+
host: z.string().min(1),
|
|
42
|
+
publicPort: z.number().int().min(1).max(65_535),
|
|
43
|
+
upstreamPort: z.number().int().min(1).max(65_535),
|
|
44
|
+
basePath: z.string().refine(isCanonicalPublicBasePath, "Invalid public Base Path"),
|
|
45
|
+
captureMode: z.enum(["simple", "full"]),
|
|
46
|
+
uiEnabled: z.boolean(),
|
|
47
|
+
dataDir: z.string().min(1),
|
|
48
|
+
supervisorPid: z.number().int().positive().nullable(),
|
|
49
|
+
urls: InstanceUrlsSchema,
|
|
50
|
+
})
|
|
51
|
+
.strict();
|
|
52
|
+
|
|
53
|
+
export const InstanceConnectionSurfacesSchema = z
|
|
54
|
+
.object({
|
|
55
|
+
ui: z
|
|
56
|
+
.object({
|
|
57
|
+
enabled: z.boolean(),
|
|
58
|
+
baseUrl: z.url().nullable(),
|
|
59
|
+
})
|
|
60
|
+
.strict(),
|
|
61
|
+
control: z.object({ baseUrl: z.url() }).strict(),
|
|
62
|
+
agent: z.object({ baseUrl: z.url() }).strict(),
|
|
63
|
+
})
|
|
64
|
+
.strict();
|
|
65
|
+
|
|
66
|
+
export const InstanceConnectionOutputSchema = z
|
|
67
|
+
.object({
|
|
68
|
+
schemaVersion: z.literal(INSTANCE_API_SCHEMA_VERSION),
|
|
69
|
+
uiEnabled: z.boolean(),
|
|
70
|
+
instance: InstanceStatusOutputSchema,
|
|
71
|
+
surfaces: InstanceConnectionSurfacesSchema,
|
|
72
|
+
/** @deprecated Use surfaces.control.baseUrl or surfaces.agent.baseUrl. */
|
|
73
|
+
baseUrl: z.url(),
|
|
74
|
+
endpoints: InstanceUrlsSchema,
|
|
75
|
+
environment: z
|
|
76
|
+
.object({
|
|
77
|
+
ANTHROPIC_BASE_URL: z.url(),
|
|
78
|
+
LLM_BASE_URL: z.url(),
|
|
79
|
+
OPENAI_BASE_URL: z.url(),
|
|
80
|
+
AGENT_INSPECTOR_MCP_URL: z.url(),
|
|
81
|
+
})
|
|
82
|
+
.strict(),
|
|
83
|
+
mcp: z
|
|
84
|
+
.object({
|
|
85
|
+
serverName: z.string().min(1),
|
|
86
|
+
transport: z.literal("streamable-http"),
|
|
87
|
+
url: z.url(),
|
|
88
|
+
})
|
|
89
|
+
.strict(),
|
|
90
|
+
codex: z
|
|
91
|
+
.object({
|
|
92
|
+
providerName: z.string().min(1),
|
|
93
|
+
baseUrl: z.url(),
|
|
94
|
+
wireApi: z.literal("responses"),
|
|
95
|
+
})
|
|
96
|
+
.strict(),
|
|
97
|
+
})
|
|
98
|
+
.strict();
|
|
99
|
+
|
|
100
|
+
export const InstanceStartRequestSchema = z
|
|
101
|
+
.object({
|
|
102
|
+
port: z.number().int().min(1).max(65_535).optional(),
|
|
103
|
+
basePath: z
|
|
104
|
+
.string()
|
|
105
|
+
.min(1)
|
|
106
|
+
.max(2_048)
|
|
107
|
+
.refine(
|
|
108
|
+
(value) => normalizePublicBasePath(value) !== null,
|
|
109
|
+
"Base Path must use URL-safe path segments without traversal, encoded separators, or markup characters",
|
|
110
|
+
)
|
|
111
|
+
.optional(),
|
|
112
|
+
host: z
|
|
113
|
+
.string()
|
|
114
|
+
.min(1)
|
|
115
|
+
.max(253)
|
|
116
|
+
.refine(
|
|
117
|
+
(value) =>
|
|
118
|
+
value.trim() === value &&
|
|
119
|
+
!value.includes("://") &&
|
|
120
|
+
!value.includes("/") &&
|
|
121
|
+
!value.includes("\\") &&
|
|
122
|
+
!/\s/u.test(value),
|
|
123
|
+
"Host must be a hostname or IP address without protocol, path, or whitespace",
|
|
124
|
+
)
|
|
125
|
+
.optional(),
|
|
126
|
+
captureMode: z.enum(["simple", "full"]).optional(),
|
|
127
|
+
uiEnabled: z.boolean().optional(),
|
|
128
|
+
dataDir: z.string().trim().min(1).max(32_767).optional(),
|
|
129
|
+
})
|
|
130
|
+
.strict();
|
|
131
|
+
|
|
132
|
+
export const InstanceEmptyRequestSchema = z.object({}).strict();
|
|
133
|
+
|
|
134
|
+
export const InstanceOperationSchema = z.enum(["start", "stop", "restart"]);
|
|
135
|
+
export const InstanceOperationOutcomeSchema = z.enum([
|
|
136
|
+
"created",
|
|
137
|
+
"started",
|
|
138
|
+
"already_running",
|
|
139
|
+
"stopped",
|
|
140
|
+
"already_stopped",
|
|
141
|
+
"restarted",
|
|
142
|
+
]);
|
|
143
|
+
|
|
144
|
+
export const InstanceOperationOutputSchema = z
|
|
145
|
+
.object({
|
|
146
|
+
schemaVersion: z.literal(INSTANCE_API_SCHEMA_VERSION),
|
|
147
|
+
operation: InstanceOperationSchema,
|
|
148
|
+
outcome: InstanceOperationOutcomeSchema,
|
|
149
|
+
instance: InstanceStatusOutputSchema,
|
|
150
|
+
})
|
|
151
|
+
.strict();
|
|
152
|
+
|
|
153
|
+
export const InstanceListOutputSchema = z
|
|
154
|
+
.object({
|
|
155
|
+
schemaVersion: z.literal(INSTANCE_API_SCHEMA_VERSION),
|
|
156
|
+
instances: z.array(InstanceStatusOutputSchema),
|
|
157
|
+
})
|
|
158
|
+
.strict();
|
|
159
|
+
|
|
160
|
+
export const InstancePublicErrorCodeSchema = z.enum([
|
|
161
|
+
"argument_invalid",
|
|
162
|
+
"config_mismatch",
|
|
163
|
+
"data_dir_conflict",
|
|
164
|
+
"data_dir_invalid",
|
|
165
|
+
"identity_mismatch",
|
|
166
|
+
"instance_not_found",
|
|
167
|
+
"launch_failed",
|
|
168
|
+
"launch_unavailable",
|
|
169
|
+
"lock_not_owned",
|
|
170
|
+
"lock_timeout",
|
|
171
|
+
"name_invalid",
|
|
172
|
+
"port_conflict",
|
|
173
|
+
"port_exhausted",
|
|
174
|
+
"port_invalid",
|
|
175
|
+
"record_invalid",
|
|
176
|
+
"registry_io",
|
|
177
|
+
"restart_failed_degraded",
|
|
178
|
+
"restart_failed_rolled_back",
|
|
179
|
+
"self_lifecycle_unsupported",
|
|
180
|
+
"shutdown_failed",
|
|
181
|
+
]);
|
|
182
|
+
|
|
183
|
+
export const InstancePublicErrorSchema = z
|
|
184
|
+
.object({
|
|
185
|
+
code: InstancePublicErrorCodeSchema,
|
|
186
|
+
message: z.string().min(1),
|
|
187
|
+
retryable: z.boolean(),
|
|
188
|
+
})
|
|
189
|
+
.strict();
|
|
190
|
+
|
|
191
|
+
export const InstanceErrorOutputSchema = z
|
|
192
|
+
.object({
|
|
193
|
+
schemaVersion: z.literal(INSTANCE_API_SCHEMA_VERSION),
|
|
194
|
+
error: InstancePublicErrorSchema,
|
|
195
|
+
})
|
|
196
|
+
.strict();
|
|
197
|
+
|
|
198
|
+
export type InstanceStatusOutput = z.infer<typeof InstanceStatusOutputSchema>;
|
|
199
|
+
export type InstanceConnectionOutput = z.infer<typeof InstanceConnectionOutputSchema>;
|
|
200
|
+
export type InstanceStartRequest = z.infer<typeof InstanceStartRequestSchema>;
|
|
201
|
+
export type InstanceOperationOutcome = z.infer<typeof InstanceOperationOutcomeSchema>;
|
|
202
|
+
export type InstanceOperationOutput = z.infer<typeof InstanceOperationOutputSchema>;
|
|
203
|
+
export type InstancePublicErrorCode = z.infer<typeof InstancePublicErrorCodeSchema>;
|
|
204
|
+
export type InstancePublicError = z.infer<typeof InstancePublicErrorSchema>;
|
|
205
|
+
export type InstanceErrorOutput = z.infer<typeof InstanceErrorOutputSchema>;
|
|
206
|
+
|
|
207
|
+
export function isRetryableInstanceError(code: InstancePublicErrorCode): boolean {
|
|
208
|
+
switch (code) {
|
|
209
|
+
case "launch_failed":
|
|
210
|
+
case "launch_unavailable":
|
|
211
|
+
case "lock_timeout":
|
|
212
|
+
case "port_exhausted":
|
|
213
|
+
case "registry_io":
|
|
214
|
+
case "restart_failed_degraded":
|
|
215
|
+
case "restart_failed_rolled_back":
|
|
216
|
+
case "shutdown_failed":
|
|
217
|
+
return true;
|
|
218
|
+
case "argument_invalid":
|
|
219
|
+
case "config_mismatch":
|
|
220
|
+
case "data_dir_conflict":
|
|
221
|
+
case "data_dir_invalid":
|
|
222
|
+
case "identity_mismatch":
|
|
223
|
+
case "instance_not_found":
|
|
224
|
+
case "lock_not_owned":
|
|
225
|
+
case "name_invalid":
|
|
226
|
+
case "port_conflict":
|
|
227
|
+
case "port_invalid":
|
|
228
|
+
case "record_invalid":
|
|
229
|
+
case "self_lifecycle_unsupported":
|
|
230
|
+
return false;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
export function instanceErrorOutput(error: InstancePublicError): InstanceErrorOutput {
|
|
235
|
+
return { schemaVersion: INSTANCE_API_SCHEMA_VERSION, error };
|
|
236
|
+
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
export const MANAGED_INSTANCE_CONTROL_PATH = "/.agent-inspector/instance";
|
|
2
|
+
export const MANAGED_INSTANCE_SHUTDOWN_PATH = `${MANAGED_INSTANCE_CONTROL_PATH}/shutdown`;
|
|
3
|
+
export const MANAGED_INSTANCE_TOKEN_HEADER = "x-agent-inspector-instance-token";
|
|
4
|
+
export const MANAGED_INSTANCE_SHUTDOWN_MESSAGE_TYPE = "agent-inspector:managed-shutdown";
|
|
5
|
+
export const AGENT_INSPECTOR_CLI_ENTRY_ENV = "AGENT_INSPECTOR_CLI_ENTRY";
|
|
6
|
+
|
|
7
|
+
export const MANAGED_INSTANCE_ENV = {
|
|
8
|
+
name: "AGENT_INSPECTOR_INSTANCE_NAME",
|
|
9
|
+
instanceId: "AGENT_INSPECTOR_INSTANCE_ID",
|
|
10
|
+
launchId: "AGENT_INSPECTOR_INSTANCE_LAUNCH_ID",
|
|
11
|
+
controlToken: "AGENT_INSPECTOR_INSTANCE_CONTROL_TOKEN",
|
|
12
|
+
startedAt: "AGENT_INSPECTOR_INSTANCE_STARTED_AT",
|
|
13
|
+
upstreamPort: "AGENT_INSPECTOR_UPSTREAM_PORT",
|
|
14
|
+
} as const;
|
|
15
|
+
|
|
16
|
+
type ManagedInstanceEnv = Readonly<Record<string, string | undefined>>;
|
|
17
|
+
|
|
18
|
+
export type ManagedInstanceLaunch = {
|
|
19
|
+
name: string;
|
|
20
|
+
instanceId: string;
|
|
21
|
+
launchId: string;
|
|
22
|
+
controlToken: string;
|
|
23
|
+
startedAt: string;
|
|
24
|
+
upstreamPort: number;
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export type ManagedInstanceLaunchResult =
|
|
28
|
+
| { kind: "unmanaged" }
|
|
29
|
+
| { kind: "invalid"; message: string }
|
|
30
|
+
| { kind: "managed"; launch: ManagedInstanceLaunch };
|
|
31
|
+
|
|
32
|
+
export type ManagedInstanceShutdownMessage = {
|
|
33
|
+
type: typeof MANAGED_INSTANCE_SHUTDOWN_MESSAGE_TYPE;
|
|
34
|
+
controlToken: string;
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
function nonEmpty(value: string | undefined): string | null {
|
|
38
|
+
const trimmed = value?.trim();
|
|
39
|
+
return trimmed === undefined || trimmed.length === 0 ? null : trimmed;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function isRecord(value: unknown): value is Record<string, unknown> {
|
|
43
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export function readManagedInstanceLaunch(
|
|
47
|
+
env: ManagedInstanceEnv = process.env,
|
|
48
|
+
): ManagedInstanceLaunchResult {
|
|
49
|
+
const values = [
|
|
50
|
+
env[MANAGED_INSTANCE_ENV.name],
|
|
51
|
+
env[MANAGED_INSTANCE_ENV.instanceId],
|
|
52
|
+
env[MANAGED_INSTANCE_ENV.launchId],
|
|
53
|
+
env[MANAGED_INSTANCE_ENV.controlToken],
|
|
54
|
+
env[MANAGED_INSTANCE_ENV.startedAt],
|
|
55
|
+
env[MANAGED_INSTANCE_ENV.upstreamPort],
|
|
56
|
+
];
|
|
57
|
+
if (values.every((value) => value === undefined || value.trim().length === 0)) {
|
|
58
|
+
return { kind: "unmanaged" };
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const name = nonEmpty(env[MANAGED_INSTANCE_ENV.name]);
|
|
62
|
+
const instanceId = nonEmpty(env[MANAGED_INSTANCE_ENV.instanceId]);
|
|
63
|
+
const launchId = nonEmpty(env[MANAGED_INSTANCE_ENV.launchId]);
|
|
64
|
+
const controlToken = nonEmpty(env[MANAGED_INSTANCE_ENV.controlToken]);
|
|
65
|
+
const startedAt = nonEmpty(env[MANAGED_INSTANCE_ENV.startedAt]);
|
|
66
|
+
const upstreamPort = Number(env[MANAGED_INSTANCE_ENV.upstreamPort]);
|
|
67
|
+
if (
|
|
68
|
+
name === null ||
|
|
69
|
+
instanceId === null ||
|
|
70
|
+
launchId === null ||
|
|
71
|
+
controlToken === null ||
|
|
72
|
+
controlToken.length < 32 ||
|
|
73
|
+
startedAt === null ||
|
|
74
|
+
!Number.isFinite(Date.parse(startedAt)) ||
|
|
75
|
+
!Number.isInteger(upstreamPort) ||
|
|
76
|
+
upstreamPort < 1 ||
|
|
77
|
+
upstreamPort > 65_535
|
|
78
|
+
) {
|
|
79
|
+
return {
|
|
80
|
+
kind: "invalid",
|
|
81
|
+
message: "Managed instance launch environment is incomplete or invalid.",
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
return {
|
|
85
|
+
kind: "managed",
|
|
86
|
+
launch: { name, instanceId, launchId, controlToken, startedAt, upstreamPort },
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
export function managedInstanceShutdownMessage(
|
|
91
|
+
controlToken: string,
|
|
92
|
+
): ManagedInstanceShutdownMessage {
|
|
93
|
+
return { type: MANAGED_INSTANCE_SHUTDOWN_MESSAGE_TYPE, controlToken };
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export function parseManagedInstanceShutdownMessage(
|
|
97
|
+
value: unknown,
|
|
98
|
+
): ManagedInstanceShutdownMessage | null {
|
|
99
|
+
if (!isRecord(value)) return null;
|
|
100
|
+
return value["type"] === MANAGED_INSTANCE_SHUTDOWN_MESSAGE_TYPE &&
|
|
101
|
+
typeof value["controlToken"] === "string"
|
|
102
|
+
? { type: MANAGED_INSTANCE_SHUTDOWN_MESSAGE_TYPE, controlToken: value["controlToken"] }
|
|
103
|
+
: null;
|
|
104
|
+
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
+
import { LogIdSchema } from "../contracts";
|
|
2
3
|
|
|
3
4
|
export const PiAgentHistoryMessageSchema = z.object({
|
|
4
5
|
role: z.enum(["user", "assistant"]),
|
|
@@ -55,9 +56,9 @@ export const PiAgentQueryStatsSchema = z.object({
|
|
|
55
56
|
export const PiAgentEvidenceSchema = z.object({
|
|
56
57
|
source: PiAgentEvidenceSourceSchema,
|
|
57
58
|
id: z.string(),
|
|
58
|
-
logId:
|
|
59
|
+
logId: LogIdSchema.optional(),
|
|
59
60
|
knowledgeId: z.string().optional(),
|
|
60
|
-
logIds: z.array(
|
|
61
|
+
logIds: z.array(LogIdSchema).optional(),
|
|
61
62
|
timestamp: z.string().optional(),
|
|
62
63
|
sessionId: z.string().optional(),
|
|
63
64
|
model: z.string().optional(),
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
2
|
+
import {
|
|
3
|
+
AGENT_INSPECTOR_PUBLIC_BASE_PATH_HEADER,
|
|
4
|
+
AGENT_INSPECTOR_PUBLIC_ORIGIN_HEADER,
|
|
5
|
+
AGENT_INSPECTOR_PUBLIC_PORT_HEADER,
|
|
6
|
+
getConfiguredBasePath,
|
|
7
|
+
normalizePublicBasePath,
|
|
8
|
+
} from "./basePath";
|
|
9
|
+
import { getCurrentPort } from "./serverPort";
|
|
10
|
+
|
|
11
|
+
type BasePathEnv = Readonly<Record<string, string | undefined>>;
|
|
12
|
+
|
|
13
|
+
type PublicRequestContext = {
|
|
14
|
+
basePath: string;
|
|
15
|
+
publicOrigin: string | null;
|
|
16
|
+
publicPort: number | null;
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
const publicRequestStorage = new AsyncLocalStorage<PublicRequestContext>();
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Resolve the public Base Path attached by the trusted ingress. Invalid or
|
|
23
|
+
* missing values fall back to the process's canonical Base Path.
|
|
24
|
+
*/
|
|
25
|
+
export function resolveRequestPublicBasePath(request: Request, env?: BasePathEnv): string {
|
|
26
|
+
const rawValue = request.headers.get(AGENT_INSPECTOR_PUBLIC_BASE_PATH_HEADER);
|
|
27
|
+
if (rawValue !== null) {
|
|
28
|
+
const normalized = normalizePublicBasePath(rawValue);
|
|
29
|
+
if (normalized !== null) return normalized;
|
|
30
|
+
}
|
|
31
|
+
return getConfiguredBasePath(env ?? process.env);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/** Resolve the trusted ingress listener port without consulting request URL or Host. */
|
|
35
|
+
export function resolveRequestPublicPort(request: Request): number | null {
|
|
36
|
+
const rawValue = request.headers.get(AGENT_INSPECTOR_PUBLIC_PORT_HEADER);
|
|
37
|
+
if (rawValue !== null && /^\d{1,5}$/u.test(rawValue)) {
|
|
38
|
+
const headerPort = Number(rawValue);
|
|
39
|
+
if (Number.isSafeInteger(headerPort) && headerPort > 0 && headerPort <= 65_535) {
|
|
40
|
+
return headerPort;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
try {
|
|
44
|
+
return getCurrentPort();
|
|
45
|
+
} catch {
|
|
46
|
+
// Vite dev does not always publish its listener port through process env.
|
|
47
|
+
}
|
|
48
|
+
try {
|
|
49
|
+
const urlPort = new URL(request.url).port;
|
|
50
|
+
if (!/^\d{1,5}$/u.test(urlPort)) return null;
|
|
51
|
+
const port = Number(urlPort);
|
|
52
|
+
return Number.isSafeInteger(port) && port > 0 && port <= 65_535 ? port : null;
|
|
53
|
+
} catch {
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function normalizedPublicOrigin(value: string): string | null {
|
|
59
|
+
try {
|
|
60
|
+
const parsed = new URL(value);
|
|
61
|
+
if (parsed.protocol !== "http:" && parsed.protocol !== "https:") return null;
|
|
62
|
+
if (parsed.username.length > 0 || parsed.password.length > 0) return null;
|
|
63
|
+
if (parsed.pathname !== "/" || parsed.search.length > 0 || parsed.hash.length > 0) return null;
|
|
64
|
+
return parsed.origin;
|
|
65
|
+
} catch {
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/** Resolve the public origin set by trusted ingress without consulting forwarded headers. */
|
|
71
|
+
export function resolveRequestPublicOrigin(request: Request): string | null {
|
|
72
|
+
const headerOrigin = request.headers.get(AGENT_INSPECTOR_PUBLIC_ORIGIN_HEADER);
|
|
73
|
+
if (headerOrigin !== null) return normalizedPublicOrigin(headerOrigin);
|
|
74
|
+
try {
|
|
75
|
+
return normalizedPublicOrigin(new URL(request.url).origin);
|
|
76
|
+
} catch {
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/** Return the originating request's public Base Path, or the canonical path outside a request. */
|
|
82
|
+
export function getPublicBasePath(env?: BasePathEnv): string {
|
|
83
|
+
return publicRequestStorage.getStore()?.basePath ?? getConfiguredBasePath(env ?? process.env);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/** Return the trusted ingress listener port, or the canonical process port outside a request. */
|
|
87
|
+
export function getPublicPort(): number {
|
|
88
|
+
return publicRequestStorage.getStore()?.publicPort ?? getCurrentPort();
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/** Return the trusted public origin, with a loopback fallback outside an ingress request. */
|
|
92
|
+
export function getPublicOrigin(): string {
|
|
93
|
+
return (
|
|
94
|
+
publicRequestStorage.getStore()?.publicOrigin ?? `http://localhost:${String(getCurrentPort())}`
|
|
95
|
+
);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/** Run work with an explicitly selected public Base Path. Primarily useful for internal calls. */
|
|
99
|
+
export function runWithPublicBasePath<T>(basePath: string, callback: () => T): T {
|
|
100
|
+
const current = publicRequestStorage.getStore();
|
|
101
|
+
const normalized = normalizePublicBasePath(basePath) ?? getConfiguredBasePath(process.env);
|
|
102
|
+
return publicRequestStorage.run(
|
|
103
|
+
{
|
|
104
|
+
basePath: normalized,
|
|
105
|
+
publicOrigin: current?.publicOrigin ?? null,
|
|
106
|
+
publicPort: current?.publicPort ?? null,
|
|
107
|
+
},
|
|
108
|
+
callback,
|
|
109
|
+
);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/** Run work with an explicit trusted public listener port. */
|
|
113
|
+
export function runWithPublicPort<T>(publicPort: number, callback: () => T): T {
|
|
114
|
+
const current = publicRequestStorage.getStore();
|
|
115
|
+
const normalizedPort =
|
|
116
|
+
Number.isSafeInteger(publicPort) && publicPort > 0 && publicPort <= 65_535 ? publicPort : null;
|
|
117
|
+
return publicRequestStorage.run(
|
|
118
|
+
{
|
|
119
|
+
basePath: current?.basePath ?? getConfiguredBasePath(process.env),
|
|
120
|
+
publicOrigin: current?.publicOrigin ?? null,
|
|
121
|
+
publicPort: normalizedPort,
|
|
122
|
+
},
|
|
123
|
+
callback,
|
|
124
|
+
);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/** Run the complete request chain with the ingress-selected public Base Path. */
|
|
128
|
+
export function runWithRequestPublicBasePath<T>(request: Request, callback: () => T): T {
|
|
129
|
+
return publicRequestStorage.run(
|
|
130
|
+
{
|
|
131
|
+
basePath: resolveRequestPublicBasePath(request),
|
|
132
|
+
publicOrigin: resolveRequestPublicOrigin(request),
|
|
133
|
+
publicPort: resolveRequestPublicPort(request),
|
|
134
|
+
},
|
|
135
|
+
callback,
|
|
136
|
+
);
|
|
137
|
+
}
|
|
@@ -9,6 +9,7 @@ export const MAX_PROVIDER_MODEL_METADATA = 64;
|
|
|
9
9
|
export const MAX_SSE_CLIENTS = 32;
|
|
10
10
|
export const MAX_ACTIVE_PROVIDER_TESTS = 2;
|
|
11
11
|
export const MAX_PROVIDER_TEST_CONCURRENCY = 4;
|
|
12
|
+
export const MAX_ACTIVE_PROXY_REQUESTS = 16;
|
|
12
13
|
|
|
13
14
|
export const ResourceLimitErrorCodeSchema = z.enum([
|
|
14
15
|
"invalid-page-request",
|
|
@@ -16,6 +17,7 @@ export const ResourceLimitErrorCodeSchema = z.enum([
|
|
|
16
17
|
"provider-model-limit-exceeded",
|
|
17
18
|
"sse-capacity-exceeded",
|
|
18
19
|
"provider-test-capacity-exceeded",
|
|
20
|
+
"proxy-capacity-exceeded",
|
|
19
21
|
]);
|
|
20
22
|
|
|
21
23
|
export const ResourceLimitStatusSchema = z.union([
|
package/src/lib/runContract.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import { JsonValueSchema } from "../contracts";
|
|
2
|
+
import { JsonValueSchema, LogIdSchema } from "../contracts";
|
|
3
3
|
import { SessionInfoSchema } from "./sessionInfoContract";
|
|
4
4
|
|
|
5
5
|
export const InspectorRunStatusSchema = z.enum([
|
|
@@ -33,7 +33,7 @@ export const RunTimelineEventSchema = z.object({
|
|
|
33
33
|
severity: RunTimelineEventSeveritySchema,
|
|
34
34
|
title: z.string(),
|
|
35
35
|
details: z.string(),
|
|
36
|
-
logId:
|
|
36
|
+
logId: LogIdSchema.nullable(),
|
|
37
37
|
status: z.number().nullable(),
|
|
38
38
|
model: z.string().nullable(),
|
|
39
39
|
provider: z.string().nullable(),
|
|
@@ -62,7 +62,7 @@ export const FailureClassificationSchema = z.object({
|
|
|
62
62
|
severity: z.enum(["none", "low", "medium", "high"]),
|
|
63
63
|
category: FailureCategorySchema,
|
|
64
64
|
summary: z.string(),
|
|
65
|
-
evidenceLogIds: z.array(
|
|
65
|
+
evidenceLogIds: z.array(LogIdSchema),
|
|
66
66
|
hints: z.array(z.string()),
|
|
67
67
|
});
|
|
68
68
|
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
+
import { LogIdSchema } from "../contracts";
|
|
2
3
|
|
|
3
4
|
export const SessionTokenUsageSchema = z.object({
|
|
4
5
|
input: z.number().int().nonnegative(),
|
|
@@ -9,7 +10,7 @@ export const SessionTokenUsageSchema = z.object({
|
|
|
9
10
|
});
|
|
10
11
|
|
|
11
12
|
export const SessionLogSummarySchema = z.object({
|
|
12
|
-
id:
|
|
13
|
+
id: LogIdSchema,
|
|
13
14
|
sessionLogNumber: z.number().int().positive().optional(),
|
|
14
15
|
timestamp: z.string(),
|
|
15
16
|
provider: z.string().nullable(),
|
|
@@ -57,7 +58,7 @@ export const SessionInfoSchema = z.object({
|
|
|
57
58
|
models: z.array(z.string()),
|
|
58
59
|
providers: z.array(z.string()),
|
|
59
60
|
tokenUsage: SessionTokenUsageSchema,
|
|
60
|
-
lastLogId:
|
|
61
|
+
lastLogId: LogIdSchema.nullable(),
|
|
61
62
|
lastModel: z.string().nullable(),
|
|
62
63
|
clientUserAgent: z.string().nullable().optional(),
|
|
63
64
|
clientPid: z.number().nullable(),
|