@tonyclaw/agent-inspector 4.0.1 → 4.0.2
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/backend/nitro.json +1 -1
- package/.output/cli.js +192 -109
- package/.output/server/_ssr/index.mjs +1 -1
- package/.output/server/_ssr/{router-CTHqmroT.mjs → router-BBY_zWRK.mjs} +91 -3
- package/.output/server/index.mjs +1 -1
- package/.output/ui/assets/{CompareDrawer-L3n4J-Or.js → CompareDrawer-rtNElN-B.js} +1 -1
- package/.output/ui/assets/{InspectorPet-D5o_3OZS.js → InspectorPet-QaAiuF3d.js} +1 -1
- package/.output/ui/assets/{ProxyViewerContainer-Ocagx75S.js → ProxyViewerContainer-6twNZHwl.js} +4 -4
- package/.output/ui/assets/{ReplayDialog-Bk7x1h-y.js → ReplayDialog-B7KlziO2.js} +1 -1
- package/.output/ui/assets/{RequestAnatomy-U4lzL7Sc.js → RequestAnatomy-2XVFBrW4.js} +1 -1
- package/.output/ui/assets/{ResponseView-LOWfvBLK.js → ResponseView-BULgzLVB.js} +1 -1
- package/.output/ui/assets/{StreamingChunkSequence-DPfsrrXQ.js → StreamingChunkSequence-DSkvkbns.js} +1 -1
- package/.output/ui/assets/{_sessionId-OdX2Jvt1.js → _sessionId-D2dmJi3G.js} +1 -1
- package/.output/ui/assets/{_sessionId-0MlWS-CO.js → _sessionId-DcS0s1Mr.js} +1 -1
- package/.output/ui/assets/{index-Du4qNOOt.js → index-B0TN1KKO.js} +2 -2
- package/.output/ui/assets/{index-gvFj_9K6.js → index-Bva1zHEs.js} +1 -1
- package/.output/ui/assets/{index-Ea-c8hPg.js → index-BzBExOxu.js} +1 -1
- package/.output/ui/assets/{index-zVVS53Hd.js → index-k6sRQz55.js} +1 -1
- package/.output/ui/assets/{json-viewer-C1WAMzg3.js → json-viewer-CWM4tY-j.js} +1 -1
- package/.output/ui/assets/{jszip.min-B8AKu2zm.js → jszip.min-BkWvRFlo.js} +1 -1
- package/.output/ui/index.html +1 -1
- package/package.json +5 -10
- package/src/assets/IDE/claudecode-color.svg +0 -1
- package/src/assets/IDE/codex-color.svg +0 -1
- package/src/assets/IDE/opencode.svg +0 -1
- package/src/assets/IDE/xiaomimimo.svg +0 -1
- package/src/assets/favicon.svg +0 -21
- package/src/assets/logos/alibaba.svg +0 -1
- package/src/assets/logos/anthropic.svg +0 -1
- package/src/assets/logos/claude-code.svg +0 -4
- package/src/assets/logos/deepseek.svg +0 -1
- package/src/assets/logos/minimax.jpeg +0 -0
- package/src/assets/logos/openai.svg +0 -1
- package/src/assets/logos/opencode.svg +0 -4
- package/src/assets/logos/qwen.webp +0 -0
- package/src/assets/logos/zhipuai.svg +0 -219
- package/src/backend/router.tsx +0 -36
- package/src/backend/routes/$.ts +0 -26
- package/src/backend/routes/__root.ts +0 -4
- package/src/backend/routes/api/-instances.ts +0 -7
- package/src/backend/routes/api/alerts.summary.ts +0 -28
- package/src/backend/routes/api/alerts.ts +0 -70
- package/src/backend/routes/api/config.paths.ts +0 -14
- package/src/backend/routes/api/config.ts +0 -73
- package/src/backend/routes/api/ecosystem.packages.$packageId.help.ts +0 -11
- package/src/backend/routes/api/ecosystem.packages.$packageId.install.ts +0 -11
- package/src/backend/routes/api/ecosystem.packages.$packageId.runner-presets.ts +0 -11
- package/src/backend/routes/api/ecosystem.packages.$packageId.upgrade.ts +0 -11
- package/src/backend/routes/api/ecosystem.packages.ts +0 -21
- package/src/backend/routes/api/ecosystem.recipes.$recipeId.run.ts +0 -11
- package/src/backend/routes/api/ecosystem.tasks.$taskId.ts +0 -16
- package/src/backend/routes/api/ecosystem.tasks.ts +0 -12
- package/src/backend/routes/api/groups.$groupId.evidence.ts +0 -55
- package/src/backend/routes/api/groups.$groupId.sessions.ts +0 -50
- package/src/backend/routes/api/groups.$groupId.ts +0 -93
- package/src/backend/routes/api/groups.ts +0 -79
- package/src/backend/routes/api/health.ts +0 -22
- package/src/backend/routes/api/instances.$name.connection.ts +0 -12
- package/src/backend/routes/api/instances.$name.restart.ts +0 -23
- package/src/backend/routes/api/instances.$name.start.ts +0 -18
- package/src/backend/routes/api/instances.$name.stop.ts +0 -23
- package/src/backend/routes/api/instances.$name.ts +0 -12
- package/src/backend/routes/api/instances.ts +0 -16
- package/src/backend/routes/api/knowledge.candidates.$candidateId.promote.ts +0 -32
- package/src/backend/routes/api/knowledge.candidates.$candidateId.ts +0 -50
- package/src/backend/routes/api/knowledge.candidates.ts +0 -10
- package/src/backend/routes/api/knowledge.project-context.ts +0 -29
- package/src/backend/routes/api/knowledge.search.ts +0 -62
- package/src/backend/routes/api/knowledge.sessions.$sessionId.candidates.ts +0 -26
- package/src/backend/routes/api/logs.$id.body.ts +0 -58
- package/src/backend/routes/api/logs.$id.chunks.ts +0 -37
- package/src/backend/routes/api/logs.$id.replay.ts +0 -297
- package/src/backend/routes/api/logs.$id.ts +0 -23
- package/src/backend/routes/api/logs.import.ts +0 -39
- package/src/backend/routes/api/logs.stream.ts +0 -174
- package/src/backend/routes/api/logs.ts +0 -214
- package/src/backend/routes/api/mcp.ts +0 -25
- package/src/backend/routes/api/models.ts +0 -10
- package/src/backend/routes/api/pi-agent.ts +0 -29
- package/src/backend/routes/api/providers.$providerId.model-metadata.ts +0 -173
- package/src/backend/routes/api/providers.$providerId.test.log.ts +0 -342
- package/src/backend/routes/api/providers.$providerId.ts +0 -111
- package/src/backend/routes/api/providers.export.ts +0 -44
- package/src/backend/routes/api/providers.import.ts +0 -81
- package/src/backend/routes/api/providers.scan.ts +0 -28
- package/src/backend/routes/api/providers.ts +0 -102
- package/src/backend/routes/api/runs.$runId.evidence.ts +0 -55
- package/src/backend/routes/api/runs.$runId.ts +0 -50
- package/src/backend/routes/api/runs.ts +0 -62
- package/src/backend/routes/api/runtime.ts +0 -46
- package/src/backend/routes/api/sessions.ts +0 -51
- package/src/backend/routes/api/storage.ts +0 -56
- package/src/backend/routes/livez.ts +0 -13
- package/src/backend/routes/metrics.ts +0 -14
- package/src/backend/routes/proxy/$.ts +0 -15
- package/src/backend/routes/readyz.ts +0 -18
- package/src/backend/start.ts +0 -10
- package/src/cli/alias.ts +0 -431
- package/src/cli/detect-tools.ts +0 -123
- package/src/cli/doctor.ts +0 -836
- package/src/cli/instance.ts +0 -1071
- package/src/cli/instanceApi.ts +0 -213
- package/src/cli/instanceArgs.ts +0 -301
- package/src/cli/instanceControl.ts +0 -191
- package/src/cli/instanceModel.ts +0 -276
- package/src/cli/instanceRegistry.ts +0 -731
- package/src/cli/networkHints.ts +0 -170
- package/src/cli/onboard.ts +0 -1668
- package/src/cli/onboardTarget.ts +0 -228
- package/src/cli/rustBackendPackage.ts +0 -458
- package/src/cli/startupOutput.ts +0 -16
- package/src/cli/templates/codex-skill-onboard.ts +0 -320
- package/src/cli/templates/command-onboard.ts +0 -25
- package/src/cli/templates/skill-onboard.ts +0 -625
- package/src/cli.ts +0 -1433
- package/src/components/OnboardingBanner.tsx +0 -115
- package/src/components/ProxyViewer.tsx +0 -2259
- package/src/components/ProxyViewerContainer.tsx +0 -1076
- package/src/components/alerts/AlertsDialog.tsx +0 -615
- package/src/components/clients/ClientLogo.tsx +0 -175
- package/src/components/ecosystem/AgentLabDialog.tsx +0 -947
- package/src/components/errors/SafeErrorBoundary.tsx +0 -201
- package/src/components/groups/GroupsDialog.tsx +0 -1304
- package/src/components/inspector-pet/InspectorPet.tsx +0 -398
- package/src/components/inspector-pet/InspectorPetCrab3D.tsx +0 -455
- package/src/components/inspector-pet/inspectorPetLogic.ts +0 -272
- package/src/components/pi-agent/PiAgentPanel.tsx +0 -446
- package/src/components/pi-agent/piAgentChatLogic.ts +0 -273
- package/src/components/providers/ImportWizardDialog.tsx +0 -281
- package/src/components/providers/ProviderCard.tsx +0 -347
- package/src/components/providers/ProviderForm.tsx +0 -1183
- package/src/components/providers/ProviderLogo.tsx +0 -122
- package/src/components/providers/ProviderTestResultsView.tsx +0 -734
- package/src/components/providers/ProvidersPanel.tsx +0 -714
- package/src/components/providers/SettingsDialog.tsx +0 -1042
- package/src/components/providers/providerFormCapabilities.ts +0 -36
- package/src/components/proxy-viewer/AgentTraceSummary.tsx +0 -902
- package/src/components/proxy-viewer/AnswerMarkdown.tsx +0 -51
- package/src/components/proxy-viewer/ApplicationBar.tsx +0 -123
- package/src/components/proxy-viewer/CompareDrawer.tsx +0 -984
- package/src/components/proxy-viewer/ConversationGroup.tsx +0 -208
- package/src/components/proxy-viewer/ConversationGroupList.tsx +0 -652
- package/src/components/proxy-viewer/ConversationHeader.tsx +0 -429
- package/src/components/proxy-viewer/LiveConnectionStatus.tsx +0 -186
- package/src/components/proxy-viewer/LogEntry.tsx +0 -1419
- package/src/components/proxy-viewer/LogEntryHeader.tsx +0 -596
- package/src/components/proxy-viewer/ProviderLogoStack.tsx +0 -57
- package/src/components/proxy-viewer/RawExportWarning.tsx +0 -77
- package/src/components/proxy-viewer/ReplayDialog.tsx +0 -636
- package/src/components/proxy-viewer/RequestToolsPanel.tsx +0 -299
- package/src/components/proxy-viewer/ResponseView.tsx +0 -202
- package/src/components/proxy-viewer/SessionLoadProgressBar.tsx +0 -61
- package/src/components/proxy-viewer/StreamingChunkSequence.tsx +0 -265
- package/src/components/proxy-viewer/ThreadConnector.tsx +0 -165
- package/src/components/proxy-viewer/ToolTraceEvents.tsx +0 -64
- package/src/components/proxy-viewer/TurnGroup.tsx +0 -383
- package/src/components/proxy-viewer/TurnGroupList.tsx +0 -156
- package/src/components/proxy-viewer/accessibility.ts +0 -8
- package/src/components/proxy-viewer/anatomy/RequestAnatomy.tsx +0 -887
- package/src/components/proxy-viewer/anatomy/SegmentBar.tsx +0 -222
- package/src/components/proxy-viewer/anatomy/contextIntelligence.ts +0 -737
- package/src/components/proxy-viewer/anatomy/sessionContextSummary.ts +0 -268
- package/src/components/proxy-viewer/anatomy/tokenEstimate.ts +0 -53
- package/src/components/proxy-viewer/anatomy/types.ts +0 -41
- package/src/components/proxy-viewer/anatomy/useAnatomyJump.ts +0 -114
- package/src/components/proxy-viewer/bodyHydration.ts +0 -123
- package/src/components/proxy-viewer/cacheTrend.ts +0 -50
- package/src/components/proxy-viewer/diff/DiffView.tsx +0 -321
- package/src/components/proxy-viewer/diff/computeDiff.ts +0 -178
- package/src/components/proxy-viewer/diff/index.ts +0 -3
- package/src/components/proxy-viewer/formats/anthropic/ContentBlocks.tsx +0 -194
- package/src/components/proxy-viewer/formats/anthropic/ResponseView.tsx +0 -81
- package/src/components/proxy-viewer/formats/anthropic/thinkingExtract.ts +0 -21
- package/src/components/proxy-viewer/formats/index.tsx +0 -47
- package/src/components/proxy-viewer/formats/openai/ResponseView.tsx +0 -442
- package/src/components/proxy-viewer/index.ts +0 -9
- package/src/components/proxy-viewer/lazy.ts +0 -41
- package/src/components/proxy-viewer/liveConnectionState.ts +0 -158
- package/src/components/proxy-viewer/log-formats/anthropic.ts +0 -191
- package/src/components/proxy-viewer/log-formats/index.ts +0 -23
- package/src/components/proxy-viewer/log-formats/openai.ts +0 -256
- package/src/components/proxy-viewer/log-formats/types.ts +0 -40
- package/src/components/proxy-viewer/log-formats/unknown.ts +0 -18
- package/src/components/proxy-viewer/logEntryVisibility.ts +0 -73
- package/src/components/proxy-viewer/logFocus.ts +0 -54
- package/src/components/proxy-viewer/proxyViewerContainerLogic.ts +0 -124
- package/src/components/proxy-viewer/proxyViewerLogic.ts +0 -488
- package/src/components/proxy-viewer/replayComparison.ts +0 -131
- package/src/components/proxy-viewer/requestDiff.ts +0 -277
- package/src/components/proxy-viewer/requestTools.ts +0 -220
- package/src/components/proxy-viewer/useCopyFeedback.ts +0 -38
- package/src/components/proxy-viewer/useKeyboardNavigation.ts +0 -232
- package/src/components/proxy-viewer/viewerState.ts +0 -176
- package/src/components/ui/badge.tsx +0 -47
- package/src/components/ui/button.tsx +0 -47
- package/src/components/ui/collapsible.tsx +0 -21
- package/src/components/ui/confirm-dialog.tsx +0 -51
- package/src/components/ui/crab-logo.tsx +0 -45
- package/src/components/ui/crab-variants.tsx +0 -467
- package/src/components/ui/dialog.tsx +0 -130
- package/src/components/ui/icon-trigger.ts +0 -2
- package/src/components/ui/json-viewer-bulk.ts +0 -132
- package/src/components/ui/json-viewer.tsx +0 -508
- package/src/components/ui/scroll-area.tsx +0 -54
- package/src/components/ui/select.tsx +0 -178
- package/src/components/ui/separator.tsx +0 -28
- package/src/components/ui/tabs.tsx +0 -88
- package/src/components/ui/tooltip.tsx +0 -51
- package/src/components/ui/transient-toast.tsx +0 -105
- package/src/contracts/anthropic.ts +0 -230
- package/src/contracts/index.ts +0 -59
- package/src/contracts/json.ts +0 -37
- package/src/contracts/log.ts +0 -139
- package/src/contracts/openai.ts +0 -267
- package/src/index.css +0 -11
- package/src/knowledge/candidateStore.ts +0 -94
- package/src/knowledge/distiller.ts +0 -98
- package/src/knowledge/openclawClient.ts +0 -161
- package/src/knowledge/openclawGatewayClient.ts +0 -249
- package/src/knowledge/openclawMarkdown.ts +0 -146
- package/src/knowledge/redactor.ts +0 -80
- package/src/knowledge/types.ts +0 -83
- package/src/lib/alertContract.ts +0 -76
- package/src/lib/apiClient.ts +0 -166
- package/src/lib/apiFormat.ts +0 -29
- package/src/lib/backendImplementation.ts +0 -16
- package/src/lib/basePath.ts +0 -107
- package/src/lib/browserRuntimeContract.ts +0 -124
- package/src/lib/browserRuntimeResolver.ts +0 -333
- package/src/lib/chunkLoadRecovery.ts +0 -83
- package/src/lib/claudeCodeStrip.ts +0 -98
- package/src/lib/clipboard.ts +0 -67
- package/src/lib/codingAgentEndpoints.ts +0 -54
- package/src/lib/ecosystemContract.ts +0 -130
- package/src/lib/export-logs.ts +0 -287
- package/src/lib/groupContract.ts +0 -166
- package/src/lib/instanceContract.ts +0 -239
- package/src/lib/jsonFile.ts +0 -46
- package/src/lib/logImportContract.ts +0 -12
- package/src/lib/managedInstance.ts +0 -112
- package/src/lib/mask.ts +0 -4
- package/src/lib/objectUtils.ts +0 -22
- package/src/lib/piAgentContract.ts +0 -102
- package/src/lib/providerContract.ts +0 -125
- package/src/lib/providerImportContract.ts +0 -27
- package/src/lib/providerModelMetadata.ts +0 -458
- package/src/lib/providerTestContract.ts +0 -170
- package/src/lib/providerTestPrompt.ts +0 -100
- package/src/lib/publicBasePathContext.ts +0 -137
- package/src/lib/resourceLimits.ts +0 -345
- package/src/lib/runContract.ts +0 -164
- package/src/lib/runtimeConfig.ts +0 -43
- package/src/lib/safeDiagnostic.ts +0 -38
- package/src/lib/safeFetch.ts +0 -508
- package/src/lib/serverPort.ts +0 -47
- package/src/lib/sessionInfoContract.ts +0 -78
- package/src/lib/sessionUrl.ts +0 -46
- package/src/lib/ssrfGuard.ts +0 -133
- package/src/lib/stopReason.ts +0 -130
- package/src/lib/themeMode.ts +0 -41
- package/src/lib/timeDisplay.ts +0 -22
- package/src/lib/toolTrace.ts +0 -290
- package/src/lib/uiScale.ts +0 -117
- package/src/lib/unknown.ts +0 -27
- package/src/lib/upstreamUrl.ts +0 -150
- package/src/lib/useAlerts.ts +0 -82
- package/src/lib/useGroupEvidence.ts +0 -37
- package/src/lib/useGroups.ts +0 -32
- package/src/lib/useOnboarding.ts +0 -93
- package/src/lib/useProviders.ts +0 -30
- package/src/lib/useStripConfig.ts +0 -154
- package/src/lib/useThemeMode.ts +0 -40
- package/src/lib/useUiScale.ts +0 -52
- package/src/lib/utils.ts +0 -78
- package/src/mcp/currentContext.ts +0 -65
- package/src/mcp/instanceHandlers.ts +0 -151
- package/src/mcp/loopback.ts +0 -88
- package/src/mcp/mode.ts +0 -75
- package/src/mcp/previewExtractor.ts +0 -233
- package/src/mcp/server.ts +0 -2274
- package/src/mcp/toolHandlers.ts +0 -1533
- package/src/proxy/alerts.ts +0 -664
- package/src/proxy/chunkStorage.ts +0 -123
- package/src/proxy/config.ts +0 -218
- package/src/proxy/constants.ts +0 -66
- package/src/proxy/dataDir.ts +0 -147
- package/src/proxy/ecosystemExecutionConfirmation.ts +0 -114
- package/src/proxy/ecosystemExecutionRoute.ts +0 -116
- package/src/proxy/ecosystemRegistry.ts +0 -296
- package/src/proxy/ecosystemTasks.ts +0 -415
- package/src/proxy/evidenceAnalysis.ts +0 -526
- package/src/proxy/evidenceExporter.ts +0 -235
- package/src/proxy/formats/anthropic/anthropicProvider.ts +0 -75
- package/src/proxy/formats/anthropic/handler.ts +0 -75
- package/src/proxy/formats/anthropic/index.ts +0 -13
- package/src/proxy/formats/anthropic/register.ts +0 -4
- package/src/proxy/formats/anthropic/schemas.ts +0 -6
- package/src/proxy/formats/anthropic/stream.ts +0 -205
- package/src/proxy/formats/handler.ts +0 -46
- package/src/proxy/formats/index.ts +0 -13
- package/src/proxy/formats/jsonSchema.ts +0 -2
- package/src/proxy/formats/openai/alibabaProvider.ts +0 -34
- package/src/proxy/formats/openai/codexMetadata.ts +0 -61
- package/src/proxy/formats/openai/handler.ts +0 -133
- package/src/proxy/formats/openai/index.ts +0 -33
- package/src/proxy/formats/openai/provider.ts +0 -50
- package/src/proxy/formats/openai/register.ts +0 -4
- package/src/proxy/formats/openai/schemas.ts +0 -25
- package/src/proxy/formats/openai/stream.ts +0 -600
- package/src/proxy/formats/openai/zhipuProvider.ts +0 -31
- package/src/proxy/formats/providerAdapter.ts +0 -50
- package/src/proxy/formats/providerRegistry.ts +0 -51
- package/src/proxy/formats/providers/index.ts +0 -3
- package/src/proxy/formats/registry.ts +0 -65
- package/src/proxy/groupEvidenceExporter.ts +0 -371
- package/src/proxy/groupStore.ts +0 -336
- package/src/proxy/handler.ts +0 -729
- package/src/proxy/identityProxy.ts +0 -1842
- package/src/proxy/jsonlRecovery.ts +0 -554
- package/src/proxy/logBodyChunks.ts +0 -91
- package/src/proxy/logFinalizer.ts +0 -777
- package/src/proxy/logFinalizer.worker.ts +0 -24
- package/src/proxy/logImportUpload.ts +0 -128
- package/src/proxy/logImporter.ts +0 -813
- package/src/proxy/logIndex.ts +0 -663
- package/src/proxy/logSearch.ts +0 -122
- package/src/proxy/logger.ts +0 -537
- package/src/proxy/openaiOrphanToolStrip.ts +0 -142
- package/src/proxy/platformCommands.ts +0 -258
- package/src/proxy/privateDataPath.ts +0 -419
- package/src/proxy/providerImporters.ts +0 -578
- package/src/proxy/providerScanStore.ts +0 -87
- package/src/proxy/providerSecretStore.ts +0 -216
- package/src/proxy/providers.ts +0 -998
- package/src/proxy/rawStreamCapture.ts +0 -342
- package/src/proxy/runFailures.ts +0 -94
- package/src/proxy/runStore.ts +0 -214
- package/src/proxy/runtimeAdmission.ts +0 -55
- package/src/proxy/runtimeHealth.ts +0 -221
- package/src/proxy/runtimeMetrics.ts +0 -149
- package/src/proxy/runtimeShutdown.ts +0 -157
- package/src/proxy/schemas.ts +0 -112
- package/src/proxy/sessionArchive.ts +0 -479
- package/src/proxy/sessionInfo.ts +0 -266
- package/src/proxy/sessionProcess.ts +0 -194
- package/src/proxy/sessionRuntime.ts +0 -121
- package/src/proxy/sessionSupervisor.ts +0 -305
- package/src/proxy/sessionWorkerEntry.ts +0 -26
- package/src/proxy/shutdownCoordinator.ts +0 -90
- package/src/proxy/socketTracker.ts +0 -639
- package/src/proxy/sqliteLogIndex.ts +0 -733
- package/src/proxy/storageLifecycle.ts +0 -432
- package/src/proxy/store.ts +0 -1773
- package/src/proxy/streamTiming.ts +0 -31
- package/src/proxy/toolSchemaWarnings.ts +0 -529
- package/src/proxy/uiAssetServer.ts +0 -106
- package/src/proxy/upstream.ts +0 -127
- package/src/services/alerts.ts +0 -12
- package/src/services/groups.ts +0 -119
- package/src/services/piAgent.ts +0 -421
- package/src/services/piAgentRetrieval.ts +0 -1180
- package/src/services/result.ts +0 -17
- package/src/services/runs.ts +0 -76
- package/src/ui/bootstrap.ts +0 -167
- package/src/ui/index.html +0 -38
- package/src/ui/logsStreamClient.ts +0 -20
- package/src/ui/main.tsx +0 -13
- package/src/ui/public/runtime-config.js +0 -2
- package/src/ui/router.tsx +0 -13
- package/src/ui/routes/__root.tsx +0 -69
- package/src/ui/routes/index.tsx +0 -35
- package/src/ui/routes/session/$sessionId.tsx +0 -50
- package/src/ui/runtimeDiscovery.ts +0 -50
|
@@ -1,526 +0,0 @@
|
|
|
1
|
-
import type { SessionInfo, SessionLogSummary } from "../lib/sessionInfoContract";
|
|
2
|
-
import type {
|
|
3
|
-
FailureCategory,
|
|
4
|
-
FailureClassification,
|
|
5
|
-
InspectorRun,
|
|
6
|
-
JenkinsReport,
|
|
7
|
-
RunTimelineEvent,
|
|
8
|
-
} from "../lib/runContract";
|
|
9
|
-
|
|
10
|
-
type AnalyzeEvidenceInput = {
|
|
11
|
-
run: InspectorRun;
|
|
12
|
-
session: SessionInfo | null;
|
|
13
|
-
exportedAt: string;
|
|
14
|
-
evidencePaths: {
|
|
15
|
-
jsonPath: string;
|
|
16
|
-
markdownPath: string;
|
|
17
|
-
htmlPath: string;
|
|
18
|
-
};
|
|
19
|
-
};
|
|
20
|
-
|
|
21
|
-
type ErrorCandidate = {
|
|
22
|
-
log: SessionLogSummary | null;
|
|
23
|
-
text: string;
|
|
24
|
-
};
|
|
25
|
-
|
|
26
|
-
function formatNullable(value: string | number | null): string {
|
|
27
|
-
return value === null ? "n/a" : String(value);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
function formatList(values: readonly string[]): string {
|
|
31
|
-
return values.length > 0 ? values.join(", ") : "n/a";
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
function lower(value: string): string {
|
|
35
|
-
return value.toLowerCase();
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
function logEvidenceText(log: SessionLogSummary): string {
|
|
39
|
-
return lower(
|
|
40
|
-
[
|
|
41
|
-
log.error,
|
|
42
|
-
log.path,
|
|
43
|
-
log.model,
|
|
44
|
-
log.provider,
|
|
45
|
-
log.status === null ? null : String(log.status),
|
|
46
|
-
log.isStreaming ? "streaming" : "non-streaming",
|
|
47
|
-
]
|
|
48
|
-
.filter((value) => value !== null)
|
|
49
|
-
.join(" "),
|
|
50
|
-
);
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
function collectErrorCandidates(session: SessionInfo): ErrorCandidate[] {
|
|
54
|
-
const candidates: ErrorCandidate[] = session.latestLogs
|
|
55
|
-
.filter((log) => log.hasError)
|
|
56
|
-
.map((log) => ({ log, text: logEvidenceText(log) }));
|
|
57
|
-
|
|
58
|
-
if (session.lastTaskError !== null) {
|
|
59
|
-
candidates.push({ log: null, text: lower(session.lastTaskError) });
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
return candidates;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
function hasText(candidates: readonly ErrorCandidate[], patterns: readonly string[]): boolean {
|
|
66
|
-
return candidates.some((candidate) =>
|
|
67
|
-
patterns.some((pattern) => candidate.text.includes(pattern)),
|
|
68
|
-
);
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
function hasStatus(session: SessionInfo, predicate: (status: number) => boolean): boolean {
|
|
72
|
-
return session.latestLogs.some((log) => log.status !== null && predicate(log.status));
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
function evidenceIds(candidates: readonly ErrorCandidate[]): number[] {
|
|
76
|
-
const ids = new Set<number>();
|
|
77
|
-
for (const candidate of candidates) {
|
|
78
|
-
if (candidate.log !== null) {
|
|
79
|
-
ids.add(candidate.log.id);
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
return [...ids].sort((left, right) => left - right);
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
function hasStreamingMismatch(session: SessionInfo): boolean {
|
|
86
|
-
for (const failed of session.latestLogs.filter((log) => log.hasError)) {
|
|
87
|
-
const matchingSuccess = session.latestLogs.some(
|
|
88
|
-
(log) =>
|
|
89
|
-
!log.hasError &&
|
|
90
|
-
log.model === failed.model &&
|
|
91
|
-
log.provider === failed.provider &&
|
|
92
|
-
log.isStreaming !== failed.isStreaming,
|
|
93
|
-
);
|
|
94
|
-
if (matchingSuccess) return true;
|
|
95
|
-
}
|
|
96
|
-
return false;
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
/**
|
|
100
|
-
* Per-category summary, hints, severity, and outcome. Keyed by every
|
|
101
|
-
* `FailureCategory` so TypeScript's `Record` enforces exhaustiveness —
|
|
102
|
-
* adding a new category is a single-place compile error instead of four
|
|
103
|
-
* parallel switch statements missing a case.
|
|
104
|
-
*/
|
|
105
|
-
const FAILURE_CATEGORY_INFO: Record<
|
|
106
|
-
FailureCategory,
|
|
107
|
-
{
|
|
108
|
-
summary: string;
|
|
109
|
-
hints: string[];
|
|
110
|
-
severity: FailureClassification["severity"];
|
|
111
|
-
outcome: FailureClassification["outcome"];
|
|
112
|
-
}
|
|
113
|
-
> = {
|
|
114
|
-
none: {
|
|
115
|
-
summary: "Session completed without captured errors.",
|
|
116
|
-
hints: ["Keep the evidence pack as the success proof for CI or release notes."],
|
|
117
|
-
severity: "none",
|
|
118
|
-
outcome: "success",
|
|
119
|
-
},
|
|
120
|
-
active: {
|
|
121
|
-
summary: "Session still has active requests or running tasks.",
|
|
122
|
-
hints: ["Wait for the session to settle, then export evidence again."],
|
|
123
|
-
severity: "low",
|
|
124
|
-
outcome: "active",
|
|
125
|
-
},
|
|
126
|
-
"provider-timeout": {
|
|
127
|
-
summary: "Provider call appears to have timed out.",
|
|
128
|
-
hints: [
|
|
129
|
-
"Increase the provider test timeout for slow models.",
|
|
130
|
-
"Compare streaming and non-streaming probes for the same model.",
|
|
131
|
-
],
|
|
132
|
-
severity: "high",
|
|
133
|
-
outcome: "failure",
|
|
134
|
-
},
|
|
135
|
-
"provider-http-error": {
|
|
136
|
-
summary: "Provider returned an HTTP error.",
|
|
137
|
-
hints: ["Open the cited log ids and inspect upstream status, response body, and provider URL."],
|
|
138
|
-
severity: "high",
|
|
139
|
-
outcome: "failure",
|
|
140
|
-
},
|
|
141
|
-
"provider-auth-error": {
|
|
142
|
-
summary: "Provider authentication or API key configuration appears invalid.",
|
|
143
|
-
hints: ["Verify the provider API key, auth header mode, and configured base URL."],
|
|
144
|
-
severity: "high",
|
|
145
|
-
outcome: "failure",
|
|
146
|
-
},
|
|
147
|
-
"provider-rate-limit": {
|
|
148
|
-
summary: "Provider rejected the request because of rate limit or quota pressure.",
|
|
149
|
-
hints: ["Retry after provider quota recovers or switch to a less constrained provider/model."],
|
|
150
|
-
severity: "high",
|
|
151
|
-
outcome: "failure",
|
|
152
|
-
},
|
|
153
|
-
"network-or-container": {
|
|
154
|
-
summary: "Network connectivity looks suspicious; check container boundaries and localhost use.",
|
|
155
|
-
hints: [
|
|
156
|
-
"If the coding agent and Inspector are in different containers, replace localhost with a reachable host.",
|
|
157
|
-
"Check DNS, proxy, firewall, and container network routes.",
|
|
158
|
-
],
|
|
159
|
-
severity: "high",
|
|
160
|
-
outcome: "failure",
|
|
161
|
-
},
|
|
162
|
-
"streaming-mismatch": {
|
|
163
|
-
summary: "Streaming and non-streaming behavior differ for the same provider/model.",
|
|
164
|
-
hints: [
|
|
165
|
-
"Compare the streaming and non-streaming captured logs side by side.",
|
|
166
|
-
"Check whether the provider's OpenAI-compatible endpoint handles stream=false differently.",
|
|
167
|
-
],
|
|
168
|
-
severity: "high",
|
|
169
|
-
outcome: "failure",
|
|
170
|
-
},
|
|
171
|
-
"context-pressure": {
|
|
172
|
-
summary: "The failure looks related to context window or token pressure.",
|
|
173
|
-
hints: [
|
|
174
|
-
"Reduce prompt/tool schema/history size or configure the model context window metadata.",
|
|
175
|
-
],
|
|
176
|
-
severity: "medium",
|
|
177
|
-
outcome: "failure",
|
|
178
|
-
},
|
|
179
|
-
"runtime-task-error": {
|
|
180
|
-
summary: "Inspector session runtime reported a task error.",
|
|
181
|
-
hints: ["Inspect the session runtime error and retry after clearing stuck session tasks."],
|
|
182
|
-
severity: "high",
|
|
183
|
-
outcome: "failure",
|
|
184
|
-
},
|
|
185
|
-
"model-output-error": {
|
|
186
|
-
summary: "The model output or upstream payload shape appears invalid.",
|
|
187
|
-
hints: ["Inspect the raw response and schema parsing details for the cited log ids."],
|
|
188
|
-
severity: "medium",
|
|
189
|
-
outcome: "failure",
|
|
190
|
-
},
|
|
191
|
-
"unknown-failure": {
|
|
192
|
-
summary: "Inspector captured errors, but the root cause is not yet classified.",
|
|
193
|
-
hints: ["Open the cited logs and inspect error/status/latency fields to refine the diagnosis."],
|
|
194
|
-
severity: "medium",
|
|
195
|
-
outcome: "failure",
|
|
196
|
-
},
|
|
197
|
-
"no-session-data": {
|
|
198
|
-
summary: "No Inspector session data was available for this run.",
|
|
199
|
-
hints: [
|
|
200
|
-
"Confirm the run's sessionId matches captured traffic and that history scanning is enabled when needed.",
|
|
201
|
-
],
|
|
202
|
-
severity: "medium",
|
|
203
|
-
outcome: "unknown",
|
|
204
|
-
},
|
|
205
|
-
};
|
|
206
|
-
|
|
207
|
-
function classifyCategory(
|
|
208
|
-
session: SessionInfo,
|
|
209
|
-
candidates: readonly ErrorCandidate[],
|
|
210
|
-
): FailureCategory {
|
|
211
|
-
if (session.status === "active") return "active";
|
|
212
|
-
if (session.errorCount === 0 && session.failedRequests === 0 && session.lastTaskError === null) {
|
|
213
|
-
return "none";
|
|
214
|
-
}
|
|
215
|
-
if (hasStreamingMismatch(session)) return "streaming-mismatch";
|
|
216
|
-
if (
|
|
217
|
-
hasText(candidates, [
|
|
218
|
-
"timeout",
|
|
219
|
-
"timed out",
|
|
220
|
-
"etimedout",
|
|
221
|
-
"deadline",
|
|
222
|
-
"aborterror",
|
|
223
|
-
"econnaborted",
|
|
224
|
-
])
|
|
225
|
-
) {
|
|
226
|
-
return "provider-timeout";
|
|
227
|
-
}
|
|
228
|
-
if (hasText(candidates, ["localhost", "econnrefused", "enotfound", "network", "fetch failed"])) {
|
|
229
|
-
return "network-or-container";
|
|
230
|
-
}
|
|
231
|
-
if (hasStatus(session, (status) => status === 401 || status === 403)) {
|
|
232
|
-
return "provider-auth-error";
|
|
233
|
-
}
|
|
234
|
-
if (hasText(candidates, ["unauthorized", "forbidden", "invalid api key", "api key"])) {
|
|
235
|
-
return "provider-auth-error";
|
|
236
|
-
}
|
|
237
|
-
if (hasStatus(session, (status) => status === 429)) return "provider-rate-limit";
|
|
238
|
-
if (hasText(candidates, ["rate limit", "quota"])) return "provider-rate-limit";
|
|
239
|
-
if (hasText(candidates, ["context", "too many tokens", "token limit", "maximum context"])) {
|
|
240
|
-
return "context-pressure";
|
|
241
|
-
}
|
|
242
|
-
if (session.lastTaskError !== null) return "runtime-task-error";
|
|
243
|
-
if (hasText(candidates, ["invalid json", "schema", "parse", "malformed"])) {
|
|
244
|
-
return "model-output-error";
|
|
245
|
-
}
|
|
246
|
-
if (hasStatus(session, (status) => status >= 400)) return "provider-http-error";
|
|
247
|
-
return "unknown-failure";
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
function severityFor(category: FailureCategory): FailureClassification["severity"] {
|
|
251
|
-
return FAILURE_CATEGORY_INFO[category].severity;
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
function outcomeFor(category: FailureCategory): FailureClassification["outcome"] {
|
|
255
|
-
return FAILURE_CATEGORY_INFO[category].outcome;
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
function categorySummary(category: FailureCategory): string {
|
|
259
|
-
return FAILURE_CATEGORY_INFO[category].summary;
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
function categoryHints(category: FailureCategory): string[] {
|
|
263
|
-
return FAILURE_CATEGORY_INFO[category].hints;
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
export function classifyRunFailure(
|
|
267
|
-
run: InspectorRun,
|
|
268
|
-
session: SessionInfo | null,
|
|
269
|
-
): FailureClassification {
|
|
270
|
-
if (session === null) {
|
|
271
|
-
const category: FailureCategory = "no-session-data";
|
|
272
|
-
return {
|
|
273
|
-
outcome: outcomeFor(category),
|
|
274
|
-
severity: severityFor(category),
|
|
275
|
-
category,
|
|
276
|
-
summary: `${categorySummary(category)} Run ${run.id} is bound to session ${run.sessionId}.`,
|
|
277
|
-
evidenceLogIds: [],
|
|
278
|
-
hints: categoryHints(category),
|
|
279
|
-
};
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
const candidates = collectErrorCandidates(session);
|
|
283
|
-
const category = classifyCategory(session, candidates);
|
|
284
|
-
const summary =
|
|
285
|
-
category === "none"
|
|
286
|
-
? `${categorySummary(category)} ${String(session.requestCount)} request(s), ${String(
|
|
287
|
-
session.tokenUsage.total,
|
|
288
|
-
)} token(s).`
|
|
289
|
-
: `${categorySummary(category)} ${String(session.errorCount)} error log(s), ${String(
|
|
290
|
-
session.failedRequests,
|
|
291
|
-
)} failed request(s).`;
|
|
292
|
-
|
|
293
|
-
return {
|
|
294
|
-
outcome: outcomeFor(category),
|
|
295
|
-
severity: severityFor(category),
|
|
296
|
-
category,
|
|
297
|
-
summary,
|
|
298
|
-
evidenceLogIds: evidenceIds(candidates),
|
|
299
|
-
hints: categoryHints(category),
|
|
300
|
-
};
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
function logTitle(log: SessionLogSummary): string {
|
|
304
|
-
if (log.hasError) return `Request failed: log ${String(log.id)}`;
|
|
305
|
-
if (log.status !== null && log.status >= 200 && log.status < 400) {
|
|
306
|
-
return `Request succeeded: log ${String(log.id)}`;
|
|
307
|
-
}
|
|
308
|
-
return `Request captured: log ${String(log.id)}`;
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
function logDetails(log: SessionLogSummary): string {
|
|
312
|
-
const parts = [
|
|
313
|
-
`path=${log.path}`,
|
|
314
|
-
`status=${formatNullable(log.status)}`,
|
|
315
|
-
`model=${formatNullable(log.model)}`,
|
|
316
|
-
`provider=${formatNullable(log.provider)}`,
|
|
317
|
-
`streaming=${log.isStreaming ? "yes" : "no"}`,
|
|
318
|
-
`latencyMs=${formatNullable(log.latencyMs)}`,
|
|
319
|
-
];
|
|
320
|
-
if (log.isStreaming) {
|
|
321
|
-
parts.push(`firstChunkMs=${formatNullable(log.firstChunkMs ?? null)}`);
|
|
322
|
-
parts.push(`totalStreamMs=${formatNullable(log.totalStreamMs ?? null)}`);
|
|
323
|
-
parts.push(`tokensPerSecond=${formatNullable(log.tokensPerSecond ?? null)}`);
|
|
324
|
-
}
|
|
325
|
-
if (log.error !== null) {
|
|
326
|
-
parts.push(`error=${log.error}`);
|
|
327
|
-
}
|
|
328
|
-
return parts.join(", ");
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
export function buildRunTimeline(
|
|
332
|
-
run: InspectorRun,
|
|
333
|
-
session: SessionInfo | null,
|
|
334
|
-
exportedAt: string,
|
|
335
|
-
): RunTimelineEvent[] {
|
|
336
|
-
const events: RunTimelineEvent[] = [
|
|
337
|
-
{
|
|
338
|
-
timestamp: run.createdAt,
|
|
339
|
-
kind: "run-created",
|
|
340
|
-
severity: "info",
|
|
341
|
-
title: "Run declared",
|
|
342
|
-
details: `Run ${run.id} was declared for session ${run.sessionId}.`,
|
|
343
|
-
logId: null,
|
|
344
|
-
status: null,
|
|
345
|
-
model: null,
|
|
346
|
-
provider: null,
|
|
347
|
-
latencyMs: null,
|
|
348
|
-
isStreaming: null,
|
|
349
|
-
},
|
|
350
|
-
];
|
|
351
|
-
|
|
352
|
-
if (session !== null && session.createdAt !== null) {
|
|
353
|
-
events.push({
|
|
354
|
-
timestamp: session.createdAt,
|
|
355
|
-
kind: "session-started",
|
|
356
|
-
severity: "info",
|
|
357
|
-
title: "Session started",
|
|
358
|
-
details: `Inspector session ${session.id} started with source ${session.source ?? "unknown"}.`,
|
|
359
|
-
logId: null,
|
|
360
|
-
status: null,
|
|
361
|
-
model: null,
|
|
362
|
-
provider: null,
|
|
363
|
-
latencyMs: null,
|
|
364
|
-
isStreaming: null,
|
|
365
|
-
});
|
|
366
|
-
}
|
|
367
|
-
|
|
368
|
-
if (session !== null) {
|
|
369
|
-
const logs = [...session.latestLogs].sort((left, right) =>
|
|
370
|
-
left.timestamp.localeCompare(right.timestamp),
|
|
371
|
-
);
|
|
372
|
-
for (const log of logs) {
|
|
373
|
-
events.push({
|
|
374
|
-
timestamp: log.timestamp,
|
|
375
|
-
kind: "request",
|
|
376
|
-
severity: log.hasError ? "error" : "success",
|
|
377
|
-
title: logTitle(log),
|
|
378
|
-
details: logDetails(log),
|
|
379
|
-
logId: log.id,
|
|
380
|
-
status: log.status,
|
|
381
|
-
model: log.model,
|
|
382
|
-
provider: log.provider,
|
|
383
|
-
latencyMs: log.latencyMs,
|
|
384
|
-
isStreaming: log.isStreaming,
|
|
385
|
-
});
|
|
386
|
-
}
|
|
387
|
-
|
|
388
|
-
if (session.updatedAt !== null) {
|
|
389
|
-
events.push({
|
|
390
|
-
timestamp: session.updatedAt,
|
|
391
|
-
kind: "session-finished",
|
|
392
|
-
severity:
|
|
393
|
-
session.status === "failed"
|
|
394
|
-
? "error"
|
|
395
|
-
: session.status === "active"
|
|
396
|
-
? "warning"
|
|
397
|
-
: "success",
|
|
398
|
-
title: `Session ${session.status}`,
|
|
399
|
-
details: `${String(session.requestCount)} request(s), ${String(
|
|
400
|
-
session.errorCount,
|
|
401
|
-
)} error(s), ${String(session.tokenUsage.total)} token(s).`,
|
|
402
|
-
logId: session.lastLogId,
|
|
403
|
-
status: null,
|
|
404
|
-
model: session.lastModel,
|
|
405
|
-
provider: null,
|
|
406
|
-
latencyMs: null,
|
|
407
|
-
isStreaming: null,
|
|
408
|
-
});
|
|
409
|
-
}
|
|
410
|
-
}
|
|
411
|
-
|
|
412
|
-
events.push({
|
|
413
|
-
timestamp: exportedAt,
|
|
414
|
-
kind: "evidence-exported",
|
|
415
|
-
severity: "info",
|
|
416
|
-
title: "Evidence exported",
|
|
417
|
-
details: `Evidence pack exported at ${exportedAt}.`,
|
|
418
|
-
logId: null,
|
|
419
|
-
status: null,
|
|
420
|
-
model: null,
|
|
421
|
-
provider: null,
|
|
422
|
-
latencyMs: null,
|
|
423
|
-
isStreaming: null,
|
|
424
|
-
});
|
|
425
|
-
|
|
426
|
-
return events.sort((left, right) => left.timestamp.localeCompare(right.timestamp));
|
|
427
|
-
}
|
|
428
|
-
|
|
429
|
-
function reportStatus(classification: FailureClassification): JenkinsReport["status"] {
|
|
430
|
-
switch (classification.outcome) {
|
|
431
|
-
case "success":
|
|
432
|
-
return "PASS";
|
|
433
|
-
case "failure":
|
|
434
|
-
return "FAIL";
|
|
435
|
-
case "active":
|
|
436
|
-
return "RUNNING";
|
|
437
|
-
case "unknown":
|
|
438
|
-
return "UNKNOWN";
|
|
439
|
-
}
|
|
440
|
-
}
|
|
441
|
-
|
|
442
|
-
function timelineMarkdown(timeline: readonly RunTimelineEvent[]): string[] {
|
|
443
|
-
if (timeline.length === 0) return ["No timeline events were available."];
|
|
444
|
-
return [
|
|
445
|
-
"| Time | Event | Severity | Evidence |",
|
|
446
|
-
"| --- | --- | --- | --- |",
|
|
447
|
-
...timeline.map((event) => {
|
|
448
|
-
const evidence = event.logId === null ? "n/a" : `log ${String(event.logId)}`;
|
|
449
|
-
return `| ${event.timestamp} | ${event.title} | ${event.severity} | ${evidence} |`;
|
|
450
|
-
}),
|
|
451
|
-
];
|
|
452
|
-
}
|
|
453
|
-
|
|
454
|
-
export function buildJenkinsReport(input: {
|
|
455
|
-
run: InspectorRun;
|
|
456
|
-
session: SessionInfo | null;
|
|
457
|
-
timeline: readonly RunTimelineEvent[];
|
|
458
|
-
classification: FailureClassification;
|
|
459
|
-
evidencePaths: AnalyzeEvidenceInput["evidencePaths"];
|
|
460
|
-
}): JenkinsReport {
|
|
461
|
-
const status = reportStatus(input.classification);
|
|
462
|
-
const session = input.session;
|
|
463
|
-
const summary = `[${status}] ${input.classification.summary}`;
|
|
464
|
-
const lines = [
|
|
465
|
-
`# Jenkins Report: ${input.run.title}`,
|
|
466
|
-
"",
|
|
467
|
-
`- Status: ${status}`,
|
|
468
|
-
`- Run ID: ${input.run.id}`,
|
|
469
|
-
`- Session ID: ${input.run.sessionId}`,
|
|
470
|
-
`- Inspector URL: ${session?.inspectorUrl ?? "n/a"}`,
|
|
471
|
-
`- Category: ${input.classification.category}`,
|
|
472
|
-
`- Severity: ${input.classification.severity}`,
|
|
473
|
-
`- Summary: ${input.classification.summary}`,
|
|
474
|
-
`- Evidence Logs: ${
|
|
475
|
-
input.classification.evidenceLogIds.length > 0
|
|
476
|
-
? input.classification.evidenceLogIds.map((id) => `#${String(id)}`).join(", ")
|
|
477
|
-
: "n/a"
|
|
478
|
-
}`,
|
|
479
|
-
"",
|
|
480
|
-
"## Session Metrics",
|
|
481
|
-
"",
|
|
482
|
-
`- Requests: ${String(session?.requestCount ?? 0)}`,
|
|
483
|
-
`- Errors: ${String(session?.errorCount ?? 0)}`,
|
|
484
|
-
`- Models: ${formatList(session?.models ?? [])}`,
|
|
485
|
-
`- Providers: ${formatList(session?.providers ?? [])}`,
|
|
486
|
-
`- Tokens: ${String(session?.tokenUsage.total ?? 0)}`,
|
|
487
|
-
"",
|
|
488
|
-
"## Timeline",
|
|
489
|
-
"",
|
|
490
|
-
...timelineMarkdown(input.timeline),
|
|
491
|
-
"",
|
|
492
|
-
"## Artifacts",
|
|
493
|
-
"",
|
|
494
|
-
`- JSON: ${input.evidencePaths.jsonPath}`,
|
|
495
|
-
`- Markdown: ${input.evidencePaths.markdownPath}`,
|
|
496
|
-
`- HTML: ${input.evidencePaths.htmlPath}`,
|
|
497
|
-
"",
|
|
498
|
-
"## Next Actions",
|
|
499
|
-
"",
|
|
500
|
-
...input.classification.hints.map((hint) => `- ${hint}`),
|
|
501
|
-
"",
|
|
502
|
-
];
|
|
503
|
-
|
|
504
|
-
return {
|
|
505
|
-
status,
|
|
506
|
-
summary,
|
|
507
|
-
markdown: lines.join("\n"),
|
|
508
|
-
};
|
|
509
|
-
}
|
|
510
|
-
|
|
511
|
-
export function analyzeEvidence(input: AnalyzeEvidenceInput): {
|
|
512
|
-
classification: FailureClassification;
|
|
513
|
-
timeline: RunTimelineEvent[];
|
|
514
|
-
jenkinsReport: JenkinsReport;
|
|
515
|
-
} {
|
|
516
|
-
const classification = classifyRunFailure(input.run, input.session);
|
|
517
|
-
const timeline = buildRunTimeline(input.run, input.session, input.exportedAt);
|
|
518
|
-
const jenkinsReport = buildJenkinsReport({
|
|
519
|
-
run: input.run,
|
|
520
|
-
session: input.session,
|
|
521
|
-
timeline,
|
|
522
|
-
classification,
|
|
523
|
-
evidencePaths: input.evidencePaths,
|
|
524
|
-
});
|
|
525
|
-
return { classification, timeline, jenkinsReport };
|
|
526
|
-
}
|