@browserbasehq/orca 3.5.0-vertex-test → 3.6.0-gemini-cua
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 +7 -15
- package/dist/cjs/lib/utils.d.ts +8 -0
- package/dist/cjs/lib/utils.js +31 -0
- package/dist/cjs/lib/utils.js.map +1 -1
- package/dist/cjs/lib/v3/agent/AgentProvider.js +5 -3
- package/dist/cjs/lib/v3/agent/AgentProvider.js.map +1 -1
- package/dist/cjs/lib/v3/agent/AnthropicCUAClient.js +10 -8
- package/dist/cjs/lib/v3/agent/AnthropicCUAClient.js.map +1 -1
- package/dist/cjs/lib/v3/agent/GoogleCUAClient.js +124 -28
- package/dist/cjs/lib/v3/agent/GoogleCUAClient.js.map +1 -1
- package/dist/cjs/lib/v3/agent/utils/captureAriaTreeProbe.d.ts +35 -0
- package/dist/cjs/lib/v3/agent/utils/captureAriaTreeProbe.js +38 -0
- package/dist/cjs/lib/v3/agent/utils/captureAriaTreeProbe.js.map +1 -0
- package/dist/cjs/lib/v3/agent/utils/handleDoneToolCall.js +10 -1
- package/dist/cjs/lib/v3/agent/utils/handleDoneToolCall.js.map +1 -1
- package/dist/cjs/lib/v3/agent/utils/postStepProbeEvidence.d.ts +19 -0
- package/dist/cjs/lib/v3/agent/utils/postStepProbeEvidence.js +54 -0
- package/dist/cjs/lib/v3/agent/utils/postStepProbeEvidence.js.map +1 -0
- package/dist/cjs/lib/v3/agent/utils/toolOutputEvidence.d.ts +2 -0
- package/dist/cjs/lib/v3/agent/utils/toolOutputEvidence.js +62 -0
- package/dist/cjs/lib/v3/agent/utils/toolOutputEvidence.js.map +1 -0
- package/dist/cjs/lib/v3/agent/utils/wrapEvidenceCallback.d.ts +3 -0
- package/dist/cjs/lib/v3/agent/utils/wrapEvidenceCallback.js +25 -0
- package/dist/cjs/lib/v3/agent/utils/wrapEvidenceCallback.js.map +1 -0
- package/dist/cjs/lib/v3/api.d.ts +1 -0
- package/dist/cjs/lib/v3/api.js +37 -16
- package/dist/cjs/lib/v3/api.js.map +1 -1
- package/dist/cjs/lib/v3/cache/ActCache.js +1 -1
- package/dist/cjs/lib/v3/cache/ActCache.js.map +1 -1
- package/dist/cjs/lib/v3/cache/utils.d.ts +7 -0
- package/dist/cjs/lib/v3/cache/utils.js +19 -0
- package/dist/cjs/lib/v3/cache/utils.js.map +1 -1
- package/dist/cjs/lib/v3/dom/build/locatorScripts.generated.d.ts +24 -24
- package/dist/cjs/lib/v3/dom/build/locatorScripts.generated.js +24 -24
- package/dist/cjs/lib/v3/dom/build/locatorScripts.generated.js.map +1 -1
- package/dist/cjs/lib/v3/dom/locatorScripts/xpathResolver.js +79 -10
- package/dist/cjs/lib/v3/dom/locatorScripts/xpathResolver.js.map +1 -1
- package/dist/cjs/lib/v3/handlers/v3AgentHandler.d.ts +3 -1
- package/dist/cjs/lib/v3/handlers/v3AgentHandler.js +108 -16
- package/dist/cjs/lib/v3/handlers/v3AgentHandler.js.map +1 -1
- package/dist/cjs/lib/v3/handlers/v3CuaAgentHandler.d.ts +11 -0
- package/dist/cjs/lib/v3/handlers/v3CuaAgentHandler.js +119 -5
- package/dist/cjs/lib/v3/handlers/v3CuaAgentHandler.js.map +1 -1
- package/dist/cjs/lib/v3/index.d.ts +13 -1
- package/dist/cjs/lib/v3/index.js +19 -1
- package/dist/cjs/lib/v3/index.js.map +1 -1
- package/dist/cjs/lib/v3/launch/local.js +1 -0
- package/dist/cjs/lib/v3/launch/local.js.map +1 -1
- package/dist/cjs/lib/v3/llm/LLMProvider.d.ts +3 -0
- package/dist/cjs/lib/v3/llm/LLMProvider.js +45 -3
- package/dist/cjs/lib/v3/llm/LLMProvider.js.map +1 -1
- package/dist/cjs/lib/v3/llm/aisdk.js +4 -0
- package/dist/cjs/lib/v3/llm/aisdk.js.map +1 -1
- package/dist/cjs/lib/v3/llm/anthropicOptions.d.ts +57 -0
- package/dist/cjs/lib/v3/llm/anthropicOptions.js +115 -0
- package/dist/cjs/lib/v3/llm/anthropicOptions.js.map +1 -0
- package/dist/cjs/lib/v3/types/public/agent.d.ts +8 -2
- package/dist/cjs/lib/v3/types/public/agent.js +3 -0
- package/dist/cjs/lib/v3/types/public/agent.js.map +1 -1
- package/dist/cjs/lib/v3/types/public/agentEvidenceEvents.d.ts +85 -0
- package/dist/cjs/lib/v3/types/public/agentEvidenceEvents.js +15 -0
- package/dist/cjs/lib/v3/types/public/agentEvidenceEvents.js.map +1 -0
- package/dist/cjs/lib/v3/types/public/api.d.ts +925 -182
- package/dist/cjs/lib/v3/types/public/api.js +138 -20
- package/dist/cjs/lib/v3/types/public/api.js.map +1 -1
- package/dist/cjs/lib/v3/types/public/clipboard.d.ts +15 -0
- package/dist/cjs/lib/v3/types/public/clipboard.js +3 -0
- package/dist/cjs/lib/v3/types/public/clipboard.js.map +1 -0
- package/dist/cjs/lib/v3/types/public/index.d.ts +2 -0
- package/dist/cjs/lib/v3/types/public/index.js +2 -0
- package/dist/cjs/lib/v3/types/public/index.js.map +1 -1
- package/dist/cjs/lib/v3/types/public/model.d.ts +33 -8
- package/dist/cjs/lib/v3/types/public/model.js.map +1 -1
- package/dist/cjs/lib/v3/types/public/page.d.ts +29 -0
- package/dist/cjs/lib/v3/types/public/page.js.map +1 -1
- package/dist/cjs/lib/v3/types/public/sdkErrors.d.ts +3 -0
- package/dist/cjs/lib/v3/types/public/sdkErrors.js +8 -2
- package/dist/cjs/lib/v3/types/public/sdkErrors.js.map +1 -1
- package/dist/cjs/lib/v3/understudy/clipboard.d.ts +24 -0
- package/dist/cjs/lib/v3/understudy/clipboard.js +166 -0
- package/dist/cjs/lib/v3/understudy/clipboard.js.map +1 -0
- package/dist/cjs/lib/v3/understudy/context.d.ts +3 -0
- package/dist/cjs/lib/v3/understudy/context.js +15 -0
- package/dist/cjs/lib/v3/understudy/context.js.map +1 -1
- package/dist/cjs/lib/v3/understudy/page.d.ts +23 -1
- package/dist/cjs/lib/v3/understudy/page.js +283 -0
- package/dist/cjs/lib/v3/understudy/page.js.map +1 -1
- package/dist/cjs/lib/v3/v3.js +19 -7
- package/dist/cjs/lib/v3/v3.js.map +1 -1
- package/dist/cjs/lib/v3/verifier/errorTaxonomy.d.ts +35 -0
- package/dist/cjs/lib/v3/verifier/errorTaxonomy.js +291 -0
- package/dist/cjs/lib/v3/verifier/errorTaxonomy.js.map +1 -0
- package/dist/cjs/lib/v3/verifier/evidence.d.ts +44 -0
- package/dist/cjs/lib/v3/verifier/evidence.js +432 -0
- package/dist/cjs/lib/v3/verifier/evidence.js.map +1 -0
- package/dist/cjs/lib/v3/verifier/evidenceNormalization.d.ts +7 -0
- package/dist/cjs/lib/v3/verifier/evidenceNormalization.js +100 -0
- package/dist/cjs/lib/v3/verifier/evidenceNormalization.js.map +1 -0
- package/dist/cjs/lib/v3/verifier/index.d.ts +6 -0
- package/dist/cjs/lib/v3/verifier/index.js +16 -0
- package/dist/cjs/lib/v3/verifier/index.js.map +1 -0
- package/dist/cjs/lib/v3/verifier/prompts/batchedRelevance.d.ts +21 -0
- package/dist/cjs/lib/v3/verifier/prompts/batchedRelevance.js +71 -0
- package/dist/cjs/lib/v3/verifier/prompts/batchedRelevance.js.map +1 -0
- package/dist/cjs/lib/v3/verifier/prompts/firstPointOfFailure.d.ts +3 -0
- package/dist/cjs/lib/v3/verifier/prompts/firstPointOfFailure.js +166 -0
- package/dist/cjs/lib/v3/verifier/prompts/firstPointOfFailure.js.map +1 -0
- package/dist/cjs/lib/v3/verifier/prompts/fusedJudgment.d.ts +35 -0
- package/dist/cjs/lib/v3/verifier/prompts/fusedJudgment.js +158 -0
- package/dist/cjs/lib/v3/verifier/prompts/fusedJudgment.js.map +1 -0
- package/dist/cjs/lib/v3/verifier/prompts/fusedOutcome.d.ts +26 -0
- package/dist/cjs/lib/v3/verifier/prompts/fusedOutcome.js +137 -0
- package/dist/cjs/lib/v3/verifier/prompts/fusedOutcome.js.map +1 -0
- package/dist/cjs/lib/v3/verifier/prompts/index.d.ts +8 -0
- package/dist/cjs/lib/v3/verifier/prompts/index.js +22 -0
- package/dist/cjs/lib/v3/verifier/prompts/index.js.map +1 -0
- package/dist/cjs/lib/v3/verifier/prompts/perCriterionScore.d.ts +23 -0
- package/dist/cjs/lib/v3/verifier/prompts/perCriterionScore.js +77 -0
- package/dist/cjs/lib/v3/verifier/prompts/perCriterionScore.js.map +1 -0
- package/dist/cjs/lib/v3/verifier/prompts/render.d.ts +23 -0
- package/dist/cjs/lib/v3/verifier/prompts/render.js +45 -0
- package/dist/cjs/lib/v3/verifier/prompts/render.js.map +1 -0
- package/dist/cjs/lib/v3/verifier/prompts/rubricGeneration.d.ts +16 -0
- package/dist/cjs/lib/v3/verifier/prompts/rubricGeneration.js +321 -0
- package/dist/cjs/lib/v3/verifier/prompts/rubricGeneration.js.map +1 -0
- package/dist/cjs/lib/v3/verifier/prompts/taskValidity.d.ts +1 -0
- package/dist/cjs/lib/v3/verifier/prompts/taskValidity.js +116 -0
- package/dist/cjs/lib/v3/verifier/prompts/taskValidity.js.map +1 -0
- package/dist/cjs/lib/v3/verifier/rubricVerifier.d.ts +91 -0
- package/dist/cjs/lib/v3/verifier/rubricVerifier.js +1645 -0
- package/dist/cjs/lib/v3/verifier/rubricVerifier.js.map +1 -0
- package/dist/cjs/lib/v3/verifier/trajectory.d.ts +50 -0
- package/dist/cjs/lib/v3/verifier/trajectory.js +316 -0
- package/dist/cjs/lib/v3/verifier/trajectory.js.map +1 -0
- package/dist/cjs/lib/v3/verifier/types.d.ts +429 -0
- package/dist/cjs/lib/v3/verifier/types.js +3 -0
- package/dist/cjs/lib/v3/verifier/types.js.map +1 -0
- package/dist/cjs/lib/v3Evaluator.d.ts +14 -4
- package/dist/cjs/lib/v3Evaluator.js +189 -1
- package/dist/cjs/lib/v3Evaluator.js.map +1 -1
- package/dist/cjs/lib/v3LegacyEvaluator.js +5 -1
- package/dist/cjs/lib/v3LegacyEvaluator.js.map +1 -1
- package/dist/cjs/lib/version.d.ts +1 -1
- package/dist/cjs/lib/version.js +1 -1
- package/dist/cjs/lib/version.js.map +1 -1
- package/dist/esm/lib/utils.d.ts +8 -0
- package/dist/esm/lib/utils.js +28 -0
- package/dist/esm/lib/utils.js.map +1 -1
- package/dist/esm/lib/v3/agent/AgentProvider.js +5 -3
- package/dist/esm/lib/v3/agent/AgentProvider.js.map +1 -1
- package/dist/esm/lib/v3/agent/AnthropicCUAClient.js +10 -8
- package/dist/esm/lib/v3/agent/AnthropicCUAClient.js.map +1 -1
- package/dist/esm/lib/v3/agent/GoogleCUAClient.js +124 -28
- package/dist/esm/lib/v3/agent/GoogleCUAClient.js.map +1 -1
- package/dist/esm/lib/v3/agent/utils/captureAriaTreeProbe.d.ts +35 -0
- package/dist/esm/lib/v3/agent/utils/captureAriaTreeProbe.js +35 -0
- package/dist/esm/lib/v3/agent/utils/captureAriaTreeProbe.js.map +1 -0
- package/dist/esm/lib/v3/agent/utils/handleDoneToolCall.js +10 -1
- package/dist/esm/lib/v3/agent/utils/handleDoneToolCall.js.map +1 -1
- package/dist/esm/lib/v3/agent/utils/postStepProbeEvidence.d.ts +19 -0
- package/dist/esm/lib/v3/agent/utils/postStepProbeEvidence.js +50 -0
- package/dist/esm/lib/v3/agent/utils/postStepProbeEvidence.js.map +1 -0
- package/dist/esm/lib/v3/agent/utils/toolOutputEvidence.d.ts +2 -0
- package/dist/esm/lib/v3/agent/utils/toolOutputEvidence.js +59 -0
- package/dist/esm/lib/v3/agent/utils/toolOutputEvidence.js.map +1 -0
- package/dist/esm/lib/v3/agent/utils/wrapEvidenceCallback.d.ts +3 -0
- package/dist/esm/lib/v3/agent/utils/wrapEvidenceCallback.js +22 -0
- package/dist/esm/lib/v3/agent/utils/wrapEvidenceCallback.js.map +1 -0
- package/dist/esm/lib/v3/api.d.ts +1 -0
- package/dist/esm/lib/v3/api.js +38 -17
- package/dist/esm/lib/v3/api.js.map +1 -1
- package/dist/esm/lib/v3/cache/ActCache.js +2 -2
- package/dist/esm/lib/v3/cache/ActCache.js.map +1 -1
- package/dist/esm/lib/v3/cache/utils.d.ts +7 -0
- package/dist/esm/lib/v3/cache/utils.js +18 -0
- package/dist/esm/lib/v3/cache/utils.js.map +1 -1
- package/dist/esm/lib/v3/dom/build/locatorScripts.generated.d.ts +24 -24
- package/dist/esm/lib/v3/dom/build/locatorScripts.generated.js +24 -24
- package/dist/esm/lib/v3/dom/build/locatorScripts.generated.js.map +1 -1
- package/dist/esm/lib/v3/dom/locatorScripts/xpathResolver.js +79 -10
- package/dist/esm/lib/v3/dom/locatorScripts/xpathResolver.js.map +1 -1
- package/dist/esm/lib/v3/handlers/v3AgentHandler.d.ts +3 -1
- package/dist/esm/lib/v3/handlers/v3AgentHandler.js +108 -16
- package/dist/esm/lib/v3/handlers/v3AgentHandler.js.map +1 -1
- package/dist/esm/lib/v3/handlers/v3CuaAgentHandler.d.ts +11 -0
- package/dist/esm/lib/v3/handlers/v3CuaAgentHandler.js +119 -5
- package/dist/esm/lib/v3/handlers/v3CuaAgentHandler.js.map +1 -1
- package/dist/esm/lib/v3/index.d.ts +13 -1
- package/dist/esm/lib/v3/index.js +10 -0
- package/dist/esm/lib/v3/index.js.map +1 -1
- package/dist/esm/lib/v3/launch/local.js +1 -0
- package/dist/esm/lib/v3/launch/local.js.map +1 -1
- package/dist/esm/lib/v3/llm/LLMProvider.d.ts +3 -0
- package/dist/esm/lib/v3/llm/LLMProvider.js +44 -3
- package/dist/esm/lib/v3/llm/LLMProvider.js.map +1 -1
- package/dist/esm/lib/v3/llm/aisdk.js +4 -0
- package/dist/esm/lib/v3/llm/aisdk.js.map +1 -1
- package/dist/esm/lib/v3/llm/anthropicOptions.d.ts +57 -0
- package/dist/esm/lib/v3/llm/anthropicOptions.js +106 -0
- package/dist/esm/lib/v3/llm/anthropicOptions.js.map +1 -0
- package/dist/esm/lib/v3/types/public/agent.d.ts +8 -2
- package/dist/esm/lib/v3/types/public/agent.js +3 -0
- package/dist/esm/lib/v3/types/public/agent.js.map +1 -1
- package/dist/esm/lib/v3/types/public/agentEvidenceEvents.d.ts +85 -0
- package/dist/esm/lib/v3/types/public/agentEvidenceEvents.js +14 -0
- package/dist/esm/lib/v3/types/public/agentEvidenceEvents.js.map +1 -0
- package/dist/esm/lib/v3/types/public/api.d.ts +925 -182
- package/dist/esm/lib/v3/types/public/api.js +136 -18
- package/dist/esm/lib/v3/types/public/api.js.map +1 -1
- package/dist/esm/lib/v3/types/public/clipboard.d.ts +15 -0
- package/dist/esm/lib/v3/types/public/clipboard.js +2 -0
- package/dist/esm/lib/v3/types/public/clipboard.js.map +1 -0
- package/dist/esm/lib/v3/types/public/index.d.ts +2 -0
- package/dist/esm/lib/v3/types/public/index.js +2 -0
- package/dist/esm/lib/v3/types/public/index.js.map +1 -1
- package/dist/esm/lib/v3/types/public/model.d.ts +33 -8
- package/dist/esm/lib/v3/types/public/model.js.map +1 -1
- package/dist/esm/lib/v3/types/public/page.d.ts +29 -0
- package/dist/esm/lib/v3/types/public/page.js.map +1 -1
- package/dist/esm/lib/v3/types/public/sdkErrors.d.ts +3 -0
- package/dist/esm/lib/v3/types/public/sdkErrors.js +5 -0
- package/dist/esm/lib/v3/types/public/sdkErrors.js.map +1 -1
- package/dist/esm/lib/v3/understudy/clipboard.d.ts +24 -0
- package/dist/esm/lib/v3/understudy/clipboard.js +163 -0
- package/dist/esm/lib/v3/understudy/clipboard.js.map +1 -0
- package/dist/esm/lib/v3/understudy/context.d.ts +3 -0
- package/dist/esm/lib/v3/understudy/context.js +15 -0
- package/dist/esm/lib/v3/understudy/context.js.map +1 -1
- package/dist/esm/lib/v3/understudy/page.d.ts +23 -1
- package/dist/esm/lib/v3/understudy/page.js +284 -1
- package/dist/esm/lib/v3/understudy/page.js.map +1 -1
- package/dist/esm/lib/v3/v3.js +20 -8
- package/dist/esm/lib/v3/v3.js.map +1 -1
- package/dist/esm/lib/v3/verifier/errorTaxonomy.d.ts +35 -0
- package/dist/esm/lib/v3/verifier/errorTaxonomy.js +285 -0
- package/dist/esm/lib/v3/verifier/errorTaxonomy.js.map +1 -0
- package/dist/esm/lib/v3/verifier/evidence.d.ts +44 -0
- package/dist/esm/lib/v3/verifier/evidence.js +393 -0
- package/dist/esm/lib/v3/verifier/evidence.js.map +1 -0
- package/dist/esm/lib/v3/verifier/evidenceNormalization.d.ts +7 -0
- package/dist/esm/lib/v3/verifier/evidenceNormalization.js +93 -0
- package/dist/esm/lib/v3/verifier/evidenceNormalization.js.map +1 -0
- package/dist/esm/lib/v3/verifier/index.d.ts +6 -0
- package/dist/esm/lib/v3/verifier/index.js +3 -0
- package/dist/esm/lib/v3/verifier/index.js.map +1 -0
- package/dist/esm/lib/v3/verifier/prompts/batchedRelevance.d.ts +21 -0
- package/dist/esm/lib/v3/verifier/prompts/batchedRelevance.js +68 -0
- package/dist/esm/lib/v3/verifier/prompts/batchedRelevance.js.map +1 -0
- package/dist/esm/lib/v3/verifier/prompts/firstPointOfFailure.d.ts +3 -0
- package/dist/esm/lib/v3/verifier/prompts/firstPointOfFailure.js +162 -0
- package/dist/esm/lib/v3/verifier/prompts/firstPointOfFailure.js.map +1 -0
- package/dist/esm/lib/v3/verifier/prompts/fusedJudgment.d.ts +35 -0
- package/dist/esm/lib/v3/verifier/prompts/fusedJudgment.js +155 -0
- package/dist/esm/lib/v3/verifier/prompts/fusedJudgment.js.map +1 -0
- package/dist/esm/lib/v3/verifier/prompts/fusedOutcome.d.ts +26 -0
- package/dist/esm/lib/v3/verifier/prompts/fusedOutcome.js +134 -0
- package/dist/esm/lib/v3/verifier/prompts/fusedOutcome.js.map +1 -0
- package/dist/esm/lib/v3/verifier/prompts/index.d.ts +8 -0
- package/dist/esm/lib/v3/verifier/prompts/index.js +9 -0
- package/dist/esm/lib/v3/verifier/prompts/index.js.map +1 -0
- package/dist/esm/lib/v3/verifier/prompts/perCriterionScore.d.ts +23 -0
- package/dist/esm/lib/v3/verifier/prompts/perCriterionScore.js +74 -0
- package/dist/esm/lib/v3/verifier/prompts/perCriterionScore.js.map +1 -0
- package/dist/esm/lib/v3/verifier/prompts/render.d.ts +23 -0
- package/dist/esm/lib/v3/verifier/prompts/render.js +41 -0
- package/dist/esm/lib/v3/verifier/prompts/render.js.map +1 -0
- package/dist/esm/lib/v3/verifier/prompts/rubricGeneration.d.ts +16 -0
- package/dist/esm/lib/v3/verifier/prompts/rubricGeneration.js +318 -0
- package/dist/esm/lib/v3/verifier/prompts/rubricGeneration.js.map +1 -0
- package/dist/esm/lib/v3/verifier/prompts/taskValidity.d.ts +1 -0
- package/dist/esm/lib/v3/verifier/prompts/taskValidity.js +113 -0
- package/dist/esm/lib/v3/verifier/prompts/taskValidity.js.map +1 -0
- package/dist/esm/lib/v3/verifier/rubricVerifier.d.ts +91 -0
- package/dist/esm/lib/v3/verifier/rubricVerifier.js +1640 -0
- package/dist/esm/lib/v3/verifier/rubricVerifier.js.map +1 -0
- package/dist/esm/lib/v3/verifier/trajectory.d.ts +50 -0
- package/dist/esm/lib/v3/verifier/trajectory.js +273 -0
- package/dist/esm/lib/v3/verifier/trajectory.js.map +1 -0
- package/dist/esm/lib/v3/verifier/types.d.ts +429 -0
- package/dist/esm/lib/v3/verifier/types.js +2 -0
- package/dist/esm/lib/v3/verifier/types.js.map +1 -0
- package/dist/esm/lib/v3Evaluator.d.ts +14 -4
- package/dist/esm/lib/v3Evaluator.js +189 -1
- package/dist/esm/lib/v3Evaluator.js.map +1 -1
- package/dist/esm/lib/v3LegacyEvaluator.js +5 -1
- package/dist/esm/lib/v3LegacyEvaluator.js.map +1 -1
- package/dist/esm/lib/version.d.ts +1 -1
- package/dist/esm/lib/version.js +1 -1
- package/dist/esm/lib/version.js.map +1 -1
- package/package.json +18 -12
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.normalizeRubric = normalizeRubric;
|
|
40
|
+
exports.loadTrajectoryFromDisk = loadTrajectoryFromDisk;
|
|
41
|
+
exports.nextResultFilename = nextResultFilename;
|
|
42
|
+
exports.shouldPersistTrajectory = shouldPersistTrajectory;
|
|
43
|
+
exports.writeTrajectoryDir = writeTrajectoryDir;
|
|
44
|
+
const promises_1 = __importDefault(require("node:fs/promises"));
|
|
45
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
46
|
+
const evidenceNormalization_js_1 = require("./evidenceNormalization.js");
|
|
47
|
+
/**
|
|
48
|
+
* Convert dataset or generated rubric JSON into the public Stagehand shape.
|
|
49
|
+
* Snake-case dataset fields are accepted here so serialized quirks do not leak
|
|
50
|
+
* into the canonical rubric type.
|
|
51
|
+
*/
|
|
52
|
+
function normalizeRubric(rubric) {
|
|
53
|
+
if (rubric == null)
|
|
54
|
+
return undefined;
|
|
55
|
+
if (typeof rubric !== "object") {
|
|
56
|
+
throw new TypeError("Rubric must be an object");
|
|
57
|
+
}
|
|
58
|
+
const rawRubric = rubric;
|
|
59
|
+
if (!Array.isArray(rawRubric.items)) {
|
|
60
|
+
throw new TypeError("Rubric is missing an items array");
|
|
61
|
+
}
|
|
62
|
+
return {
|
|
63
|
+
items: rawRubric.items.map((item) => {
|
|
64
|
+
const criterion = normalizeRequiredString(item.criterion, "criterion");
|
|
65
|
+
const description = normalizeRequiredString(item.description, "description");
|
|
66
|
+
const maxPoints = normalizeMaxPoints(item);
|
|
67
|
+
if (typeof maxPoints !== "number" || !Number.isFinite(maxPoints)) {
|
|
68
|
+
throw new TypeError(`Rubric criterion "${criterion}" is missing a numeric maxPoints value`);
|
|
69
|
+
}
|
|
70
|
+
return {
|
|
71
|
+
criterion,
|
|
72
|
+
description,
|
|
73
|
+
maxPoints,
|
|
74
|
+
...(typeof item.condition === "string" && {
|
|
75
|
+
condition: item.condition,
|
|
76
|
+
}),
|
|
77
|
+
};
|
|
78
|
+
}),
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
function normalizeRequiredString(value, fieldName) {
|
|
82
|
+
if (typeof value === "string" && value.length) {
|
|
83
|
+
return value;
|
|
84
|
+
}
|
|
85
|
+
throw new TypeError(`Rubric criterion is missing a ${fieldName} value`);
|
|
86
|
+
}
|
|
87
|
+
function normalizeMaxPoints(item) {
|
|
88
|
+
return item.maxPoints ?? item.max_points;
|
|
89
|
+
}
|
|
90
|
+
function normalizeResultLabel(label) {
|
|
91
|
+
return (label ?? `rescore-${new Date().toISOString()}`).replace(/[^A-Za-z0-9._-]/g, "_");
|
|
92
|
+
}
|
|
93
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
94
|
+
// On-disk loader
|
|
95
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
96
|
+
/**
|
|
97
|
+
* Hydrate a Trajectory from the on-disk directory layout written by
|
|
98
|
+
* TrajectoryRecorder.persist(). Used by the offline re-scoring CLI (`bench
|
|
99
|
+
* verify`) and by any consumer that wants to feed a saved trajectory back
|
|
100
|
+
* into V3Evaluator.verify() without running an agent.
|
|
101
|
+
*
|
|
102
|
+
* Reverses the recorder's serialization tweaks:
|
|
103
|
+
* - `probeEvidence.screenshotPath` → read file into `probeEvidence.screenshot`.
|
|
104
|
+
* - Image modalities in `agentEvidence.modalities` carry `imagePath` on disk
|
|
105
|
+
* (relative to the trajectory dir). Legacy `bytesBase64` is also accepted
|
|
106
|
+
* for trajectories written before the externalization change.
|
|
107
|
+
*
|
|
108
|
+
* @param dir absolute or cwd-relative path to a `<run-id>/<task-id>/` directory.
|
|
109
|
+
*/
|
|
110
|
+
async function loadTrajectoryFromDisk(dir) {
|
|
111
|
+
const fs = await Promise.resolve().then(() => __importStar(require("node:fs/promises")));
|
|
112
|
+
const path = await Promise.resolve().then(() => __importStar(require("node:path")));
|
|
113
|
+
const trajectoryDir = path.resolve(dir);
|
|
114
|
+
const trajectoryPath = path.join(trajectoryDir, "trajectory.json");
|
|
115
|
+
const raw = await fs.readFile(trajectoryPath, "utf8");
|
|
116
|
+
const parsed = JSON.parse(raw);
|
|
117
|
+
const resolveWithinTrajectoryDir = (candidate, fieldName = "screenshotPath") => {
|
|
118
|
+
const resolved = path.resolve(trajectoryDir, candidate);
|
|
119
|
+
const relative = path.relative(trajectoryDir, resolved);
|
|
120
|
+
const outside = relative === ".." ||
|
|
121
|
+
relative.startsWith(`..${path.sep}`) ||
|
|
122
|
+
path.isAbsolute(relative);
|
|
123
|
+
if (outside) {
|
|
124
|
+
throw new Error(`Trajectory ${fieldName} escapes trajectory directory: ${candidate}`);
|
|
125
|
+
}
|
|
126
|
+
return resolved;
|
|
127
|
+
};
|
|
128
|
+
const hydrateProbeScreenshot = async (probe) => {
|
|
129
|
+
if (probe?.screenshotPath && !probe.screenshot) {
|
|
130
|
+
const resolved = resolveWithinTrajectoryDir(probe.screenshotPath);
|
|
131
|
+
try {
|
|
132
|
+
probe.screenshot = await fs.readFile(resolved);
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
// Missing screenshot file: leave probe.screenshot unset. The verifier's
|
|
136
|
+
// evidence_insufficient path will handle it.
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
};
|
|
140
|
+
for (const step of parsed.steps) {
|
|
141
|
+
// Rehydrate tier-2 probe screenshot from its on-disk file reference.
|
|
142
|
+
await hydrateProbeScreenshot(step.probeEvidence);
|
|
143
|
+
// Rehydrate tier-1 image modalities. New shape: resolve imagePath → Buffer.
|
|
144
|
+
// Legacy shape: decode bytesBase64 → Buffer.
|
|
145
|
+
if (step.agentEvidence?.modalities) {
|
|
146
|
+
const resolved = [];
|
|
147
|
+
for (const m of step.agentEvidence.modalities) {
|
|
148
|
+
if (m.type !== "image") {
|
|
149
|
+
resolved.push(m);
|
|
150
|
+
continue;
|
|
151
|
+
}
|
|
152
|
+
const raw = m;
|
|
153
|
+
if (typeof raw.imagePath === "string") {
|
|
154
|
+
const imagePath = resolveWithinTrajectoryDir(raw.imagePath, "imagePath");
|
|
155
|
+
try {
|
|
156
|
+
const bytes = await fs.readFile(imagePath);
|
|
157
|
+
resolved.push({ type: "image", bytes, mediaType: m.mediaType });
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
// Missing tier-1 image: drop this modality. evidence_insufficient
|
|
161
|
+
// handles the downstream effect.
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
else if (typeof raw.bytesBase64 === "string") {
|
|
165
|
+
resolved.push({
|
|
166
|
+
type: "image",
|
|
167
|
+
bytes: Buffer.from(raw.bytesBase64, "base64"),
|
|
168
|
+
mediaType: m.mediaType,
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
resolved.push(m);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
step.agentEvidence.modalities = resolved;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
await hydrateProbeScreenshot(parsed.finalObservation);
|
|
179
|
+
return parsed;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Build a `result*.json` filename for persisted evaluator output.
|
|
183
|
+
*
|
|
184
|
+
* Convention: the live run writes `result.json`; offline re-score attempts use
|
|
185
|
+
* a label-based name (e.g., `result_rescore-2026-05-11.json`) so they coexist
|
|
186
|
+
* without collisions and remain easy to diff.
|
|
187
|
+
*/
|
|
188
|
+
function nextResultFilename(label) {
|
|
189
|
+
return `result_${normalizeResultLabel(label)}.json`;
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Default persistence policy: explicit override, then env, then "on unless CI".
|
|
193
|
+
*/
|
|
194
|
+
function shouldPersistTrajectory(override) {
|
|
195
|
+
if (override !== undefined)
|
|
196
|
+
return override;
|
|
197
|
+
const env = process.env.VERIFIER_PERSIST_TRAJECTORIES?.toLowerCase();
|
|
198
|
+
if (env === "1" || env === "true")
|
|
199
|
+
return true;
|
|
200
|
+
if (env === "0" || env === "false")
|
|
201
|
+
return false;
|
|
202
|
+
return !process.env.CI;
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Write the on-disk trajectory layout under `dir`:
|
|
206
|
+
*
|
|
207
|
+
* <dir>/
|
|
208
|
+
* ├── task_data.json
|
|
209
|
+
* ├── trajectory.json (screenshots referenced by path)
|
|
210
|
+
* ├── screenshots/
|
|
211
|
+
* │ ├── probe/<N>.png
|
|
212
|
+
* │ └── agent/<N>[_M].png
|
|
213
|
+
* ├── scores/ (empty; populated separately)
|
|
214
|
+
* └── core.log
|
|
215
|
+
*
|
|
216
|
+
* Image bytes are externalized to PNG files; the in-memory Trajectory is left
|
|
217
|
+
* untouched so callers can keep using it after persistence.
|
|
218
|
+
*/
|
|
219
|
+
async function writeTrajectoryDir(dir, trajectory) {
|
|
220
|
+
await promises_1.default.mkdir(dir, { recursive: true });
|
|
221
|
+
await promises_1.default.mkdir(node_path_1.default.join(dir, "screenshots", "probe"), { recursive: true });
|
|
222
|
+
await promises_1.default.mkdir(node_path_1.default.join(dir, "screenshots", "agent"), { recursive: true });
|
|
223
|
+
const serializableSteps = [];
|
|
224
|
+
// A single post-turn probe is fanned across every step of a multi-tool turn,
|
|
225
|
+
// and a single agent screenshot is shared across every action a CUA provider
|
|
226
|
+
// chose from it, so the same Buffer is shared by reference. Dedupe by
|
|
227
|
+
// identity: write the PNG once and point every sharing step at the same file.
|
|
228
|
+
const probePathByBuffer = new Map();
|
|
229
|
+
const agentPathByBuffer = new Map();
|
|
230
|
+
for (const [i, step] of trajectory.steps.entries()) {
|
|
231
|
+
const probe = { ...step.probeEvidence };
|
|
232
|
+
if (probe.screenshot) {
|
|
233
|
+
let relPath = probePathByBuffer.get(probe.screenshot);
|
|
234
|
+
if (!relPath) {
|
|
235
|
+
relPath = `screenshots/probe/${i + 1}.png`;
|
|
236
|
+
await promises_1.default.writeFile(node_path_1.default.join(dir, relPath), probe.screenshot);
|
|
237
|
+
probePathByBuffer.set(probe.screenshot, relPath);
|
|
238
|
+
}
|
|
239
|
+
probe.screenshotPath = relPath;
|
|
240
|
+
delete probe.screenshot;
|
|
241
|
+
}
|
|
242
|
+
const imageModalities = step.agentEvidence.modalities.filter((m) => m.type === "image");
|
|
243
|
+
const multipleImages = imageModalities.length > 1;
|
|
244
|
+
let imageSeq = 0;
|
|
245
|
+
const modalities = [];
|
|
246
|
+
for (const m of step.agentEvidence.modalities) {
|
|
247
|
+
if (m.type !== "image") {
|
|
248
|
+
modalities.push(m.type === "json"
|
|
249
|
+
? {
|
|
250
|
+
...m,
|
|
251
|
+
content: (0, evidenceNormalization_js_1.redactInlineImagePayloads)(m.content, step.actionName),
|
|
252
|
+
}
|
|
253
|
+
: m);
|
|
254
|
+
continue;
|
|
255
|
+
}
|
|
256
|
+
let relPath = agentPathByBuffer.get(m.bytes);
|
|
257
|
+
if (!relPath) {
|
|
258
|
+
const suffix = multipleImages ? `_${imageSeq}` : "";
|
|
259
|
+
relPath = `screenshots/agent/${i + 1}${suffix}.png`;
|
|
260
|
+
await promises_1.default.writeFile(node_path_1.default.join(dir, relPath), m.bytes);
|
|
261
|
+
agentPathByBuffer.set(m.bytes, relPath);
|
|
262
|
+
}
|
|
263
|
+
modalities.push({
|
|
264
|
+
type: "image",
|
|
265
|
+
imagePath: relPath,
|
|
266
|
+
mediaType: m.mediaType,
|
|
267
|
+
});
|
|
268
|
+
imageSeq += 1;
|
|
269
|
+
}
|
|
270
|
+
serializableSteps.push({
|
|
271
|
+
...step,
|
|
272
|
+
probeEvidence: probe,
|
|
273
|
+
agentEvidence: { modalities },
|
|
274
|
+
toolOutput: {
|
|
275
|
+
...step.toolOutput,
|
|
276
|
+
result: (0, evidenceNormalization_js_1.redactInlineImagePayloads)(step.toolOutput.result, step.actionName),
|
|
277
|
+
},
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
const finalObservation = trajectory.finalObservation === undefined
|
|
281
|
+
? undefined
|
|
282
|
+
: { ...trajectory.finalObservation };
|
|
283
|
+
if (finalObservation?.screenshot) {
|
|
284
|
+
const relPath = "screenshots/probe/final.png";
|
|
285
|
+
await promises_1.default.writeFile(node_path_1.default.join(dir, relPath), finalObservation.screenshot);
|
|
286
|
+
finalObservation.screenshotPath = relPath;
|
|
287
|
+
delete finalObservation.screenshot;
|
|
288
|
+
}
|
|
289
|
+
// Image modalities carry imagePath instead of raw bytes on disk; cast
|
|
290
|
+
// through unknown rather than widen Trajectory's type contract.
|
|
291
|
+
const serialized = {
|
|
292
|
+
...trajectory,
|
|
293
|
+
steps: serializableSteps,
|
|
294
|
+
...(finalObservation ? { finalObservation } : {}),
|
|
295
|
+
};
|
|
296
|
+
await promises_1.default.writeFile(node_path_1.default.join(dir, "trajectory.json"), JSON.stringify(serialized, null, 2));
|
|
297
|
+
await promises_1.default.writeFile(node_path_1.default.join(dir, "task_data.json"), JSON.stringify({
|
|
298
|
+
task: trajectory.task,
|
|
299
|
+
status: trajectory.status,
|
|
300
|
+
finalAnswer: trajectory.finalAnswer ?? null,
|
|
301
|
+
}, null, 2));
|
|
302
|
+
await promises_1.default.mkdir(node_path_1.default.join(dir, "scores"), { recursive: true });
|
|
303
|
+
await promises_1.default.writeFile(node_path_1.default.join(dir, "core.log"), coreLog(trajectory));
|
|
304
|
+
}
|
|
305
|
+
function coreLog(trajectory) {
|
|
306
|
+
return (trajectory.steps
|
|
307
|
+
.map((step, i) => JSON.stringify({
|
|
308
|
+
step: i,
|
|
309
|
+
action: step.actionName,
|
|
310
|
+
url: step.probeEvidence.url ?? null,
|
|
311
|
+
ok: step.toolOutput.ok,
|
|
312
|
+
reasoning: step.reasoning || undefined,
|
|
313
|
+
}))
|
|
314
|
+
.join("\n") + "\n");
|
|
315
|
+
}
|
|
316
|
+
//# sourceMappingURL=trajectory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trajectory.js","sourceRoot":"","sources":["../../../../../lib/v3/verifier/trajectory.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type {\n AgentEvidenceModality,\n ProbeEvidence,\n Rubric,\n Trajectory,\n TrajectoryStep,\n} from \"./types.js\";\nimport { redactInlineImagePayloads } from \"./evidenceNormalization.js\";\n\ntype RawRubricCriterion = {\n criterion: unknown;\n description: unknown;\n max_points?: unknown;\n maxPoints?: unknown;\n condition?: unknown;\n};\n\ntype RawRubric = {\n items?: unknown;\n};\n\ntype PersistedProbeEvidence = ProbeEvidence & {\n screenshotPath?: string;\n};\n\n/**\n * Convert dataset or generated rubric JSON into the public Stagehand shape.\n * Snake-case dataset fields are accepted here so serialized quirks do not leak\n * into the canonical rubric type.\n */\nexport function normalizeRubric(rubric: unknown): Rubric | undefined {\n if (rubric == null) return undefined;\n if (typeof rubric !== \"object\") {\n throw new TypeError(\"Rubric must be an object\");\n }\n\n const rawRubric = rubric as RawRubric;\n if (!Array.isArray(rawRubric.items)) {\n throw new TypeError(\"Rubric is missing an items array\");\n }\n\n return {\n items: rawRubric.items.map((item) => {\n const criterion = normalizeRequiredString(item.criterion, \"criterion\");\n const description = normalizeRequiredString(\n item.description,\n \"description\",\n );\n const maxPoints = normalizeMaxPoints(item);\n\n if (typeof maxPoints !== \"number\" || !Number.isFinite(maxPoints)) {\n throw new TypeError(\n `Rubric criterion \"${criterion}\" is missing a numeric maxPoints value`,\n );\n }\n\n return {\n criterion,\n description,\n maxPoints,\n ...(typeof item.condition === \"string\" && {\n condition: item.condition,\n }),\n };\n }),\n };\n}\n\nfunction normalizeRequiredString(value: unknown, fieldName: string): string {\n if (typeof value === \"string\" && value.length) {\n return value;\n }\n\n throw new TypeError(`Rubric criterion is missing a ${fieldName} value`);\n}\n\nfunction normalizeMaxPoints(item: RawRubricCriterion): unknown {\n return item.maxPoints ?? item.max_points;\n}\n\nfunction normalizeResultLabel(label?: string): string {\n return (label ?? `rescore-${new Date().toISOString()}`).replace(\n /[^A-Za-z0-9._-]/g,\n \"_\",\n );\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// On-disk loader\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Hydrate a Trajectory from the on-disk directory layout written by\n * TrajectoryRecorder.persist(). Used by the offline re-scoring CLI (`bench\n * verify`) and by any consumer that wants to feed a saved trajectory back\n * into V3Evaluator.verify() without running an agent.\n *\n * Reverses the recorder's serialization tweaks:\n * - `probeEvidence.screenshotPath` → read file into `probeEvidence.screenshot`.\n * - Image modalities in `agentEvidence.modalities` carry `imagePath` on disk\n * (relative to the trajectory dir). Legacy `bytesBase64` is also accepted\n * for trajectories written before the externalization change.\n *\n * @param dir absolute or cwd-relative path to a `<run-id>/<task-id>/` directory.\n */\nexport async function loadTrajectoryFromDisk(dir: string): Promise<Trajectory> {\n const fs = await import(\"node:fs/promises\");\n const path = await import(\"node:path\");\n const trajectoryDir = path.resolve(dir);\n\n const trajectoryPath = path.join(trajectoryDir, \"trajectory.json\");\n const raw = await fs.readFile(trajectoryPath, \"utf8\");\n const parsed = JSON.parse(raw) as Trajectory & {\n finalObservation?: PersistedProbeEvidence;\n steps: Array<\n TrajectoryStep & {\n agentEvidence: {\n modalities: Array<\n | { type: \"text\"; content: string }\n | {\n type: \"image\";\n mediaType: string;\n // Accept both shapes:\n // imagePath — new, relative path under the trajectory dir\n // bytesBase64 — legacy, inline base64\n bytes?: unknown;\n imagePath?: string;\n bytesBase64?: string;\n }\n | { type: \"json\"; content: unknown }\n >;\n };\n probeEvidence: PersistedProbeEvidence;\n }\n >;\n };\n\n const resolveWithinTrajectoryDir = (\n candidate: string,\n fieldName = \"screenshotPath\",\n ): string => {\n const resolved = path.resolve(trajectoryDir, candidate);\n const relative = path.relative(trajectoryDir, resolved);\n const outside =\n relative === \"..\" ||\n relative.startsWith(`..${path.sep}`) ||\n path.isAbsolute(relative);\n\n if (outside) {\n throw new Error(\n `Trajectory ${fieldName} escapes trajectory directory: ${candidate}`,\n );\n }\n\n return resolved;\n };\n\n const hydrateProbeScreenshot = async (\n probe: PersistedProbeEvidence | undefined,\n ): Promise<void> => {\n if (probe?.screenshotPath && !probe.screenshot) {\n const resolved = resolveWithinTrajectoryDir(probe.screenshotPath);\n try {\n probe.screenshot = await fs.readFile(resolved);\n } catch {\n // Missing screenshot file: leave probe.screenshot unset. The verifier's\n // evidence_insufficient path will handle it.\n }\n }\n };\n\n for (const step of parsed.steps) {\n // Rehydrate tier-2 probe screenshot from its on-disk file reference.\n await hydrateProbeScreenshot(step.probeEvidence);\n\n // Rehydrate tier-1 image modalities. New shape: resolve imagePath → Buffer.\n // Legacy shape: decode bytesBase64 → Buffer.\n if (step.agentEvidence?.modalities) {\n const resolved: AgentEvidenceModality[] = [];\n for (const m of step.agentEvidence.modalities) {\n if (m.type !== \"image\") {\n resolved.push(m as AgentEvidenceModality);\n continue;\n }\n const raw = m as unknown as {\n imagePath?: string;\n bytesBase64?: string;\n };\n if (typeof raw.imagePath === \"string\") {\n const imagePath = resolveWithinTrajectoryDir(\n raw.imagePath,\n \"imagePath\",\n );\n try {\n const bytes = await fs.readFile(imagePath);\n resolved.push({ type: \"image\", bytes, mediaType: m.mediaType });\n } catch {\n // Missing tier-1 image: drop this modality. evidence_insufficient\n // handles the downstream effect.\n }\n } else if (typeof raw.bytesBase64 === \"string\") {\n resolved.push({\n type: \"image\",\n bytes: Buffer.from(raw.bytesBase64, \"base64\"),\n mediaType: m.mediaType,\n });\n } else {\n resolved.push(m as AgentEvidenceModality);\n }\n }\n step.agentEvidence.modalities = resolved;\n }\n }\n\n await hydrateProbeScreenshot(parsed.finalObservation);\n\n return parsed;\n}\n\n/**\n * Build a `result*.json` filename for persisted evaluator output.\n *\n * Convention: the live run writes `result.json`; offline re-score attempts use\n * a label-based name (e.g., `result_rescore-2026-05-11.json`) so they coexist\n * without collisions and remain easy to diff.\n */\nexport function nextResultFilename(label?: string): string {\n return `result_${normalizeResultLabel(label)}.json`;\n}\n\n/**\n * Default persistence policy: explicit override, then env, then \"on unless CI\".\n */\nexport function shouldPersistTrajectory(\n override: boolean | undefined,\n): boolean {\n if (override !== undefined) return override;\n const env = process.env.VERIFIER_PERSIST_TRAJECTORIES?.toLowerCase();\n if (env === \"1\" || env === \"true\") return true;\n if (env === \"0\" || env === \"false\") return false;\n return !process.env.CI;\n}\n\n/**\n * Write the on-disk trajectory layout under `dir`:\n *\n * <dir>/\n * ├── task_data.json\n * ├── trajectory.json (screenshots referenced by path)\n * ├── screenshots/\n * │ ├── probe/<N>.png\n * │ └── agent/<N>[_M].png\n * ├── scores/ (empty; populated separately)\n * └── core.log\n *\n * Image bytes are externalized to PNG files; the in-memory Trajectory is left\n * untouched so callers can keep using it after persistence.\n */\nexport async function writeTrajectoryDir(\n dir: string,\n trajectory: Trajectory,\n): Promise<void> {\n await fs.mkdir(dir, { recursive: true });\n await fs.mkdir(path.join(dir, \"screenshots\", \"probe\"), { recursive: true });\n await fs.mkdir(path.join(dir, \"screenshots\", \"agent\"), { recursive: true });\n\n const serializableSteps: unknown[] = [];\n // A single post-turn probe is fanned across every step of a multi-tool turn,\n // and a single agent screenshot is shared across every action a CUA provider\n // chose from it, so the same Buffer is shared by reference. Dedupe by\n // identity: write the PNG once and point every sharing step at the same file.\n const probePathByBuffer = new Map<Buffer, string>();\n const agentPathByBuffer = new Map<Buffer, string>();\n for (const [i, step] of trajectory.steps.entries()) {\n const probe: ProbeEvidence = { ...step.probeEvidence };\n if (probe.screenshot) {\n let relPath = probePathByBuffer.get(probe.screenshot);\n if (!relPath) {\n relPath = `screenshots/probe/${i + 1}.png`;\n await fs.writeFile(path.join(dir, relPath), probe.screenshot);\n probePathByBuffer.set(probe.screenshot, relPath);\n }\n probe.screenshotPath = relPath;\n delete probe.screenshot;\n }\n\n const imageModalities = step.agentEvidence.modalities.filter(\n (m) => m.type === \"image\",\n );\n const multipleImages = imageModalities.length > 1;\n let imageSeq = 0;\n const modalities: unknown[] = [];\n for (const m of step.agentEvidence.modalities) {\n if (m.type !== \"image\") {\n modalities.push(\n m.type === \"json\"\n ? {\n ...m,\n content: redactInlineImagePayloads(m.content, step.actionName),\n }\n : m,\n );\n continue;\n }\n let relPath = agentPathByBuffer.get(m.bytes);\n if (!relPath) {\n const suffix = multipleImages ? `_${imageSeq}` : \"\";\n relPath = `screenshots/agent/${i + 1}${suffix}.png`;\n await fs.writeFile(path.join(dir, relPath), m.bytes);\n agentPathByBuffer.set(m.bytes, relPath);\n }\n modalities.push({\n type: \"image\",\n imagePath: relPath,\n mediaType: m.mediaType,\n });\n imageSeq += 1;\n }\n serializableSteps.push({\n ...step,\n probeEvidence: probe,\n agentEvidence: { modalities },\n toolOutput: {\n ...step.toolOutput,\n result: redactInlineImagePayloads(\n step.toolOutput.result,\n step.actionName,\n ),\n },\n });\n }\n\n const finalObservation: ProbeEvidence | undefined =\n trajectory.finalObservation === undefined\n ? undefined\n : { ...trajectory.finalObservation };\n if (finalObservation?.screenshot) {\n const relPath = \"screenshots/probe/final.png\";\n await fs.writeFile(path.join(dir, relPath), finalObservation.screenshot);\n finalObservation.screenshotPath = relPath;\n delete finalObservation.screenshot;\n }\n\n // Image modalities carry imagePath instead of raw bytes on disk; cast\n // through unknown rather than widen Trajectory's type contract.\n const serialized = {\n ...trajectory,\n steps: serializableSteps,\n ...(finalObservation ? { finalObservation } : {}),\n } as unknown;\n\n await fs.writeFile(\n path.join(dir, \"trajectory.json\"),\n JSON.stringify(serialized, null, 2),\n );\n\n await fs.writeFile(\n path.join(dir, \"task_data.json\"),\n JSON.stringify(\n {\n task: trajectory.task,\n status: trajectory.status,\n finalAnswer: trajectory.finalAnswer ?? null,\n },\n null,\n 2,\n ),\n );\n\n await fs.mkdir(path.join(dir, \"scores\"), { recursive: true });\n await fs.writeFile(path.join(dir, \"core.log\"), coreLog(trajectory));\n}\n\nfunction coreLog(trajectory: Trajectory): string {\n return (\n trajectory.steps\n .map((step, i) =>\n JSON.stringify({\n step: i,\n action: step.actionName,\n url: step.probeEvidence.url ?? null,\n ok: step.toolOutput.ok,\n reasoning: step.reasoning || undefined,\n }),\n )\n .join(\"\\n\") + \"\\n\"\n );\n}\n"]}
|