prose-qa 0.1.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/LICENSE +21 -0
- package/README.md +570 -0
- package/dist/agent/bash.d.ts +52 -0
- package/dist/agent/bash.d.ts.map +1 -0
- package/dist/agent/bash.js +186 -0
- package/dist/agent/bash.js.map +1 -0
- package/dist/agent/bash.test.d.ts +2 -0
- package/dist/agent/bash.test.d.ts.map +1 -0
- package/dist/agent/bash.test.js +70 -0
- package/dist/agent/bash.test.js.map +1 -0
- package/dist/agent/llm-model.d.ts +5 -0
- package/dist/agent/llm-model.d.ts.map +1 -0
- package/dist/agent/llm-model.js +29 -0
- package/dist/agent/llm-model.js.map +1 -0
- package/dist/agent/llm-model.test.d.ts +2 -0
- package/dist/agent/llm-model.test.d.ts.map +1 -0
- package/dist/agent/llm-model.test.js +28 -0
- package/dist/agent/llm-model.test.js.map +1 -0
- package/dist/agent/prompt.d.ts +17 -0
- package/dist/agent/prompt.d.ts.map +1 -0
- package/dist/agent/prompt.js +97 -0
- package/dist/agent/prompt.js.map +1 -0
- package/dist/agent/prompt.test.d.ts +2 -0
- package/dist/agent/prompt.test.d.ts.map +1 -0
- package/dist/agent/prompt.test.js +124 -0
- package/dist/agent/prompt.test.js.map +1 -0
- package/dist/agent/provider-options.d.ts +8 -0
- package/dist/agent/provider-options.d.ts.map +1 -0
- package/dist/agent/provider-options.js +115 -0
- package/dist/agent/provider-options.js.map +1 -0
- package/dist/agent/provider-options.test.d.ts +2 -0
- package/dist/agent/provider-options.test.d.ts.map +1 -0
- package/dist/agent/provider-options.test.js +114 -0
- package/dist/agent/provider-options.test.js.map +1 -0
- package/dist/agent/runner.d.ts +27 -0
- package/dist/agent/runner.d.ts.map +1 -0
- package/dist/agent/runner.js +291 -0
- package/dist/agent/runner.js.map +1 -0
- package/dist/agent/verdict-retry-prompt.d.ts +3 -0
- package/dist/agent/verdict-retry-prompt.d.ts.map +1 -0
- package/dist/agent/verdict-retry-prompt.js +18 -0
- package/dist/agent/verdict-retry-prompt.js.map +1 -0
- package/dist/agent/verdict-retry-prompt.test.d.ts +2 -0
- package/dist/agent/verdict-retry-prompt.test.d.ts.map +1 -0
- package/dist/agent/verdict-retry-prompt.test.js +25 -0
- package/dist/agent/verdict-retry-prompt.test.js.map +1 -0
- package/dist/agent/verdict.d.ts +31 -0
- package/dist/agent/verdict.d.ts.map +1 -0
- package/dist/agent/verdict.js +123 -0
- package/dist/agent/verdict.js.map +1 -0
- package/dist/agent/verdict.test.d.ts +2 -0
- package/dist/agent/verdict.test.d.ts.map +1 -0
- package/dist/agent/verdict.test.js +156 -0
- package/dist/agent/verdict.test.js.map +1 -0
- package/dist/analyze/build-context.d.ts +58 -0
- package/dist/analyze/build-context.d.ts.map +1 -0
- package/dist/analyze/build-context.js +141 -0
- package/dist/analyze/build-context.js.map +1 -0
- package/dist/analyze/build-context.test.d.ts +2 -0
- package/dist/analyze/build-context.test.d.ts.map +1 -0
- package/dist/analyze/build-context.test.js +118 -0
- package/dist/analyze/build-context.test.js.map +1 -0
- package/dist/analyze/compare-runs.d.ts +49 -0
- package/dist/analyze/compare-runs.d.ts.map +1 -0
- package/dist/analyze/compare-runs.js +214 -0
- package/dist/analyze/compare-runs.js.map +1 -0
- package/dist/analyze/compare-runs.test.d.ts +2 -0
- package/dist/analyze/compare-runs.test.d.ts.map +1 -0
- package/dist/analyze/compare-runs.test.js +139 -0
- package/dist/analyze/compare-runs.test.js.map +1 -0
- package/dist/analyze/diff-hunks.d.ts +16 -0
- package/dist/analyze/diff-hunks.d.ts.map +1 -0
- package/dist/analyze/diff-hunks.js +287 -0
- package/dist/analyze/diff-hunks.js.map +1 -0
- package/dist/analyze/diff-hunks.test.d.ts +2 -0
- package/dist/analyze/diff-hunks.test.d.ts.map +1 -0
- package/dist/analyze/diff-hunks.test.js +54 -0
- package/dist/analyze/diff-hunks.test.js.map +1 -0
- package/dist/analyze/hunk-editor.d.ts +8 -0
- package/dist/analyze/hunk-editor.d.ts.map +1 -0
- package/dist/analyze/hunk-editor.js +129 -0
- package/dist/analyze/hunk-editor.js.map +1 -0
- package/dist/analyze/hunk-editor.test.d.ts +2 -0
- package/dist/analyze/hunk-editor.test.d.ts.map +1 -0
- package/dist/analyze/hunk-editor.test.js +48 -0
- package/dist/analyze/hunk-editor.test.js.map +1 -0
- package/dist/analyze/index.d.ts +23 -0
- package/dist/analyze/index.d.ts.map +1 -0
- package/dist/analyze/index.js +122 -0
- package/dist/analyze/index.js.map +1 -0
- package/dist/analyze/llm-fix.d.ts +11 -0
- package/dist/analyze/llm-fix.d.ts.map +1 -0
- package/dist/analyze/llm-fix.js +76 -0
- package/dist/analyze/llm-fix.js.map +1 -0
- package/dist/analyze/parse-proposal.d.ts +41 -0
- package/dist/analyze/parse-proposal.d.ts.map +1 -0
- package/dist/analyze/parse-proposal.js +53 -0
- package/dist/analyze/parse-proposal.js.map +1 -0
- package/dist/analyze/parse-proposal.test.d.ts +2 -0
- package/dist/analyze/parse-proposal.test.d.ts.map +1 -0
- package/dist/analyze/parse-proposal.test.js +40 -0
- package/dist/analyze/parse-proposal.test.js.map +1 -0
- package/dist/analyze/repl.d.ts +28 -0
- package/dist/analyze/repl.d.ts.map +1 -0
- package/dist/analyze/repl.js +284 -0
- package/dist/analyze/repl.js.map +1 -0
- package/dist/analyze/repl.test.d.ts +2 -0
- package/dist/analyze/repl.test.d.ts.map +1 -0
- package/dist/analyze/repl.test.js +101 -0
- package/dist/analyze/repl.test.js.map +1 -0
- package/dist/analyze/suggest.d.ts +5 -0
- package/dist/analyze/suggest.d.ts.map +1 -0
- package/dist/analyze/suggest.js +75 -0
- package/dist/analyze/suggest.js.map +1 -0
- package/dist/analyze/suggest.test.d.ts +2 -0
- package/dist/analyze/suggest.test.d.ts.map +1 -0
- package/dist/analyze/suggest.test.js +53 -0
- package/dist/analyze/suggest.test.js.map +1 -0
- package/dist/analyze/validate-markdown.d.ts +3 -0
- package/dist/analyze/validate-markdown.d.ts.map +1 -0
- package/dist/analyze/validate-markdown.js +25 -0
- package/dist/analyze/validate-markdown.js.map +1 -0
- package/dist/artifacts/policy.d.ts +9 -0
- package/dist/artifacts/policy.d.ts.map +1 -0
- package/dist/artifacts/policy.js +46 -0
- package/dist/artifacts/policy.js.map +1 -0
- package/dist/artifacts/policy.test.d.ts +2 -0
- package/dist/artifacts/policy.test.d.ts.map +1 -0
- package/dist/artifacts/policy.test.js +73 -0
- package/dist/artifacts/policy.test.js.map +1 -0
- package/dist/auth/resolve.d.ts +22 -0
- package/dist/auth/resolve.d.ts.map +1 -0
- package/dist/auth/resolve.js +148 -0
- package/dist/auth/resolve.js.map +1 -0
- package/dist/auth/store.d.ts +23 -0
- package/dist/auth/store.d.ts.map +1 -0
- package/dist/auth/store.js +103 -0
- package/dist/auth/store.js.map +1 -0
- package/dist/cache/generate.d.ts +8 -0
- package/dist/cache/generate.d.ts.map +1 -0
- package/dist/cache/generate.js +61 -0
- package/dist/cache/generate.js.map +1 -0
- package/dist/cache/hash.d.ts +5 -0
- package/dist/cache/hash.d.ts.map +1 -0
- package/dist/cache/hash.js +21 -0
- package/dist/cache/hash.js.map +1 -0
- package/dist/cache/hash.test.d.ts +2 -0
- package/dist/cache/hash.test.d.ts.map +1 -0
- package/dist/cache/hash.test.js +42 -0
- package/dist/cache/hash.test.js.map +1 -0
- package/dist/cache/resolve.d.ts +5 -0
- package/dist/cache/resolve.d.ts.map +1 -0
- package/dist/cache/resolve.js +8 -0
- package/dist/cache/resolve.js.map +1 -0
- package/dist/cache/store.d.ts +20 -0
- package/dist/cache/store.d.ts.map +1 -0
- package/dist/cache/store.js +90 -0
- package/dist/cache/store.js.map +1 -0
- package/dist/cache/store.test.d.ts +2 -0
- package/dist/cache/store.test.d.ts.map +1 -0
- package/dist/cache/store.test.js +101 -0
- package/dist/cache/store.test.js.map +1 -0
- package/dist/cli/analyze.d.ts +21 -0
- package/dist/cli/analyze.d.ts.map +1 -0
- package/dist/cli/analyze.js +148 -0
- package/dist/cli/analyze.js.map +1 -0
- package/dist/cli/concurrency.d.ts +17 -0
- package/dist/cli/concurrency.d.ts.map +1 -0
- package/dist/cli/concurrency.js +56 -0
- package/dist/cli/concurrency.js.map +1 -0
- package/dist/cli/concurrency.test.d.ts +2 -0
- package/dist/cli/concurrency.test.d.ts.map +1 -0
- package/dist/cli/concurrency.test.js +74 -0
- package/dist/cli/concurrency.test.js.map +1 -0
- package/dist/cli/config.d.ts +2 -0
- package/dist/cli/config.d.ts.map +1 -0
- package/dist/cli/config.js +14 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/help.d.ts +23 -0
- package/dist/cli/help.d.ts.map +1 -0
- package/dist/cli/help.js +458 -0
- package/dist/cli/help.js.map +1 -0
- package/dist/cli/help.test.d.ts +2 -0
- package/dist/cli/help.test.d.ts.map +1 -0
- package/dist/cli/help.test.js +41 -0
- package/dist/cli/help.test.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +300 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/mcp.d.ts +6 -0
- package/dist/cli/mcp.d.ts.map +1 -0
- package/dist/cli/mcp.js +17 -0
- package/dist/cli/mcp.js.map +1 -0
- package/dist/cli/record.d.ts +27 -0
- package/dist/cli/record.d.ts.map +1 -0
- package/dist/cli/record.js +244 -0
- package/dist/cli/record.js.map +1 -0
- package/dist/cli/run.d.ts +11 -0
- package/dist/cli/run.d.ts.map +1 -0
- package/dist/cli/run.js +676 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/cli/subprocess.d.ts +19 -0
- package/dist/cli/subprocess.d.ts.map +1 -0
- package/dist/cli/subprocess.js +142 -0
- package/dist/cli/subprocess.js.map +1 -0
- package/dist/cli/subprocess.test.d.ts +2 -0
- package/dist/cli/subprocess.test.d.ts.map +1 -0
- package/dist/cli/subprocess.test.js +76 -0
- package/dist/cli/subprocess.test.js.map +1 -0
- package/dist/cli/tags.d.ts +5 -0
- package/dist/cli/tags.d.ts.map +1 -0
- package/dist/cli/tags.js +33 -0
- package/dist/cli/tags.js.map +1 -0
- package/dist/cli/tags.test.d.ts +2 -0
- package/dist/cli/tags.test.d.ts.map +1 -0
- package/dist/cli/tags.test.js +31 -0
- package/dist/cli/tags.test.js.map +1 -0
- package/dist/config/env-vars.d.ts +2 -0
- package/dist/config/env-vars.d.ts.map +1 -0
- package/dist/config/env-vars.js +14 -0
- package/dist/config/env-vars.js.map +1 -0
- package/dist/config/env.d.ts +2 -0
- package/dist/config/env.d.ts.map +1 -0
- package/dist/config/env.js +9 -0
- package/dist/config/env.js.map +1 -0
- package/dist/config/lightpanda.d.ts +6 -0
- package/dist/config/lightpanda.d.ts.map +1 -0
- package/dist/config/lightpanda.js +38 -0
- package/dist/config/lightpanda.js.map +1 -0
- package/dist/config/lightpanda.test.d.ts +2 -0
- package/dist/config/lightpanda.test.d.ts.map +1 -0
- package/dist/config/lightpanda.test.js +46 -0
- package/dist/config/lightpanda.test.js.map +1 -0
- package/dist/config/load.d.ts +22 -0
- package/dist/config/load.d.ts.map +1 -0
- package/dist/config/load.js +242 -0
- package/dist/config/load.js.map +1 -0
- package/dist/config/load.test.d.ts +2 -0
- package/dist/config/load.test.d.ts.map +1 -0
- package/dist/config/load.test.js +86 -0
- package/dist/config/load.test.js.map +1 -0
- package/dist/config/set.d.ts +8 -0
- package/dist/config/set.d.ts.map +1 -0
- package/dist/config/set.js +93 -0
- package/dist/config/set.js.map +1 -0
- package/dist/config/set.test.d.ts +2 -0
- package/dist/config/set.test.d.ts.map +1 -0
- package/dist/config/set.test.js +98 -0
- package/dist/config/set.test.js.map +1 -0
- package/dist/healing/classify.d.ts +15 -0
- package/dist/healing/classify.d.ts.map +1 -0
- package/dist/healing/classify.js +209 -0
- package/dist/healing/classify.js.map +1 -0
- package/dist/healing/classify.test.d.ts +2 -0
- package/dist/healing/classify.test.d.ts.map +1 -0
- package/dist/healing/classify.test.js +167 -0
- package/dist/healing/classify.test.js.map +1 -0
- package/dist/healing/recovery-prompt.d.ts +3 -0
- package/dist/healing/recovery-prompt.d.ts.map +1 -0
- package/dist/healing/recovery-prompt.js +22 -0
- package/dist/healing/recovery-prompt.js.map +1 -0
- package/dist/mcp/inline-scenario.d.ts +13 -0
- package/dist/mcp/inline-scenario.d.ts.map +1 -0
- package/dist/mcp/inline-scenario.js +23 -0
- package/dist/mcp/inline-scenario.js.map +1 -0
- package/dist/mcp/server.d.ts +4 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +186 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/skill.d.ts +5 -0
- package/dist/mcp/skill.d.ts.map +1 -0
- package/dist/mcp/skill.js +38 -0
- package/dist/mcp/skill.js.map +1 -0
- package/dist/mcp/skill.test.d.ts +2 -0
- package/dist/mcp/skill.test.d.ts.map +1 -0
- package/dist/mcp/skill.test.js +18 -0
- package/dist/mcp/skill.test.js.map +1 -0
- package/dist/paths.d.ts +12 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +61 -0
- package/dist/paths.js.map +1 -0
- package/dist/prompt/load.d.ts +4 -0
- package/dist/prompt/load.d.ts.map +1 -0
- package/dist/prompt/load.js +19 -0
- package/dist/prompt/load.js.map +1 -0
- package/dist/recorder/bridge-process.d.ts +14 -0
- package/dist/recorder/bridge-process.d.ts.map +1 -0
- package/dist/recorder/bridge-process.js +133 -0
- package/dist/recorder/bridge-process.js.map +1 -0
- package/dist/recorder/bridge-process.test.d.ts +2 -0
- package/dist/recorder/bridge-process.test.d.ts.map +1 -0
- package/dist/recorder/bridge-process.test.js +36 -0
- package/dist/recorder/bridge-process.test.js.map +1 -0
- package/dist/recorder/bridge-worker.d.ts +2 -0
- package/dist/recorder/bridge-worker.d.ts.map +1 -0
- package/dist/recorder/bridge-worker.js +76 -0
- package/dist/recorder/bridge-worker.js.map +1 -0
- package/dist/recorder/bridge.d.ts +12 -0
- package/dist/recorder/bridge.d.ts.map +1 -0
- package/dist/recorder/bridge.js +61 -0
- package/dist/recorder/bridge.js.map +1 -0
- package/dist/recorder/bridge.test.d.ts +2 -0
- package/dist/recorder/bridge.test.d.ts.map +1 -0
- package/dist/recorder/bridge.test.js +21 -0
- package/dist/recorder/bridge.test.js.map +1 -0
- package/dist/recorder/enrich-event.d.ts +31 -0
- package/dist/recorder/enrich-event.d.ts.map +1 -0
- package/dist/recorder/enrich-event.js +91 -0
- package/dist/recorder/enrich-event.js.map +1 -0
- package/dist/recorder/events.d.ts +11 -0
- package/dist/recorder/events.d.ts.map +1 -0
- package/dist/recorder/events.js +42 -0
- package/dist/recorder/events.js.map +1 -0
- package/dist/recorder/events.test.d.ts +2 -0
- package/dist/recorder/events.test.d.ts.map +1 -0
- package/dist/recorder/events.test.js +40 -0
- package/dist/recorder/events.test.js.map +1 -0
- package/dist/recorder/generate-scenario.d.ts +16 -0
- package/dist/recorder/generate-scenario.d.ts.map +1 -0
- package/dist/recorder/generate-scenario.js +78 -0
- package/dist/recorder/generate-scenario.js.map +1 -0
- package/dist/recorder/in-page-helpers.d.ts +6 -0
- package/dist/recorder/in-page-helpers.d.ts.map +1 -0
- package/dist/recorder/in-page-helpers.js +238 -0
- package/dist/recorder/in-page-helpers.js.map +1 -0
- package/dist/recorder/in-page-helpers.test.d.ts +2 -0
- package/dist/recorder/in-page-helpers.test.d.ts.map +1 -0
- package/dist/recorder/in-page-helpers.test.js +186 -0
- package/dist/recorder/in-page-helpers.test.js.map +1 -0
- package/dist/recorder/page-script.d.ts +7 -0
- package/dist/recorder/page-script.d.ts.map +1 -0
- package/dist/recorder/page-script.js +132 -0
- package/dist/recorder/page-script.js.map +1 -0
- package/dist/recorder/redact.d.ts +8 -0
- package/dist/recorder/redact.d.ts.map +1 -0
- package/dist/recorder/redact.js +26 -0
- package/dist/recorder/redact.js.map +1 -0
- package/dist/recorder/redact.test.d.ts +2 -0
- package/dist/recorder/redact.test.d.ts.map +1 -0
- package/dist/recorder/redact.test.js +27 -0
- package/dist/recorder/redact.test.js.map +1 -0
- package/dist/recorder/session.d.ts +8 -0
- package/dist/recorder/session.d.ts.map +1 -0
- package/dist/recorder/session.js +28 -0
- package/dist/recorder/session.js.map +1 -0
- package/dist/recorder/snapshot-match.d.ts +22 -0
- package/dist/recorder/snapshot-match.d.ts.map +1 -0
- package/dist/recorder/snapshot-match.js +102 -0
- package/dist/recorder/snapshot-match.js.map +1 -0
- package/dist/recorder/snapshot-match.test.d.ts +2 -0
- package/dist/recorder/snapshot-match.test.d.ts.map +1 -0
- package/dist/recorder/snapshot-match.test.js +34 -0
- package/dist/recorder/snapshot-match.test.js.map +1 -0
- package/dist/redact/env-secrets.d.ts +14 -0
- package/dist/redact/env-secrets.d.ts.map +1 -0
- package/dist/redact/env-secrets.js +86 -0
- package/dist/redact/env-secrets.js.map +1 -0
- package/dist/redact/env-secrets.test.d.ts +2 -0
- package/dist/redact/env-secrets.test.d.ts.map +1 -0
- package/dist/redact/env-secrets.test.js +103 -0
- package/dist/redact/env-secrets.test.js.map +1 -0
- package/dist/reporter/export.d.ts +14 -0
- package/dist/reporter/export.d.ts.map +1 -0
- package/dist/reporter/export.js +53 -0
- package/dist/reporter/export.js.map +1 -0
- package/dist/reporter/export.test.d.ts +2 -0
- package/dist/reporter/export.test.d.ts.map +1 -0
- package/dist/reporter/export.test.js +100 -0
- package/dist/reporter/export.test.js.map +1 -0
- package/dist/reporter/index.d.ts +11 -0
- package/dist/reporter/index.d.ts.map +1 -0
- package/dist/reporter/index.js +161 -0
- package/dist/reporter/index.js.map +1 -0
- package/dist/reporter/index.test.d.ts +2 -0
- package/dist/reporter/index.test.d.ts.map +1 -0
- package/dist/reporter/index.test.js +61 -0
- package/dist/reporter/index.test.js.map +1 -0
- package/dist/scenarios/globs.d.ts +15 -0
- package/dist/scenarios/globs.d.ts.map +1 -0
- package/dist/scenarios/globs.js +48 -0
- package/dist/scenarios/globs.js.map +1 -0
- package/dist/scenarios/globs.test.d.ts +2 -0
- package/dist/scenarios/globs.test.d.ts.map +1 -0
- package/dist/scenarios/globs.test.js +53 -0
- package/dist/scenarios/globs.test.js.map +1 -0
- package/dist/scenarios/parser.d.ts +15 -0
- package/dist/scenarios/parser.d.ts.map +1 -0
- package/dist/scenarios/parser.js +278 -0
- package/dist/scenarios/parser.js.map +1 -0
- package/dist/scenarios/parser.test.d.ts +2 -0
- package/dist/scenarios/parser.test.d.ts.map +1 -0
- package/dist/scenarios/parser.test.js +373 -0
- package/dist/scenarios/parser.test.js.map +1 -0
- package/dist/skills/loader.d.ts +10 -0
- package/dist/skills/loader.d.ts.map +1 -0
- package/dist/skills/loader.js +98 -0
- package/dist/skills/loader.js.map +1 -0
- package/dist/types/config.d.ts +131 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +2 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/recorder.d.ts +71 -0
- package/dist/types/recorder.d.ts.map +1 -0
- package/dist/types/recorder.js +2 -0
- package/dist/types/recorder.js.map +1 -0
- package/dist/types/scenario.d.ts +41 -0
- package/dist/types/scenario.d.ts.map +1 -0
- package/dist/types/scenario.js +2 -0
- package/dist/types/scenario.js.map +1 -0
- package/dist/types/skill.d.ts +20 -0
- package/dist/types/skill.d.ts.map +1 -0
- package/dist/types/skill.js +13 -0
- package/dist/types/skill.js.map +1 -0
- package/dist/types/verdict.d.ts +82 -0
- package/dist/types/verdict.d.ts.map +1 -0
- package/dist/types/verdict.js +13 -0
- package/dist/types/verdict.js.map +1 -0
- package/package.json +75 -0
- package/pqa.config.ts +82 -0
- package/prompt/ANALYZE-FLAKY.md +62 -0
- package/prompt/ANALYZE.md +110 -0
- package/prompt/CACHE-HINTS.md +49 -0
- package/prompt/RECORD.md +114 -0
- package/prompt/SYSTEM.md +118 -0
- package/skills/agent-browser/SKILL.md +2438 -0
- package/skills/create-pqa-scenario/SKILL.md +273 -0
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import { describe, it } from "node:test";
|
|
3
|
+
import { buildVerdictRetryPrompt } from "./verdict-retry-prompt.js";
|
|
4
|
+
const baseScenario = {
|
|
5
|
+
filePath: "scenarios/test.md",
|
|
6
|
+
frontmatter: { name: "test" },
|
|
7
|
+
skills: [],
|
|
8
|
+
goal: "Test goal",
|
|
9
|
+
steps: "1. Do thing",
|
|
10
|
+
then: ['url contains "/home"', 'page shows "Welcome"'],
|
|
11
|
+
rawCheckpoints: [],
|
|
12
|
+
checkpoints: [],
|
|
13
|
+
};
|
|
14
|
+
describe("buildVerdictRetryPrompt", () => {
|
|
15
|
+
it("lists every Then checkpoint and requires JSON verdict", () => {
|
|
16
|
+
const prompt = buildVerdictRetryPrompt(baseScenario);
|
|
17
|
+
assert.match(prompt, /## Verdict required/);
|
|
18
|
+
assert.match(prompt, /2 total/);
|
|
19
|
+
assert.match(prompt, /\*\*url contains "\/home"\*\*/);
|
|
20
|
+
assert.match(prompt, /\*\*page shows "Welcome"\*\*/);
|
|
21
|
+
assert.match(prompt, /fenced ```json block/i);
|
|
22
|
+
assert.match(prompt, /Do \*\*not\*\* use bash or read tools/);
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
//# sourceMappingURL=verdict-retry-prompt.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verdict-retry-prompt.test.js","sourceRoot":"","sources":["../../src/agent/verdict-retry-prompt.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,MAAM,YAAY,GAAa;IAC7B,QAAQ,EAAE,mBAAmB;IAC7B,WAAW,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;IAC7B,MAAM,EAAE,EAAE;IACV,IAAI,EAAE,WAAW;IACjB,KAAK,EAAE,aAAa;IACpB,IAAI,EAAE,CAAC,sBAAsB,EAAE,sBAAsB,CAAC;IACtD,cAAc,EAAE,EAAE;IAClB,WAAW,EAAE,EAAE;CAChB,CAAC;AAEF,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,MAAM,GAAG,uBAAuB,CAAC,YAAY,CAAC,CAAC;QAErD,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;QAC5C,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAChC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,+BAA+B,CAAC,CAAC;QACtD,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,8BAA8B,CAAC,CAAC;QACrD,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC;QAC9C,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,uCAAuC,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { ModelMessage } from "ai";
|
|
2
|
+
import { type AgentTranscript, type BashEntry, type TranscriptBashEntry, type TranscriptMessageEntry, type Verdict } from "../types/verdict.js";
|
|
3
|
+
/** Drop the last assistant turn (and trailing tool results) so the model can redo that completion. */
|
|
4
|
+
export declare function stripLastAssistantTurn(messages: ModelMessage[]): ModelMessage[];
|
|
5
|
+
export declare function extractVerdict(text: string): Verdict | null;
|
|
6
|
+
export declare function getTranscriptMessages(transcript: AgentTranscript): TranscriptMessageEntry[];
|
|
7
|
+
export declare function getTranscriptBashEntries(transcript: AgentTranscript): TranscriptBashEntry[];
|
|
8
|
+
export interface TranscriptEntryTiming {
|
|
9
|
+
at?: Date;
|
|
10
|
+
durationMs?: number;
|
|
11
|
+
}
|
|
12
|
+
export declare function appendTranscriptMessage(transcript: AgentTranscript, role: string, content: string, thinking?: string, timing?: TranscriptEntryTiming): void;
|
|
13
|
+
export declare function appendTranscriptBash(transcript: AgentTranscript, entry: BashEntry, timing?: Pick<TranscriptEntryTiming, "at">): void;
|
|
14
|
+
/** Append final model text when it is not already the last assistant message. */
|
|
15
|
+
export declare function appendFinalTextToTranscript(transcript: AgentTranscript, finalText: string, timing?: TranscriptEntryTiming): void;
|
|
16
|
+
export interface StepTranscriptInput {
|
|
17
|
+
text: string;
|
|
18
|
+
reasoningText?: string;
|
|
19
|
+
toolCalls: Array<{
|
|
20
|
+
toolName: string;
|
|
21
|
+
input: unknown;
|
|
22
|
+
}>;
|
|
23
|
+
}
|
|
24
|
+
export interface StepTranscriptFormatted {
|
|
25
|
+
content: string | null;
|
|
26
|
+
thinking?: string;
|
|
27
|
+
}
|
|
28
|
+
/** Format one LLM step for the transcript (content, thinking, and tool calls). */
|
|
29
|
+
export declare function formatStepForTranscript(step: StepTranscriptInput): StepTranscriptFormatted;
|
|
30
|
+
export declare function appendStepToTranscript(transcript: AgentTranscript, step: StepTranscriptInput, bashEntries?: BashEntry[], formattedOverride?: StepTranscriptFormatted, timing?: TranscriptEntryTiming): boolean;
|
|
31
|
+
//# sourceMappingURL=verdict.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verdict.d.ts","sourceRoot":"","sources":["../../src/agent/verdict.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AACvC,OAAO,EAEL,KAAK,eAAe,EACpB,KAAK,SAAS,EACd,KAAK,mBAAmB,EACxB,KAAK,sBAAsB,EAC3B,KAAK,OAAO,EACb,MAAM,qBAAqB,CAAC;AAE7B,sGAAsG;AACtG,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,YAAY,EAAE,CAS/E;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CAmC3D;AAED,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,eAAe,GAC1B,sBAAsB,EAAE,CAI1B;AAED,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,eAAe,GAC1B,mBAAmB,EAAE,CAIvB;AAaD,MAAM,WAAW,qBAAqB;IACpC,EAAE,CAAC,EAAE,IAAI,CAAC;IACV,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,eAAe,EAC3B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,qBAAqB,GAC7B,IAAI,CAUN;AAED,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,eAAe,EAC3B,KAAK,EAAE,SAAS,EAChB,MAAM,CAAC,EAAE,IAAI,CAAC,qBAAqB,EAAE,IAAI,CAAC,GACzC,IAAI,CAMN;AAED,iFAAiF;AACjF,wBAAgB,2BAA2B,CACzC,UAAU,EAAE,eAAe,EAC3B,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,qBAAqB,GAC7B,IAAI,CAKN;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CACxD;AAED,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,kFAAkF;AAClF,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,mBAAmB,GACxB,uBAAuB,CAgBzB;AAED,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,eAAe,EAC3B,IAAI,EAAE,mBAAmB,EACzB,WAAW,GAAE,SAAS,EAAO,EAC7B,iBAAiB,CAAC,EAAE,uBAAuB,EAC3C,MAAM,CAAC,EAAE,qBAAqB,GAC7B,OAAO,CAmBT"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { VerdictSchema, } from "../types/verdict.js";
|
|
2
|
+
/** Drop the last assistant turn (and trailing tool results) so the model can redo that completion. */
|
|
3
|
+
export function stripLastAssistantTurn(messages) {
|
|
4
|
+
let end = messages.length;
|
|
5
|
+
while (end > 0 && messages[end - 1]?.role === "tool") {
|
|
6
|
+
end -= 1;
|
|
7
|
+
}
|
|
8
|
+
if (end > 0 && messages[end - 1]?.role === "assistant") {
|
|
9
|
+
return messages.slice(0, end - 1);
|
|
10
|
+
}
|
|
11
|
+
return messages;
|
|
12
|
+
}
|
|
13
|
+
export function extractVerdict(text) {
|
|
14
|
+
const jsonBlock = /```(?:json)?\s*([\s\S]*?)```/g;
|
|
15
|
+
let match;
|
|
16
|
+
const candidates = [];
|
|
17
|
+
while ((match = jsonBlock.exec(text)) !== null) {
|
|
18
|
+
candidates.push(match[1].trim());
|
|
19
|
+
}
|
|
20
|
+
// Also try parsing the whole text as JSON
|
|
21
|
+
candidates.push(text.trim());
|
|
22
|
+
for (const candidate of candidates.reverse()) {
|
|
23
|
+
try {
|
|
24
|
+
const parsed = JSON.parse(candidate);
|
|
25
|
+
const result = VerdictSchema.safeParse(parsed);
|
|
26
|
+
if (result.success)
|
|
27
|
+
return result.data;
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
// continue
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
// Try to find inline JSON object with status field
|
|
34
|
+
const inline = /\{[\s\S]*"status"\s*:\s*"(?:pass|fail)"[\s\S]*\}/.exec(text);
|
|
35
|
+
if (inline) {
|
|
36
|
+
try {
|
|
37
|
+
const parsed = JSON.parse(inline[0]);
|
|
38
|
+
const result = VerdictSchema.safeParse(parsed);
|
|
39
|
+
if (result.success)
|
|
40
|
+
return result.data;
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
// continue
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
export function getTranscriptMessages(transcript) {
|
|
49
|
+
return transcript.entries.filter((entry) => entry.type === "message");
|
|
50
|
+
}
|
|
51
|
+
export function getTranscriptBashEntries(transcript) {
|
|
52
|
+
return transcript.entries.filter((entry) => entry.type === "bash");
|
|
53
|
+
}
|
|
54
|
+
function getLastAssistantMessageEntry(transcript) {
|
|
55
|
+
for (let i = transcript.entries.length - 1; i >= 0; i -= 1) {
|
|
56
|
+
const entry = transcript.entries[i];
|
|
57
|
+
if (entry.type === "message" && entry.role === "assistant")
|
|
58
|
+
return entry;
|
|
59
|
+
if (entry.type === "message" && entry.role === "user")
|
|
60
|
+
break;
|
|
61
|
+
}
|
|
62
|
+
return undefined;
|
|
63
|
+
}
|
|
64
|
+
export function appendTranscriptMessage(transcript, role, content, thinking, timing) {
|
|
65
|
+
const entry = {
|
|
66
|
+
type: "message",
|
|
67
|
+
role,
|
|
68
|
+
thinking,
|
|
69
|
+
content,
|
|
70
|
+
at: (timing?.at ?? new Date()).toISOString(),
|
|
71
|
+
...(timing?.durationMs !== undefined ? { durationMs: timing.durationMs } : {}),
|
|
72
|
+
};
|
|
73
|
+
transcript.entries.push(entry);
|
|
74
|
+
}
|
|
75
|
+
export function appendTranscriptBash(transcript, entry, timing) {
|
|
76
|
+
transcript.entries.push({
|
|
77
|
+
type: "bash",
|
|
78
|
+
...entry,
|
|
79
|
+
at: (timing?.at ?? new Date()).toISOString(),
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
/** Append final model text when it is not already the last assistant message. */
|
|
83
|
+
export function appendFinalTextToTranscript(transcript, finalText, timing) {
|
|
84
|
+
if (!finalText)
|
|
85
|
+
return;
|
|
86
|
+
const last = getLastAssistantMessageEntry(transcript);
|
|
87
|
+
if (last?.content === finalText)
|
|
88
|
+
return;
|
|
89
|
+
appendTranscriptMessage(transcript, "assistant", finalText, undefined, timing);
|
|
90
|
+
}
|
|
91
|
+
/** Format one LLM step for the transcript (content, thinking, and tool calls). */
|
|
92
|
+
export function formatStepForTranscript(step) {
|
|
93
|
+
const contentParts = [];
|
|
94
|
+
if (step.text)
|
|
95
|
+
contentParts.push(step.text);
|
|
96
|
+
for (const call of step.toolCalls) {
|
|
97
|
+
const input = typeof call.input === "string"
|
|
98
|
+
? call.input
|
|
99
|
+
: JSON.stringify(call.input);
|
|
100
|
+
contentParts.push(`[tool ${call.toolName}] ${input}`);
|
|
101
|
+
}
|
|
102
|
+
const content = contentParts.length > 0 ? contentParts.join("\n\n") : null;
|
|
103
|
+
const result = { content };
|
|
104
|
+
const thinking = step.reasoningText?.trim();
|
|
105
|
+
if (thinking)
|
|
106
|
+
result.thinking = thinking;
|
|
107
|
+
return result;
|
|
108
|
+
}
|
|
109
|
+
export function appendStepToTranscript(transcript, step, bashEntries = [], formattedOverride, timing) {
|
|
110
|
+
let changed = false;
|
|
111
|
+
const formatted = formattedOverride ?? formatStepForTranscript(step);
|
|
112
|
+
const recordedAt = timing?.at ?? new Date();
|
|
113
|
+
if (formatted.content || formatted.thinking) {
|
|
114
|
+
appendTranscriptMessage(transcript, "assistant", formatted.content ?? "", formatted.thinking, { at: recordedAt, durationMs: timing?.durationMs });
|
|
115
|
+
changed = true;
|
|
116
|
+
}
|
|
117
|
+
for (const entry of bashEntries) {
|
|
118
|
+
appendTranscriptBash(transcript, entry, { at: recordedAt });
|
|
119
|
+
changed = true;
|
|
120
|
+
}
|
|
121
|
+
return changed;
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=verdict.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verdict.js","sourceRoot":"","sources":["../../src/agent/verdict.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verdict.test.d.ts","sourceRoot":"","sources":["../../src/agent/verdict.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import { describe, it } from "node:test";
|
|
3
|
+
import { appendFinalTextToTranscript, appendStepToTranscript, formatStepForTranscript, stripLastAssistantTurn, } from "./verdict.js";
|
|
4
|
+
describe("stripLastAssistantTurn", () => {
|
|
5
|
+
it("removes the last assistant message", () => {
|
|
6
|
+
const messages = [
|
|
7
|
+
{ role: "user", content: "go" },
|
|
8
|
+
{ role: "assistant", content: "no verdict yet" },
|
|
9
|
+
];
|
|
10
|
+
assert.deepEqual(stripLastAssistantTurn(messages), [
|
|
11
|
+
{ role: "user", content: "go" },
|
|
12
|
+
]);
|
|
13
|
+
});
|
|
14
|
+
it("removes trailing tool results with the assistant turn", () => {
|
|
15
|
+
const messages = [
|
|
16
|
+
{ role: "user", content: "go" },
|
|
17
|
+
{
|
|
18
|
+
role: "assistant",
|
|
19
|
+
content: [
|
|
20
|
+
{
|
|
21
|
+
type: "tool-call",
|
|
22
|
+
toolCallId: "1",
|
|
23
|
+
toolName: "bash",
|
|
24
|
+
input: { command: "true" },
|
|
25
|
+
},
|
|
26
|
+
],
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
role: "tool",
|
|
30
|
+
content: [
|
|
31
|
+
{
|
|
32
|
+
type: "tool-result",
|
|
33
|
+
toolCallId: "1",
|
|
34
|
+
toolName: "bash",
|
|
35
|
+
output: { type: "json", value: { exitCode: 0 } },
|
|
36
|
+
},
|
|
37
|
+
],
|
|
38
|
+
},
|
|
39
|
+
];
|
|
40
|
+
assert.deepEqual(stripLastAssistantTurn(messages), [
|
|
41
|
+
{ role: "user", content: "go" },
|
|
42
|
+
]);
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
describe("formatStepForTranscript", () => {
|
|
46
|
+
it("returns empty content when the step has no text, reasoning, or tool calls", () => {
|
|
47
|
+
assert.deepEqual(formatStepForTranscript({ text: "", toolCalls: [] }), {
|
|
48
|
+
content: null,
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
it("includes assistant text in content", () => {
|
|
52
|
+
assert.deepEqual(formatStepForTranscript({
|
|
53
|
+
text: "Opening the app.",
|
|
54
|
+
toolCalls: [],
|
|
55
|
+
}), { content: "Opening the app." });
|
|
56
|
+
});
|
|
57
|
+
it("includes tool calls in content when the step has no assistant text", () => {
|
|
58
|
+
assert.deepEqual(formatStepForTranscript({
|
|
59
|
+
text: "",
|
|
60
|
+
toolCalls: [{ toolName: "bash", input: { command: "agent-browser open /" } }],
|
|
61
|
+
}), {
|
|
62
|
+
content: '[tool bash] {"command":"agent-browser open /"}',
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
it("keeps text and tool calls in content and reasoning in thinking", () => {
|
|
66
|
+
assert.deepEqual(formatStepForTranscript({
|
|
67
|
+
text: "Checking the page.",
|
|
68
|
+
reasoningText: "Need a snapshot first.",
|
|
69
|
+
toolCalls: [{ toolName: "bash", input: { command: "agent-browser snapshot -i" } }],
|
|
70
|
+
}), {
|
|
71
|
+
content: [
|
|
72
|
+
"Checking the page.",
|
|
73
|
+
'[tool bash] {"command":"agent-browser snapshot -i"}',
|
|
74
|
+
].join("\n\n"),
|
|
75
|
+
thinking: "Need a snapshot first.",
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
describe("appendFinalTextToTranscript", () => {
|
|
80
|
+
it("skips append only when the last assistant message exactly matches finalText", () => {
|
|
81
|
+
const transcript = {
|
|
82
|
+
entries: [
|
|
83
|
+
{ type: "message", role: "assistant", content: "The test passed successfully", at: "2026-01-01T00:00:00.000Z" },
|
|
84
|
+
],
|
|
85
|
+
};
|
|
86
|
+
appendFinalTextToTranscript(transcript, "passed");
|
|
87
|
+
assert.equal(transcript.entries.length, 2);
|
|
88
|
+
assert.equal(transcript.entries[1].type === "message" ? transcript.entries[1].content : "", "passed");
|
|
89
|
+
});
|
|
90
|
+
it("does not append duplicate when finalText equals the last assistant message", () => {
|
|
91
|
+
const transcript = {
|
|
92
|
+
entries: [{ type: "message", role: "assistant", content: "Done.", at: "2026-01-01T00:00:00.000Z" }],
|
|
93
|
+
};
|
|
94
|
+
appendFinalTextToTranscript(transcript, "Done.");
|
|
95
|
+
assert.equal(transcript.entries.length, 1);
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
describe("appendStepToTranscript", () => {
|
|
99
|
+
it("appends one assistant message per step", () => {
|
|
100
|
+
const transcript = { entries: [] };
|
|
101
|
+
assert.equal(appendStepToTranscript(transcript, {
|
|
102
|
+
text: "",
|
|
103
|
+
toolCalls: [{ toolName: "bash", input: { command: "agent-browser open /" } }],
|
|
104
|
+
}), true);
|
|
105
|
+
assert.equal(appendStepToTranscript(transcript, {
|
|
106
|
+
text: "Done.",
|
|
107
|
+
toolCalls: [],
|
|
108
|
+
}), true);
|
|
109
|
+
assert.equal(transcript.entries.length, 2);
|
|
110
|
+
const first = transcript.entries[0];
|
|
111
|
+
const second = transcript.entries[1];
|
|
112
|
+
assert.equal(first.type, "message");
|
|
113
|
+
assert.equal(first.role, "assistant");
|
|
114
|
+
assert.match(first.content, /agent-browser open/);
|
|
115
|
+
assert.ok(first.at);
|
|
116
|
+
assert.equal(second.type, "message");
|
|
117
|
+
assert.equal(second.content, "Done.");
|
|
118
|
+
assert.ok(second.at);
|
|
119
|
+
});
|
|
120
|
+
it("records timestamps and LLM step duration on assistant messages", () => {
|
|
121
|
+
const transcript = { entries: [] };
|
|
122
|
+
const at = new Date("2026-01-01T00:00:05.000Z");
|
|
123
|
+
appendStepToTranscript(transcript, { text: "Checking.", toolCalls: [] }, [], undefined, { at, durationMs: 4200 });
|
|
124
|
+
assert.equal(transcript.entries.length, 1);
|
|
125
|
+
const message = transcript.entries[0];
|
|
126
|
+
assert.equal(message.type, "message");
|
|
127
|
+
assert.equal(message.at, "2026-01-01T00:00:05.000Z");
|
|
128
|
+
assert.equal(message.durationMs, 4200);
|
|
129
|
+
});
|
|
130
|
+
it("writes the assistant message before bash results for a step", () => {
|
|
131
|
+
const transcript = { entries: [] };
|
|
132
|
+
appendStepToTranscript(transcript, {
|
|
133
|
+
text: "Opening the app.",
|
|
134
|
+
reasoningText: "Need to load the page first.",
|
|
135
|
+
toolCalls: [{ toolName: "bash", input: { command: "agent-browser open /" } }],
|
|
136
|
+
}, [
|
|
137
|
+
{
|
|
138
|
+
command: "agent-browser open /",
|
|
139
|
+
stdout: "ok",
|
|
140
|
+
stderr: "",
|
|
141
|
+
exitCode: 0,
|
|
142
|
+
durationMs: 10,
|
|
143
|
+
},
|
|
144
|
+
]);
|
|
145
|
+
assert.equal(transcript.entries.length, 2);
|
|
146
|
+
const message = transcript.entries[0];
|
|
147
|
+
const bash = transcript.entries[1];
|
|
148
|
+
assert.equal(message.type, "message");
|
|
149
|
+
assert.equal(bash.type, "bash");
|
|
150
|
+
assert.match(message.content, /Opening the app/);
|
|
151
|
+
assert.equal(message.thinking, "Need to load the page first.");
|
|
152
|
+
assert.equal(message.at, bash.at);
|
|
153
|
+
assert.equal(bash.command, "agent-browser open /");
|
|
154
|
+
});
|
|
155
|
+
});
|
|
156
|
+
//# sourceMappingURL=verdict.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verdict.test.js","sourceRoot":"","sources":["../../src/agent/verdict.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { AnalyzeFinding } from "./index.js";
|
|
2
|
+
import type { FlakyScenarioFinding, RunOccurrence } from "./compare-runs.js";
|
|
3
|
+
import type { ScenarioResult, TranscriptEntry } from "../types/verdict.js";
|
|
4
|
+
export interface ScenarioIntentContext {
|
|
5
|
+
name: string;
|
|
6
|
+
url?: string;
|
|
7
|
+
auth?: string;
|
|
8
|
+
tags?: string[];
|
|
9
|
+
goal: string;
|
|
10
|
+
steps: string;
|
|
11
|
+
then: string[];
|
|
12
|
+
}
|
|
13
|
+
export interface TruncatedScenarioResult {
|
|
14
|
+
scenario: string;
|
|
15
|
+
filePath: string;
|
|
16
|
+
status: string;
|
|
17
|
+
error?: string;
|
|
18
|
+
durationMs?: number;
|
|
19
|
+
verdict: ScenarioResult["verdict"];
|
|
20
|
+
transcript: {
|
|
21
|
+
entries: TranscriptEntry[];
|
|
22
|
+
};
|
|
23
|
+
healing?: ScenarioResult["healing"];
|
|
24
|
+
}
|
|
25
|
+
export interface LlmAnalyzeContext {
|
|
26
|
+
heuristicFinding: AnalyzeFinding;
|
|
27
|
+
scenarioIntent: ScenarioIntentContext | null;
|
|
28
|
+
scenarioResult: TruncatedScenarioResult;
|
|
29
|
+
scenarioMarkdown: string;
|
|
30
|
+
}
|
|
31
|
+
export interface FlakyLlmAnalyzeContext extends LlmAnalyzeContext {
|
|
32
|
+
runComparison: {
|
|
33
|
+
runIds: string[];
|
|
34
|
+
stats: {
|
|
35
|
+
pass: number;
|
|
36
|
+
fail: number;
|
|
37
|
+
error: number;
|
|
38
|
+
};
|
|
39
|
+
inconsistentCheckpoints: FlakyScenarioFinding["inconsistentCheckpoints"];
|
|
40
|
+
filePathWarnings: string[];
|
|
41
|
+
representativeRuns: {
|
|
42
|
+
pass?: TruncatedScenarioResult;
|
|
43
|
+
fail?: TruncatedScenarioResult;
|
|
44
|
+
};
|
|
45
|
+
otherRuns: Array<{
|
|
46
|
+
runId: string;
|
|
47
|
+
status: RunOccurrence["status"];
|
|
48
|
+
verdictSummary?: string;
|
|
49
|
+
failedCheckpoints: string[];
|
|
50
|
+
}>;
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
export declare function buildScenarioIntent(filePath: string): ScenarioIntentContext | null;
|
|
54
|
+
export declare function truncateScenarioResult(result: ScenarioResult): TruncatedScenarioResult;
|
|
55
|
+
export declare function buildLlmAnalyzeContext(finding: AnalyzeFinding, result: ScenarioResult, cwd: string): LlmAnalyzeContext;
|
|
56
|
+
export declare function buildFlakyAnalyzeContext(finding: FlakyScenarioFinding, runDirs: string[], cwd: string): FlakyLlmAnalyzeContext;
|
|
57
|
+
export declare function flakyFindingToAnalyzeFinding(finding: FlakyScenarioFinding): AnalyzeFinding;
|
|
58
|
+
//# sourceMappingURL=build-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-context.d.ts","sourceRoot":"","sources":["../../src/analyze/build-context.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,KAAK,EACV,oBAAoB,EACpB,aAAa,EACd,MAAM,mBAAmB,CAAC;AAG3B,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAW3E,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,cAAc,CAAC,SAAS,CAAC,CAAC;IACnC,UAAU,EAAE;QACV,OAAO,EAAE,eAAe,EAAE,CAAC;KAC5B,CAAC;IACF,OAAO,CAAC,EAAE,cAAc,CAAC,SAAS,CAAC,CAAC;CACrC;AAED,MAAM,WAAW,iBAAiB;IAChC,gBAAgB,EAAE,cAAc,CAAC;IACjC,cAAc,EAAE,qBAAqB,GAAG,IAAI,CAAC;IAC7C,cAAc,EAAE,uBAAuB,CAAC;IACxC,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,sBAAuB,SAAQ,iBAAiB;IAC/D,aAAa,EAAE;QACb,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,KAAK,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC;QACrD,uBAAuB,EAAE,oBAAoB,CAAC,yBAAyB,CAAC,CAAC;QACzE,gBAAgB,EAAE,MAAM,EAAE,CAAC;QAC3B,kBAAkB,EAAE;YAClB,IAAI,CAAC,EAAE,uBAAuB,CAAC;YAC/B,IAAI,CAAC,EAAE,uBAAuB,CAAC;SAChC,CAAC;QACF,SAAS,EAAE,KAAK,CAAC;YACf,KAAK,EAAE,MAAM,CAAC;YACd,MAAM,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;YAChC,cAAc,CAAC,EAAE,MAAM,CAAC;YACxB,iBAAiB,EAAE,MAAM,EAAE,CAAC;SAC7B,CAAC,CAAC;KACJ,CAAC;CACH;AAED,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,GACf,qBAAqB,GAAG,IAAI,CAe9B;AAED,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,cAAc,GACrB,uBAAuB,CAqCzB;AAED,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,cAAc,EACtB,GAAG,EAAE,MAAM,GACV,iBAAiB,CAcnB;AAiBD,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,oBAAoB,EAC7B,OAAO,EAAE,MAAM,EAAE,EACjB,GAAG,EAAE,MAAM,GACV,sBAAsB,CA0DxB;AAED,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,oBAAoB,GAC5B,cAAc,CAEhB"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { parseScenarioFile } from "../scenarios/parser.js";
|
|
4
|
+
import { selectRepresentativeRuns } from "./compare-runs.js";
|
|
5
|
+
import { loadRunReport } from "./index.js";
|
|
6
|
+
const MAX_TRANSCRIPT_ENTRIES = 28;
|
|
7
|
+
const MAX_STDOUT_CHARS = 1500;
|
|
8
|
+
const MAX_MESSAGE_CHARS = 2000;
|
|
9
|
+
function truncate(text, max) {
|
|
10
|
+
if (text.length <= max)
|
|
11
|
+
return text;
|
|
12
|
+
return `${text.slice(0, max)}…`;
|
|
13
|
+
}
|
|
14
|
+
export function buildScenarioIntent(filePath) {
|
|
15
|
+
try {
|
|
16
|
+
const scenario = parseScenarioFile(filePath);
|
|
17
|
+
return {
|
|
18
|
+
name: scenario.frontmatter.name,
|
|
19
|
+
url: scenario.frontmatter.url,
|
|
20
|
+
auth: scenario.frontmatter.auth,
|
|
21
|
+
tags: scenario.frontmatter.tags,
|
|
22
|
+
goal: scenario.goal,
|
|
23
|
+
steps: scenario.steps,
|
|
24
|
+
then: scenario.then,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export function truncateScenarioResult(result) {
|
|
32
|
+
const entries = result.transcript.entries
|
|
33
|
+
.slice(-MAX_TRANSCRIPT_ENTRIES)
|
|
34
|
+
.map((entry) => {
|
|
35
|
+
if (entry.type === "message") {
|
|
36
|
+
return {
|
|
37
|
+
type: "message",
|
|
38
|
+
role: entry.role,
|
|
39
|
+
content: truncate(entry.content, MAX_MESSAGE_CHARS),
|
|
40
|
+
at: entry.at,
|
|
41
|
+
...(entry.thinking
|
|
42
|
+
? { thinking: truncate(entry.thinking, MAX_MESSAGE_CHARS) }
|
|
43
|
+
: {}),
|
|
44
|
+
...(entry.durationMs !== undefined ? { durationMs: entry.durationMs } : {}),
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
return {
|
|
48
|
+
type: "bash",
|
|
49
|
+
command: entry.command,
|
|
50
|
+
exitCode: entry.exitCode,
|
|
51
|
+
stdout: truncate(entry.stdout, MAX_STDOUT_CHARS),
|
|
52
|
+
stderr: truncate(entry.stderr, 500),
|
|
53
|
+
durationMs: entry.durationMs,
|
|
54
|
+
at: entry.at,
|
|
55
|
+
};
|
|
56
|
+
});
|
|
57
|
+
return {
|
|
58
|
+
scenario: result.scenario,
|
|
59
|
+
filePath: result.filePath,
|
|
60
|
+
status: result.status,
|
|
61
|
+
error: result.error,
|
|
62
|
+
durationMs: result.durationMs,
|
|
63
|
+
verdict: result.verdict,
|
|
64
|
+
transcript: { entries },
|
|
65
|
+
healing: result.healing,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
export function buildLlmAnalyzeContext(finding, result, cwd) {
|
|
69
|
+
const scenarioPath = path.isAbsolute(result.filePath)
|
|
70
|
+
? result.filePath
|
|
71
|
+
: path.resolve(cwd, result.filePath);
|
|
72
|
+
const scenarioMarkdown = readFileSync(scenarioPath, "utf-8");
|
|
73
|
+
const scenarioIntent = buildScenarioIntent(scenarioPath);
|
|
74
|
+
return {
|
|
75
|
+
heuristicFinding: finding,
|
|
76
|
+
scenarioIntent,
|
|
77
|
+
scenarioResult: truncateScenarioResult(result),
|
|
78
|
+
scenarioMarkdown,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
function syntheticFindingFromFlaky(finding) {
|
|
82
|
+
const assessment = finding.heuristicAssessment;
|
|
83
|
+
return {
|
|
84
|
+
scenario: finding.scenario,
|
|
85
|
+
filePath: finding.filePath,
|
|
86
|
+
status: finding.failCount > 0 ? "fail" : "error",
|
|
87
|
+
failureKind: assessment.dominantKind,
|
|
88
|
+
confidence: assessment.likelyFalseNegative ? "high" : "medium",
|
|
89
|
+
suggestions: assessment.suggestions,
|
|
90
|
+
signals: finding.runs.flatMap((r) => r.signals ?? []).slice(0, 6),
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
export function buildFlakyAnalyzeContext(finding, runDirs, cwd) {
|
|
94
|
+
const reports = runDirs.map((runDir) => ({
|
|
95
|
+
runDir,
|
|
96
|
+
report: loadRunReport(runDir),
|
|
97
|
+
}));
|
|
98
|
+
const entries = reports.flatMap(({ report }) => report.results
|
|
99
|
+
.filter((r) => (r.scenario || r.filePath) === finding.scenario)
|
|
100
|
+
.map((result) => ({ runId: report.runId, result })));
|
|
101
|
+
const { pass: passEntry, fail: failEntry } = selectRepresentativeRuns(entries);
|
|
102
|
+
const representativeRunIds = new Set([passEntry?.runId, failEntry?.runId].filter(Boolean));
|
|
103
|
+
const otherRuns = entries
|
|
104
|
+
.filter(({ runId }) => !representativeRunIds.has(runId))
|
|
105
|
+
.map(({ runId, result }) => ({
|
|
106
|
+
runId,
|
|
107
|
+
status: result.status,
|
|
108
|
+
verdictSummary: result.verdict?.summary,
|
|
109
|
+
failedCheckpoints: result.verdict?.checkpoints
|
|
110
|
+
.filter((c) => !c.pass)
|
|
111
|
+
.map((c) => c.assertion) ?? [],
|
|
112
|
+
}));
|
|
113
|
+
const baseResult = failEntry?.result ?? passEntry?.result ?? entries[0].result;
|
|
114
|
+
const base = buildLlmAnalyzeContext(syntheticFindingFromFlaky(finding), baseResult, cwd);
|
|
115
|
+
return {
|
|
116
|
+
...base,
|
|
117
|
+
runComparison: {
|
|
118
|
+
runIds: finding.runs.map((r) => r.runId),
|
|
119
|
+
stats: {
|
|
120
|
+
pass: finding.passCount,
|
|
121
|
+
fail: finding.failCount,
|
|
122
|
+
error: finding.errorCount,
|
|
123
|
+
},
|
|
124
|
+
inconsistentCheckpoints: finding.inconsistentCheckpoints,
|
|
125
|
+
filePathWarnings: finding.filePathWarnings,
|
|
126
|
+
representativeRuns: {
|
|
127
|
+
...(passEntry
|
|
128
|
+
? { pass: truncateScenarioResult(passEntry.result) }
|
|
129
|
+
: {}),
|
|
130
|
+
...(failEntry
|
|
131
|
+
? { fail: truncateScenarioResult(failEntry.result) }
|
|
132
|
+
: {}),
|
|
133
|
+
},
|
|
134
|
+
otherRuns,
|
|
135
|
+
},
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
export function flakyFindingToAnalyzeFinding(finding) {
|
|
139
|
+
return syntheticFindingFromFlaky(finding);
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=build-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-context.js","sourceRoot":"","sources":["../../src/analyze/build-context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-context.test.d.ts","sourceRoot":"","sources":["../../src/analyze/build-context.test.ts"],"names":[],"mappings":""}
|