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,186 @@
|
|
|
1
|
+
import { exec } from "node:child_process";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { promisify } from "node:util";
|
|
4
|
+
import { lightpandaBrowserEnv } from "../config/lightpanda.js";
|
|
5
|
+
import { resolveAgentBrowserBinDirs } from "../paths.js";
|
|
6
|
+
const execAsync = promisify(exec);
|
|
7
|
+
/** Prepend local agent-browser CLI dirs so bash works without a global install. */
|
|
8
|
+
export function withAgentBrowserPath(cwd, env) {
|
|
9
|
+
const binDirs = resolveAgentBrowserBinDirs(cwd);
|
|
10
|
+
if (binDirs.length === 0)
|
|
11
|
+
return env;
|
|
12
|
+
const existing = env.PATH ?? env.Path ?? process.env.PATH ?? "";
|
|
13
|
+
const nextPath = existing
|
|
14
|
+
? `${binDirs.join(path.delimiter)}${path.delimiter}${existing}`
|
|
15
|
+
: binDirs.join(path.delimiter);
|
|
16
|
+
return { ...env, PATH: nextPath, Path: nextPath };
|
|
17
|
+
}
|
|
18
|
+
export async function runBash(command, options) {
|
|
19
|
+
const start = Date.now();
|
|
20
|
+
try {
|
|
21
|
+
const { stdout, stderr } = await execAsync(command, {
|
|
22
|
+
cwd: options.cwd,
|
|
23
|
+
timeout: options.timeoutMs,
|
|
24
|
+
env: withAgentBrowserPath(options.cwd, {
|
|
25
|
+
...process.env,
|
|
26
|
+
...options.env,
|
|
27
|
+
}),
|
|
28
|
+
maxBuffer: 10 * 1024 * 1024,
|
|
29
|
+
shell: "/bin/bash",
|
|
30
|
+
});
|
|
31
|
+
return {
|
|
32
|
+
command,
|
|
33
|
+
stdout: stdout ?? "",
|
|
34
|
+
stderr: stderr ?? "",
|
|
35
|
+
exitCode: 0,
|
|
36
|
+
durationMs: Date.now() - start,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
const e = err;
|
|
41
|
+
return {
|
|
42
|
+
command,
|
|
43
|
+
stdout: e.stdout ?? "",
|
|
44
|
+
stderr: e.stderr ?? (e.killed ? "Command timed out" : String(err)),
|
|
45
|
+
exitCode: typeof e.code === "number" ? e.code : 1,
|
|
46
|
+
durationMs: Date.now() - start,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
export async function closeBrowserSession(options) {
|
|
51
|
+
const env = buildBrowserEnv({
|
|
52
|
+
cwd: options.cwd,
|
|
53
|
+
headed: options.headed,
|
|
54
|
+
sessionName: options.sessionName,
|
|
55
|
+
engine: options.engine,
|
|
56
|
+
lightpanda: options.lightpanda,
|
|
57
|
+
artifactDir: options.cwd,
|
|
58
|
+
});
|
|
59
|
+
const entry = await runBash("agent-browser close 2>/dev/null || true", {
|
|
60
|
+
cwd: options.cwd,
|
|
61
|
+
timeoutMs: options.timeoutMs,
|
|
62
|
+
env,
|
|
63
|
+
});
|
|
64
|
+
if (options.verbose && (entry.stderr || entry.stdout)) {
|
|
65
|
+
console.error(entry.stderr || entry.stdout);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
export async function closeAllBrowserSessions(options) {
|
|
69
|
+
const env = buildBrowserEnv({
|
|
70
|
+
cwd: options.cwd,
|
|
71
|
+
headed: options.headed,
|
|
72
|
+
sessionName: "pqa",
|
|
73
|
+
engine: options.engine,
|
|
74
|
+
lightpanda: options.lightpanda,
|
|
75
|
+
artifactDir: options.cwd,
|
|
76
|
+
});
|
|
77
|
+
const entry = await runBash("agent-browser close --all 2>/dev/null || true", {
|
|
78
|
+
cwd: options.cwd,
|
|
79
|
+
timeoutMs: options.timeoutMs,
|
|
80
|
+
env,
|
|
81
|
+
});
|
|
82
|
+
if (options.verbose && (entry.stderr || entry.stdout)) {
|
|
83
|
+
console.error(entry.stderr || entry.stdout);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
function stateWasIgnored(entry) {
|
|
87
|
+
const msg = `${entry.stderr}\n${entry.stdout}`;
|
|
88
|
+
return (msg.includes("--state ignored") || msg.includes("daemon already running"));
|
|
89
|
+
}
|
|
90
|
+
function isAuthRedirectUrl(url) {
|
|
91
|
+
return (url.includes("accounts.google.com") || url.includes("iap.googleapis.com"));
|
|
92
|
+
}
|
|
93
|
+
export async function prepareBrowserSession(options) {
|
|
94
|
+
const env = buildBrowserEnv({
|
|
95
|
+
cwd: options.cwd,
|
|
96
|
+
headed: options.headed,
|
|
97
|
+
sessionName: options.sessionName,
|
|
98
|
+
engine: options.engine,
|
|
99
|
+
lightpanda: options.lightpanda,
|
|
100
|
+
profilePath: options.profilePath,
|
|
101
|
+
authStatePath: options.profilePath ? undefined : options.authStatePath,
|
|
102
|
+
artifactDir: options.cwd,
|
|
103
|
+
});
|
|
104
|
+
const startUrl = options.startUrl ?? "about:blank";
|
|
105
|
+
await runBash("agent-browser close 2>/dev/null || true", {
|
|
106
|
+
cwd: options.cwd,
|
|
107
|
+
timeoutMs: options.timeoutMs,
|
|
108
|
+
env,
|
|
109
|
+
});
|
|
110
|
+
let entry = await runBash(`agent-browser open "${startUrl}"`, {
|
|
111
|
+
cwd: options.cwd,
|
|
112
|
+
timeoutMs: options.timeoutMs,
|
|
113
|
+
env,
|
|
114
|
+
});
|
|
115
|
+
if (stateWasIgnored(entry)) {
|
|
116
|
+
await runBash("agent-browser close --all 2>/dev/null || true", {
|
|
117
|
+
cwd: options.cwd,
|
|
118
|
+
timeoutMs: options.timeoutMs,
|
|
119
|
+
env,
|
|
120
|
+
});
|
|
121
|
+
entry = await runBash(`agent-browser open "${startUrl}"`, {
|
|
122
|
+
cwd: options.cwd,
|
|
123
|
+
timeoutMs: options.timeoutMs,
|
|
124
|
+
env,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
if (entry.exitCode !== 0 || stateWasIgnored(entry)) {
|
|
128
|
+
const label = options.profilePath ? "auth profile" : "browser session";
|
|
129
|
+
throw new Error(`Failed to start ${label}: ${entry.stderr || entry.stdout}`);
|
|
130
|
+
}
|
|
131
|
+
if (startUrl !== "about:blank") {
|
|
132
|
+
await runBash("agent-browser wait --load networkidle 2>/dev/null || true", {
|
|
133
|
+
cwd: options.cwd,
|
|
134
|
+
timeoutMs: options.timeoutMs,
|
|
135
|
+
env,
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
const urlEntry = await runBash("agent-browser get url", {
|
|
139
|
+
cwd: options.cwd,
|
|
140
|
+
timeoutMs: options.timeoutMs,
|
|
141
|
+
env,
|
|
142
|
+
});
|
|
143
|
+
const currentUrl = urlEntry.stdout.trim();
|
|
144
|
+
if (startUrl !== "about:blank") {
|
|
145
|
+
if (!currentUrl || currentUrl === "about:blank") {
|
|
146
|
+
const hint = options.profilePath
|
|
147
|
+
? " Re-run with --auth-refresh."
|
|
148
|
+
: "";
|
|
149
|
+
throw new Error(`Browser is empty after opening ${startUrl} (url=${currentUrl || "(empty)"}).${hint}`);
|
|
150
|
+
}
|
|
151
|
+
if (options.profilePath && isAuthRedirectUrl(currentUrl)) {
|
|
152
|
+
throw new Error(`Auth profile is not signed in — browser redirected to ${currentUrl}. Re-run with --auth-refresh.`);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
if (options.verbose) {
|
|
156
|
+
console.log(`Browser ready on ${currentUrl || startUrl} (session ${options.sessionName})`);
|
|
157
|
+
}
|
|
158
|
+
return { startUrl: currentUrl || startUrl };
|
|
159
|
+
}
|
|
160
|
+
export function buildBrowserEnv(config) {
|
|
161
|
+
const engine = config.engine ?? "chrome";
|
|
162
|
+
const env = {
|
|
163
|
+
PQA_ARTIFACT_DIR: config.artifactDir,
|
|
164
|
+
AGENT_BROWSER_SESSION_NAME: config.sessionName,
|
|
165
|
+
AGENT_BROWSER_SESSION: config.sessionName,
|
|
166
|
+
AGENT_BROWSER_ENGINE: engine,
|
|
167
|
+
...lightpandaBrowserEnv(config.cwd ?? config.artifactDir, engine, config.lightpanda),
|
|
168
|
+
};
|
|
169
|
+
if (config.profilePath) {
|
|
170
|
+
env.AGENT_BROWSER_PROFILE = config.profilePath;
|
|
171
|
+
}
|
|
172
|
+
else if (config.authStatePath) {
|
|
173
|
+
env.AGENT_BROWSER_STATE = config.authStatePath;
|
|
174
|
+
}
|
|
175
|
+
if (config.authSavePath) {
|
|
176
|
+
env.PQA_AUTH_SAVE_PATH = config.authSavePath;
|
|
177
|
+
}
|
|
178
|
+
if (!config.headed) {
|
|
179
|
+
env.AGENT_BROWSER_HEADED = "false";
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
env.AGENT_BROWSER_HEADED = "true";
|
|
183
|
+
}
|
|
184
|
+
return env;
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=bash.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bash.js","sourceRoot":"","sources":["../../src/agent/bash.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bash.test.d.ts","sourceRoot":"","sources":["../../src/agent/bash.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { describe, it } from "node:test";
|
|
4
|
+
import { getPackageRoot } from "../paths.js";
|
|
5
|
+
import { buildBrowserEnv, withAgentBrowserPath } from "./bash.js";
|
|
6
|
+
describe("withAgentBrowserPath", () => {
|
|
7
|
+
it("prepends prose-qa node_modules/.bin when cwd has no local install", () => {
|
|
8
|
+
const pkgBin = path.join(getPackageRoot(), "node_modules/.bin");
|
|
9
|
+
const env = withAgentBrowserPath("/tmp/pqa-no-local-agent-browser", {
|
|
10
|
+
PATH: "/usr/bin",
|
|
11
|
+
});
|
|
12
|
+
assert.ok(env.PATH?.startsWith(`${pkgBin}:`));
|
|
13
|
+
assert.equal(env.PATH, env.Path);
|
|
14
|
+
});
|
|
15
|
+
});
|
|
16
|
+
describe("buildBrowserEnv", () => {
|
|
17
|
+
it("sets AGENT_BROWSER_ENGINE from config", () => {
|
|
18
|
+
const chrome = buildBrowserEnv({
|
|
19
|
+
headed: false,
|
|
20
|
+
sessionName: "pqa",
|
|
21
|
+
engine: "chrome",
|
|
22
|
+
artifactDir: "/tmp/artifacts",
|
|
23
|
+
});
|
|
24
|
+
assert.equal(chrome.AGENT_BROWSER_ENGINE, "chrome");
|
|
25
|
+
const lightpanda = buildBrowserEnv({
|
|
26
|
+
headed: false,
|
|
27
|
+
sessionName: "pqa",
|
|
28
|
+
engine: "lightpanda",
|
|
29
|
+
artifactDir: "/tmp/artifacts",
|
|
30
|
+
});
|
|
31
|
+
assert.equal(lightpanda.AGENT_BROWSER_ENGINE, "lightpanda");
|
|
32
|
+
});
|
|
33
|
+
it("defaults AGENT_BROWSER_ENGINE to chrome", () => {
|
|
34
|
+
const env = buildBrowserEnv({
|
|
35
|
+
headed: false,
|
|
36
|
+
sessionName: "pqa",
|
|
37
|
+
artifactDir: "/tmp/artifacts",
|
|
38
|
+
});
|
|
39
|
+
assert.equal(env.AGENT_BROWSER_ENGINE, "chrome");
|
|
40
|
+
});
|
|
41
|
+
it("applies lightpanda config when engine is lightpanda", () => {
|
|
42
|
+
const cwd = "/project";
|
|
43
|
+
const env = buildBrowserEnv({
|
|
44
|
+
cwd,
|
|
45
|
+
headed: false,
|
|
46
|
+
sessionName: "pqa",
|
|
47
|
+
engine: "lightpanda",
|
|
48
|
+
lightpanda: {
|
|
49
|
+
executablePath: "/opt/lightpanda",
|
|
50
|
+
telemetry: false,
|
|
51
|
+
},
|
|
52
|
+
artifactDir: "/tmp/artifacts",
|
|
53
|
+
});
|
|
54
|
+
assert.equal(env.AGENT_BROWSER_ENGINE, "lightpanda");
|
|
55
|
+
assert.equal(env.AGENT_BROWSER_EXECUTABLE_PATH, "/opt/lightpanda");
|
|
56
|
+
assert.equal(env.LIGHTPANDA_DISABLE_TELEMETRY, "true");
|
|
57
|
+
});
|
|
58
|
+
it("does not set lightpanda env for chrome engine", () => {
|
|
59
|
+
const env = buildBrowserEnv({
|
|
60
|
+
cwd: "/project",
|
|
61
|
+
headed: false,
|
|
62
|
+
sessionName: "pqa",
|
|
63
|
+
engine: "chrome",
|
|
64
|
+
lightpanda: { telemetry: false },
|
|
65
|
+
artifactDir: "/tmp/artifacts",
|
|
66
|
+
});
|
|
67
|
+
assert.equal(env.LIGHTPANDA_DISABLE_TELEMETRY, undefined);
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
//# sourceMappingURL=bash.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bash.test.js","sourceRoot":"","sources":["../../src/agent/bash.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { LanguageModel } from "ai";
|
|
2
|
+
import type { PqaConfig } from "../types/config.js";
|
|
3
|
+
/** Resolve the Vercel AI SDK language model for the configured LLM provider. */
|
|
4
|
+
export declare function createLlmModel(config: PqaConfig): LanguageModel;
|
|
5
|
+
//# sourceMappingURL=llm-model.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm-model.d.ts","sourceRoot":"","sources":["../../src/agent/llm-model.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACxC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD,gFAAgF;AAChF,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,GAAG,aAAa,CAoB/D"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { anthropic } from "@ai-sdk/anthropic";
|
|
2
|
+
import { fireworks } from "@ai-sdk/fireworks";
|
|
3
|
+
import { google } from "@ai-sdk/google";
|
|
4
|
+
import { openai } from "@ai-sdk/openai";
|
|
5
|
+
import { openrouter } from "@openrouter/ai-sdk-provider";
|
|
6
|
+
import { ollama } from "ollama-ai-provider-v2";
|
|
7
|
+
/** Resolve the Vercel AI SDK language model for the configured LLM provider. */
|
|
8
|
+
export function createLlmModel(config) {
|
|
9
|
+
const { provider, model } = config.llm;
|
|
10
|
+
switch (provider) {
|
|
11
|
+
case "anthropic":
|
|
12
|
+
return anthropic(model);
|
|
13
|
+
case "openai":
|
|
14
|
+
return openai(model);
|
|
15
|
+
case "fireworks":
|
|
16
|
+
return fireworks(model);
|
|
17
|
+
case "ollama":
|
|
18
|
+
return ollama(model);
|
|
19
|
+
case "google":
|
|
20
|
+
return google(model);
|
|
21
|
+
case "openrouter":
|
|
22
|
+
return openrouter(model);
|
|
23
|
+
default: {
|
|
24
|
+
const unsupported = provider;
|
|
25
|
+
throw new Error(`Unsupported llm.provider: ${unsupported}`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=llm-model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm-model.js","sourceRoot":"","sources":["../../src/agent/llm-model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAI/C,gFAAgF;AAChF,MAAM,UAAU,cAAc,CAAC,MAAiB;IAC9C,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC;IACvC,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,WAAW;YACd,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC;QAC1B,KAAK,QAAQ;YACX,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;QACvB,KAAK,WAAW;YACd,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC;QAC1B,KAAK,QAAQ;YACX,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;QACvB,KAAK,QAAQ;YACX,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;QACvB,KAAK,YAAY;YACf,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC;QAC3B,OAAO,CAAC,CAAC,CAAC;YACR,MAAM,WAAW,GAAU,QAAQ,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,6BAA6B,WAAW,EAAE,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm-model.test.d.ts","sourceRoot":"","sources":["../../src/agent/llm-model.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import { describe, it } from "node:test";
|
|
3
|
+
import { createLlmModel } from "./llm-model.js";
|
|
4
|
+
const base = {
|
|
5
|
+
browser: { headed: false, sessionName: "pqa", defaultTimeout: 25_000, engine: "chrome" },
|
|
6
|
+
skills: { dirs: [], preloads: [] },
|
|
7
|
+
agent: { maxTurns: 10, bashTimeoutMs: 60_000 },
|
|
8
|
+
auth: {},
|
|
9
|
+
};
|
|
10
|
+
describe("createLlmModel", () => {
|
|
11
|
+
it("returns a model for google provider", () => {
|
|
12
|
+
const model = createLlmModel({
|
|
13
|
+
...base,
|
|
14
|
+
llm: { provider: "google", model: "gemini-2.5-flash" },
|
|
15
|
+
});
|
|
16
|
+
assert.ok(model);
|
|
17
|
+
assert.equal(typeof model, "object");
|
|
18
|
+
});
|
|
19
|
+
it("returns a model for openrouter provider", () => {
|
|
20
|
+
const model = createLlmModel({
|
|
21
|
+
...base,
|
|
22
|
+
llm: { provider: "openrouter", model: "anthropic/claude-sonnet-4" },
|
|
23
|
+
});
|
|
24
|
+
assert.ok(model);
|
|
25
|
+
assert.equal(typeof model, "object");
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
//# sourceMappingURL=llm-model.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm-model.test.js","sourceRoot":"","sources":["../../src/agent/llm-model.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhD,MAAM,IAAI,GAAG;IACX,OAAO,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE;IACxF,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;IAClC,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE;IAC9C,IAAI,EAAE,EAAE;CACoB,CAAC;AAE/B,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,KAAK,GAAG,cAAc,CAAC;YAC3B,GAAG,IAAI;YACP,GAAG,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,kBAAkB,EAAE;SAC1C,CAAC,CAAC;QAChB,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;QACjB,MAAM,CAAC,KAAK,CAAC,OAAO,KAAK,EAAE,QAAQ,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,KAAK,GAAG,cAAc,CAAC;YAC3B,GAAG,IAAI;YACP,GAAG,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAE,2BAA2B,EAAE;SACvD,CAAC,CAAC;QAChB,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;QACjB,MAAM,CAAC,KAAK,CAAC,OAAO,KAAK,EAAE,QAAQ,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { PqaConfig, ArtifactsMode } from "../types/config.js";
|
|
2
|
+
import type { Scenario } from "../types/scenario.js";
|
|
3
|
+
import type { Skill } from "../types/skill.js";
|
|
4
|
+
export declare function buildInitialPrompt(scenario: Scenario, preparedStartUrl?: string): string;
|
|
5
|
+
export declare function buildSystemPrompt(config: PqaConfig, skills: Skill[], scenario: Scenario, runtime: {
|
|
6
|
+
cwd: string;
|
|
7
|
+
artifactDir: string;
|
|
8
|
+
authStatePath?: string;
|
|
9
|
+
authProfile?: string;
|
|
10
|
+
profilePath?: string;
|
|
11
|
+
headed: boolean;
|
|
12
|
+
sessionName: string;
|
|
13
|
+
artifacts: ArtifactsMode;
|
|
14
|
+
scenarioCacheHints?: string;
|
|
15
|
+
preparedStartUrl?: string;
|
|
16
|
+
}): string;
|
|
17
|
+
//# sourceMappingURL=prompt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/agent/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAW/C,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,QAAQ,EAClB,gBAAgB,CAAC,EAAE,MAAM,GACxB,MAAM,CAuBR;AAED,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,KAAK,EAAE,EACf,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE;IACP,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,aAAa,CAAC;IACzB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,GACA,MAAM,CAwER"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { formatArtifactsRuntimeHint } from "../artifacts/policy.js";
|
|
2
|
+
import { resolveStatePath } from "../auth/store.js";
|
|
3
|
+
import { formatDeclaredEnvVarHints } from "../config/env-vars.js";
|
|
4
|
+
import { loadSystemPrompt } from "../prompt/load.js";
|
|
5
|
+
import { buildSkillPrompt } from "../skills/loader.js";
|
|
6
|
+
import { formatScenarioForPrompt } from "../scenarios/parser.js";
|
|
7
|
+
const EXECUTION_HINT = "Use the Observe-Act-Verify loop from the system prompt. After all Steps, verify every Then checkpoint with CLI evidence before emitting the verdict JSON.";
|
|
8
|
+
export function buildInitialPrompt(scenario, preparedStartUrl) {
|
|
9
|
+
const name = scenario.frontmatter.name;
|
|
10
|
+
if (preparedStartUrl && preparedStartUrl !== "about:blank") {
|
|
11
|
+
const authClause = scenario.frontmatter.auth
|
|
12
|
+
? "with auth state loaded. "
|
|
13
|
+
: "The harness opened this page via agent-browser. ";
|
|
14
|
+
return (`Execute the scenario "${name}" now. The browser is already open on ${preparedStartUrl} ` +
|
|
15
|
+
`${authClause}Continue from Step 1 without running agent-browser close. ` +
|
|
16
|
+
EXECUTION_HINT);
|
|
17
|
+
}
|
|
18
|
+
if (preparedStartUrl === "about:blank") {
|
|
19
|
+
return (`Execute the scenario "${name}" now. Auth state is loaded in the browser session. ` +
|
|
20
|
+
`Follow the Steps without running agent-browser close first. ${EXECUTION_HINT}`);
|
|
21
|
+
}
|
|
22
|
+
const url = scenario.frontmatter.url;
|
|
23
|
+
if (url) {
|
|
24
|
+
return `Execute the scenario "${name}" now. Start by opening ${url} with agent-browser, then continue with the Steps. ${EXECUTION_HINT}`;
|
|
25
|
+
}
|
|
26
|
+
return `Execute the scenario "${name}" now. Follow the Steps, navigating to any URLs specified there with agent-browser. ${EXECUTION_HINT}`;
|
|
27
|
+
}
|
|
28
|
+
export function buildSystemPrompt(config, skills, scenario, runtime) {
|
|
29
|
+
const systemPrompt = loadSystemPrompt(runtime.cwd, config.systemPromptPath);
|
|
30
|
+
const skillBlock = buildSkillPrompt(skills);
|
|
31
|
+
const scenarioBlock = formatScenarioForPrompt(scenario);
|
|
32
|
+
const authSavePath = runtime.authProfile
|
|
33
|
+
? resolveStatePath(runtime.cwd, runtime.authProfile, config)
|
|
34
|
+
: undefined;
|
|
35
|
+
const envHints = [
|
|
36
|
+
runtime.authProfile
|
|
37
|
+
? [
|
|
38
|
+
`Auth scenario for profile "${runtime.authProfile}" — complete login Steps and Then checkpoints.`,
|
|
39
|
+
"The harness saves browser state and closes the session after you pass.",
|
|
40
|
+
"Do NOT run: agent-browser close, agent-browser close --all, or agent-browser state save.",
|
|
41
|
+
"Leave the browser on the signed-in page until your final verdict.",
|
|
42
|
+
].join("\n")
|
|
43
|
+
: null,
|
|
44
|
+
scenario.frontmatter.url
|
|
45
|
+
? runtime.preparedStartUrl && runtime.preparedStartUrl !== "about:blank"
|
|
46
|
+
? `Scenario start URL: ${scenario.frontmatter.url} (harness already opened it — do not reload or agent-browser open this URL again)`
|
|
47
|
+
: `Scenario start URL: ${scenario.frontmatter.url} (open this before executing Steps)`
|
|
48
|
+
: "No start URL — navigate to URLs as specified in Steps",
|
|
49
|
+
`Artifact directory: ${runtime.artifactDir}`,
|
|
50
|
+
formatArtifactsRuntimeHint(runtime.artifacts),
|
|
51
|
+
`Browser session: ${runtime.sessionName}`,
|
|
52
|
+
`Headed mode: ${runtime.headed}`,
|
|
53
|
+
runtime.profilePath
|
|
54
|
+
? `Auth browser profile: ${runtime.profilePath} (already signed in — do not run agent-browser close or reopen with --state)`
|
|
55
|
+
: runtime.authStatePath
|
|
56
|
+
? `Auth state file: ${runtime.authStatePath}`
|
|
57
|
+
: "No auth state preloaded",
|
|
58
|
+
authSavePath ? `Auth state will be saved to: ${authSavePath}` : null,
|
|
59
|
+
`Then checkpoints to verify: ${scenario.then.length}`,
|
|
60
|
+
"",
|
|
61
|
+
"Harness environment variables available in bash:",
|
|
62
|
+
"- PQA_ARTIFACT_DIR",
|
|
63
|
+
"- AGENT_BROWSER_SESSION_NAME",
|
|
64
|
+
runtime.profilePath ? "- AGENT_BROWSER_PROFILE" : null,
|
|
65
|
+
runtime.authStatePath && !runtime.profilePath
|
|
66
|
+
? "- AGENT_BROWSER_STATE"
|
|
67
|
+
: null,
|
|
68
|
+
authSavePath ? "- PQA_AUTH_SAVE_PATH" : null,
|
|
69
|
+
...formatDeclaredEnvVarHints(config.envVars ?? []),
|
|
70
|
+
]
|
|
71
|
+
.filter(Boolean)
|
|
72
|
+
.join("\n");
|
|
73
|
+
const cacheBlock = runtime.scenarioCacheHints?.trim()
|
|
74
|
+
? `## Scenario replay hints (prior successful runs)
|
|
75
|
+
|
|
76
|
+
${runtime.scenarioCacheHints.trim()}
|
|
77
|
+
|
|
78
|
+
Treat these as accelerators, not strict scripts. Re-snapshot and adapt if the UI changed.
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
`
|
|
83
|
+
: "";
|
|
84
|
+
return `${systemPrompt}
|
|
85
|
+
|
|
86
|
+
Runtime:
|
|
87
|
+
${envHints}
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
${skillBlock}
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
${cacheBlock}${scenarioBlock}`;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/agent/prompt.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.test.d.ts","sourceRoot":"","sources":["../../src/agent/prompt.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import { describe, it } from "node:test";
|
|
5
|
+
import { buildInitialPrompt, buildSystemPrompt } from "./prompt.js";
|
|
6
|
+
const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../..");
|
|
7
|
+
const baseConfig = {
|
|
8
|
+
llm: { provider: "anthropic", model: "claude-sonnet-4-20250514" },
|
|
9
|
+
browser: { headed: false, sessionName: "pqa", defaultTimeout: 25_000, engine: "chrome" },
|
|
10
|
+
systemPromptPath: path.join(repoRoot, "prompt/SYSTEM.md"),
|
|
11
|
+
skills: { dirs: [], preloads: [] },
|
|
12
|
+
agent: { maxTurns: 100, bashTimeoutMs: 120_000 },
|
|
13
|
+
auth: {},
|
|
14
|
+
};
|
|
15
|
+
function makeScenario(overrides = {}) {
|
|
16
|
+
return {
|
|
17
|
+
filePath: "/tmp/example.md",
|
|
18
|
+
frontmatter: { name: "example-smoke" },
|
|
19
|
+
skills: [],
|
|
20
|
+
goal: "Verify the dashboard loads.",
|
|
21
|
+
steps: "1. Open the app.",
|
|
22
|
+
then: ['url contains "/dashboard"', 'page shows "Welcome"'],
|
|
23
|
+
rawCheckpoints: [
|
|
24
|
+
'url contains "/dashboard"',
|
|
25
|
+
'page shows "Welcome"',
|
|
26
|
+
],
|
|
27
|
+
checkpoints: [
|
|
28
|
+
{ raw: 'url contains "/dashboard"', kind: "url_contains", value: "/dashboard" },
|
|
29
|
+
{ raw: 'page shows "Welcome"', kind: "page_shows", value: "Welcome" },
|
|
30
|
+
],
|
|
31
|
+
...overrides,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
describe("buildInitialPrompt", () => {
|
|
35
|
+
it("includes Observe-Act-Verify execution hint in all variants", () => {
|
|
36
|
+
const scenario = makeScenario();
|
|
37
|
+
const hint = "Observe-Act-Verify loop";
|
|
38
|
+
assert.match(buildInitialPrompt(scenario), new RegExp(hint));
|
|
39
|
+
assert.match(buildInitialPrompt(scenario, "http://localhost:3000/clients"), new RegExp(hint));
|
|
40
|
+
assert.match(buildInitialPrompt(scenario, "about:blank"), new RegExp(hint));
|
|
41
|
+
assert.match(buildInitialPrompt(makeScenario({
|
|
42
|
+
frontmatter: { name: "with-url", url: "http://localhost:3000" },
|
|
43
|
+
})), new RegExp(hint));
|
|
44
|
+
});
|
|
45
|
+
it("asks agent to open start URL when frontmatter url is set but harness did not preload", () => {
|
|
46
|
+
const prompt = buildInitialPrompt(makeScenario({
|
|
47
|
+
frontmatter: { name: "with-url", url: "http://localhost:3000/clients" },
|
|
48
|
+
}));
|
|
49
|
+
assert.match(prompt, /http:\/\/localhost:3000\/clients/);
|
|
50
|
+
assert.match(prompt, /agent-browser/);
|
|
51
|
+
assert.doesNotMatch(prompt, /already open/i);
|
|
52
|
+
});
|
|
53
|
+
it("tells agent not to reload when harness pre-opened frontmatter url", () => {
|
|
54
|
+
const prompt = buildInitialPrompt(makeScenario({
|
|
55
|
+
frontmatter: { name: "hello", url: "http://127.0.0.1:8080/" },
|
|
56
|
+
}), "http://127.0.0.1:8080/");
|
|
57
|
+
assert.match(prompt, /already open on http:\/\/127\.0\.0\.1:8080\//);
|
|
58
|
+
assert.match(prompt, /harness opened this page via agent-browser/i);
|
|
59
|
+
assert.match(prompt, /Continue from Step 1 without running agent-browser close/i);
|
|
60
|
+
assert.doesNotMatch(prompt, /auth state loaded/i);
|
|
61
|
+
});
|
|
62
|
+
it("mentions auth when harness pre-opened url with auth profile", () => {
|
|
63
|
+
const prompt = buildInitialPrompt(makeScenario({
|
|
64
|
+
frontmatter: {
|
|
65
|
+
name: "authed",
|
|
66
|
+
url: "http://127.0.0.1:8080/projects",
|
|
67
|
+
auth: "admin",
|
|
68
|
+
},
|
|
69
|
+
}), "http://127.0.0.1:8080/projects");
|
|
70
|
+
assert.match(prompt, /auth state loaded/i);
|
|
71
|
+
assert.match(prompt, /Continue from Step 1 without running agent-browser close/i);
|
|
72
|
+
assert.doesNotMatch(prompt, /harness opened this page via agent-browser/i);
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
describe("buildSystemPrompt", () => {
|
|
76
|
+
it("includes scenario block and Then checkpoint count in runtime hints", () => {
|
|
77
|
+
const scenario = makeScenario();
|
|
78
|
+
const skills = [];
|
|
79
|
+
const prompt = buildSystemPrompt(baseConfig, skills, scenario, {
|
|
80
|
+
cwd: repoRoot,
|
|
81
|
+
artifactDir: "/tmp/pqa-artifacts",
|
|
82
|
+
headed: false,
|
|
83
|
+
sessionName: "pqa",
|
|
84
|
+
artifacts: "on-failure",
|
|
85
|
+
});
|
|
86
|
+
assert.match(prompt, /# Scenario: example-smoke/);
|
|
87
|
+
assert.match(prompt, /Then checkpoints to verify: 2/);
|
|
88
|
+
assert.match(prompt, /Observe-Act-Verify loop/);
|
|
89
|
+
assert.match(prompt, /url contains "\/dashboard"/);
|
|
90
|
+
});
|
|
91
|
+
it("marks frontmatter url as harness-opened when preparedStartUrl is set", () => {
|
|
92
|
+
const scenario = makeScenario({
|
|
93
|
+
frontmatter: { name: "preloaded", url: "http://127.0.0.1:8080/" },
|
|
94
|
+
});
|
|
95
|
+
const prompt = buildSystemPrompt(baseConfig, [], scenario, {
|
|
96
|
+
cwd: repoRoot,
|
|
97
|
+
artifactDir: "/tmp/pqa-artifacts",
|
|
98
|
+
headed: false,
|
|
99
|
+
sessionName: "pqa",
|
|
100
|
+
artifacts: "on-failure",
|
|
101
|
+
preparedStartUrl: "http://127.0.0.1:8080/",
|
|
102
|
+
});
|
|
103
|
+
assert.match(prompt, /harness already opened it/);
|
|
104
|
+
assert.doesNotMatch(prompt, /open this before executing Steps/);
|
|
105
|
+
});
|
|
106
|
+
it("includes scenario replay hints block when provided", () => {
|
|
107
|
+
const scenario = makeScenario();
|
|
108
|
+
const prompt = buildSystemPrompt(baseConfig, [], scenario, {
|
|
109
|
+
cwd: repoRoot,
|
|
110
|
+
artifactDir: "/tmp/pqa-artifacts",
|
|
111
|
+
headed: false,
|
|
112
|
+
sessionName: "pqa",
|
|
113
|
+
artifacts: "on-failure",
|
|
114
|
+
scenarioCacheHints: "### Effective actions\n- Use snapshot -i first",
|
|
115
|
+
});
|
|
116
|
+
assert.match(prompt, /Scenario replay hints \(prior successful runs\)/);
|
|
117
|
+
assert.match(prompt, /Use snapshot -i first/);
|
|
118
|
+
assert.match(prompt, /Re-snapshot and adapt if the UI changed/);
|
|
119
|
+
const scenarioIndex = prompt.indexOf("# Scenario: example-smoke");
|
|
120
|
+
const hintsIndex = prompt.indexOf("Scenario replay hints");
|
|
121
|
+
assert.ok(hintsIndex > 0 && hintsIndex < scenarioIndex);
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
//# sourceMappingURL=prompt.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.test.js","sourceRoot":"","sources":["../../src/agent/prompt.test.ts"],"names":[],"mappings":"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"}
|