@jevitate/cli 0.12.0 → 0.14.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/dist/author-journey-cli.d.ts +9 -0
- package/dist/author-journey-cli.js +18 -1
- package/dist/author-journey-cli.js.map +1 -1
- package/dist/bin.js +25673 -24216
- package/dist/build-info.generated.js +2 -2
- package/dist/catalog-analysis.js +4 -2
- package/dist/catalog-analysis.js.map +1 -1
- package/dist/catalog-bundle-api.js +1 -3
- package/dist/catalog-bundle-api.js.map +1 -1
- package/dist/catalog-bundle-findings.js +1 -3
- package/dist/catalog-bundle-findings.js.map +1 -1
- package/dist/catalog-bundle.js +1 -4
- package/dist/catalog-bundle.js.map +1 -1
- package/dist/catalog-cli.js +48 -6
- package/dist/catalog-cli.js.map +1 -1
- package/dist/catalog-review.d.ts +8 -0
- package/dist/catalog-review.js +26 -0
- package/dist/catalog-review.js.map +1 -1
- package/dist/catalog.d.ts +42 -0
- package/dist/catalog.js +67 -4
- package/dist/catalog.js.map +1 -1
- package/dist/check-execute.js +9 -0
- package/dist/check-execute.js.map +1 -1
- package/dist/check-plan.d.ts +5 -2
- package/dist/check-plan.js +9 -5
- package/dist/check-plan.js.map +1 -1
- package/dist/check-suite.js +1 -3
- package/dist/check-suite.js.map +1 -1
- package/dist/cli-output.js +1 -3
- package/dist/cli-output.js.map +1 -1
- package/dist/cli-shared.d.ts +1 -1
- package/dist/cli-shared.js +2 -0
- package/dist/cli-shared.js.map +1 -1
- package/dist/defect-evidence.js +4 -8
- package/dist/defect-evidence.js.map +1 -1
- package/dist/environments.d.ts +1 -1
- package/dist/environments.js +1 -1
- package/dist/environments.js.map +1 -1
- package/dist/exit-codes.d.ts +0 -1
- package/dist/exit-codes.js +2 -0
- package/dist/exit-codes.js.map +1 -1
- package/dist/explore-adversarial.d.ts +10 -1
- package/dist/explore-adversarial.js +3 -0
- package/dist/explore-adversarial.js.map +1 -1
- package/dist/explore-cli/adversarial-strategy.d.ts +3 -0
- package/dist/explore-cli/adversarial-strategy.js +101 -0
- package/dist/explore-cli/adversarial-strategy.js.map +1 -0
- package/dist/explore-cli/coverage-strategy.d.ts +3 -0
- package/dist/explore-cli/coverage-strategy.js +97 -0
- package/dist/explore-cli/coverage-strategy.js.map +1 -0
- package/dist/explore-cli/feature-strategy.d.ts +3 -0
- package/dist/explore-cli/feature-strategy.js +60 -0
- package/dist/explore-cli/feature-strategy.js.map +1 -0
- package/dist/explore-cli/goal-strategy.d.ts +3 -0
- package/dist/explore-cli/goal-strategy.js +185 -0
- package/dist/explore-cli/goal-strategy.js.map +1 -0
- package/dist/explore-cli/options.d.ts +3 -0
- package/dist/explore-cli/options.js +157 -0
- package/dist/explore-cli/options.js.map +1 -0
- package/dist/explore-cli/run.d.ts +7 -0
- package/dist/explore-cli/run.js +702 -0
- package/dist/explore-cli/run.js.map +1 -0
- package/dist/explore-cli/scope-region.d.ts +17 -0
- package/dist/explore-cli/scope-region.js +24 -0
- package/dist/explore-cli/scope-region.js.map +1 -0
- package/dist/explore-cli/shared.d.ts +167 -0
- package/dist/explore-cli/shared.js +20 -0
- package/dist/explore-cli/shared.js.map +1 -0
- package/dist/explore-cli/usability-strategy.d.ts +3 -0
- package/dist/explore-cli/usability-strategy.js +137 -0
- package/dist/explore-cli/usability-strategy.js.map +1 -0
- package/dist/explore-cli.d.ts +2 -2
- package/dist/explore-cli.js +2 -1347
- package/dist/explore-cli.js.map +1 -1
- package/dist/explore-coverage.d.ts +10 -1
- package/dist/explore-coverage.js +3 -0
- package/dist/explore-coverage.js.map +1 -1
- package/dist/explore-feature.d.ts +6 -0
- package/dist/explore-feature.js +1 -0
- package/dist/explore-feature.js.map +1 -1
- package/dist/explore-goal.d.ts +6 -0
- package/dist/explore-goal.js +1 -0
- package/dist/explore-goal.js.map +1 -1
- package/dist/explore-specs.d.ts +3 -1
- package/dist/explore-specs.js +2 -1
- package/dist/explore-specs.js.map +1 -1
- package/dist/github-issue-filer.js +1 -4
- package/dist/github-issue-filer.js.map +1 -1
- package/dist/goal-run-flags.d.ts +0 -1
- package/dist/goal-run-flags.js.map +1 -1
- package/dist/inbox-cli.js +1 -3
- package/dist/inbox-cli.js.map +1 -1
- package/dist/init-skills.js +1 -4
- package/dist/init-skills.js.map +1 -1
- package/dist/journey-anchor-api.d.ts +10 -9
- package/dist/journey-anchor-api.js +12 -22
- package/dist/journey-anchor-api.js.map +1 -1
- package/dist/journey-anchor-cli.d.ts +1 -1
- package/dist/journey-anchor-cli.js +22 -8
- package/dist/journey-anchor-cli.js.map +1 -1
- package/dist/journey-cli/anchors.d.ts +4 -0
- package/dist/journey-cli/anchors.js +48 -0
- package/dist/journey-cli/anchors.js.map +1 -0
- package/dist/journey-cli/find.d.ts +4 -0
- package/dist/journey-cli/find.js +44 -0
- package/dist/journey-cli/find.js.map +1 -0
- package/dist/journey-cli/lint.d.ts +4 -0
- package/dist/journey-cli/lint.js +84 -0
- package/dist/journey-cli/lint.js.map +1 -0
- package/dist/journey-cli/list.d.ts +4 -0
- package/dist/journey-cli/list.js +48 -0
- package/dist/journey-cli/list.js.map +1 -0
- package/dist/journey-cli/migrate.d.ts +4 -0
- package/dist/journey-cli/migrate.js +101 -0
- package/dist/journey-cli/migrate.js.map +1 -0
- package/dist/journey-cli/promote.d.ts +4 -0
- package/dist/journey-cli/promote.js +181 -0
- package/dist/journey-cli/promote.js.map +1 -0
- package/dist/journey-cli/publish.d.ts +4 -0
- package/dist/journey-cli/publish.js +70 -0
- package/dist/journey-cli/publish.js.map +1 -0
- package/dist/journey-cli/review.d.ts +4 -0
- package/dist/journey-cli/review.js +108 -0
- package/dist/journey-cli/review.js.map +1 -0
- package/dist/journey-cli/run.d.ts +4 -0
- package/dist/journey-cli/run.js +244 -0
- package/dist/journey-cli/run.js.map +1 -0
- package/dist/journey-cli/shared.d.ts +9 -0
- package/dist/journey-cli/shared.js +12 -0
- package/dist/journey-cli/shared.js.map +1 -0
- package/dist/journey-cli/verify.d.ts +4 -0
- package/dist/journey-cli/verify.js +125 -0
- package/dist/journey-cli/verify.js.map +1 -0
- package/dist/journey-cli.d.ts +3 -2
- package/dist/journey-cli.js +25 -950
- package/dist/journey-cli.js.map +1 -1
- package/dist/journey-link-api.d.ts +40 -0
- package/dist/journey-link-api.js +90 -0
- package/dist/journey-link-api.js.map +1 -0
- package/dist/journey-link-cli.d.ts +7 -0
- package/dist/journey-link-cli.js +58 -0
- package/dist/journey-link-cli.js.map +1 -0
- package/dist/journey-link-hints.d.ts +8 -0
- package/dist/journey-link-hints.js +68 -0
- package/dist/journey-link-hints.js.map +1 -0
- package/dist/journey-lint-sarif.js +3 -0
- package/dist/journey-lint-sarif.js.map +1 -1
- package/dist/journey-network-checks.d.ts +9 -1
- package/dist/journey-network-checks.js +55 -12
- package/dist/journey-network-checks.js.map +1 -1
- package/dist/journey-prefix.d.ts +9 -1
- package/dist/journey-prefix.js +12 -0
- package/dist/journey-prefix.js.map +1 -1
- package/dist/journey-review/render.d.ts +43 -0
- package/dist/journey-review/render.js +461 -0
- package/dist/journey-review/render.js.map +1 -0
- package/dist/journey-review-api.d.ts +1 -0
- package/dist/journey-review-api.js +7 -0
- package/dist/journey-review-api.js.map +1 -1
- package/dist/journey-review-store.js +1 -0
- package/dist/journey-review-store.js.map +1 -1
- package/dist/journey-review.d.ts +6 -4
- package/dist/journey-review.js +18 -393
- package/dist/journey-review.js.map +1 -1
- package/dist/journey-verify.js +2 -1
- package/dist/journey-verify.js.map +1 -1
- package/dist/ledger-api.js +1 -4
- package/dist/ledger-api.js.map +1 -1
- package/dist/locator-health-api.js +1 -3
- package/dist/locator-health-api.js.map +1 -1
- package/dist/locator-health.d.ts +0 -1
- package/dist/locator-health.js +0 -3
- package/dist/locator-health.js.map +1 -1
- package/dist/log-classes.js +1 -3
- package/dist/log-classes.js.map +1 -1
- package/dist/log-sources.js +17 -1
- package/dist/log-sources.js.map +1 -1
- package/dist/mcp-api.js +16 -821
- package/dist/mcp-api.js.map +1 -1
- package/dist/mcp-cli-tools.js +48 -7
- package/dist/mcp-cli-tools.js.map +1 -1
- package/dist/mcp-tools/cli.d.ts +3 -0
- package/dist/mcp-tools/cli.js +20 -0
- package/dist/mcp-tools/cli.js.map +1 -0
- package/dist/mcp-tools/explore.d.ts +3 -0
- package/dist/mcp-tools/explore.js +141 -0
- package/dist/mcp-tools/explore.js.map +1 -0
- package/dist/mcp-tools/findings.d.ts +3 -0
- package/dist/mcp-tools/findings.js +277 -0
- package/dist/mcp-tools/findings.js.map +1 -0
- package/dist/mcp-tools/inbox.d.ts +3 -0
- package/dist/mcp-tools/inbox.js +106 -0
- package/dist/mcp-tools/inbox.js.map +1 -0
- package/dist/mcp-tools/journey.d.ts +3 -0
- package/dist/mcp-tools/journey.js +260 -0
- package/dist/mcp-tools/journey.js.map +1 -0
- package/dist/mcp-tools/shared.d.ts +39 -0
- package/dist/mcp-tools/shared.js +69 -0
- package/dist/mcp-tools/shared.js.map +1 -0
- package/dist/mission-fixtures.js +1 -8
- package/dist/mission-fixtures.js.map +1 -1
- package/dist/mission-queue-cli.js +1 -3
- package/dist/mission-queue-cli.js.map +1 -1
- package/dist/multi-run.js +1 -3
- package/dist/multi-run.js.map +1 -1
- package/dist/pre-approval.js +4 -4
- package/dist/pre-approval.js.map +1 -1
- package/dist/readiness.js +2 -2
- package/dist/readiness.js.map +1 -1
- package/dist/report-api.js +1 -4
- package/dist/report-api.js.map +1 -1
- package/dist/resource-preflight.js.map +1 -1
- package/dist/run-metadata.js +1 -3
- package/dist/run-metadata.js.map +1 -1
- package/dist/run-tags-cli.d.ts +0 -2
- package/dist/run-tags-cli.js +0 -4
- package/dist/run-tags-cli.js.map +1 -1
- package/dist/session-check.js +1 -3
- package/dist/session-check.js.map +1 -1
- package/dist/signal-triage.js +6 -2
- package/dist/signal-triage.js.map +1 -1
- package/dist/suite-explore-options.d.ts +8 -0
- package/dist/suite-explore-options.js +4 -0
- package/dist/suite-explore-options.js.map +1 -1
- package/dist/sweep-api.d.ts +9 -0
- package/dist/sweep-api.js +70 -4
- package/dist/sweep-api.js.map +1 -1
- package/dist/sweep-cli.d.ts +2 -0
- package/dist/sweep-cli.js +22 -5
- package/dist/sweep-cli.js.map +1 -1
- package/dist/transcript-file.d.ts +0 -3
- package/dist/transcript-file.js +0 -9
- package/dist/transcript-file.js.map +1 -1
- package/dist/ui-api.js +1 -4
- package/dist/ui-api.js.map +1 -1
- package/dist/ux-usability/analysis.d.ts +14 -0
- package/dist/ux-usability/analysis.js +106 -0
- package/dist/ux-usability/analysis.js.map +1 -0
- package/dist/ux-usability/done-adjudication.d.ts +15 -0
- package/dist/ux-usability/done-adjudication.js +56 -0
- package/dist/ux-usability/done-adjudication.js.map +1 -0
- package/dist/ux-usability/hang.d.ts +5 -0
- package/dist/ux-usability/hang.js +41 -0
- package/dist/ux-usability/hang.js.map +1 -0
- package/dist/ux-usability/loop.d.ts +15 -0
- package/dist/ux-usability/loop.js +104 -0
- package/dist/ux-usability/loop.js.map +1 -0
- package/dist/ux-usability/observe.d.ts +7 -0
- package/dist/ux-usability/observe.js +89 -0
- package/dist/ux-usability/observe.js.map +1 -0
- package/dist/ux-usability/result.d.ts +11 -0
- package/dist/ux-usability/result.js +113 -0
- package/dist/ux-usability/result.js.map +1 -0
- package/dist/ux-usability/setup.d.ts +76 -0
- package/dist/ux-usability/setup.js +204 -0
- package/dist/ux-usability/setup.js.map +1 -0
- package/dist/ux-usability/teardown.d.ts +3 -0
- package/dist/ux-usability/teardown.js +13 -0
- package/dist/ux-usability/teardown.js.map +1 -0
- package/dist/ux-usability.d.ts +20 -17
- package/dist/ux-usability.js +15 -589
- package/dist/ux-usability.js.map +1 -1
- package/dist/verify-fix-api.js +1 -4
- package/dist/verify-fix-api.js.map +1 -1
- package/package.json +5 -6
- package/skills/jevitate-explore/SKILL.md +9 -1
- package/skills/jevitate-getting-started/SKILL.md +1 -0
- package/skills/jevitate-promotion-ready/SKILL.md +76 -0
- package/skills/jevitate-record/SKILL.md +3 -0
- package/skills/jevitate-run-journey/SKILL.md +3 -0
- package/skills/jevitate-test-campaign/SKILL.md +5 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"result.js","sourceRoot":"","sources":["../../src/ux-usability/result.ts"],"names":[],"mappings":"AAAA,gHAAgH;AAChH,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAEpE,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,YAAY,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAChH,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAE3D,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,EAAE,6BAA6B,EAAE,eAAe,EAAE,YAAY,EAAgC,MAAM,qBAAqB,CAAC;AACjI,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAE/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAOxD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,GAAmB,EACnB,IAAmB,EACnB,QAA2B,EAC3B,IAA6B,EAC7B,OAAyB;IAEzB,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,mBAAmB,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,GAAG,CAAC;IACnM,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC;IAChE,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,OAAO,EAAE,eAAe,EAAE,GAAG,QAAQ,CAAC;IACxE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IACjD,0FAA0F;IAC1F,MAAM,UAAU,GAAG,MAAM,UAAU,CAAC,MAAM,EAAE,CAAC;IAC7C,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IAC5D,MAAM,IAAI,GAAG;QACX,aAAa,EAAE,6BAA6B;QAC5C,QAAQ,EAAE,WAAoB;QAC9B,MAAM,EAAE;YACN,OAAO,EAAE,KAAK,CAAC,UAAU;YACzB,SAAS,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC;YAC9B,GAAG,CAAC,IAAI,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACjG;QACD,GAAG,YAAY,CAAC,KAAK,CAAC;QACtB,cAAc,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC;QACvC,GAAG,MAAM;QACT,GAAG,UAAU;QACb,UAAU,EAAE,aAAa,CAAC,OAAO,CAAC,aAAa,CAAC;QAChD,KAAK,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACvC,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,GAAG,CAAC,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC;QAC3D,eAAe,EAAE,SAAS,CAAC,MAAM;QACjC,cAAc,EAAE,OAAO,CAAC,cAAc;QACtC,aAAa;QACb,YAAY,EAAE,eAAe;QAC7B,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE;QAClC,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,GAAG,CAAC,GAAG,CAAC,oBAAoB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,oBAAoB,EAAE,GAAG,CAAC,oBAAoB,EAAE,CAAC;QACrG,GAAG,CAAC,GAAG,CAAC,eAAe,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,GAAG,CAAC,eAAe,EAAE,CAAC;QACtF,GAAG,CAAC,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,GAAG,CAAC,YAAY,EAAE,CAAC;QAC7E,MAAM,EAAE,iBAAiB,EAAE;QAC3B,GAAG,CAAC,GAAiC,EAAE;YACrC,MAAM,CAAC,GAAG,sBAAsB,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,IAAI,UAAU,CAAC,CAAC;YAClF,OAAO,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;QAC/C,CAAC,CAAC,EAAE;QACJ,GAAG,CAAC,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC;QACxD,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC;QACjE,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;QACvC,yFAAyF;QACzF,6FAA6F;QAC7F,iGAAiG;QACjG,GAAG,eAAe,CAAC,YAAY,CAAC;QAChC,GAAG,YAAY,CAA0E;YACvF,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,QAAQ,EAAE,IAAa,EAAE,CAAC,CAAC;YACpK,GAAG,eAAe,CAAC,YAAY,EAAE,OAAO,CAAC;SAC1C,CAAC;QACF,GAAG,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,UAAU,EAAE,EAAE,CAAC;QAC3D,GAAG,CAAC,YAAY,KAAK,SAAS;YAC5B,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC;gBACE,WAAW,EAAE,YAAY,CAAC,OAAO;gBACjC,MAAM,EAAE,YAAY,CAAC,MAAM;gBAC3B,GAAG,CAAC,YAAY,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,YAAY,CAAC,QAAQ,EAAE,CAAC;aACzF,CAAC;QACN,GAAG,IAAI,CAAC,MAAM;KACf,CAAC;IACF,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC9B,uFAAuF;QACvF,2FAA2F;QAC3F,MAAM,GAAG,GAAG,IAAI,qBAAqB,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC;QACtG,MAAM,cAAc,GAAmB,UAAU,KAAK,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,UAAU,CAAC;QAC5F,MAAM,WAAW,GAAG;YAClB,GAAG,IAAI;YACP,MAAM,EAAE,IAAI;YACZ,UAAU,EAAE,IAAI;YAChB,cAAc;YACd,QAAQ,EAAE,eAAe,CAAC,cAAc,CAAC;YACzC,mBAAmB,EAAE,GAAG;SACzB,CAAC;QACF,qGAAqG;QACrG,OAAO,MAAM,eAAe,CAAC,EAAE,GAAG,WAAW,EAAE,UAAU,EAAE,kBAAkB,CAAC,OAAO,CAAC,aAAa,EAAE,cAAc,EAAE,WAAW,CAAC,QAAQ,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE,EAAE,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,IAAI,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;IACzO,CAAC;IACD,MAAM,MAAM,GAAG,WAAW,CAAC,cAAc,CAAC,kBAAkB,CAAC,OAAO,EAAE,cAAc,CAAC,EAAE,QAAQ,CAAC,EAAE;QAChG,aAAa;QACb,OAAO;QACP,mBAAmB;QACnB,GAAG,CAAC,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,uBAAuB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtF,kBAAkB,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAC;KAClF,CAAC,CAAC;IACH,MAAM,SAAS,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC5E,MAAM,QAAQ,GAAG,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,cAAc,EAAE,UAAU,EAAE,QAAQ,EAAE,eAAe,CAAC,UAAU,CAAC,EAAE,CAAC;IACpH,OAAO,MAAM,eAAe,CAAC,EAAE,GAAG,QAAQ,EAAE,UAAU,EAAE,kBAAkB,CAAC,OAAO,CAAC,aAAa,EAAE,UAAU,EAAE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,EAAE,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,IAAI,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;AAC5N,CAAC"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { type SecretCommandRunner, type TranscriptEntry } from "@jevitate/explore";
|
|
2
|
+
import { type ScreenRef, type UxEvidence, type UxFinding } from "@jevitate/ux";
|
|
3
|
+
import { MissionJournal } from "../mission-journal.js";
|
|
4
|
+
import { Http5xxOracle } from "@jevitate/explore";
|
|
5
|
+
import { UsabilityCapture } from "../usability-capture.js";
|
|
6
|
+
import type { RunUsabilityMissionOptions } from "../ux-usability.js";
|
|
7
|
+
/** Usability reads only a spec's `budget` (#150) — never its `invariants`/`capture` (#86/#147, not supported here). */
|
|
8
|
+
export declare class UsabilityInvariantsUnsupportedError extends Error {
|
|
9
|
+
readonly code: "E_USABILITY_INVARIANTS";
|
|
10
|
+
constructor();
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Phase 1 — set-up: every bad-input refusal BEFORE a browser opens, the run's artifact paths, the
|
|
14
|
+
* armed launch (kill switch, host sampler, browser), the capture/journal/server-log listener chain
|
|
15
|
+
* and the once-only session close. Returns the run's shared state, mutated in place by later phases.
|
|
16
|
+
*/
|
|
17
|
+
export declare function setUpUsabilityMission(opts: RunUsabilityMissionOptions): Promise<{
|
|
18
|
+
opts: RunUsabilityMissionOptions;
|
|
19
|
+
origin: string;
|
|
20
|
+
minConfidence: number;
|
|
21
|
+
quality: import("@jevitate/ux").QualityPolicy;
|
|
22
|
+
maxFindingsPerRoute: number;
|
|
23
|
+
fixture: string | undefined;
|
|
24
|
+
product: import("../ux-product.js").LoadedProductFacts;
|
|
25
|
+
runCapture: import("../run-screenshots.js").RunCapture;
|
|
26
|
+
portFactory: () => import("@jevitate/playwright").BrowserPort;
|
|
27
|
+
port: import("@jevitate/playwright").BrowserPort;
|
|
28
|
+
collected: UxEvidence[];
|
|
29
|
+
history: ScreenRef[];
|
|
30
|
+
overflowFindings: UxFinding[];
|
|
31
|
+
seenOverflow: Set<string>;
|
|
32
|
+
extract: (session: {
|
|
33
|
+
page: {
|
|
34
|
+
evaluate: (fn: () => string) => Promise<string>;
|
|
35
|
+
};
|
|
36
|
+
}) => Promise<string>;
|
|
37
|
+
outDir: string;
|
|
38
|
+
stamp: string;
|
|
39
|
+
reportPath: string;
|
|
40
|
+
journal: MissionJournal;
|
|
41
|
+
screenshotDir: string;
|
|
42
|
+
videoDir: string | undefined;
|
|
43
|
+
launch: {
|
|
44
|
+
storageState?: string | undefined;
|
|
45
|
+
viewport?: import("@jevitate/playwright").ViewportSize;
|
|
46
|
+
device?: string;
|
|
47
|
+
geolocation?: import("@jevitate/playwright").GeolocationSpec;
|
|
48
|
+
baseUrl: string;
|
|
49
|
+
blockOffAllowlistNavigation?: boolean | undefined;
|
|
50
|
+
allowedOrigins: string[];
|
|
51
|
+
executablePath?: string;
|
|
52
|
+
channel?: string;
|
|
53
|
+
args?: readonly string[];
|
|
54
|
+
slowMo?: number;
|
|
55
|
+
extensions?: readonly import("@jevitate/playwright").UnpackedExtension[];
|
|
56
|
+
resources?: import("@jevitate/playwright").ResourceLimits;
|
|
57
|
+
recordVideo?: {
|
|
58
|
+
dir: string;
|
|
59
|
+
} | undefined;
|
|
60
|
+
headless: boolean;
|
|
61
|
+
};
|
|
62
|
+
secrets: string[];
|
|
63
|
+
runUsage: import("@jevitate/ai-core").UsageLedger | undefined;
|
|
64
|
+
disarmKillSwitch: () => void;
|
|
65
|
+
health: import("@jevitate/explore").HostHealthSampler;
|
|
66
|
+
session: import("@jevitate/playwright").BrowserSession;
|
|
67
|
+
snapshotter: import("../storage-state-snapshot.js").StorageStateSnapshotter;
|
|
68
|
+
uxSecretCommand: SecretCommandRunner | undefined;
|
|
69
|
+
http5xx: Http5xxOracle;
|
|
70
|
+
capture: UsabilityCapture;
|
|
71
|
+
journalListener: (entry: TranscriptEntry, all: readonly TranscriptEntry[]) => void;
|
|
72
|
+
serverLog: import("../log-correlation.js").ServerLogRuntime | undefined;
|
|
73
|
+
closeSession: () => Promise<void>;
|
|
74
|
+
}>;
|
|
75
|
+
/** The run's shared state: set up once, handed to every later phase (the same objects, never copies). */
|
|
76
|
+
export type UsabilitySetup = Awaited<ReturnType<typeof setUpUsabilityMission>>;
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
// ux-usability/setup.ts — phase 1 of `runUsabilityMission` (#500): input refusals, launch, listener chain.
|
|
2
|
+
import { resolveProjectMissionFixture } from "../journey-api.js";
|
|
3
|
+
import { logsDirFor } from "../project-dir.js";
|
|
4
|
+
import { join, resolve as resolvePath } from "node:path";
|
|
5
|
+
import { PlaywrightBrowserPort } from "@jevitate/playwright";
|
|
6
|
+
import { closeOnce, runVideoDir, sessionLaunchOptions } from "../browser-run-options.js";
|
|
7
|
+
import { runCaptureFor } from "../run-screenshots.js";
|
|
8
|
+
import { assertAuthorizedExploreTarget, secretFieldSecrets } from "@jevitate/explore";
|
|
9
|
+
import { resolveMinConfidence, resolveMaxFindingsPerRoute, resolveQualityPolicy } from "@jevitate/ux";
|
|
10
|
+
import { loadProductFacts } from "../ux-product.js";
|
|
11
|
+
import { loadUxMaxFindingsPerPage, loadUxMinConfidence, loadUxMinConfidenceByAppClass, loadUxShow } from "../ux-config.js";
|
|
12
|
+
import { clock } from "@jevitate/domain";
|
|
13
|
+
import { MissionJournal, artifactStamp, closeQuietly } from "../mission-journal.js";
|
|
14
|
+
import { launchArmed } from "../launch-armed.js";
|
|
15
|
+
import { Http5xxOracle } from "@jevitate/explore";
|
|
16
|
+
import { openServerLogRuntime } from "../log-correlation.js";
|
|
17
|
+
import { serverLogRuntimeOptions } from "../explore-shared.js";
|
|
18
|
+
import { assertSaveStorageStateOutsideProject, currentUrlSafe, persistStorageState } from "../explore-api.js";
|
|
19
|
+
import { transcriptPathFor } from "../transcript-file.js";
|
|
20
|
+
import { UsabilityCapture } from "../usability-capture.js";
|
|
21
|
+
/** Usability reads only a spec's `budget` (#150) — never its `invariants`/`capture` (#86/#147, not supported here). */
|
|
22
|
+
export class UsabilityInvariantsUnsupportedError extends Error {
|
|
23
|
+
code = "E_USABILITY_INVARIANTS";
|
|
24
|
+
constructor() {
|
|
25
|
+
super("usability does not check app-declared invariants or captures — only a `budget` is read; " +
|
|
26
|
+
"give a spec with an empty invariants array (and no capture) to use --invariants with usability");
|
|
27
|
+
this.name = "UsabilityInvariantsUnsupportedError";
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Phase 1 — set-up: every bad-input refusal BEFORE a browser opens, the run's artifact paths, the
|
|
32
|
+
* armed launch (kill switch, host sampler, browser), the capture/journal/server-log listener chain
|
|
33
|
+
* and the once-only session close. Returns the run's shared state, mutated in place by later phases.
|
|
34
|
+
*/
|
|
35
|
+
export async function setUpUsabilityMission(opts) {
|
|
36
|
+
const origin = assertAuthorizedExploreTarget(opts.url, opts.allowlist);
|
|
37
|
+
assertSaveStorageStateOutsideProject(opts.saveStorageState);
|
|
38
|
+
// #150 — usability reads only a spec's `budget`: it does not check invariants or captures (#86/
|
|
39
|
+
// #147) today. Refused BEFORE a browser opens, same as every other bad-input refusal here.
|
|
40
|
+
if (opts.invariants !== undefined && (opts.invariants.invariants.length > 0 || opts.invariants.capture !== undefined)) {
|
|
41
|
+
throw new UsabilityInvariantsUnsupportedError();
|
|
42
|
+
}
|
|
43
|
+
// Validate the cutoff before a browser opens — a bad value fails fast, never mid-run.
|
|
44
|
+
const minConfidence = resolveMinConfidence(opts.minConfidence, opts.env ?? process.env, loadUxMinConfidence(opts.configPath), loadUxMinConfidenceByAppClass(opts.configPath, opts.appContext.appClass));
|
|
45
|
+
const quality = resolveQualityPolicy(opts.show, opts.env ?? process.env, loadUxShow(opts.configPath), opts.appContext.appClass);
|
|
46
|
+
const maxFindingsPerRoute = resolveMaxFindingsPerRoute(opts.maxFindingsPerRoute, opts.env ?? process.env, loadUxMaxFindingsPerPage(opts.configPath));
|
|
47
|
+
const fixture = opts.fixture === undefined ? undefined : await resolveProjectMissionFixture(opts.fixture);
|
|
48
|
+
// #198: the product facts are validated before a browser opens (a bad file is a usage error).
|
|
49
|
+
const product = await loadProductFacts(opts.product);
|
|
50
|
+
// #250/#251: a recorded or screenshotted run's sessions carry the live pixel mask from their first
|
|
51
|
+
// paint; `--screenshots` captures after each step (the Recording path names their folder).
|
|
52
|
+
const runCapture = runCaptureFor({
|
|
53
|
+
recordsVideo: opts.browser?.recordVideo !== undefined,
|
|
54
|
+
screenshots: opts.screenshots,
|
|
55
|
+
secrets: [...(opts.secrets ?? []), ...secretFieldSecrets(opts.secretFields)],
|
|
56
|
+
artifactPath: () => journal.recordingPath,
|
|
57
|
+
title: `usability: ${opts.job}`,
|
|
58
|
+
});
|
|
59
|
+
const portFactory = runCapture.wrap(opts.browserPortFactory ?? (() => new PlaywrightBrowserPort()));
|
|
60
|
+
const port = portFactory();
|
|
61
|
+
const collected = [];
|
|
62
|
+
const history = [];
|
|
63
|
+
// #149: one signal finding per distinct fingerprint (route + element) — a wide table seen across
|
|
64
|
+
// many observed screens is still ONE finding, never a finding per occurrence.
|
|
65
|
+
const overflowFindings = [];
|
|
66
|
+
const seenOverflow = new Set();
|
|
67
|
+
const extract = opts.extractText ??
|
|
68
|
+
(async (s) => s.page.evaluate(() => (typeof document !== "undefined" && document.body ? document.body.innerText : "")));
|
|
69
|
+
const outDir = opts.outDir ?? logsDirFor();
|
|
70
|
+
const iso = (opts.nowIso ?? (() => clock.nowIso()))();
|
|
71
|
+
const stamp = artifactStamp(iso);
|
|
72
|
+
const reportPath = join(outDir, `usability-${stamp}.json`);
|
|
73
|
+
// #98 — the same artifact shape as goal/adversarial missions, next to the report: the decision
|
|
74
|
+
// transcript (each step's redacted typed value and screenshot), the Recording and the per-step
|
|
75
|
+
// screenshots. Crash-safe: the transcript and partial Recording are flushed after every step.
|
|
76
|
+
const journal = new MissionJournal(join(outDir, `usability-${stamp}.recording.json`), transcriptPathFor(reportPath));
|
|
77
|
+
const screenshotDir = join(outDir, `usability-${stamp}.screens`);
|
|
78
|
+
// #245: shown/recorded like every other strategy's session (videos in `usability-<stamp>.videos/`).
|
|
79
|
+
const videoDir = runVideoDir(opts.browser, reportPath);
|
|
80
|
+
const launch = {
|
|
81
|
+
...sessionLaunchOptions(opts.browser, videoDir),
|
|
82
|
+
allowedOrigins: [...opts.allowlist],
|
|
83
|
+
...(opts.blockOffAllowlistNavigation === true ? { blockOffAllowlistNavigation: true } : {}),
|
|
84
|
+
baseUrl: origin,
|
|
85
|
+
...opts.emulation,
|
|
86
|
+
...(opts.storageState !== undefined ? { storageState: opts.storageState } : {}),
|
|
87
|
+
};
|
|
88
|
+
// A bound secret (or TOTP seed) is a run secret too: masked on screen, redacted everywhere.
|
|
89
|
+
const secrets = [...(opts.secrets ?? []), ...secretFieldSecrets(opts.secretFields)];
|
|
90
|
+
// #163: this run's own share of a (possibly shared) tracker: its usage and sidecar.
|
|
91
|
+
const runUsage = opts.usage?.scope();
|
|
92
|
+
// The screenshot capture needs the open page; until then a killed run has taken none.
|
|
93
|
+
let armedCapture;
|
|
94
|
+
// Crash-safe on SIGTERM/SIGINT too (#94): a partial `inconclusive` result is written from
|
|
95
|
+
// whatever the journal has already flushed, and the process exits with the conventional code.
|
|
96
|
+
// #120: the transcript lives next to the REPORT (`usability-<stamp>.transcript.json`), not the
|
|
97
|
+
// Recording — so the killed run's result names the real file, and reports the live step list,
|
|
98
|
+
// the tokens spent so far and the screens already observed.
|
|
99
|
+
// #226: the kill switch is armed BEFORE the host sampler and the browser launch (see launch-armed.ts).
|
|
100
|
+
const { disarmKillSwitch, health, session, snapshotter } = await launchArmed({
|
|
101
|
+
hostHealth: opts.hostHealth,
|
|
102
|
+
saveStorageState: opts.saveStorageState !== undefined,
|
|
103
|
+
open: () => port.open(launch),
|
|
104
|
+
mission: (hooks) => ({
|
|
105
|
+
// #220: the killed run's partial result carries the unified schema's common fields too.
|
|
106
|
+
strategy: "usability",
|
|
107
|
+
target: { seedUrl: opts.url, allowlist: [...opts.allowlist], ...(opts.storageState !== undefined ? { storageStatePath: resolvePath(opts.storageState) } : {}) },
|
|
108
|
+
recordingPath: journal.recordingPath,
|
|
109
|
+
hostHealth: hooks.hostHealth,
|
|
110
|
+
...(videoDir === undefined ? {} : { videoDir }),
|
|
111
|
+
transcriptPath: journal.transcriptPath,
|
|
112
|
+
transcript: () => journal.transcript,
|
|
113
|
+
...(runUsage === undefined ? {} : { usage: runUsage }),
|
|
114
|
+
partialReport: () => ({ screensObserved: collected.length, screenshotDir, screenshots: armedCapture === undefined ? [] : armedCapture.screenshots() }),
|
|
115
|
+
...(opts.saveStorageState === undefined ? {} : { storageState: { path: opts.saveStorageState, snapshot: hooks.snapshot } }),
|
|
116
|
+
}),
|
|
117
|
+
});
|
|
118
|
+
// #324: the engine runs a cmd: binding's command at type time. A value read mid-run joins this
|
|
119
|
+
// run's secrets at once (screenshots' scan, result, evidence, report) and — #360 — the run's pixel
|
|
120
|
+
// mask, before the value is typed. (It was once handed to UsabilityCapture, which has no such
|
|
121
|
+
// option, so a usability run could not type a cmd: field at all.)
|
|
122
|
+
const uxSecretCommand = opts.secretCommand === undefined
|
|
123
|
+
? undefined
|
|
124
|
+
: async (command) => {
|
|
125
|
+
const out = await opts.secretCommand(command);
|
|
126
|
+
const value = out.trim();
|
|
127
|
+
if (value !== "" && !secrets.includes(value))
|
|
128
|
+
secrets.push(value);
|
|
129
|
+
if (value !== "")
|
|
130
|
+
await runCapture.mask.addSecret(value);
|
|
131
|
+
return out;
|
|
132
|
+
};
|
|
133
|
+
// #208: the shared HTTP 5xx hard signal, listening from before the first navigation.
|
|
134
|
+
const http5xx = new Http5xxOracle(session.page, { allowlist: opts.allowlist });
|
|
135
|
+
const capture = new UsabilityCapture({
|
|
136
|
+
page: session.page,
|
|
137
|
+
screenshotDir,
|
|
138
|
+
secrets,
|
|
139
|
+
...(opts.secretFields === undefined ? {} : { secretFields: opts.secretFields }),
|
|
140
|
+
});
|
|
141
|
+
armedCapture = capture;
|
|
142
|
+
// The usability capture (screenshots) and the journal (crash-safe flush) are the EXISTING listener
|
|
143
|
+
// chain; a server-log runtime (#142) is inserted in FRONT of it (never replacing it) so every step
|
|
144
|
+
// still gets its screenshot/flush exactly as before, whether or not --log-source was given. #159:
|
|
145
|
+
// every settled step also refreshes the in-memory storageState snapshot (a cheap no-op when
|
|
146
|
+
// `--save-storage-state` was not given).
|
|
147
|
+
const journalListener = (entry, all) => {
|
|
148
|
+
runCapture.noteEntry(session.page, entry);
|
|
149
|
+
health.noteStep(entry);
|
|
150
|
+
http5xx.noteStep(entry);
|
|
151
|
+
capture.noteEntry(entry, all);
|
|
152
|
+
journal.onTranscriptEntry(entry, capture.withScreenshots(all));
|
|
153
|
+
snapshotter.noteSettledStep(currentUrlSafe(session));
|
|
154
|
+
};
|
|
155
|
+
const serverLog = openServerLogRuntime({
|
|
156
|
+
...serverLogRuntimeOptions(opts.serverLog),
|
|
157
|
+
secrets,
|
|
158
|
+
onTranscriptEntry: journalListener,
|
|
159
|
+
});
|
|
160
|
+
// #204: every request's correlation ids, from before the first navigation.
|
|
161
|
+
serverLog?.observe(session.page);
|
|
162
|
+
// #159/#245: persisted and closed once — early (before the result is written) when recording video.
|
|
163
|
+
const closeSession = closeOnce(async () => {
|
|
164
|
+
await persistStorageState(session, opts.saveStorageState, snapshotter);
|
|
165
|
+
await closeQuietly(session);
|
|
166
|
+
});
|
|
167
|
+
return {
|
|
168
|
+
opts,
|
|
169
|
+
origin,
|
|
170
|
+
minConfidence,
|
|
171
|
+
quality,
|
|
172
|
+
maxFindingsPerRoute,
|
|
173
|
+
fixture,
|
|
174
|
+
product,
|
|
175
|
+
runCapture,
|
|
176
|
+
portFactory,
|
|
177
|
+
port,
|
|
178
|
+
collected,
|
|
179
|
+
history,
|
|
180
|
+
overflowFindings,
|
|
181
|
+
seenOverflow,
|
|
182
|
+
extract,
|
|
183
|
+
outDir,
|
|
184
|
+
stamp,
|
|
185
|
+
reportPath,
|
|
186
|
+
journal,
|
|
187
|
+
screenshotDir,
|
|
188
|
+
videoDir,
|
|
189
|
+
launch,
|
|
190
|
+
secrets,
|
|
191
|
+
runUsage,
|
|
192
|
+
disarmKillSwitch,
|
|
193
|
+
health,
|
|
194
|
+
session,
|
|
195
|
+
snapshotter,
|
|
196
|
+
uxSecretCommand,
|
|
197
|
+
http5xx,
|
|
198
|
+
capture,
|
|
199
|
+
journalListener,
|
|
200
|
+
serverLog,
|
|
201
|
+
closeSession,
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/ux-usability/setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { UsabilitySetup } from "./setup.js";
|
|
2
|
+
/** Phase 7 — teardown, on every exit path (the orchestrator's `finally`): listeners, kill switch, host sampler, log sources, session. */
|
|
3
|
+
export declare function tearDownUsabilityMission(ctx: UsabilitySetup): Promise<void>;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** Phase 7 — teardown, on every exit path (the orchestrator's `finally`): listeners, kill switch, host sampler, log sources, session. */
|
|
2
|
+
export async function tearDownUsabilityMission(ctx) {
|
|
3
|
+
const { capture, disarmKillSwitch, health, serverLog, closeSession } = ctx;
|
|
4
|
+
capture.detach();
|
|
5
|
+
disarmKillSwitch();
|
|
6
|
+
health.stop();
|
|
7
|
+
// Safety net: if the mission threw before `serverLog.finish()` ran, close sources immediately
|
|
8
|
+
// (no drain wait) rather than leaving them open until process exit.
|
|
9
|
+
await serverLog?.abort();
|
|
10
|
+
// #159: reaches this even when the mission above threw — the context is still open here.
|
|
11
|
+
await closeSession();
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=teardown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"teardown.js","sourceRoot":"","sources":["../../src/ux-usability/teardown.ts"],"names":[],"mappings":"AAGA,yIAAyI;AACzI,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,GAAmB;IAChE,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,GAAG,CAAC;IAC3E,OAAO,CAAC,MAAM,EAAE,CAAC;IACjB,gBAAgB,EAAE,CAAC;IACnB,MAAM,CAAC,IAAI,EAAE,CAAC;IACd,8FAA8F;IAC9F,oEAAoE;IACpE,MAAM,SAAS,EAAE,KAAK,EAAE,CAAC;IACzB,yFAAyF;IACzF,MAAM,YAAY,EAAE,CAAC;AACvB,CAAC"}
|
package/dist/ux-usability.d.ts
CHANGED
|
@@ -1,21 +1,23 @@
|
|
|
1
1
|
import type { JudgmentPort, GenerationPort, UsageTracker, UsageCounts } from "@jevitate/ai-core";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
2
|
+
import type { BrowserPort, EmulationSpec } from "@jevitate/playwright";
|
|
3
|
+
import type { BrowserRunOptions } from "./browser-run-options.js";
|
|
4
|
+
import type { ScreenshotsSpec } from "./run-screenshots.js";
|
|
5
5
|
import type { InvariantSpec } from "@jevitate/recording";
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
6
|
+
import type { SuccessCheck, SuccessCheckResult, SuccessWhen, Bounds, TimingSummary, RunAnswer, RunOutcome, SecretField, SecretCommandRunner, HangFinding, SideEffect, SafetyOverride, BudgetTrajectory, CrashReport } from "@jevitate/explore";
|
|
7
|
+
import type { AppContext, SignalOptions, UxReport } from "@jevitate/ux";
|
|
8
|
+
import type { ConversationOptions } from "./conversation-options.js";
|
|
9
|
+
import type { GoalOutcome, MissionFailure, MissionOutcome } from "@jevitate/domain";
|
|
10
10
|
import { MISSION_RESULT_SCHEMA_VERSION, type AdvisoryServerLogDefect } from "./result-schema.js";
|
|
11
|
-
import {
|
|
11
|
+
import type { JourneyPrefix } from "./journey-prefix.js";
|
|
12
12
|
import type { JourneyBranchPoint } from "@jevitate/journey";
|
|
13
|
-
import {
|
|
13
|
+
import type { ActionDeltaStats, HostHealthSampler, Http5xxDefect, RunDepth } from "@jevitate/explore";
|
|
14
14
|
import type { DefectOutcome, EnvironmentDegraded, HostHealthSummary } from "@jevitate/domain";
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
15
|
+
import type { EngineInfo } from "./engine.js";
|
|
16
|
+
import type { ServerLogsSummary } from "./log-correlation.js";
|
|
17
|
+
import type { MissionTarget, ServerLogOptions } from "./explore-api.js";
|
|
18
18
|
import type { TargetConfig } from "./target-config.js";
|
|
19
|
+
import { UsabilityInvariantsUnsupportedError } from "./ux-usability/setup.js";
|
|
20
|
+
export { UsabilityInvariantsUnsupportedError };
|
|
19
21
|
export interface RunUsabilityMissionOptions {
|
|
20
22
|
/** Test seam (#203): the run's host-health sampler (a deterministic fake host). Default: this host's. */
|
|
21
23
|
readonly hostHealth?: HostHealthSampler;
|
|
@@ -156,11 +158,12 @@ export interface RunUsabilityMissionOptions {
|
|
|
156
158
|
* result (`actionDeltas`), told to the model and used by the no-progress check. Off: no capture.
|
|
157
159
|
*/
|
|
158
160
|
readonly actionDeltas?: boolean;
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
161
|
+
/**
|
|
162
|
+
* #521 `--block-off-allowlist-navigation` (opt-in, off by default): arm the navigation guard on this
|
|
163
|
+
* run's mission session (and its fresh/hang-replay sessions) — an off-allowlist page navigation is
|
|
164
|
+
* stopped in place and the mission treats it as a departure. Never on login, Journey or demo sessions.
|
|
165
|
+
*/
|
|
166
|
+
readonly blockOffAllowlistNavigation?: boolean;
|
|
164
167
|
}
|
|
165
168
|
export interface RunUsabilityMissionResult {
|
|
166
169
|
/** The host's health over the run (#203): peaks, the slowest render, starved steps. */
|