stageflow 0.40.0 → 0.44.0
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/README.md +15 -4
- package/dist/agent/activity.d.ts +18 -0
- package/dist/agent/claudeAdapter.js +7 -0
- package/dist/agent/claudeTools.d.ts +27 -18
- package/dist/agent/claudeTools.js +54 -15
- package/dist/agent/compactionEvents.d.ts +34 -0
- package/dist/agent/compactionEvents.js +37 -0
- package/dist/agent/openRouterRouting.d.ts +7 -0
- package/dist/agent/openRouterRouting.js +23 -0
- package/dist/agent/piAdapter.d.ts +6 -0
- package/dist/agent/piAdapter.js +128 -27
- package/dist/agent/piSettings.d.ts +7 -0
- package/dist/agent/piSettings.js +9 -0
- package/dist/agent/sandboxPiTools.d.ts +3 -1
- package/dist/agent/sandboxPiTools.js +8 -2
- package/dist/agent/stageTurnDriver.d.ts +11 -2
- package/dist/agent/stageTurnDriver.js +45 -4
- package/dist/agent/toolOutputBudget.d.ts +15 -1
- package/dist/agent/toolOutputBudget.js +18 -0
- package/dist/agent/toolOutputBudgetExtension.d.ts +2 -0
- package/dist/agent/toolOutputBudgetExtension.js +40 -3
- package/dist/agents/authorChat.d.ts +5 -0
- package/dist/agents/authorChat.js +120 -12
- package/dist/agents/authorSessionStore.d.ts +38 -0
- package/dist/agents/authorSessionStore.js +167 -0
- package/dist/agents/chatTurn.d.ts +2 -0
- package/dist/agents/chatTurn.js +17 -1
- package/dist/agents/errors.d.ts +1 -1
- package/dist/agents/errors.js +1 -0
- package/dist/agents/evalGate.d.ts +61 -0
- package/dist/agents/evalGate.js +103 -0
- package/dist/agents/evalSession.d.ts +26 -0
- package/dist/agents/evalSession.js +29 -0
- package/dist/agents/hostContext.d.ts +4 -1
- package/dist/agents/hostContext.js +4 -1
- package/dist/agents/runtime/piRuntime.d.ts +6 -2
- package/dist/agents/runtime/piRuntime.js +50 -16
- package/dist/agents/runtime/types.d.ts +3 -1
- package/dist/agents/service.d.ts +27 -2
- package/dist/agents/service.js +91 -15
- package/dist/agents/sessions.d.ts +8 -0
- package/dist/agents/sessions.js +53 -11
- package/dist/agents/store.d.ts +14 -3
- package/dist/agents/store.js +45 -7
- package/dist/agents/toolRisk.d.ts +21 -0
- package/dist/agents/toolRisk.js +50 -0
- package/dist/cli/doctorCommand.js +26 -0
- package/dist/cli/evalCommand.d.ts +20 -0
- package/dist/cli/evalCommand.js +720 -0
- package/dist/cli/exportAllCommand.js +1 -1
- package/dist/cli/hostClient.d.ts +60 -0
- package/dist/cli/hostClient.js +71 -0
- package/dist/cli/validateOutput.d.ts +2 -2
- package/dist/cli/validateOutput.js +2 -2
- package/dist/cli.js +10 -0
- package/dist/compaction/directives.d.ts +18 -0
- package/dist/compaction/directives.js +119 -0
- package/dist/compaction/extension.d.ts +20 -0
- package/dist/compaction/extension.js +78 -0
- package/dist/compaction/mask.d.ts +18 -0
- package/dist/compaction/mask.js +155 -0
- package/dist/compaction/pin.d.ts +21 -0
- package/dist/compaction/pin.js +270 -0
- package/dist/compaction/scrub.d.ts +7 -0
- package/dist/compaction/scrub.js +26 -0
- package/dist/compaction/sessionWiring.d.ts +22 -0
- package/dist/compaction/sessionWiring.js +26 -0
- package/dist/compaction/summarize.d.ts +79 -0
- package/dist/compaction/summarize.js +171 -0
- package/dist/compaction/toolPolicy.d.ts +3 -0
- package/dist/compaction/toolPolicy.js +33 -0
- package/dist/compaction/types.d.ts +45 -0
- package/dist/compaction/types.js +7 -0
- package/dist/compaction/workingState.d.ts +56 -0
- package/dist/compaction/workingState.js +198 -0
- package/dist/config/atomicWrite.d.ts +15 -0
- package/dist/config/atomicWrite.js +43 -0
- package/dist/config/browseCatalog.d.ts +2 -0
- package/dist/config/browseCatalog.js +4 -2
- package/dist/config/createPipeline.js +2 -0
- package/dist/config/createTrigger.js +7 -1
- package/dist/config/csv.d.ts +9 -0
- package/dist/config/csv.js +81 -0
- package/dist/config/datasetAgentCheck.d.ts +18 -0
- package/dist/config/datasetAgentCheck.js +109 -0
- package/dist/config/datasetCandidates.d.ts +22 -0
- package/dist/config/datasetCandidates.js +86 -0
- package/dist/config/datasetFromSessions.d.ts +34 -0
- package/dist/config/datasetFromSessions.js +105 -0
- package/dist/config/datasetHash.d.ts +1 -0
- package/dist/config/datasetHash.js +4 -0
- package/dist/config/datasetImport.d.ts +21 -0
- package/dist/config/datasetImport.js +120 -0
- package/dist/config/datasetStageCheck.d.ts +9 -0
- package/dist/config/datasetStageCheck.js +17 -0
- package/dist/config/datasetTypes.d.ts +27 -0
- package/dist/config/datasetTypes.js +1 -0
- package/dist/config/ensureCatalogScanRoot.d.ts +4 -1
- package/dist/config/ensureCatalogScanRoot.js +8 -6
- package/dist/config/evalCatalog.d.ts +22 -0
- package/dist/config/evalCatalog.js +95 -0
- package/dist/config/evalWriteRoots.d.ts +17 -0
- package/dist/config/evalWriteRoots.js +109 -0
- package/dist/config/githubTriggerAction.d.ts +8 -0
- package/dist/config/githubTriggerAction.js +29 -0
- package/dist/config/hostConfig.js +3 -0
- package/dist/config/installEvalSample.d.ts +34 -0
- package/dist/config/installEvalSample.js +182 -0
- package/dist/config/loadDataset.d.ts +16 -0
- package/dist/config/loadDataset.js +318 -0
- package/dist/config/loadEval.d.ts +32 -0
- package/dist/config/loadEval.js +1103 -0
- package/dist/config/loadOutcome.d.ts +5 -0
- package/dist/config/loadStageflowManifest.js +64 -0
- package/dist/config/pipelineNeeds.d.ts +2 -0
- package/dist/config/pipelineNeeds.js +16 -3
- package/dist/config/pipelineRoute.js +5 -4
- package/dist/config/resolveAgentTarget.d.ts +32 -0
- package/dist/config/resolveAgentTarget.js +118 -0
- package/dist/config/resolveEvalTarget.d.ts +21 -0
- package/dist/config/resolveEvalTarget.js +89 -0
- package/dist/config/scanCatalogPaths.d.ts +1 -1
- package/dist/config/scanCatalogPaths.js +17 -5
- package/dist/config/validateCatalog.d.ts +2 -2
- package/dist/config/validateCatalog.js +21 -1
- package/dist/config/validateEval.d.ts +36 -0
- package/dist/config/validateEval.js +446 -0
- package/dist/config/writeDataset.d.ts +54 -0
- package/dist/config/writeDataset.js +186 -0
- package/dist/config/writeEval.d.ts +25 -0
- package/dist/config/writeEval.js +398 -0
- package/dist/diagnostics/checks.js +1 -1
- package/dist/envelope/assertEmittedArtifacts.d.ts +12 -0
- package/dist/envelope/assertEmittedArtifacts.js +43 -0
- package/dist/envelope/preEmitChecks.d.ts +3 -0
- package/dist/evals/agentDiff.d.ts +13 -0
- package/dist/evals/agentDiff.js +11 -0
- package/dist/evals/canonical.d.ts +3 -0
- package/dist/evals/canonical.js +24 -0
- package/dist/evals/caseTask.d.ts +3 -0
- package/dist/evals/caseTask.js +9 -0
- package/dist/evals/compare.d.ts +94 -0
- package/dist/evals/compare.js +201 -0
- package/dist/evals/constants.d.ts +62 -0
- package/dist/evals/constants.js +97 -0
- package/dist/evals/engine/FakeEngine.d.ts +33 -0
- package/dist/evals/engine/FakeEngine.js +177 -0
- package/dist/evals/engine/index.d.ts +9 -0
- package/dist/evals/engine/index.js +19 -0
- package/dist/evals/engine/promptfoo/PromptfooEngine.d.ts +52 -0
- package/dist/evals/engine/promptfoo/PromptfooEngine.js +312 -0
- package/dist/evals/engine/promptfoo/errors.d.ts +5 -0
- package/dist/evals/engine/promptfoo/errors.js +8 -0
- package/dist/evals/engine/promptfoo/generate.d.ts +30 -0
- package/dist/evals/engine/promptfoo/generate.js +345 -0
- package/dist/evals/engine/promptfoo/guard.d.ts +10 -0
- package/dist/evals/engine/promptfoo/guard.js +116 -0
- package/dist/evals/engine/promptfoo/install.d.ts +17 -0
- package/dist/evals/engine/promptfoo/install.js +73 -0
- package/dist/evals/engine/promptfoo/judgeProviders.d.ts +2 -0
- package/dist/evals/engine/promptfoo/judgeProviders.js +9 -0
- package/dist/evals/engine/promptfoo/judgeServices.d.ts +6 -0
- package/dist/evals/engine/promptfoo/judgeServices.js +41 -0
- package/dist/evals/engine/promptfoo/locate.d.ts +21 -0
- package/dist/evals/engine/promptfoo/locate.js +68 -0
- package/dist/evals/engine/promptfoo/nodeVersion.d.ts +7 -0
- package/dist/evals/engine/promptfoo/nodeVersion.js +14 -0
- package/dist/evals/engine/promptfoo/normalize.d.ts +66 -0
- package/dist/evals/engine/promptfoo/normalize.js +261 -0
- package/dist/evals/engine/promptfoo/pinned.d.ts +5 -0
- package/dist/evals/engine/promptfoo/pinned.js +5 -0
- package/dist/evals/engine/promptfoo/rubricPrompt.d.ts +14 -0
- package/dist/evals/engine/promptfoo/rubricPrompt.js +105 -0
- package/dist/evals/engine/promptfoo/runTokens.d.ts +18 -0
- package/dist/evals/engine/promptfoo/runTokens.js +31 -0
- package/dist/evals/engine/promptfoo/status.d.ts +13 -0
- package/dist/evals/engine/promptfoo/status.js +16 -0
- package/dist/evals/estimate.d.ts +56 -0
- package/dist/evals/estimate.js +66 -0
- package/dist/evals/graders/codeGrader.d.ts +6 -0
- package/dist/evals/graders/codeGrader.js +85 -0
- package/dist/evals/graders/conversationCheckGrader.d.ts +6 -0
- package/dist/evals/graders/conversationCheckGrader.js +62 -0
- package/dist/evals/graders/fieldGrader.d.ts +11 -0
- package/dist/evals/graders/fieldGrader.js +117 -0
- package/dist/evals/graders/goal.d.ts +3 -0
- package/dist/evals/graders/goal.js +14 -0
- package/dist/evals/graders/index.d.ts +18 -0
- package/dist/evals/graders/index.js +34 -0
- package/dist/evals/graders/notApplicable.d.ts +5 -0
- package/dist/evals/graders/notApplicable.js +9 -0
- package/dist/evals/graders/path.d.ts +26 -0
- package/dist/evals/graders/path.js +75 -0
- package/dist/evals/graders/referenceGrader.d.ts +5 -0
- package/dist/evals/graders/referenceGrader.js +59 -0
- package/dist/evals/graders/schemaGrader.d.ts +5 -0
- package/dist/evals/graders/schemaGrader.js +29 -0
- package/dist/evals/graders/subject.d.ts +6 -0
- package/dist/evals/graders/subject.js +33 -0
- package/dist/evals/graders/toolCallsGrader.d.ts +6 -0
- package/dist/evals/graders/toolCallsGrader.js +100 -0
- package/dist/evals/graders/transcript.d.ts +12 -0
- package/dist/evals/graders/transcript.js +57 -0
- package/dist/evals/graders/types.d.ts +20 -0
- package/dist/evals/graders/types.js +1 -0
- package/dist/evals/judgeProviders.d.ts +16 -0
- package/dist/evals/judgeProviders.js +27 -0
- package/dist/evals/lineDiff.d.ts +5 -0
- package/dist/evals/lineDiff.js +34 -0
- package/dist/evals/listStatus.d.ts +31 -0
- package/dist/evals/listStatus.js +48 -0
- package/dist/evals/manager.d.ts +187 -0
- package/dist/evals/manager.js +795 -0
- package/dist/evals/plan.d.ts +65 -0
- package/dist/evals/plan.js +621 -0
- package/dist/evals/planInternalAgent.d.ts +19 -0
- package/dist/evals/planInternalAgent.js +205 -0
- package/dist/evals/providerKeys.d.ts +1 -0
- package/dist/evals/providerKeys.js +21 -0
- package/dist/evals/read/agentTargets.d.ts +37 -0
- package/dist/evals/read/agentTargets.js +101 -0
- package/dist/evals/read/api.d.ts +208 -0
- package/dist/evals/read/api.js +363 -0
- package/dist/evals/read/compare.d.ts +4 -0
- package/dist/evals/read/compare.js +39 -0
- package/dist/evals/read/datasets.d.ts +105 -0
- package/dist/evals/read/datasets.js +318 -0
- package/dist/evals/read/list.d.ts +66 -0
- package/dist/evals/read/list.js +182 -0
- package/dist/evals/read/results.d.ts +46 -0
- package/dist/evals/read/results.js +107 -0
- package/dist/evals/read/runs.d.ts +154 -0
- package/dist/evals/read/runs.js +295 -0
- package/dist/evals/read/suggestions.d.ts +43 -0
- package/dist/evals/read/suggestions.js +73 -0
- package/dist/evals/runner/FakeAgentBackend.d.ts +40 -0
- package/dist/evals/runner/FakeAgentBackend.js +82 -0
- package/dist/evals/runner/agentCaseRunner.d.ts +24 -0
- package/dist/evals/runner/agentCaseRunner.js +388 -0
- package/dist/evals/runner/caseRunner.d.ts +8 -0
- package/dist/evals/runner/caseRunner.js +28 -0
- package/dist/evals/runner/conversationSubject.d.ts +18 -0
- package/dist/evals/runner/conversationSubject.js +123 -0
- package/dist/evals/runner/internalAgentCaseRunner.d.ts +6 -0
- package/dist/evals/runner/internalAgentCaseRunner.js +250 -0
- package/dist/evals/runner/simulatorModel.d.ts +51 -0
- package/dist/evals/runner/simulatorModel.js +58 -0
- package/dist/evals/runner/simulatorPrompt.d.ts +29 -0
- package/dist/evals/runner/simulatorPrompt.js +59 -0
- package/dist/evals/runner/stageCaseRunner.d.ts +30 -0
- package/dist/evals/runner/stageCaseRunner.js +279 -0
- package/dist/evals/runner/userDriver.d.ts +71 -0
- package/dist/evals/runner/userDriver.js +104 -0
- package/dist/evals/scoring.d.ts +34 -0
- package/dist/evals/scoring.js +67 -0
- package/dist/evals/snapshot.d.ts +191 -0
- package/dist/evals/snapshot.js +70 -0
- package/dist/evals/stageDiff.d.ts +8 -0
- package/dist/evals/stageDiff.js +48 -0
- package/dist/evals/stats.d.ts +95 -0
- package/dist/evals/stats.js +220 -0
- package/dist/evals/statsAdapter.d.ts +4 -0
- package/dist/evals/statsAdapter.js +30 -0
- package/dist/evals/statsTypes.d.ts +51 -0
- package/dist/evals/statsTypes.js +18 -0
- package/dist/evals/storeError.d.ts +5 -0
- package/dist/evals/storeError.js +8 -0
- package/dist/evals/storeTypes.d.ts +207 -0
- package/dist/evals/storeTypes.js +1 -0
- package/dist/evals/tTable.d.ts +3 -0
- package/dist/evals/tTable.js +15 -0
- package/dist/evals/triage/constants.d.ts +26 -0
- package/dist/evals/triage/constants.js +33 -0
- package/dist/evals/triage/credentials.d.ts +13 -0
- package/dist/evals/triage/credentials.js +20 -0
- package/dist/evals/triage/jevClassifier.d.ts +14 -0
- package/dist/evals/triage/jevClassifier.js +124 -0
- package/dist/evals/triage/judgeClassifier.d.ts +10 -0
- package/dist/evals/triage/judgeClassifier.js +76 -0
- package/dist/evals/triage/prompts.d.ts +16 -0
- package/dist/evals/triage/prompts.js +64 -0
- package/dist/evals/triage/service.d.ts +79 -0
- package/dist/evals/triage/service.js +217 -0
- package/dist/evals/triage/stateBuilder.d.ts +19 -0
- package/dist/evals/triage/stateBuilder.js +125 -0
- package/dist/evals/triage/types.d.ts +60 -0
- package/dist/evals/triage/types.js +8 -0
- package/dist/evals/types.d.ts +357 -0
- package/dist/evals/types.js +4 -0
- package/dist/guide/cardContract.d.ts +133 -0
- package/dist/guide/cardContract.js +156 -0
- package/dist/guide/chat.d.ts +45 -0
- package/dist/guide/chat.js +378 -0
- package/dist/guide/knowledge/index.d.ts +14 -0
- package/dist/guide/knowledge/index.js +109 -0
- package/dist/guide/knowledge/topics/agents.d.ts +2 -0
- package/dist/guide/knowledge/topics/agents.js +58 -0
- package/dist/guide/knowledge/topics/bestPractices.d.ts +2 -0
- package/dist/guide/knowledge/topics/bestPractices.js +67 -0
- package/dist/guide/knowledge/topics/connections.d.ts +2 -0
- package/dist/guide/knowledge/topics/connections.js +66 -0
- package/dist/guide/knowledge/topics/consoleMap.d.ts +2 -0
- package/dist/guide/knowledge/topics/consoleMap.js +55 -0
- package/dist/guide/knowledge/topics/evals.d.ts +2 -0
- package/dist/guide/knowledge/topics/evals.js +72 -0
- package/dist/guide/knowledge/topics/limitations.d.ts +2 -0
- package/dist/guide/knowledge/topics/limitations.js +84 -0
- package/dist/guide/knowledge/topics/mcpSkillsBrowser.d.ts +2 -0
- package/dist/guide/knowledge/topics/mcpSkillsBrowser.js +57 -0
- package/dist/guide/knowledge/topics/memories.d.ts +2 -0
- package/dist/guide/knowledge/topics/memories.js +63 -0
- package/dist/guide/knowledge/topics/modelsAndProviders.d.ts +2 -0
- package/dist/guide/knowledge/topics/modelsAndProviders.js +56 -0
- package/dist/guide/knowledge/topics/overview.d.ts +2 -0
- package/dist/guide/knowledge/topics/overview.js +56 -0
- package/dist/guide/knowledge/topics/pipelines.d.ts +2 -0
- package/dist/guide/knowledge/topics/pipelines.js +93 -0
- package/dist/guide/knowledge/topics/stages.d.ts +2 -0
- package/dist/guide/knowledge/topics/stages.js +54 -0
- package/dist/guide/knowledge/topics/tasks.d.ts +2 -0
- package/dist/guide/knowledge/topics/tasks.js +52 -0
- package/dist/guide/knowledge/topics/triggers.d.ts +2 -0
- package/dist/guide/knowledge/topics/triggers.js +68 -0
- package/dist/guide/knowledge/topics/troubleshooting.d.ts +2 -0
- package/dist/guide/knowledge/topics/troubleshooting.js +85 -0
- package/dist/guide/knowledgeTools.d.ts +2 -0
- package/dist/guide/knowledgeTools.js +56 -0
- package/dist/guide/showUi.d.ts +6 -0
- package/dist/guide/showUi.js +546 -0
- package/dist/guide/threadStore.d.ts +48 -0
- package/dist/guide/threadStore.js +189 -0
- package/dist/guide/writeRoot.d.ts +11 -0
- package/dist/guide/writeRoot.js +70 -0
- package/dist/hosted/translate.js +2 -0
- package/dist/mcp/agentTools.js +12 -0
- package/dist/mcp/catalogTools.js +18 -20
- package/dist/mcp/catalogWriteTools.d.ts +8 -0
- package/dist/mcp/catalogWriteTools.js +225 -0
- package/dist/mcp/connectionTools.d.ts +3 -0
- package/dist/mcp/connectionTools.js +85 -0
- package/dist/mcp/controlTools.js +34 -1
- package/dist/mcp/deps.d.ts +16 -0
- package/dist/mcp/evalTools.d.ts +3 -0
- package/dist/mcp/evalTools.js +943 -0
- package/dist/mcp/memoryHostTools.d.ts +3 -0
- package/dist/mcp/memoryHostTools.js +72 -0
- package/dist/mcp/pipelineAuthorTools.js +14 -1
- package/dist/mcp/server.js +6 -0
- package/dist/mcp/tools.js +8 -0
- package/dist/mcp/triggerTools.js +77 -31
- package/dist/models/response.d.ts +7 -2
- package/dist/models/response.js +6 -1
- package/dist/operatorAgent/agentAuthorContext.d.ts +1 -1
- package/dist/operatorAgent/agentAuthorContext.js +1 -1
- package/dist/operatorAgent/evalGate.d.ts +22 -0
- package/dist/operatorAgent/evalGate.js +77 -0
- package/dist/operatorAgent/fakeHost.js +10 -2
- package/dist/operatorAgent/host.js +18 -2
- package/dist/operatorAgent/index.d.ts +1 -0
- package/dist/operatorAgent/index.js +1 -0
- package/dist/operatorAgent/internalAgents.d.ts +11 -0
- package/dist/operatorAgent/internalAgents.js +13 -0
- package/dist/operatorAgent/piModel.d.ts +5 -1
- package/dist/operatorAgent/piModel.js +32 -14
- package/dist/operatorAgent/profiles/agentAuthor.d.ts +3 -1
- package/dist/operatorAgent/profiles/agentAuthor.js +201 -32
- package/dist/operatorAgent/profiles/agentAuthorPlaybook.d.ts +1 -1
- package/dist/operatorAgent/profiles/agentAuthorPlaybook.js +48 -15
- package/dist/operatorAgent/profiles/authorReadable.d.ts +2 -0
- package/dist/operatorAgent/profiles/authorReadable.js +26 -0
- package/dist/operatorAgent/profiles/guideConfirm.d.ts +21 -0
- package/dist/operatorAgent/profiles/guideConfirm.js +100 -0
- package/dist/operatorAgent/profiles/guideTools.d.ts +7 -0
- package/dist/operatorAgent/profiles/guideTools.js +123 -0
- package/dist/operatorAgent/profiles/stageflowGuide.d.ts +7 -0
- package/dist/operatorAgent/profiles/stageflowGuide.js +132 -0
- package/dist/operatorAgent/profiles/workshopAuthor.js +23 -0
- package/dist/operatorAgent/profiles/workshopAuthorPlaybook.d.ts +1 -1
- package/dist/operatorAgent/profiles/workshopAuthorPlaybook.js +9 -1
- package/dist/operatorAgent/profiles/workshopAuthorTools.d.ts +2 -0
- package/dist/operatorAgent/profiles/workshopAuthorTools.js +197 -9
- package/dist/operatorAgent/types.d.ts +23 -0
- package/dist/package-meta.d.ts +1 -1
- package/dist/package-meta.js +1 -1
- package/dist/runstore/port.d.ts +43 -0
- package/dist/runstore/retention.d.ts +2 -1
- package/dist/runstore/retention.js +3 -7
- package/dist/runstore/runStatusClock.d.ts +17 -0
- package/dist/runstore/runStatusClock.js +19 -0
- package/dist/runstore/sqlite/SqliteRunStore.d.ts +29 -0
- package/dist/runstore/sqlite/SqliteRunStore.js +144 -50
- package/dist/runstore/sqlite/evalStore.d.ts +20 -0
- package/dist/runstore/sqlite/evalStore.js +541 -0
- package/dist/runstore/sqlite/migrations/015-evals.d.ts +12 -0
- package/dist/runstore/sqlite/migrations/015-evals.js +157 -0
- package/dist/runstore/sqlite/migrations/016-eval-subject-ref.d.ts +12 -0
- package/dist/runstore/sqlite/migrations/016-eval-subject-ref.js +20 -0
- package/dist/runstore/sqlite/migrations/017-eval-result-suggestions.d.ts +11 -0
- package/dist/runstore/sqlite/migrations/017-eval-result-suggestions.js +36 -0
- package/dist/runstore/sqlite/migrations/index.js +6 -0
- package/dist/runstore/sqlite/suggestionStore.d.ts +14 -0
- package/dist/runstore/sqlite/suggestionStore.js +132 -0
- package/dist/runstore/workspaceLayout.js +6 -1
- package/dist/runtime/artifactDiskInspect.d.ts +14 -0
- package/dist/runtime/artifactDiskInspect.js +52 -0
- package/dist/runtime/artifactPath.d.ts +24 -0
- package/dist/runtime/artifactPath.js +84 -0
- package/dist/runtime/completionCheckRunner.js +15 -43
- package/dist/runtime/githubPollSource.d.ts +22 -4
- package/dist/runtime/githubPollSource.js +93 -8
- package/dist/runtime/pipelineRunner.d.ts +2 -1
- package/dist/runtime/pipelineRunner.js +2 -0
- package/dist/runtime/priorArtifactGrants.d.ts +8 -0
- package/dist/runtime/priorArtifactGrants.js +105 -0
- package/dist/runtime/runActionEligibility.d.ts +46 -0
- package/dist/runtime/runActionEligibility.js +123 -0
- package/dist/runtime/runManager.d.ts +6 -2
- package/dist/runtime/runManager.js +60 -16
- package/dist/runtime/runRetentionSweep.js +2 -2
- package/dist/runtime/runRetryCoordinator.d.ts +2 -14
- package/dist/runtime/runRetryCoordinator.js +3 -67
- package/dist/runtime/sandboxContainer.d.ts +7 -0
- package/dist/runtime/sandboxContainer.js +48 -6
- package/dist/runtime/sandboxDesk.d.ts +2 -1
- package/dist/runtime/sandboxDesk.js +11 -12
- package/dist/runtime/stageEnvironment.js +1 -0
- package/dist/runtime/stageRoots.d.ts +12 -0
- package/dist/runtime/stageSandbox.d.ts +2 -1
- package/dist/runtime/stageSandbox.js +18 -2
- package/dist/runtime/stageWorker.js +20 -0
- package/dist/server/agentAuthorRoutes.js +59 -1
- package/dist/server/bootstrap.d.ts +13 -0
- package/dist/server/bootstrap.js +69 -0
- package/dist/server/controlToken.js +3 -0
- package/dist/server/evalInternalRoutes.d.ts +14 -0
- package/dist/server/evalInternalRoutes.js +87 -0
- package/dist/server/evalRouteContext.d.ts +46 -0
- package/dist/server/evalRouteContext.js +43 -0
- package/dist/server/evalRoutes.d.ts +5 -0
- package/dist/server/evalRoutes.js +1456 -0
- package/dist/server/evalTriageRoutes.d.ts +2 -0
- package/dist/server/evalTriageRoutes.js +95 -0
- package/dist/server/guideRoutes.d.ts +5 -0
- package/dist/server/guideRoutes.js +166 -0
- package/dist/server/http.d.ts +15 -0
- package/dist/server/http.js +67 -3
- package/dist/server/internalAgentRoutes.d.ts +6 -0
- package/dist/server/internalAgentRoutes.js +12 -0
- package/dist/server/mcpHost.js +5 -0
- package/dist/toolkit/meta.d.ts +1 -1
- package/dist/toolkit/meta.js +53 -0
- package/dist/toolkit/profiles.d.ts +5 -0
- package/dist/toolkit/profiles.js +13 -1
- package/dist/tools/askOperator.js +2 -1
- package/dist/tools/emitStageEnvelope.d.ts +17 -16
- package/dist/tools/emitStageEnvelope.js +46 -32
- package/dist/tools/stageToolNames.d.ts +4 -0
- package/dist/tools/stageToolNames.js +4 -0
- package/dist/tools/workingState.d.ts +40 -0
- package/dist/tools/workingState.js +108 -0
- package/dist/tools/writeStageArtifact.d.ts +0 -9
- package/dist/tools/writeStageArtifact.js +2 -1
- package/dist/types/stageflowManifest.d.ts +6 -0
- package/dist/ui/assets/{MarkdownText-D7tYaIFO.js → MarkdownText-S5C_vemc.js} +2 -2
- package/dist/ui/assets/adapters-C0l4ruiR.js +17 -0
- package/dist/ui/assets/chat-CjnsmvqR.js +2 -0
- package/dist/ui/assets/chat-DFDd4UjS.css +2 -0
- package/dist/ui/assets/{main-BFo79krC.css → main-Del1GeLf.css} +1 -1
- package/dist/ui/assets/main-_yXVqcW9.js +277 -0
- package/dist/ui/chat.html +3 -4
- package/dist/ui/index.html +3 -4
- package/dist/workshop/chatTurn.js +1 -1
- package/dist/workshop/workshopPin.d.ts +3 -3
- package/dist/workshop/workshopPin.js +16 -15
- package/examples/README.md +2 -0
- package/examples/compaction-stress/README.md +30 -0
- package/examples/compaction-stress/check-run.mjs +53 -0
- package/examples/compaction-stress/collect-evidence.yaml +60 -0
- package/examples/compaction-stress/compaction-stress.pipeline.yaml +141 -0
- package/examples/compaction-stress/compaction-stress.task.yaml +15 -0
- package/examples/compaction-stress/generate-evidence.mjs +110 -0
- package/examples/compaction-stress/root-cause.yaml +26 -0
- package/examples/compaction-stress/stageflow.yaml +9 -0
- package/examples/compaction-stress/write-postmortem.yaml +40 -0
- package/examples/document-policy-review/README.md +35 -0
- package/examples/document-policy-review/agents/compliance.agent.yaml +42 -0
- package/examples/document-policy-review/documents/acme-vendor-sow.md +15 -0
- package/examples/document-policy-review/documents/support-runbook.md +13 -0
- package/examples/document-policy-review/policies/acceptable-use.md +13 -0
- package/examples/document-policy-review/policies/data-handling.md +17 -0
- package/examples/document-policy-review/policies/vendor-security.md +17 -0
- package/examples/evals/README.md +141 -0
- package/examples/evals/critique-sample.dataset.jsonl +8 -0
- package/examples/evals/critique-sample.eval.yaml +34 -0
- package/examples/evals/critique-sample.task.yaml +4 -0
- package/examples/evals/eval-sample.pipeline.yaml +35 -0
- package/examples/evals/guide-behavior.dataset.jsonl +15 -0
- package/examples/evals/guide-behavior.eval.yaml +35 -0
- package/examples/evals/guide-depth.dataset.jsonl +35 -0
- package/examples/evals/guide-depth.eval.yaml +169 -0
- package/examples/evals/support-sample.agent.yaml +20 -0
- package/examples/evals/support-sample.dataset.jsonl +6 -0
- package/examples/evals/support-sample.eval.yaml +38 -0
- package/examples/memory/evals/guide-behavior.dataset.jsonl +15 -0
- package/examples/memory/evals/guide-behavior.eval.yaml +35 -0
- package/examples/memory/evals/guide-depth.dataset.jsonl +35 -0
- package/examples/memory/evals/guide-depth.eval.yaml +169 -0
- package/examples/stageflow.yaml +6 -0
- package/package.json +1 -1
- package/skills/stageflow/SKILL.md +5 -2
- package/skills/stageflow/references/control-surface.md +4 -2
- package/skills/stageflow/references/evals.md +68 -0
- package/skills/stageflow-author/SKILL.md +4 -0
- package/skills/stageflow-run/SKILL.md +4 -0
- package/dist/ui/assets/AssistantRuntimeProvider-CsiPFhCT.js +0 -9
- package/dist/ui/assets/ReadonlyStore-BfXqHykm.js +0 -6
- package/dist/ui/assets/chat-BbLukq9W.js +0 -5
- package/dist/ui/assets/chat-zIZU_bP1.css +0 -2
- package/dist/ui/assets/main-CijYMeM0.js +0 -259
|
@@ -0,0 +1,720 @@
|
|
|
1
|
+
import { stat } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { buildValidationResult, } from "../config/validateCatalog.js";
|
|
4
|
+
import { loadEvalCatalog } from "../config/evalCatalog.js";
|
|
5
|
+
import { evalStem, findEvalFile, manifestForWrite } from "../config/evalWriteRoots.js";
|
|
6
|
+
import { loadEvalOutcome } from "../config/loadEval.js";
|
|
7
|
+
import { EngineError } from "../evals/engine/promptfoo/errors.js";
|
|
8
|
+
import { installPromptfoo } from "../evals/engine/promptfoo/install.js";
|
|
9
|
+
import { engineStatus } from "../evals/engine/promptfoo/status.js";
|
|
10
|
+
import { globalStageflowHome } from "../project/globalHome.js";
|
|
11
|
+
import { ensureGlobalService, hostBaseUrl, } from "../server/ensureGlobalService.js";
|
|
12
|
+
import { httpCancelEvalRun, httpCompareEvalRuns, httpDeleteEvalRun, httpEnsureProject, httpGetEval, httpGetEvalRun, httpListDatasets, httpListEvalRuns, httpListEvalSuggestions, httpSortEvalFailures, httpListEvals, httpStartEvalRun, } from "./hostClient.js";
|
|
13
|
+
import { resolveCliProjectRootLocal } from "./resolveCliProjectRoot.js";
|
|
14
|
+
import { exitCodeForValidation, formatValidationHuman, formatValidationJson, } from "./validateOutput.js";
|
|
15
|
+
export const EVAL_USAGE = `Usage:
|
|
16
|
+
sf eval list [--json]
|
|
17
|
+
sf eval show <id|path> [--json]
|
|
18
|
+
sf eval validate [<id|path>] [--json] [--strict]
|
|
19
|
+
sf eval run <id|path> [--repeats <n>] [--judge <model>] [--model <id>] [--user-model <model>] [--allow-real-tools] [--max-cost <usd>] [--case <id> ...] [--tag <tag> ...] [--label <text>] [--no-wait] [--json]
|
|
20
|
+
sf eval runs [<evalId>] [--json]
|
|
21
|
+
sf eval runs show <evalRunId> [--json]
|
|
22
|
+
sf eval runs cancel <evalRunId>
|
|
23
|
+
sf eval runs delete <evalRunId>
|
|
24
|
+
sf eval sort <evalRunId> [--classifier auto|jev|judge] [--limit <n>] [--resort] [--json]
|
|
25
|
+
sf eval suggestions <evalRunId> [--status pending|accepted|dismissed] [--json]
|
|
26
|
+
sf eval compare <evalRunIdA> <evalRunIdB> [--json]
|
|
27
|
+
sf eval datasets [--json]
|
|
28
|
+
sf eval engine status [--json]
|
|
29
|
+
sf eval engine install
|
|
30
|
+
|
|
31
|
+
Agent evals: --model overrides the agent's model, --user-model the model that plays the user. An eval whose
|
|
32
|
+
conversation.tools is real also needs --allow-real-tools.
|
|
33
|
+
|
|
34
|
+
Every subcommand also accepts --project-root <id-or-path>.`;
|
|
35
|
+
const defaultIo = {
|
|
36
|
+
log: (line) => console.log(line),
|
|
37
|
+
error: (line) => console.error(line),
|
|
38
|
+
};
|
|
39
|
+
const COMMON_FLAGS = {
|
|
40
|
+
"--json": {},
|
|
41
|
+
"--help": {},
|
|
42
|
+
"-h": {},
|
|
43
|
+
"--project-root": { value: true },
|
|
44
|
+
};
|
|
45
|
+
const FLAGS = {
|
|
46
|
+
list: {},
|
|
47
|
+
show: {},
|
|
48
|
+
validate: { "--strict": {} },
|
|
49
|
+
run: {
|
|
50
|
+
"--repeats": { value: true },
|
|
51
|
+
"--judge": { value: true },
|
|
52
|
+
"--model": { value: true },
|
|
53
|
+
"--user-model": { value: true },
|
|
54
|
+
"--allow-real-tools": {},
|
|
55
|
+
"--max-cost": { value: true },
|
|
56
|
+
"--case": { value: true, repeat: true },
|
|
57
|
+
"--tag": { value: true, repeat: true },
|
|
58
|
+
"--label": { value: true },
|
|
59
|
+
"--no-wait": {},
|
|
60
|
+
},
|
|
61
|
+
runs: {},
|
|
62
|
+
sort: { "--classifier": { value: true }, "--limit": { value: true }, "--resort": {} },
|
|
63
|
+
suggestions: { "--status": { value: true } },
|
|
64
|
+
compare: {},
|
|
65
|
+
datasets: {},
|
|
66
|
+
engine: {},
|
|
67
|
+
};
|
|
68
|
+
class UsageError extends Error {
|
|
69
|
+
}
|
|
70
|
+
function parseArgs(command, rest) {
|
|
71
|
+
const specs = { ...COMMON_FLAGS, ...FLAGS[command] };
|
|
72
|
+
const parsed = {
|
|
73
|
+
help: false,
|
|
74
|
+
json: false,
|
|
75
|
+
strict: false,
|
|
76
|
+
noWait: false,
|
|
77
|
+
allowRealTools: false,
|
|
78
|
+
resort: false,
|
|
79
|
+
cases: [],
|
|
80
|
+
tags: [],
|
|
81
|
+
positionals: [],
|
|
82
|
+
};
|
|
83
|
+
const seen = new Set();
|
|
84
|
+
for (let i = 0; i < rest.length; i++) {
|
|
85
|
+
const arg = rest[i];
|
|
86
|
+
if (!arg.startsWith("-")) {
|
|
87
|
+
parsed.positionals.push(arg);
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
const spec = specs[arg];
|
|
91
|
+
if (spec === undefined)
|
|
92
|
+
throw new UsageError(`Unknown flag: ${arg}`);
|
|
93
|
+
if (seen.has(arg) && spec.repeat !== true)
|
|
94
|
+
throw new UsageError(`Duplicate flag: ${arg}`);
|
|
95
|
+
seen.add(arg);
|
|
96
|
+
let value;
|
|
97
|
+
if (spec.value === true) {
|
|
98
|
+
value = rest[++i];
|
|
99
|
+
if (value === undefined || value.length === 0)
|
|
100
|
+
throw new UsageError(`Missing value for ${arg}`);
|
|
101
|
+
}
|
|
102
|
+
switch (arg) {
|
|
103
|
+
case "--help":
|
|
104
|
+
case "-h":
|
|
105
|
+
parsed.help = true;
|
|
106
|
+
break;
|
|
107
|
+
case "--json":
|
|
108
|
+
parsed.json = true;
|
|
109
|
+
break;
|
|
110
|
+
case "--strict":
|
|
111
|
+
parsed.strict = true;
|
|
112
|
+
break;
|
|
113
|
+
case "--no-wait":
|
|
114
|
+
parsed.noWait = true;
|
|
115
|
+
break;
|
|
116
|
+
case "--allow-real-tools":
|
|
117
|
+
parsed.allowRealTools = true;
|
|
118
|
+
break;
|
|
119
|
+
case "--user-model":
|
|
120
|
+
parsed.userModel = value;
|
|
121
|
+
break;
|
|
122
|
+
case "--project-root":
|
|
123
|
+
parsed.projectRoot = value;
|
|
124
|
+
break;
|
|
125
|
+
case "--judge":
|
|
126
|
+
parsed.judge = value;
|
|
127
|
+
break;
|
|
128
|
+
case "--model":
|
|
129
|
+
parsed.model = value;
|
|
130
|
+
break;
|
|
131
|
+
case "--label":
|
|
132
|
+
parsed.label = value;
|
|
133
|
+
break;
|
|
134
|
+
case "--case":
|
|
135
|
+
parsed.cases.push(value);
|
|
136
|
+
break;
|
|
137
|
+
case "--classifier":
|
|
138
|
+
if (value !== "auto" && value !== "jev" && value !== "judge") {
|
|
139
|
+
throw new UsageError("--classifier must be auto, jev or judge");
|
|
140
|
+
}
|
|
141
|
+
parsed.classifier = value;
|
|
142
|
+
break;
|
|
143
|
+
case "--limit": {
|
|
144
|
+
const n = Number(value);
|
|
145
|
+
if (!Number.isInteger(n) || n < 1)
|
|
146
|
+
throw new UsageError("--limit must be a positive integer");
|
|
147
|
+
parsed.limit = n;
|
|
148
|
+
break;
|
|
149
|
+
}
|
|
150
|
+
case "--resort":
|
|
151
|
+
parsed.resort = true;
|
|
152
|
+
break;
|
|
153
|
+
case "--status":
|
|
154
|
+
if (value !== "pending" && value !== "accepted" && value !== "dismissed") {
|
|
155
|
+
throw new UsageError("--status must be pending, accepted or dismissed");
|
|
156
|
+
}
|
|
157
|
+
parsed.status = value;
|
|
158
|
+
break;
|
|
159
|
+
case "--tag":
|
|
160
|
+
parsed.tags.push(value);
|
|
161
|
+
break;
|
|
162
|
+
case "--repeats": {
|
|
163
|
+
const n = Number(value);
|
|
164
|
+
if (!Number.isInteger(n) || n < 1)
|
|
165
|
+
throw new UsageError("--repeats must be a positive integer");
|
|
166
|
+
parsed.repeats = n;
|
|
167
|
+
break;
|
|
168
|
+
}
|
|
169
|
+
case "--max-cost": {
|
|
170
|
+
const n = Number(value);
|
|
171
|
+
if (!Number.isFinite(n) || n <= 0)
|
|
172
|
+
throw new UsageError("--max-cost must be a positive number");
|
|
173
|
+
parsed.maxCost = n;
|
|
174
|
+
break;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
if (parsed.cases.length > 0 && parsed.tags.length > 0) {
|
|
179
|
+
throw new UsageError("Use either --case or --tag, not both");
|
|
180
|
+
}
|
|
181
|
+
return parsed;
|
|
182
|
+
}
|
|
183
|
+
function looksLikePath(ref) {
|
|
184
|
+
return /[\\/]/.test(ref) || /\.ya?ml$/.test(ref);
|
|
185
|
+
}
|
|
186
|
+
function pct(value) {
|
|
187
|
+
return typeof value === "number" ? `${(value * 100).toFixed(1)}%` : "n/a";
|
|
188
|
+
}
|
|
189
|
+
function usd(value) {
|
|
190
|
+
return typeof value === "number" ? `$${value.toFixed(4)}` : "n/a";
|
|
191
|
+
}
|
|
192
|
+
function suggestionLine(s) {
|
|
193
|
+
return [
|
|
194
|
+
s.case_id,
|
|
195
|
+
`#${s.repeat_index}`,
|
|
196
|
+
s.bucket,
|
|
197
|
+
s.failure_type ?? "-",
|
|
198
|
+
`${Math.round(s.confidence * 100)}%`,
|
|
199
|
+
s.status,
|
|
200
|
+
].join("\t");
|
|
201
|
+
}
|
|
202
|
+
function agentLabel(target) {
|
|
203
|
+
const id = String(target.agent_id ?? target.id ?? "");
|
|
204
|
+
return typeof target.revision === "number" ? `Agent ${id} r${target.revision}` : `Agent ${id}`;
|
|
205
|
+
}
|
|
206
|
+
function targetLabel(target) {
|
|
207
|
+
if (target?.kind === "agent")
|
|
208
|
+
return agentLabel(target);
|
|
209
|
+
return target?.label ?? "";
|
|
210
|
+
}
|
|
211
|
+
function conversationLine(conversation) {
|
|
212
|
+
if (!conversation)
|
|
213
|
+
return null;
|
|
214
|
+
return `Conversation: ${conversation.mode ?? "script"}, up to ${conversation.max_turns ?? "?"} turns, tools ${conversation.tools ?? "read_only"}, approvals ${conversation.approvals ?? "record_only"}`;
|
|
215
|
+
}
|
|
216
|
+
const REAL_TOOLS_WARNING = "Warning: real tools can change files and call services from this machine.";
|
|
217
|
+
function outcomeOf(detail) {
|
|
218
|
+
if (detail.status === "completed")
|
|
219
|
+
return detail.passed === true ? "passed" : "below_threshold";
|
|
220
|
+
if (detail.status === "cancelled")
|
|
221
|
+
return "cancelled";
|
|
222
|
+
if (detail.status === "budget_stopped")
|
|
223
|
+
return "budget_stopped";
|
|
224
|
+
return "failed";
|
|
225
|
+
}
|
|
226
|
+
const TERMINAL = new Set(["completed", "failed", "cancelled", "budget_stopped"]);
|
|
227
|
+
export async function runEvalCommand(args, options = {}) {
|
|
228
|
+
const out = { ...defaultIo, ...options.io };
|
|
229
|
+
const cwd = options.cwd ?? process.cwd();
|
|
230
|
+
const base = options.hostBaseUrl ?? hostBaseUrl();
|
|
231
|
+
const ensureService = options.ensureService ?? (() => ensureGlobalService());
|
|
232
|
+
const usageError = (message) => {
|
|
233
|
+
if (message !== undefined)
|
|
234
|
+
out.error(message);
|
|
235
|
+
out.error(EVAL_USAGE);
|
|
236
|
+
return 1;
|
|
237
|
+
};
|
|
238
|
+
if (args.length === 0)
|
|
239
|
+
return usageError();
|
|
240
|
+
if (args[0] === "--help" || args[0] === "-h") {
|
|
241
|
+
out.error(EVAL_USAGE);
|
|
242
|
+
return 0;
|
|
243
|
+
}
|
|
244
|
+
const command = args[0];
|
|
245
|
+
if (!(command in FLAGS))
|
|
246
|
+
return usageError(`Unknown eval subcommand: ${command}`);
|
|
247
|
+
let parsed;
|
|
248
|
+
try {
|
|
249
|
+
parsed = parseArgs(command, args.slice(1));
|
|
250
|
+
}
|
|
251
|
+
catch (err) {
|
|
252
|
+
if (err instanceof UsageError)
|
|
253
|
+
return usageError(err.message);
|
|
254
|
+
throw err;
|
|
255
|
+
}
|
|
256
|
+
if (parsed.help) {
|
|
257
|
+
out.error(EVAL_USAGE);
|
|
258
|
+
return 0;
|
|
259
|
+
}
|
|
260
|
+
const positionals = [...parsed.positionals];
|
|
261
|
+
const json = parsed.json;
|
|
262
|
+
const printJson = (payload) => out.log(JSON.stringify(payload, null, 2));
|
|
263
|
+
const fail = (failure) => {
|
|
264
|
+
if (json) {
|
|
265
|
+
printJson({
|
|
266
|
+
error: failure.reason,
|
|
267
|
+
...(failure.code !== undefined ? { code: failure.code } : {}),
|
|
268
|
+
...(failure.status !== undefined ? { status: failure.status } : {}),
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
else {
|
|
272
|
+
out.error(failure.code !== undefined ? `${failure.code}: ${failure.reason}` : failure.reason);
|
|
273
|
+
}
|
|
274
|
+
return 1;
|
|
275
|
+
};
|
|
276
|
+
let projectRoot = options.projectRoot ?? cwd;
|
|
277
|
+
if (parsed.projectRoot !== undefined) {
|
|
278
|
+
const local = resolveCliProjectRootLocal(parsed.projectRoot);
|
|
279
|
+
if (!local)
|
|
280
|
+
return usageError(`Unknown project_root: ${parsed.projectRoot.trim()}`);
|
|
281
|
+
projectRoot = local.rootPath;
|
|
282
|
+
}
|
|
283
|
+
const expectArgs = (min, max, label) => {
|
|
284
|
+
if (positionals.length < min)
|
|
285
|
+
return `Missing ${label}`;
|
|
286
|
+
if (positionals.length > max)
|
|
287
|
+
return `Unexpected argument: ${positionals[max]}`;
|
|
288
|
+
return null;
|
|
289
|
+
};
|
|
290
|
+
const resolveEvalFile = async (ref, local = false) => {
|
|
291
|
+
if (looksLikePath(ref)) {
|
|
292
|
+
const absPath = path.resolve(cwd, ref);
|
|
293
|
+
try {
|
|
294
|
+
if (!(await stat(absPath)).isFile())
|
|
295
|
+
return `Not a file: ${ref}`;
|
|
296
|
+
}
|
|
297
|
+
catch {
|
|
298
|
+
return `Eval file not found: ${ref}`;
|
|
299
|
+
}
|
|
300
|
+
const outcome = await loadEvalOutcome(absPath, projectRoot);
|
|
301
|
+
return { id: outcome.ok ? outcome.value.id : evalStem(path.basename(absPath)), absPath };
|
|
302
|
+
}
|
|
303
|
+
if (!local)
|
|
304
|
+
return { id: ref };
|
|
305
|
+
const found = await findEvalFile(projectRoot, ref);
|
|
306
|
+
if (found === undefined)
|
|
307
|
+
return `Eval not found: ${ref}`;
|
|
308
|
+
return { id: ref, absPath: found.absPath };
|
|
309
|
+
};
|
|
310
|
+
if (command === "engine") {
|
|
311
|
+
const sub = positionals.shift();
|
|
312
|
+
const home = options.home ?? globalStageflowHome();
|
|
313
|
+
if (sub === "status") {
|
|
314
|
+
const extra = expectArgs(0, 0, "");
|
|
315
|
+
if (extra)
|
|
316
|
+
return usageError(extra);
|
|
317
|
+
const status = engineStatus({ home });
|
|
318
|
+
const wire = {
|
|
319
|
+
installed: status.installed,
|
|
320
|
+
version: status.version,
|
|
321
|
+
pinned: status.pinned,
|
|
322
|
+
node: status.node,
|
|
323
|
+
node_ok: status.nodeOk,
|
|
324
|
+
install_command: status.installCommand,
|
|
325
|
+
};
|
|
326
|
+
if (json)
|
|
327
|
+
printJson(wire);
|
|
328
|
+
else {
|
|
329
|
+
out.log(status.installed
|
|
330
|
+
? `Eval engine: promptfoo ${status.version} installed (pinned ${status.pinned})`
|
|
331
|
+
: `Eval engine: not installed (pinned ${status.pinned}). Run \`${status.installCommand}\``);
|
|
332
|
+
out.log(`Node ${status.node}${status.nodeOk ? "" : " (too old for evals)"}`);
|
|
333
|
+
}
|
|
334
|
+
return 0;
|
|
335
|
+
}
|
|
336
|
+
if (sub === "install") {
|
|
337
|
+
const extra = expectArgs(0, 0, "");
|
|
338
|
+
if (extra)
|
|
339
|
+
return usageError(extra);
|
|
340
|
+
if (json)
|
|
341
|
+
return usageError("Unknown flag: --json");
|
|
342
|
+
try {
|
|
343
|
+
const result = await installPromptfoo({
|
|
344
|
+
home,
|
|
345
|
+
...(options.runNpm !== undefined ? { runNpm: options.runNpm } : {}),
|
|
346
|
+
log: (line) => out.error(line),
|
|
347
|
+
});
|
|
348
|
+
out.log(result.status === "installed"
|
|
349
|
+
? `Installed promptfoo ${result.version}`
|
|
350
|
+
: `promptfoo ${result.version} is already installed`);
|
|
351
|
+
return 0;
|
|
352
|
+
}
|
|
353
|
+
catch (err) {
|
|
354
|
+
if (err instanceof EngineError) {
|
|
355
|
+
out.error(`${err.code}: ${err.message}`);
|
|
356
|
+
return 1;
|
|
357
|
+
}
|
|
358
|
+
out.error(err instanceof Error ? err.message : String(err));
|
|
359
|
+
return 1;
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
return usageError(sub === undefined ? "Missing engine subcommand" : `Unknown engine subcommand: ${sub}`);
|
|
363
|
+
}
|
|
364
|
+
if (command === "validate") {
|
|
365
|
+
const extra = expectArgs(0, 1, "");
|
|
366
|
+
if (extra)
|
|
367
|
+
return usageError(extra);
|
|
368
|
+
let findings;
|
|
369
|
+
try {
|
|
370
|
+
const manifest = await manifestForWrite(projectRoot);
|
|
371
|
+
const entries = await loadEvalCatalog(manifest);
|
|
372
|
+
if (positionals.length === 1) {
|
|
373
|
+
const target = await resolveEvalFile(positionals[0], true);
|
|
374
|
+
if (typeof target === "string") {
|
|
375
|
+
out.error(target);
|
|
376
|
+
return 1;
|
|
377
|
+
}
|
|
378
|
+
const entry = entries.find((e) => path.resolve(e.absPath) === path.resolve(target.absPath));
|
|
379
|
+
if (entry === undefined) {
|
|
380
|
+
out.error(`Eval is not in a catalog root: ${positionals[0]}`);
|
|
381
|
+
return 1;
|
|
382
|
+
}
|
|
383
|
+
findings = entry.findings;
|
|
384
|
+
}
|
|
385
|
+
else {
|
|
386
|
+
findings = entries.flatMap((e) => e.findings);
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
catch (err) {
|
|
390
|
+
out.error(err instanceof Error ? err.message : String(err));
|
|
391
|
+
return 1;
|
|
392
|
+
}
|
|
393
|
+
const result = buildValidationResult("full", findings, parsed.strict);
|
|
394
|
+
out.log(json ? formatValidationJson(result) : formatValidationHuman(result, { strict: parsed.strict }));
|
|
395
|
+
return exitCodeForValidation(result);
|
|
396
|
+
}
|
|
397
|
+
const argError = command === "list" || command === "datasets"
|
|
398
|
+
? expectArgs(0, 0, "")
|
|
399
|
+
: command === "show"
|
|
400
|
+
? expectArgs(1, 1, "<id|path>")
|
|
401
|
+
: command === "run"
|
|
402
|
+
? expectArgs(1, 1, "<id|path>")
|
|
403
|
+
: command === "compare"
|
|
404
|
+
? expectArgs(2, 2, "<evalRunIdA> <evalRunIdB>")
|
|
405
|
+
: command === "sort" || command === "suggestions"
|
|
406
|
+
? expectArgs(1, 1, "<evalRunId>")
|
|
407
|
+
: null;
|
|
408
|
+
if (argError)
|
|
409
|
+
return usageError(argError);
|
|
410
|
+
let runsSub;
|
|
411
|
+
if (command === "runs") {
|
|
412
|
+
if (["show", "cancel", "delete"].includes(positionals[0] ?? "")) {
|
|
413
|
+
runsSub = positionals.shift();
|
|
414
|
+
const err = expectArgs(1, 1, "<evalRunId>");
|
|
415
|
+
if (err)
|
|
416
|
+
return usageError(err);
|
|
417
|
+
}
|
|
418
|
+
else {
|
|
419
|
+
const err = expectArgs(0, 1, "");
|
|
420
|
+
if (err)
|
|
421
|
+
return usageError(err);
|
|
422
|
+
}
|
|
423
|
+
if (json && (runsSub === "cancel" || runsSub === "delete"))
|
|
424
|
+
return usageError("Unknown flag: --json");
|
|
425
|
+
}
|
|
426
|
+
const ensured = await ensureService();
|
|
427
|
+
if (!ensured.ok) {
|
|
428
|
+
if (json)
|
|
429
|
+
printJson({ error: ensured.message, reason: ensured.reason });
|
|
430
|
+
else
|
|
431
|
+
out.error(ensured.message);
|
|
432
|
+
return 1;
|
|
433
|
+
}
|
|
434
|
+
const project = await httpEnsureProject(base, projectRoot);
|
|
435
|
+
if (!project.ok)
|
|
436
|
+
return fail(project);
|
|
437
|
+
const wireRoot = project.project_root;
|
|
438
|
+
const show = (result, human) => {
|
|
439
|
+
if (!result.ok)
|
|
440
|
+
return fail(result);
|
|
441
|
+
if (json)
|
|
442
|
+
printJson(result.body);
|
|
443
|
+
else
|
|
444
|
+
human(result.body);
|
|
445
|
+
return 0;
|
|
446
|
+
};
|
|
447
|
+
switch (command) {
|
|
448
|
+
case "list":
|
|
449
|
+
return show(await httpListEvals(base, wireRoot), (body) => {
|
|
450
|
+
const items = (body.items ?? []);
|
|
451
|
+
for (const item of items) {
|
|
452
|
+
out.log([
|
|
453
|
+
item.id,
|
|
454
|
+
item.status,
|
|
455
|
+
item.valid === false ? "invalid" : "valid",
|
|
456
|
+
item.last_run ? pct(item.last_run.pass_rate) : "-",
|
|
457
|
+
targetLabel(item.target),
|
|
458
|
+
].join("\t"));
|
|
459
|
+
}
|
|
460
|
+
});
|
|
461
|
+
case "show": {
|
|
462
|
+
const target = await resolveEvalFile(positionals[0]);
|
|
463
|
+
if (typeof target === "string")
|
|
464
|
+
return fail({ reason: target, code: "EVAL_NOT_FOUND" });
|
|
465
|
+
return show(await httpGetEval(base, target.id, wireRoot), (body) => {
|
|
466
|
+
const detail = body;
|
|
467
|
+
if (detail.definition?.target?.kind === "agent") {
|
|
468
|
+
const live = detail.agent;
|
|
469
|
+
out.log(live
|
|
470
|
+
? `${agentLabel({ id: live.id, revision: live.revision })}${live.model ? ` (${live.model})` : ""}`
|
|
471
|
+
: agentLabel({ id: detail.definition.target.agent }));
|
|
472
|
+
const line = conversationLine({
|
|
473
|
+
mode: detail.definition.conversation?.mode,
|
|
474
|
+
max_turns: detail.definition.conversation?.max_turns,
|
|
475
|
+
tools: detail.definition.conversation?.tools,
|
|
476
|
+
approvals: detail.definition.conversation?.approvals,
|
|
477
|
+
});
|
|
478
|
+
if (line)
|
|
479
|
+
out.log(line);
|
|
480
|
+
out.log("");
|
|
481
|
+
}
|
|
482
|
+
out.log(String(detail.yaml ?? ""));
|
|
483
|
+
});
|
|
484
|
+
}
|
|
485
|
+
case "datasets":
|
|
486
|
+
return show(await httpListDatasets(base, wireRoot), (body) => {
|
|
487
|
+
for (const item of body.items) {
|
|
488
|
+
out.log([item.id, item.format, item.cases, item.path].join("\t"));
|
|
489
|
+
}
|
|
490
|
+
});
|
|
491
|
+
case "compare":
|
|
492
|
+
return show(await httpCompareEvalRuns(base, positionals[0], positionals[1]), (body) => {
|
|
493
|
+
out.log(JSON.stringify(body, null, 2));
|
|
494
|
+
});
|
|
495
|
+
case "runs": {
|
|
496
|
+
if (runsSub === "show") {
|
|
497
|
+
return show(await httpGetEvalRun(base, positionals[0]), (d) => {
|
|
498
|
+
out.log(`${d.eval_id} run #${d.run_number}\t${d.status}\t${d.eval_run_id}`);
|
|
499
|
+
if (d.status_reason)
|
|
500
|
+
out.log(`reason: ${d.status_reason}`);
|
|
501
|
+
out.log(`pass rate ${pct(d.stats?.pass_rate)}\tresults ${d.progress?.results_done}/${d.progress?.results_total}\tcost ${usd(d.stats?.cost_total ?? d.progress?.cost_usd)}`);
|
|
502
|
+
if (d.config?.target?.agent_id !== undefined) {
|
|
503
|
+
out.log(agentLabel(d.config.target));
|
|
504
|
+
const line = conversationLine(d.config.settings?.conversation);
|
|
505
|
+
if (line)
|
|
506
|
+
out.log(line);
|
|
507
|
+
out.log(`mean turns ${d.stats?.mean_turns ?? "n/a"}\tmean tool calls ${d.stats?.mean_tool_calls ?? "n/a"}`);
|
|
508
|
+
}
|
|
509
|
+
out.log(`fingerprint ${d.fingerprint}`);
|
|
510
|
+
});
|
|
511
|
+
}
|
|
512
|
+
if (runsSub === "cancel") {
|
|
513
|
+
const result = await httpCancelEvalRun(base, positionals[0]);
|
|
514
|
+
if (!result.ok)
|
|
515
|
+
return fail(result);
|
|
516
|
+
out.log(`Eval run ${result.body.eval_run_id} ${result.body.status}`);
|
|
517
|
+
return 0;
|
|
518
|
+
}
|
|
519
|
+
if (runsSub === "delete") {
|
|
520
|
+
const result = await httpDeleteEvalRun(base, positionals[0]);
|
|
521
|
+
if (!result.ok)
|
|
522
|
+
return fail(result);
|
|
523
|
+
out.log(`Deleted eval run ${positionals[0]}`);
|
|
524
|
+
return 0;
|
|
525
|
+
}
|
|
526
|
+
return show(await httpListEvalRuns(base, {
|
|
527
|
+
project_root: wireRoot,
|
|
528
|
+
...(positionals[0] !== undefined ? { eval_id: positionals[0] } : {}),
|
|
529
|
+
}), (body) => {
|
|
530
|
+
for (const item of body.items) {
|
|
531
|
+
out.log([
|
|
532
|
+
item.eval_id,
|
|
533
|
+
`#${item.run_number}`,
|
|
534
|
+
item.status,
|
|
535
|
+
pct(item.pass_rate),
|
|
536
|
+
usd(item.cost_total),
|
|
537
|
+
item.eval_run_id,
|
|
538
|
+
].join("\t"));
|
|
539
|
+
}
|
|
540
|
+
});
|
|
541
|
+
}
|
|
542
|
+
case "run":
|
|
543
|
+
return runEval();
|
|
544
|
+
case "sort": {
|
|
545
|
+
const result = await httpSortEvalFailures(base, positionals[0], {
|
|
546
|
+
classifier: parsed.classifier ?? "auto",
|
|
547
|
+
...(parsed.resort ? { only_unsorted: false } : {}),
|
|
548
|
+
...(parsed.limit !== undefined ? { limit: parsed.limit } : {}),
|
|
549
|
+
});
|
|
550
|
+
return show(result, (b) => {
|
|
551
|
+
out.log(`Sorted ${b.sorted}, skipped ${b.skipped}, failed ${b.failed} with ${b.classifier} (${b.model}); sorting cost ${usd(b.triage_cost_usd)}`);
|
|
552
|
+
for (const s of b.suggestions)
|
|
553
|
+
out.log(suggestionLine(s));
|
|
554
|
+
out.log(`Review and accept in the console, or POST /api/eval-runs/${positionals[0]}/failures/suggestions/accept`);
|
|
555
|
+
});
|
|
556
|
+
}
|
|
557
|
+
case "suggestions":
|
|
558
|
+
return show(await httpListEvalSuggestions(base, positionals[0], parsed.status), (b) => {
|
|
559
|
+
for (const s of b.items)
|
|
560
|
+
out.log(suggestionLine(s));
|
|
561
|
+
const sum = b.summary;
|
|
562
|
+
out.log(`agent_wrong ${sum.by_bucket.agent_wrong}\tgrader_wrong ${sum.by_bucket.grader_wrong}\tcase_wrong ${sum.by_bucket.case_wrong}\tunclear ${sum.by_bucket.unclear}\t` +
|
|
563
|
+
`pending ${sum.pending}\taccepted ${sum.accepted}\tdismissed ${sum.dismissed}\tlow confidence ${sum.low_confidence}`);
|
|
564
|
+
});
|
|
565
|
+
default:
|
|
566
|
+
return usageError(`Unknown eval subcommand: ${command}`);
|
|
567
|
+
}
|
|
568
|
+
async function runEval() {
|
|
569
|
+
const target = await resolveEvalFile(positionals[0]);
|
|
570
|
+
if (typeof target === "string")
|
|
571
|
+
return fail({ reason: target, code: "EVAL_NOT_FOUND" });
|
|
572
|
+
const input = {
|
|
573
|
+
project_root: wireRoot,
|
|
574
|
+
started_via: "cli",
|
|
575
|
+
...(parsed.repeats !== undefined ? { repeats: parsed.repeats } : {}),
|
|
576
|
+
...(parsed.judge !== undefined ? { judge: parsed.judge } : {}),
|
|
577
|
+
...(parsed.model !== undefined ? { model: parsed.model } : {}),
|
|
578
|
+
...(parsed.userModel !== undefined ? { user_model: parsed.userModel } : {}),
|
|
579
|
+
...(parsed.allowRealTools ? { allow_real_tools: true } : {}),
|
|
580
|
+
...(parsed.maxCost !== undefined ? { max_cost_usd: parsed.maxCost } : {}),
|
|
581
|
+
...(parsed.cases.length > 0 ? { case_ids: parsed.cases } : {}),
|
|
582
|
+
...(parsed.tags.length > 0 ? { tags: parsed.tags } : {}),
|
|
583
|
+
...(parsed.label !== undefined ? { label: parsed.label } : {}),
|
|
584
|
+
};
|
|
585
|
+
if (parsed.allowRealTools) {
|
|
586
|
+
const detail = await httpGetEval(base, target.id, wireRoot);
|
|
587
|
+
const definition = detail.ok ? detail.body.definition : null;
|
|
588
|
+
if (definition?.target?.kind === "agent" && definition.conversation?.tools === "real") {
|
|
589
|
+
out.error(REAL_TOOLS_WARNING);
|
|
590
|
+
}
|
|
591
|
+
}
|
|
592
|
+
const started = await httpStartEvalRun(base, target.id, input);
|
|
593
|
+
if (!started.ok) {
|
|
594
|
+
if (started.code === "EVAL_REAL_TOOLS_NOT_CONFIRMED") {
|
|
595
|
+
if (json)
|
|
596
|
+
printJson({ ok: false, code: started.code, message: started.reason });
|
|
597
|
+
else
|
|
598
|
+
out.error(`${started.code}: ${started.reason} Re-run with --allow-real-tools to confirm.`);
|
|
599
|
+
return 1;
|
|
600
|
+
}
|
|
601
|
+
if (started.code === "EVAL_INVALID" && started.findings !== undefined) {
|
|
602
|
+
const result = buildValidationResult("full", started.findings, false);
|
|
603
|
+
out.log(json ? formatValidationJson(result) : formatValidationHuman(result));
|
|
604
|
+
return 1;
|
|
605
|
+
}
|
|
606
|
+
return fail(started);
|
|
607
|
+
}
|
|
608
|
+
const evalRunId = started.body.eval_run_id;
|
|
609
|
+
if (parsed.noWait) {
|
|
610
|
+
if (json)
|
|
611
|
+
printJson({ eval_run_id: evalRunId, status: started.body.status });
|
|
612
|
+
else
|
|
613
|
+
out.log(evalRunId);
|
|
614
|
+
return 0;
|
|
615
|
+
}
|
|
616
|
+
let interrupted = false;
|
|
617
|
+
let wake = () => { };
|
|
618
|
+
const woken = new Promise((resolve) => {
|
|
619
|
+
wake = resolve;
|
|
620
|
+
});
|
|
621
|
+
const subscribe = options.onInterrupt ??
|
|
622
|
+
((handler) => {
|
|
623
|
+
process.once("SIGINT", handler);
|
|
624
|
+
return () => process.removeListener("SIGINT", handler);
|
|
625
|
+
});
|
|
626
|
+
const unsubscribe = subscribe(() => {
|
|
627
|
+
interrupted = true;
|
|
628
|
+
wake();
|
|
629
|
+
});
|
|
630
|
+
const interval = options.pollIntervalMs ?? 1500;
|
|
631
|
+
const tty = options.stderrIsTTY ?? process.stderr.isTTY === true;
|
|
632
|
+
let lastProgress = "";
|
|
633
|
+
let detail;
|
|
634
|
+
try {
|
|
635
|
+
for (;;) {
|
|
636
|
+
if (interrupted) {
|
|
637
|
+
const cancelled = await httpCancelEvalRun(base, evalRunId);
|
|
638
|
+
if (!cancelled.ok) {
|
|
639
|
+
fail(cancelled);
|
|
640
|
+
return 1;
|
|
641
|
+
}
|
|
642
|
+
detail = cancelled.body;
|
|
643
|
+
break;
|
|
644
|
+
}
|
|
645
|
+
const polled = await httpGetEvalRun(base, evalRunId);
|
|
646
|
+
if (!polled.ok)
|
|
647
|
+
return fail(polled);
|
|
648
|
+
detail = polled.body;
|
|
649
|
+
if (TERMINAL.has(detail.status))
|
|
650
|
+
break;
|
|
651
|
+
if (tty) {
|
|
652
|
+
const line = `${detail.progress?.results_done ?? 0}/${detail.progress?.results_total ?? 0} results, ${usd(detail.progress?.cost_usd ?? 0)}`;
|
|
653
|
+
if (line !== lastProgress) {
|
|
654
|
+
lastProgress = line;
|
|
655
|
+
out.error(line);
|
|
656
|
+
}
|
|
657
|
+
}
|
|
658
|
+
await Promise.race([new Promise((resolve) => setTimeout(resolve, interval)), woken]);
|
|
659
|
+
}
|
|
660
|
+
}
|
|
661
|
+
finally {
|
|
662
|
+
unsubscribe();
|
|
663
|
+
}
|
|
664
|
+
return reportRun(detail);
|
|
665
|
+
}
|
|
666
|
+
function reportRun(detail) {
|
|
667
|
+
const outcome = outcomeOf(detail);
|
|
668
|
+
const stats = detail.stats;
|
|
669
|
+
const threshold = detail.config?.settings?.pass_threshold ?? detail.components?.pass_threshold ?? null;
|
|
670
|
+
const doc = {
|
|
671
|
+
outcome,
|
|
672
|
+
eval_run_id: detail.eval_run_id,
|
|
673
|
+
eval_id: detail.eval_id,
|
|
674
|
+
pass_rate: stats?.pass_rate ?? null,
|
|
675
|
+
pass_rate_ci: stats?.pass_rate_ci ?? null,
|
|
676
|
+
threshold,
|
|
677
|
+
results: {
|
|
678
|
+
executed: stats?.results_executed ?? 0,
|
|
679
|
+
passed: stats?.results_passed ?? 0,
|
|
680
|
+
errored: stats?.errored ?? 0,
|
|
681
|
+
},
|
|
682
|
+
reliability: stats?.reliability ?? null,
|
|
683
|
+
cost_total: stats?.cost_total ?? detail.progress?.cost_usd ?? 0,
|
|
684
|
+
fingerprint: detail.fingerprint,
|
|
685
|
+
url: `${base}/#/evals/${detail.eval_id}/runs/${detail.run_number}`,
|
|
686
|
+
...(detail.config?.target?.agent_id !== undefined
|
|
687
|
+
? {
|
|
688
|
+
target_kind: "agent",
|
|
689
|
+
agent_id: detail.config.target.agent_id,
|
|
690
|
+
agent_revision: (detail.config.target.revision ?? null),
|
|
691
|
+
mean_turns: (stats?.mean_turns ?? null),
|
|
692
|
+
mean_tool_calls: (stats?.mean_tool_calls ?? null),
|
|
693
|
+
tools_policy: (detail.config.settings?.conversation?.tools ?? null),
|
|
694
|
+
}
|
|
695
|
+
: {}),
|
|
696
|
+
};
|
|
697
|
+
if (json) {
|
|
698
|
+
printJson(doc);
|
|
699
|
+
}
|
|
700
|
+
else {
|
|
701
|
+
const ci = doc.pass_rate_ci
|
|
702
|
+
? ` (CI ${pct(doc.pass_rate_ci.low)} to ${pct(doc.pass_rate_ci.high)})`
|
|
703
|
+
: "";
|
|
704
|
+
out.log(`Eval ${doc.eval_id} run #${detail.run_number}: ${outcome.replace("_", " ").toUpperCase()}`);
|
|
705
|
+
if (detail.status_reason)
|
|
706
|
+
out.log(`Reason: ${detail.status_reason}`);
|
|
707
|
+
out.log(`Pass rate: ${pct(doc.pass_rate)}${ci}, threshold ${pct(threshold)}`);
|
|
708
|
+
out.log(`Results: ${doc.results.executed} executed, ${doc.results.passed} passed, ${doc.results.errored} errored`);
|
|
709
|
+
out.log(`Reliability: ${doc.reliability ?? "n/a"}`);
|
|
710
|
+
if (doc.target_kind === "agent") {
|
|
711
|
+
out.log(`${agentLabel({ id: doc.agent_id, revision: doc.agent_revision })}, tools ${doc.tools_policy ?? "n/a"}`);
|
|
712
|
+
out.log(`Mean turns: ${doc.mean_turns ?? "n/a"}, mean tool calls: ${doc.mean_tool_calls ?? "n/a"}`);
|
|
713
|
+
}
|
|
714
|
+
out.log(`Cost: ${usd(doc.cost_total)}`);
|
|
715
|
+
out.log(`Fingerprint: ${doc.fingerprint}`);
|
|
716
|
+
out.log(`URL: ${doc.url}`);
|
|
717
|
+
}
|
|
718
|
+
return outcome === "passed" ? 0 : 1;
|
|
719
|
+
}
|
|
720
|
+
}
|