swipium 1.4.0 → 2.0.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/CHANGELOG.md +313 -0
- package/README.md +175 -219
- package/THREAT_MODEL.md +223 -47
- package/dist/appMap/automationLink.js +39 -26
- package/dist/appMap/automationLink.js.map +1 -1
- package/dist/appMap/build.js +68 -20
- package/dist/appMap/build.js.map +1 -1
- package/dist/appMap/codeIndex.js +31 -5
- package/dist/appMap/codeIndex.js.map +1 -1
- package/dist/appMap/featureIndex.js +23 -5
- package/dist/appMap/featureIndex.js.map +1 -1
- package/dist/appMap/featureModel.js +44 -8
- package/dist/appMap/featureModel.js.map +1 -1
- package/dist/appMap/firstRunApply.js +24 -6
- package/dist/appMap/firstRunApply.js.map +1 -1
- package/dist/appMap/fsWalk.js +19 -2
- package/dist/appMap/fsWalk.js.map +1 -1
- package/dist/appMap/issues.js +10 -30
- package/dist/appMap/issues.js.map +1 -1
- package/dist/appMap/migrations.js +6 -6
- package/dist/appMap/migrations.js.map +1 -1
- package/dist/appMap/prelaunch.js +2 -2
- package/dist/appMap/prelaunch.js.map +1 -1
- package/dist/appMap/projectRegistry.js +83 -11
- package/dist/appMap/projectRegistry.js.map +1 -1
- package/dist/appMap/provenance.js +2 -2
- package/dist/appMap/provenance.js.map +1 -1
- package/dist/appMap/query.js +21 -5
- package/dist/appMap/query.js.map +1 -1
- package/dist/appMap/runtimeMerge.js +12 -5
- package/dist/appMap/runtimeMerge.js.map +1 -1
- package/dist/appMap/schema.js +1 -1
- package/dist/appMap/schema.js.map +1 -1
- package/dist/appMap/screenMatch.js +6 -2
- package/dist/appMap/screenMatch.js.map +1 -1
- package/dist/appMap/staticScan.js +151 -39
- package/dist/appMap/staticScan.js.map +1 -1
- package/dist/appMap/store.js +58 -85
- package/dist/appMap/store.js.map +1 -1
- package/dist/appMap/tsAstScan.js +34 -12
- package/dist/appMap/tsAstScan.js.map +1 -1
- package/dist/artifacts/bundletool.js +49 -12
- package/dist/artifacts/bundletool.js.map +1 -1
- package/dist/artifacts/resolve.js +41 -14
- package/dist/artifacts/resolve.js.map +1 -1
- package/dist/automation/capabilities.js +112 -30
- package/dist/automation/capabilities.js.map +1 -1
- package/dist/automation/gestures.js +6 -2
- package/dist/automation/gestures.js.map +1 -1
- package/dist/automation/plan.js +71 -23
- package/dist/automation/plan.js.map +1 -1
- package/dist/automation/report.js +15 -5
- package/dist/automation/report.js.map +1 -1
- package/dist/automation/selectors.js +22 -28
- package/dist/automation/selectors.js.map +1 -1
- package/dist/automation/types.js +1 -1
- package/dist/automation/types.js.map +1 -1
- package/dist/automation/waits.js +14 -8
- package/dist/automation/waits.js.map +1 -1
- package/dist/automation/webview.js +9 -3
- package/dist/automation/webview.js.map +1 -1
- package/dist/automationGen/appiumModel.js +16 -8
- package/dist/automationGen/appiumModel.js.map +1 -1
- package/dist/automationGen/ciEmitter.js +6 -6
- package/dist/automationGen/ciEmitter.js.map +1 -1
- package/dist/automationGen/identifiers.js +224 -0
- package/dist/automationGen/identifiers.js.map +1 -0
- package/dist/automationGen/jsEmitter.js +288 -121
- package/dist/automationGen/jsEmitter.js.map +1 -1
- package/dist/automationGen/packagePatch.js +2 -2
- package/dist/automationGen/packagePatch.js.map +1 -1
- package/dist/automationGen/platformResolve.js +36 -0
- package/dist/automationGen/platformResolve.js.map +1 -0
- package/dist/automationGen/projectProfile.js +76 -27
- package/dist/automationGen/projectProfile.js.map +1 -1
- package/dist/automationGen/pythonEmitter.js +278 -107
- package/dist/automationGen/pythonEmitter.js.map +1 -1
- package/dist/automationGen/readmeEmitter.js +7 -6
- package/dist/automationGen/readmeEmitter.js.map +1 -1
- package/dist/automationGen/run.js +388 -0
- package/dist/automationGen/run.js.map +1 -0
- package/dist/automationGen/suitePlan.js +17 -10
- package/dist/automationGen/suitePlan.js.map +1 -1
- package/dist/automationGen/validation.js +52 -12
- package/dist/automationGen/validation.js.map +1 -1
- package/dist/build/parseBuildLog.js +235 -31
- package/dist/build/parseBuildLog.js.map +1 -1
- package/dist/build/plan.js +39 -18
- package/dist/build/plan.js.map +1 -1
- package/dist/ci/preflight.js +13 -4
- package/dist/ci/preflight.js.map +1 -1
- package/dist/cli/gc.js +74 -0
- package/dist/cli/gc.js.map +1 -0
- package/dist/cli/init.js +217 -26
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/main.js +50 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli/report.js +218 -0
- package/dist/cli/report.js.map +1 -0
- package/dist/cli/scan.js +36 -15
- package/dist/cli/scan.js.map +1 -1
- package/dist/cli/suite.js +7 -7
- package/dist/cli/suite.js.map +1 -1
- package/dist/cli/verify.js +7 -7
- package/dist/cli/verify.js.map +1 -1
- package/dist/consent/consent.js +162 -5
- package/dist/consent/consent.js.map +1 -1
- package/dist/context/detect.js +55 -18
- package/dist/context/detect.js.map +1 -1
- package/dist/context/findApps.js +22 -8
- package/dist/context/findApps.js.map +1 -1
- package/dist/context/projectRoot.js +174 -19
- package/dist/context/projectRoot.js.map +1 -1
- package/dist/context/scan.js +1 -1
- package/dist/context/scan.js.map +1 -1
- package/dist/core/capabilityGroups.js +90 -0
- package/dist/core/capabilityGroups.js.map +1 -0
- package/dist/core/target.js +10 -8
- package/dist/core/target.js.map +1 -1
- package/dist/core/targetPlan.js +160 -39
- package/dist/core/targetPlan.js.map +1 -1
- package/dist/drivers/DirectDriver.js +317 -43
- package/dist/drivers/DirectDriver.js.map +1 -1
- package/dist/drivers/SimctlDriver.js +124 -8
- package/dist/drivers/SimctlDriver.js.map +1 -1
- package/dist/drivers/WdaDriver.js +365 -55
- package/dist/drivers/WdaDriver.js.map +1 -1
- package/dist/explore/candidates.js +7 -3
- package/dist/explore/candidates.js.map +1 -1
- package/dist/explore/graph.js +15 -6
- package/dist/explore/graph.js.map +1 -1
- package/dist/explore/memory.js +4 -1
- package/dist/explore/memory.js.map +1 -1
- package/dist/explore/planner.js +54 -9
- package/dist/explore/planner.js.map +1 -1
- package/dist/explore/policy.js +11 -6
- package/dist/explore/policy.js.map +1 -1
- package/dist/explore/runner.js +363 -190
- package/dist/explore/runner.js.map +1 -1
- package/dist/explore/signatures.js +4 -2
- package/dist/explore/signatures.js.map +1 -1
- package/dist/explore/suite.js +3 -1
- package/dist/explore/suite.js.map +1 -1
- package/dist/featureTesting/executionBootstrap.js +137 -29
- package/dist/featureTesting/executionBootstrap.js.map +1 -1
- package/dist/featureTesting/featureMap.js +6 -3
- package/dist/featureTesting/featureMap.js.map +1 -1
- package/dist/featureTesting/featureScope.js +101 -20
- package/dist/featureTesting/featureScope.js.map +1 -1
- package/dist/featureTesting/mapFeatureScope.js +44 -15
- package/dist/featureTesting/mapFeatureScope.js.map +1 -1
- package/dist/featureTesting/objectiveModel.js +15 -11
- package/dist/featureTesting/objectiveModel.js.map +1 -1
- package/dist/featureTesting/resultMerge.js +16 -8
- package/dist/featureTesting/resultMerge.js.map +1 -1
- package/dist/featureTesting/sources.js +8 -5
- package/dist/featureTesting/sources.js.map +1 -1
- package/dist/featureTesting/suiteBridge.js +8 -2
- package/dist/featureTesting/suiteBridge.js.map +1 -1
- package/dist/featureTesting/synonyms.js +32 -4
- package/dist/featureTesting/synonyms.js.map +1 -1
- package/dist/featureTesting/testCaseFactory.js +27 -15
- package/dist/featureTesting/testCaseFactory.js.map +1 -1
- package/dist/featureTesting/testPlan.js +34 -12
- package/dist/featureTesting/testPlan.js.map +1 -1
- package/dist/firstRun/authStateMachine.js +1 -1
- package/dist/firstRun/authStateMachine.js.map +1 -1
- package/dist/firstRun/classifyScreen.js +9 -6
- package/dist/firstRun/classifyScreen.js.map +1 -1
- package/dist/firstRun/firstRunPlanner.js +16 -13
- package/dist/firstRun/firstRunPlanner.js.map +1 -1
- package/dist/firstRun/firstRunRunner.js +92 -31
- package/dist/firstRun/firstRunRunner.js.map +1 -1
- package/dist/firstRun/generatedDataPolicy.js +25 -15
- package/dist/firstRun/generatedDataPolicy.js.map +1 -1
- package/dist/firstRun/inputPlanner.js +45 -11
- package/dist/firstRun/inputPlanner.js.map +1 -1
- package/dist/firstRun/onboardingStateMachine.js +1 -1
- package/dist/firstRun/onboardingStateMachine.js.map +1 -1
- package/dist/firstRun/paywallPolicy.js +3 -3
- package/dist/firstRun/paywallPolicy.js.map +1 -1
- package/dist/firstRun/types.js +1 -1
- package/dist/firstRun/types.js.map +1 -1
- package/dist/fixtures/catalog.js +72 -9
- package/dist/fixtures/catalog.js.map +1 -1
- package/dist/fixtures/load.js +50 -0
- package/dist/fixtures/load.js.map +1 -0
- package/dist/flows/discover.js +2 -2
- package/dist/flows/discover.js.map +1 -1
- package/dist/flows/generate.js +68 -17
- package/dist/flows/generate.js.map +1 -1
- package/dist/flows/lint.js +88 -14
- package/dist/flows/lint.js.map +1 -1
- package/dist/flows/pack.js +21 -5
- package/dist/flows/pack.js.map +1 -1
- package/dist/flows/paths.js +57 -0
- package/dist/flows/paths.js.map +1 -0
- package/dist/flows/repair.js +176 -37
- package/dist/flows/repair.js.map +1 -1
- package/dist/flows/run.js +308 -99
- package/dist/flows/run.js.map +1 -1
- package/dist/flows/schema.js +107 -25
- package/dist/flows/schema.js.map +1 -1
- package/dist/flows/seedExec.js +8 -4
- package/dist/flows/seedExec.js.map +1 -1
- package/dist/flows/templates.js +5 -5
- package/dist/index.js +50 -8
- package/dist/index.js.map +1 -1
- package/dist/ios/signing.js +32 -3
- package/dist/ios/signing.js.map +1 -1
- package/dist/issues/classify.js +28 -20
- package/dist/issues/classify.js.map +1 -1
- package/dist/issues/fingerprint.js +35 -9
- package/dist/issues/fingerprint.js.map +1 -1
- package/dist/issues/index.js +93 -46
- package/dist/issues/index.js.map +1 -1
- package/dist/issues/metrics.js +6 -5
- package/dist/issues/metrics.js.map +1 -1
- package/dist/issues/recurrence.js +35 -8
- package/dist/issues/recurrence.js.map +1 -1
- package/dist/issues/report.js +12 -8
- package/dist/issues/report.js.map +1 -1
- package/dist/issues/reportBridge.js +40 -9
- package/dist/issues/reportBridge.js.map +1 -1
- package/dist/issues/schema.js +2 -2
- package/dist/issues/schema.js.map +1 -1
- package/dist/issues/sourceRevision.js +2 -2
- package/dist/issues/sourceRevision.js.map +1 -1
- package/dist/issues/store.js +110 -32
- package/dist/issues/store.js.map +1 -1
- package/dist/lib/abortScope.js +48 -0
- package/dist/lib/abortScope.js.map +1 -0
- package/dist/lib/android.js +84 -8
- package/dist/lib/android.js.map +1 -1
- package/dist/lib/coordSpace.js +1 -1
- package/dist/lib/coordSpace.js.map +1 -1
- package/dist/lib/device.js +53 -12
- package/dist/lib/device.js.map +1 -1
- package/dist/lib/gestures.js +141 -0
- package/dist/lib/gestures.js.map +1 -0
- package/dist/lib/gitignore.js +4 -3
- package/dist/lib/gitignore.js.map +1 -1
- package/dist/lib/image.js +12 -3
- package/dist/lib/image.js.map +1 -1
- package/dist/lib/lockfile.js +399 -0
- package/dist/lib/lockfile.js.map +1 -0
- package/dist/lib/needsInput.js +9 -6
- package/dist/lib/needsInput.js.map +1 -1
- package/dist/lib/png.js +4 -3
- package/dist/lib/png.js.map +1 -1
- package/dist/lib/redact.js +170 -9
- package/dist/lib/redact.js.map +1 -1
- package/dist/lib/result.js +94 -10
- package/dist/lib/result.js.map +1 -1
- package/dist/lib/schemaHash.js +7 -5
- package/dist/lib/schemaHash.js.map +1 -1
- package/dist/lib/sensitive.js +6 -3
- package/dist/lib/sensitive.js.map +1 -1
- package/dist/lib/simctl.js +3 -3
- package/dist/lib/simctl.js.map +1 -1
- package/dist/lib/spawn.js +78 -17
- package/dist/lib/spawn.js.map +1 -1
- package/dist/lib/toolAnnotations.js +114 -0
- package/dist/lib/toolAnnotations.js.map +1 -0
- package/dist/lib/wda.js +321 -25
- package/dist/lib/wda.js.map +1 -1
- package/dist/lib/wdaConfig.js +12 -5
- package/dist/lib/wdaConfig.js.map +1 -1
- package/dist/lib/wdaTune.js +52 -23
- package/dist/lib/wdaTune.js.map +1 -1
- package/dist/mobileAudit/checks.js +150 -28
- package/dist/mobileAudit/checks.js.map +1 -1
- package/dist/mobileAudit/evidence.js +4 -4
- package/dist/mobileAudit/evidence.js.map +1 -1
- package/dist/mobileAudit/profiles.js +121 -20
- package/dist/mobileAudit/profiles.js.map +1 -1
- package/dist/mobileAudit/results.js +9 -4
- package/dist/mobileAudit/results.js.map +1 -1
- package/dist/mobileAudit/runner.js +214 -35
- package/dist/mobileAudit/runner.js.map +1 -1
- package/dist/oracle/auth.js +1 -1
- package/dist/oracle/auth.js.map +1 -1
- package/dist/oracle/failures.js +1085 -145
- package/dist/oracle/failures.js.map +1 -1
- package/dist/oracle/health.js +148 -26
- package/dist/oracle/health.js.map +1 -1
- package/dist/oracle/locator.js +148 -19
- package/dist/oracle/locator.js.map +1 -1
- package/dist/oracle/record.js +3 -3
- package/dist/oracle/record.js.map +1 -1
- package/dist/orchestration/envelope.js +2 -2
- package/dist/orchestration/envelope.js.map +1 -1
- package/dist/orchestration/goal.js +7 -13
- package/dist/orchestration/goal.js.map +1 -1
- package/dist/orchestration/testThis/execute.js +167 -0
- package/dist/orchestration/testThis/execute.js.map +1 -0
- package/dist/orchestration/testThis/pipeline.js +413 -0
- package/dist/orchestration/testThis/pipeline.js.map +1 -0
- package/dist/orchestration/testThis/plan.js +519 -0
- package/dist/orchestration/testThis/plan.js.map +1 -0
- package/dist/orchestration/testThis/sessionIntent.js +72 -0
- package/dist/orchestration/testThis/sessionIntent.js.map +1 -0
- package/dist/orchestration/testThis/terminal.js +136 -0
- package/dist/orchestration/testThis/terminal.js.map +1 -0
- package/dist/orchestration/testThis/types.js +12 -0
- package/dist/orchestration/testThis/types.js.map +1 -0
- package/dist/plan/plan.js +9 -9
- package/dist/plan/plan.js.map +1 -1
- package/dist/prompts/index.js +24 -24
- package/dist/prompts/index.js.map +1 -1
- package/dist/report/coverage.js +0 -1
- package/dist/report/coverage.js.map +1 -1
- package/dist/report/evidence.js.map +1 -1
- package/dist/report/export.js +449 -72
- package/dist/report/export.js.map +1 -1
- package/dist/report/findingsDedupe.js +41 -0
- package/dist/report/findingsDedupe.js.map +1 -0
- package/dist/report/flake.js +13 -14
- package/dist/report/flake.js.map +1 -1
- package/dist/report/history.js +72 -38
- package/dist/report/history.js.map +1 -1
- package/dist/report/policy.js +18 -7
- package/dist/report/policy.js.map +1 -1
- package/dist/report/qaLevel.js +10 -16
- package/dist/report/qaLevel.js.map +1 -1
- package/dist/report/readiness.js +42 -12
- package/dist/report/readiness.js.map +1 -1
- package/dist/report/sarifSources.js +160 -0
- package/dist/report/sarifSources.js.map +1 -0
- package/dist/report/summary.js +2 -2
- package/dist/report/summary.js.map +1 -1
- package/dist/report/testCatalog.js +4 -4
- package/dist/report/testCatalog.js.map +1 -1
- package/dist/report/timing.js +23 -23
- package/dist/report/timing.js.map +1 -1
- package/dist/report/toolHealth.js +124 -0
- package/dist/report/toolHealth.js.map +1 -0
- package/dist/server.js +501 -69
- package/dist/server.js.map +1 -1
- package/dist/services/automationGenerate.js +8 -2
- package/dist/services/automationGenerate.js.map +1 -1
- package/dist/services/build.js +10 -4
- package/dist/services/build.js.map +1 -1
- package/dist/services/flowGenerate.js +75 -0
- package/dist/services/flowGenerate.js.map +1 -0
- package/dist/services/preflight.js +40 -8
- package/dist/services/preflight.js.map +1 -1
- package/dist/services/prepareAndroid.js +92 -18
- package/dist/services/prepareAndroid.js.map +1 -1
- package/dist/services/prepareIos.js +94 -17
- package/dist/services/prepareIos.js.map +1 -1
- package/dist/services/report.js +271 -80
- package/dist/services/report.js.map +1 -1
- package/dist/services/smoke.js +68 -22
- package/dist/services/smoke.js.map +1 -1
- package/dist/services/suiteGenerate.js +43 -6
- package/dist/services/suiteGenerate.js.map +1 -1
- package/dist/services/testSuiteKnowledge.js +78 -33
- package/dist/services/testSuiteKnowledge.js.map +1 -1
- package/dist/session/attach.js +284 -4
- package/dist/session/attach.js.map +1 -1
- package/dist/session/processRegistry.js +433 -0
- package/dist/session/processRegistry.js.map +1 -0
- package/dist/session/progress.js +1 -1
- package/dist/session/progress.js.map +1 -1
- package/dist/session/retention.js +201 -0
- package/dist/session/retention.js.map +1 -0
- package/dist/session/store.js +459 -59
- package/dist/session/store.js.map +1 -1
- package/dist/snapshot/overlays.js +60 -10
- package/dist/snapshot/overlays.js.map +1 -1
- package/dist/snapshot/parse.js +30 -12
- package/dist/snapshot/parse.js.map +1 -1
- package/dist/snapshot/present.js +36 -6
- package/dist/snapshot/present.js.map +1 -1
- package/dist/snapshot/settle.js +39 -9
- package/dist/snapshot/settle.js.map +1 -1
- package/dist/state/consent.js +99 -0
- package/dist/state/consent.js.map +1 -0
- package/dist/state/profile.js +82 -11
- package/dist/state/profile.js.map +1 -1
- package/dist/suite/compile.js +15 -6
- package/dist/suite/compile.js.map +1 -1
- package/dist/suite/lint.js +22 -4
- package/dist/suite/lint.js.map +1 -1
- package/dist/suite/pom.js +75 -44
- package/dist/suite/pom.js.map +1 -1
- package/dist/suite/secretGuard.js +266 -0
- package/dist/suite/secretGuard.js.map +1 -0
- package/dist/suite/testcase.js +15 -11
- package/dist/suite/testcase.js.map +1 -1
- package/dist/testSuite/exporter.js +7 -3
- package/dist/testSuite/exporter.js.map +1 -1
- package/dist/testSuite/generator.js +43 -14
- package/dist/testSuite/generator.js.map +1 -1
- package/dist/testSuite/history.js +1 -1
- package/dist/testSuite/history.js.map +1 -1
- package/dist/testSuite/issueLinks.js +3 -3
- package/dist/testSuite/issueLinks.js.map +1 -1
- package/dist/testSuite/lint.js +4 -4
- package/dist/testSuite/lint.js.map +1 -1
- package/dist/testSuite/merge.js +13 -7
- package/dist/testSuite/merge.js.map +1 -1
- package/dist/testSuite/schema.js +21 -16
- package/dist/testSuite/schema.js.map +1 -1
- package/dist/testSuite/store.js +12 -4
- package/dist/testSuite/store.js.map +1 -1
- package/dist/testSuite/traceability.js +2 -2
- package/dist/testSuite/traceability.js.map +1 -1
- package/dist/tools/act.js +868 -174
- package/dist/tools/act.js.map +1 -1
- package/dist/tools/agent.js +521 -112
- package/dist/tools/agent.js.map +1 -1
- package/dist/tools/appControl.js +82 -19
- package/dist/tools/appControl.js.map +1 -1
- package/dist/tools/appMap.js +393 -189
- package/dist/tools/appMap.js.map +1 -1
- package/dist/tools/build.js +92 -51
- package/dist/tools/build.js.map +1 -1
- package/dist/tools/bundletool.js +141 -40
- package/dist/tools/bundletool.js.map +1 -1
- package/dist/tools/clearOverlay.js +98 -18
- package/dist/tools/clearOverlay.js.map +1 -1
- package/dist/tools/device.js +108 -19
- package/dist/tools/device.js.map +1 -1
- package/dist/tools/doctor.js +98 -35
- package/dist/tools/doctor.js.map +1 -1
- package/dist/tools/explore.js +110 -42
- package/dist/tools/explore.js.map +1 -1
- package/dist/tools/featureTesting.js +152 -130
- package/dist/tools/featureTesting.js.map +1 -1
- package/dist/tools/firstRun.js +94 -66
- package/dist/tools/firstRun.js.map +1 -1
- package/dist/tools/flow.js +347 -132
- package/dist/tools/flow.js.map +1 -1
- package/dist/tools/flowRepair.js +42 -10
- package/dist/tools/flowRepair.js.map +1 -1
- package/dist/tools/generate.js +199 -0
- package/dist/tools/generate.js.map +1 -0
- package/dist/tools/getArtifact.js +37 -8
- package/dist/tools/getArtifact.js.map +1 -1
- package/dist/tools/health.js +17 -12
- package/dist/tools/health.js.map +1 -1
- package/dist/tools/ios.js +148 -194
- package/dist/tools/ios.js.map +1 -1
- package/dist/tools/issues.js +256 -171
- package/dist/tools/issues.js.map +1 -1
- package/dist/tools/jobs.js +55 -11
- package/dist/tools/jobs.js.map +1 -1
- package/dist/tools/metro.js +84 -38
- package/dist/tools/metro.js.map +1 -1
- package/dist/tools/mobileAudit.js +83 -26
- package/dist/tools/mobileAudit.js.map +1 -1
- package/dist/tools/network.js +36 -14
- package/dist/tools/network.js.map +1 -1
- package/dist/tools/note.js +31 -17
- package/dist/tools/note.js.map +1 -1
- package/dist/tools/prepareIosTarget.js +31 -14
- package/dist/tools/prepareIosTarget.js.map +1 -1
- package/dist/tools/prepareTarget.js +193 -47
- package/dist/tools/prepareTarget.js.map +1 -1
- package/dist/tools/report.js +16 -8
- package/dist/tools/report.js.map +1 -1
- package/dist/tools/resolveArtifact.js +12 -12
- package/dist/tools/resolveArtifact.js.map +1 -1
- package/dist/tools/resolveTarget.js +81 -18
- package/dist/tools/resolveTarget.js.map +1 -1
- package/dist/tools/screenRecord.js +85 -20
- package/dist/tools/screenRecord.js.map +1 -1
- package/dist/tools/screenshot.js +42 -18
- package/dist/tools/screenshot.js.map +1 -1
- package/dist/tools/smoke.js +29 -12
- package/dist/tools/smoke.js.map +1 -1
- package/dist/tools/snapshot.js +157 -107
- package/dist/tools/snapshot.js.map +1 -1
- package/dist/tools/startSession.js +117 -84
- package/dist/tools/startSession.js.map +1 -1
- package/dist/tools/suite.js +391 -310
- package/dist/tools/suite.js.map +1 -1
- package/dist/tools/testSuite.js +112 -36
- package/dist/tools/testSuite.js.map +1 -1
- package/dist/tools/testThis.js +35 -802
- package/dist/tools/testThis.js.map +1 -1
- package/dist/tools/visual.js +698 -116
- package/dist/tools/visual.js.map +1 -1
- package/dist/tools/wait.js +9 -23
- package/dist/tools/wait.js.map +1 -1
- package/dist/tools/wda.js +312 -54
- package/dist/tools/wda.js.map +1 -1
- package/dist/version.js +37 -64
- package/dist/version.js.map +1 -1
- package/dist/visual/ocr.js +65 -8
- package/dist/visual/ocr.js.map +1 -1
- package/dist/visual/provider.js +87 -15
- package/dist/visual/provider.js.map +1 -1
- package/docs/README.md +24 -10
- package/docs/ci-reports.md +328 -0
- package/docs/concepts.md +227 -0
- package/docs/flows.md +153 -0
- package/docs/mcp-server.md +210 -104
- package/docs/physical-devices.md +84 -0
- package/docs/tools.md +808 -217
- package/package.json +16 -6
- package/dist/appMap/diff.js +0 -60
- package/dist/appMap/diff.js.map +0 -1
- package/dist/automation/maestroIr.js +0 -282
- package/dist/automation/maestroIr.js.map +0 -1
- package/dist/interop/maestro.js +0 -151
- package/dist/interop/maestro.js.map +0 -1
- package/dist/tools/assertVisual.js +0 -74
- package/dist/tools/assertVisual.js.map +0 -1
- package/dist/tools/automationGenerate.js +0 -394
- package/dist/tools/automationGenerate.js.map +0 -1
- package/dist/tools/capabilities.js +0 -209
- package/dist/tools/capabilities.js.map +0 -1
- package/dist/tools/detectContext.js +0 -41
- package/dist/tools/detectContext.js.map +0 -1
- package/dist/tools/flowGenerate.js +0 -55
- package/dist/tools/flowGenerate.js.map +0 -1
- package/dist/tools/history.js +0 -56
- package/dist/tools/history.js.map +0 -1
- package/dist/tools/idling.js +0 -104
- package/dist/tools/idling.js.map +0 -1
- package/dist/tools/inputCapabilities.js +0 -30
- package/dist/tools/inputCapabilities.js.map +0 -1
- package/dist/tools/locator.js +0 -57
- package/dist/tools/locator.js.map +0 -1
- package/dist/tools/maestro.js +0 -78
- package/dist/tools/maestro.js.map +0 -1
- package/dist/tools/permissions.js +0 -149
- package/dist/tools/permissions.js.map +0 -1
- package/dist/tools/plan.js +0 -49
- package/dist/tools/plan.js.map +0 -1
- package/dist/tools/screenInfo.js +0 -70
- package/dist/tools/screenInfo.js.map +0 -1
- package/dist/tools/seed.js +0 -101
- package/dist/tools/seed.js.map +0 -1
- package/dist/tools/state.js +0 -170
- package/dist/tools/state.js.map +0 -1
- package/dist/tools/visualText.js +0 -61
- package/dist/tools/visualText.js.map +0 -1
|
@@ -0,0 +1,399 @@
|
|
|
1
|
+
// Minimal advisory file lock for cross-process coordination on the small shared JSON files
|
|
2
|
+
// under ~/.swipium (registry.json, processes.json) and .swipium/app-map.json. Two concurrent
|
|
3
|
+
// server instances are common (multiple MCP clients), and an unlocked read-modify-write lets them
|
|
4
|
+
// clobber each other's entries. The lock is a DIRECTORY (mkdir is atomic on POSIX and Windows):
|
|
5
|
+
// whoever creates it holds it. Each acquisition writes an OWNER file (`<lockPath>/owner` =
|
|
6
|
+
// `pid:token`, created exclusively) so release can verify the lock is still ours. A holder that
|
|
7
|
+
// stalled past the stale threshold and was taken over must NOT delete the new owner's lock.
|
|
8
|
+
//
|
|
9
|
+
// Stale takeover (holder crashed mid-write) is CLAIM-then-MOVE (H8, review round 2):
|
|
10
|
+
// 1. claim: the taker creates `<lockPath>/.takeover` EXCLUSIVELY ('wx', with its own token).
|
|
11
|
+
// Only one taker can claim a given lock-directory instance, and the lock path never
|
|
12
|
+
// disappears during a failed claim, so a newcomer can't slip in;
|
|
13
|
+
// 2. verify: the claimed directory must still be exactly the lock it judged stale (same owner,
|
|
14
|
+
// still old before the claim, same inode after it). If a racing waiter already replaced it with a FRESH lock, the claim is dropped
|
|
15
|
+
// and the fresh lock is left untouched (it never moved);
|
|
16
|
+
// 3. move: rename the lock to a unique tombstone (`<lockPath>.stale-<pid>-<uuid>`), confirm the
|
|
17
|
+
// tombstone carries OUR claim (i.e. we moved the instance we verified), delete it, retry mkdir.
|
|
18
|
+
// Residual race: between verify and move the path can only change if the presumed-dead holder
|
|
19
|
+
// wakes up and releases, and a new holder re-creates the lock, inside that window. The post-move
|
|
20
|
+
// claim check catches it: the moved lock is renamed back. If that restore fails because yet
|
|
21
|
+
// another contender already created the path, the taker does NOT proceed (takeover failed > it
|
|
22
|
+
// goes back to waiting) and does NOT delete the moved lock. It stays as a tombstone (never
|
|
23
|
+
// treated as safe to rm while it may belong to a live holder) and is swept once older than the
|
|
24
|
+
// stale threshold; the displaced holder is warned at release and removes its own tombstone.
|
|
25
|
+
// Orphaned tombstones / claims (a taker crashed mid-takeover) are swept / expired as stale.
|
|
26
|
+
//
|
|
27
|
+
// Two variants:
|
|
28
|
+
// - withFileLock (sync): for the tiny synchronous JSON rewrites (registry/processes/app-map
|
|
29
|
+
// save). Waits are short synchronous sleeps (Atomics.wait, 25 ms slices, ≤ MAX_WAIT_MS total),
|
|
30
|
+
// so the critical section MUST be short: a sync fn cannot be heartbeated (no timer can fire
|
|
31
|
+
// while it runs). Slow work (e.g. the app-map static scan) belongs OUTSIDE the lock.
|
|
32
|
+
// - withFileLockAsync: for async critical sections. Waits yield to the event loop and a heartbeat
|
|
33
|
+
// refreshes the lock's mtime every staleMs/3 so a long holder is never judged stale.
|
|
34
|
+
// On timeout both variants fail rather than proceed unlocked (that would reintroduce clobbers).
|
|
35
|
+
import { mkdirSync, readFileSync, readdirSync, renameSync, rmSync, statSync, utimesSync, writeFileSync } from 'node:fs';
|
|
36
|
+
import { randomUUID } from 'node:crypto';
|
|
37
|
+
import { basename, dirname, join } from 'node:path';
|
|
38
|
+
import { log } from './logger.js';
|
|
39
|
+
export const STALE_LOCK_MS = 10_000;
|
|
40
|
+
const MAX_WAIT_MS = 2_000;
|
|
41
|
+
const RETRY_SLEEP_MS = 25;
|
|
42
|
+
/** 'retry' (lock vanished / stale takeover attempted) loops without sleeping at most this many
|
|
43
|
+
* times in a row; after that it sleeps like 'busy'. A takeover that can never succeed (EACCES on
|
|
44
|
+
* the claim, rename failure, a fresh claim from a crashed taker) must not busy-spin, since it would
|
|
45
|
+
* block the event loop forever (the deadline is checked on EVERY iteration too). */
|
|
46
|
+
const MAX_IMMEDIATE_RETRIES = 3;
|
|
47
|
+
const OWNER_FILE = 'owner';
|
|
48
|
+
const TOMBSTONE_MARK = '.stale-';
|
|
49
|
+
const CLAIM_FILE = '.takeover';
|
|
50
|
+
/** Test seams for simulating contender interleavings inside a takeover. Never set in production. */
|
|
51
|
+
export const lockHooks = {};
|
|
52
|
+
/** Synchronous sleep without spinning the CPU (Node allows Atomics.wait on the main thread).
|
|
53
|
+
* Only ever called with short slices (RETRY_SLEEP_MS / rename backoff). */
|
|
54
|
+
function sleepSync(ms) {
|
|
55
|
+
Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms);
|
|
56
|
+
}
|
|
57
|
+
/** The `pid:token` string of the lock's current owner, or null when absent/unreadable. */
|
|
58
|
+
function currentOwner(lockPath) {
|
|
59
|
+
try {
|
|
60
|
+
return readFileSync(join(lockPath, OWNER_FILE), 'utf8');
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
function readFileOrNull(p) {
|
|
67
|
+
try {
|
|
68
|
+
return readFileSync(p, 'utf8');
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/** Remove our takeover claim from `dir` (only if it is still ours). */
|
|
75
|
+
function dropClaim(dir, claimToken) {
|
|
76
|
+
const claim = join(dir, CLAIM_FILE);
|
|
77
|
+
if (readFileOrNull(claim) === claimToken)
|
|
78
|
+
rmSync(claim, { force: true });
|
|
79
|
+
}
|
|
80
|
+
/** A claim left by a taker that crashed mid-takeover would block every future takeover of that
|
|
81
|
+
* lock: expire it once older than the stale threshold (moved aside atomically, then removed). */
|
|
82
|
+
function expireStaleClaim(lockPath, staleMs) {
|
|
83
|
+
const claim = join(lockPath, CLAIM_FILE);
|
|
84
|
+
try {
|
|
85
|
+
if (Date.now() - statSync(claim).mtimeMs <= staleMs)
|
|
86
|
+
return;
|
|
87
|
+
const lockStat = statSync(lockPath);
|
|
88
|
+
const dead = `${claim}.dead-${randomUUID()}`;
|
|
89
|
+
renameSync(claim, dead);
|
|
90
|
+
rmSync(dead, { force: true });
|
|
91
|
+
// Removing the claim bumped the lock dir's mtime; keep it looking as stale as it is.
|
|
92
|
+
utimesSync(lockPath, lockStat.atime, lockStat.mtime);
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
/* gone or raced another expirer */
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/** Take over a lock judged stale (claim > verify > move; see the header). Returns true when the
|
|
99
|
+
* stale lock was removed (the caller should retry mkdir), false when the takeover failed and the
|
|
100
|
+
* caller must go back to waiting: the lock was already gone, another taker holds the claim, a
|
|
101
|
+
* racing waiter replaced it with a fresh lock (left untouched), or the moved lock turned out not
|
|
102
|
+
* to be the verified one (restored, or kept as a tombstone if the path was re-created meanwhile).
|
|
103
|
+
* Exported for tests. */
|
|
104
|
+
export function takeOverStaleLock(lockPath, observed, staleMs = STALE_LOCK_MS) {
|
|
105
|
+
const claimToken = `${process.pid}:${randomUUID()}`;
|
|
106
|
+
// Identify the instance BEFORE claiming (writing the claim bumps the directory's mtime).
|
|
107
|
+
let before;
|
|
108
|
+
try {
|
|
109
|
+
const st = statSync(lockPath);
|
|
110
|
+
if (currentOwner(lockPath) !== observed.owner || Date.now() - st.mtimeMs <= staleMs)
|
|
111
|
+
return false; // replaced/refreshed
|
|
112
|
+
before = { ino: st.ino, dev: st.dev };
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
return false; // already gone
|
|
116
|
+
}
|
|
117
|
+
try {
|
|
118
|
+
writeFileSync(join(lockPath, CLAIM_FILE), claimToken, { flag: 'wx' });
|
|
119
|
+
}
|
|
120
|
+
catch (e) {
|
|
121
|
+
if (e.code === 'EEXIST')
|
|
122
|
+
expireStaleClaim(lockPath, staleMs);
|
|
123
|
+
return false; // lock gone (ENOENT) or another taker is mid-takeover
|
|
124
|
+
}
|
|
125
|
+
let isSame = false;
|
|
126
|
+
try {
|
|
127
|
+
const st = statSync(lockPath);
|
|
128
|
+
isSame = st.ino === before.ino && st.dev === before.dev && currentOwner(lockPath) === observed.owner;
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
isSame = false;
|
|
132
|
+
}
|
|
133
|
+
if (!isSame) {
|
|
134
|
+
// We claimed a FRESH lock (a racing waiter won the takeover and re-acquired after our
|
|
135
|
+
// observation). It never moved: just withdraw the claim.
|
|
136
|
+
dropClaim(lockPath, claimToken);
|
|
137
|
+
return false;
|
|
138
|
+
}
|
|
139
|
+
lockHooks.beforeTakeoverMove?.();
|
|
140
|
+
const tomb = `${lockPath}${TOMBSTONE_MARK}${process.pid}-${randomUUID()}`;
|
|
141
|
+
try {
|
|
142
|
+
renameSync(lockPath, tomb); // atomic
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
return false; // released meanwhile
|
|
146
|
+
}
|
|
147
|
+
if (readFileOrNull(join(tomb, CLAIM_FILE)) !== claimToken) {
|
|
148
|
+
// The path was replaced between verify and move: we moved someone else's (possibly live) lock.
|
|
149
|
+
lockHooks.beforeTakeoverRestore?.();
|
|
150
|
+
try {
|
|
151
|
+
renameSync(tomb, lockPath); // put it back untouched
|
|
152
|
+
}
|
|
153
|
+
catch {
|
|
154
|
+
// Another contender already re-created the path. Do NOT delete the moved lock (it may belong
|
|
155
|
+
// to a live holder) and do NOT proceed as owner: the takeover failed. The tombstone is swept
|
|
156
|
+
// once stale; its holder is warned at release.
|
|
157
|
+
log('error', 'file lock takeover moved a replaced lock and could not restore it; left as tombstone, not acquiring', {
|
|
158
|
+
lockPath,
|
|
159
|
+
tomb,
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
return false;
|
|
163
|
+
}
|
|
164
|
+
rmSync(tomb, { recursive: true, force: true });
|
|
165
|
+
return true;
|
|
166
|
+
}
|
|
167
|
+
/** Remove tombstones left by a taker that crashed between rename and rm. Best-effort. */
|
|
168
|
+
export function sweepLockTombstones(lockPath, staleMs = STALE_LOCK_MS) {
|
|
169
|
+
let removed = 0;
|
|
170
|
+
try {
|
|
171
|
+
const dir = dirname(lockPath);
|
|
172
|
+
const prefix = `${basename(lockPath)}${TOMBSTONE_MARK}`;
|
|
173
|
+
for (const name of readdirSync(dir)) {
|
|
174
|
+
if (!name.startsWith(prefix))
|
|
175
|
+
continue;
|
|
176
|
+
const p = join(dir, name);
|
|
177
|
+
try {
|
|
178
|
+
if (Date.now() - statSync(p).mtimeMs > staleMs) {
|
|
179
|
+
rmSync(p, { recursive: true, force: true });
|
|
180
|
+
removed++;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
catch {
|
|
184
|
+
/* raced another sweeper */
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
catch {
|
|
189
|
+
/* parent missing/unreadable, nothing to sweep */
|
|
190
|
+
}
|
|
191
|
+
return removed;
|
|
192
|
+
}
|
|
193
|
+
/** One acquisition attempt: mkdir, else stale-check/takeover. Never sleeps. */
|
|
194
|
+
function tryAcquire(lockPath, token, staleMs) {
|
|
195
|
+
try {
|
|
196
|
+
mkdirSync(lockPath); // atomic: throws EEXIST if another process holds the lock
|
|
197
|
+
}
|
|
198
|
+
catch (e) {
|
|
199
|
+
if (e.code !== 'EEXIST')
|
|
200
|
+
throw e;
|
|
201
|
+
let observed;
|
|
202
|
+
try {
|
|
203
|
+
observed = { owner: currentOwner(lockPath), mtimeMs: statSync(lockPath).mtimeMs };
|
|
204
|
+
}
|
|
205
|
+
catch {
|
|
206
|
+
return 'retry'; // lock released between attempts, retry immediately
|
|
207
|
+
}
|
|
208
|
+
if (Date.now() - observed.mtimeMs > staleMs) {
|
|
209
|
+
// stale: the holder crashed or stalled; take over atomically, then retry mkdir
|
|
210
|
+
takeOverStaleLock(lockPath, observed, staleMs);
|
|
211
|
+
return 'retry';
|
|
212
|
+
}
|
|
213
|
+
return 'busy';
|
|
214
|
+
}
|
|
215
|
+
// We created the dir. Record ownership EXCLUSIVELY ('wx'): if an owner file already exists the
|
|
216
|
+
// directory is not really ours (a takeover restore swapped a live lock into this path).
|
|
217
|
+
try {
|
|
218
|
+
writeFileSync(join(lockPath, OWNER_FILE), token, { flag: 'wx' });
|
|
219
|
+
}
|
|
220
|
+
catch (e) {
|
|
221
|
+
if (e.code === 'EEXIST')
|
|
222
|
+
return 'busy';
|
|
223
|
+
rmSync(lockPath, { recursive: true, force: true });
|
|
224
|
+
throw e;
|
|
225
|
+
}
|
|
226
|
+
// Re-check ownership after acquiring: the lock we hold must carry OUR token.
|
|
227
|
+
if (currentOwner(lockPath) !== token)
|
|
228
|
+
return 'busy';
|
|
229
|
+
sweepLockTombstones(lockPath, staleMs);
|
|
230
|
+
return 'acquired';
|
|
231
|
+
}
|
|
232
|
+
function release(lockPath, token) {
|
|
233
|
+
// Verify-then-release: only remove the lock while the owner file still holds OUR token. If fn()
|
|
234
|
+
// stalled past the stale threshold another process legitimately took the lock over, and deleting it
|
|
235
|
+
// here would let a THIRD process acquire while the new owner still runs.
|
|
236
|
+
if (currentOwner(lockPath) === token) {
|
|
237
|
+
try {
|
|
238
|
+
rmSync(lockPath, { recursive: true, force: true });
|
|
239
|
+
}
|
|
240
|
+
catch {
|
|
241
|
+
/* already removed (stale takeover raced our release) */
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
else {
|
|
245
|
+
log('warn', 'file lock was taken over while held: this holder stalled past the stale threshold (or was displaced by a takeover race) and its work may have raced the new holder', { lockPath });
|
|
246
|
+
removeOwnTombstones(lockPath, token);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
/** A displaced holder's lock may survive as a tombstone (see takeOverStaleLock): remove the ones
|
|
250
|
+
* carrying OUR token. They are ours, so this can never touch another holder's lock. */
|
|
251
|
+
function removeOwnTombstones(lockPath, token) {
|
|
252
|
+
try {
|
|
253
|
+
const dir = dirname(lockPath);
|
|
254
|
+
const prefix = `${basename(lockPath)}${TOMBSTONE_MARK}`;
|
|
255
|
+
for (const name of readdirSync(dir)) {
|
|
256
|
+
if (!name.startsWith(prefix))
|
|
257
|
+
continue;
|
|
258
|
+
const p = join(dir, name);
|
|
259
|
+
if (currentOwner(p) === token)
|
|
260
|
+
rmSync(p, { recursive: true, force: true });
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
catch {
|
|
264
|
+
/* best-effort */
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
function newToken() {
|
|
268
|
+
// Ownership token: verify identity before acting (the same spirit as processRegistry's
|
|
269
|
+
// serverStillAlive pid+command check).
|
|
270
|
+
return `${process.pid}:${randomUUID()}`;
|
|
271
|
+
}
|
|
272
|
+
function timeoutError(lockPath) {
|
|
273
|
+
log('error', 'file lock wait timed out, refusing unlocked registry mutation', { lockPath });
|
|
274
|
+
return new Error(`Timed out waiting for file lock ${lockPath}`);
|
|
275
|
+
}
|
|
276
|
+
/** Run a SHORT synchronous `fn` while holding the advisory lock at `lockPath` (a directory that
|
|
277
|
+
* must not pre-exist). Retries for up to maxWaitMs (blocking in 25 ms slices), taking over locks
|
|
278
|
+
* older than staleMs. fn cannot be heartbeated, so keep it well under staleMs. */
|
|
279
|
+
export function withFileLock(lockPath, fn, opts = {}) {
|
|
280
|
+
const staleMs = opts.staleMs ?? STALE_LOCK_MS;
|
|
281
|
+
const deadline = Date.now() + (opts.maxWaitMs ?? MAX_WAIT_MS);
|
|
282
|
+
const token = newToken();
|
|
283
|
+
let immediate = 0;
|
|
284
|
+
for (;;) {
|
|
285
|
+
const r = tryAcquire(lockPath, token, staleMs);
|
|
286
|
+
if (r === 'acquired')
|
|
287
|
+
break;
|
|
288
|
+
if (Date.now() > deadline)
|
|
289
|
+
throw timeoutError(lockPath);
|
|
290
|
+
if (r === 'retry' && immediate++ < MAX_IMMEDIATE_RETRIES)
|
|
291
|
+
continue;
|
|
292
|
+
immediate = 0;
|
|
293
|
+
sleepSync(RETRY_SLEEP_MS);
|
|
294
|
+
}
|
|
295
|
+
try {
|
|
296
|
+
return fn();
|
|
297
|
+
}
|
|
298
|
+
finally {
|
|
299
|
+
release(lockPath, token);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
/** Async variant: waits yield to the event loop, and a heartbeat refreshes the lock's mtime every
|
|
303
|
+
* staleMs/3 while `fn` runs so a long (async) critical section is never judged stale. */
|
|
304
|
+
export async function withFileLockAsync(lockPath, fn, opts = {}) {
|
|
305
|
+
const staleMs = opts.staleMs ?? STALE_LOCK_MS;
|
|
306
|
+
const deadline = Date.now() + (opts.maxWaitMs ?? MAX_WAIT_MS);
|
|
307
|
+
const token = newToken();
|
|
308
|
+
let immediate = 0;
|
|
309
|
+
for (;;) {
|
|
310
|
+
const r = tryAcquire(lockPath, token, staleMs);
|
|
311
|
+
if (r === 'acquired')
|
|
312
|
+
break;
|
|
313
|
+
if (Date.now() > deadline)
|
|
314
|
+
throw timeoutError(lockPath);
|
|
315
|
+
if (r === 'retry' && immediate++ < MAX_IMMEDIATE_RETRIES)
|
|
316
|
+
continue;
|
|
317
|
+
immediate = 0;
|
|
318
|
+
await new Promise((res) => setTimeout(res, RETRY_SLEEP_MS));
|
|
319
|
+
}
|
|
320
|
+
const heartbeat = setInterval(() => {
|
|
321
|
+
// Only refresh a lock that is still ours. Never keep a thief's lock alive on its behalf.
|
|
322
|
+
if (currentOwner(lockPath) !== token)
|
|
323
|
+
return;
|
|
324
|
+
try {
|
|
325
|
+
const now = new Date();
|
|
326
|
+
utimesSync(lockPath, now, now);
|
|
327
|
+
}
|
|
328
|
+
catch {
|
|
329
|
+
/* lock vanished; release will log */
|
|
330
|
+
}
|
|
331
|
+
}, Math.max(10, Math.floor(staleMs / 3)));
|
|
332
|
+
heartbeat.unref?.();
|
|
333
|
+
try {
|
|
334
|
+
return await fn();
|
|
335
|
+
}
|
|
336
|
+
finally {
|
|
337
|
+
clearInterval(heartbeat);
|
|
338
|
+
release(lockPath, token);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
const RENAME_RETRY_CODES = new Set(['EPERM', 'EBUSY', 'EACCES']);
|
|
342
|
+
/** renameSync that tolerates transient Windows sharing violations (antivirus/indexer briefly
|
|
343
|
+
* holding the target): retries EPERM/EBUSY/EACCES with short backoff (≤ ~310 ms total). On
|
|
344
|
+
* POSIX those errors are permanent, so it throws immediately. */
|
|
345
|
+
export function renameWithRetry(from, to, opts = {}) {
|
|
346
|
+
const rename = opts.renameFn ?? renameSync;
|
|
347
|
+
const isWindows = opts.isWindows ?? process.platform === 'win32';
|
|
348
|
+
const delays = opts.delaysMs ?? [10, 20, 40, 80, 160];
|
|
349
|
+
for (let attempt = 0;; attempt++) {
|
|
350
|
+
try {
|
|
351
|
+
rename(from, to);
|
|
352
|
+
return;
|
|
353
|
+
}
|
|
354
|
+
catch (e) {
|
|
355
|
+
const code = e.code ?? '';
|
|
356
|
+
if (!isWindows || !RENAME_RETRY_CODES.has(code) || attempt >= delays.length)
|
|
357
|
+
throw e;
|
|
358
|
+
sleepSync(delays[attempt]);
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
/** Atomic file write: unique tmp sibling + rename (with Windows retry). Removes the tmp on failure. */
|
|
363
|
+
export function writeFileAtomicSync(path, data) {
|
|
364
|
+
const tmp = `${path}.${process.pid}.${randomUUID().slice(0, 8)}.tmp`;
|
|
365
|
+
writeFileSync(tmp, data);
|
|
366
|
+
try {
|
|
367
|
+
renameWithRetry(tmp, path);
|
|
368
|
+
}
|
|
369
|
+
catch (e) {
|
|
370
|
+
rmSync(tmp, { force: true });
|
|
371
|
+
throw e;
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
/** Delete `<baseName>.*.tmp` siblings older than maxAgeMs (residue of a writer that crashed
|
|
375
|
+
* between write and rename). Young tmp files may belong to a live writer and are kept. */
|
|
376
|
+
export function cleanupOrphanTmpFiles(dir, baseName, maxAgeMs = 10 * 60_000) {
|
|
377
|
+
let removed = 0;
|
|
378
|
+
try {
|
|
379
|
+
for (const name of readdirSync(dir)) {
|
|
380
|
+
if (!name.startsWith(`${baseName}.`) || !name.endsWith('.tmp'))
|
|
381
|
+
continue;
|
|
382
|
+
const p = join(dir, name);
|
|
383
|
+
try {
|
|
384
|
+
if (Date.now() - statSync(p).mtimeMs > maxAgeMs) {
|
|
385
|
+
rmSync(p, { force: true });
|
|
386
|
+
removed++;
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
catch {
|
|
390
|
+
/* raced another cleaner */
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
catch {
|
|
395
|
+
/* dir missing, nothing to clean */
|
|
396
|
+
}
|
|
397
|
+
return removed;
|
|
398
|
+
}
|
|
399
|
+
//# sourceMappingURL=lockfile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lockfile.js","sourceRoot":"","sources":["../../src/lib/lockfile.ts"],"names":[],"mappings":"AAAA,2FAA2F;AAC3F,6FAA6F;AAC7F,kGAAkG;AAClG,gGAAgG;AAChG,2FAA2F;AAC3F,gGAAgG;AAChG,4FAA4F;AAC5F,EAAE;AACF,qFAAqF;AACrF,8FAA8F;AAC9F,wFAAwF;AACxF,qEAAqE;AACrE,gGAAgG;AAChG,uIAAuI;AACvI,6DAA6D;AAC7D,iGAAiG;AACjG,oGAAoG;AACpG,8FAA8F;AAC9F,iGAAiG;AACjG,4FAA4F;AAC5F,+FAA+F;AAC/F,2FAA2F;AAC3F,+FAA+F;AAC/F,4FAA4F;AAC5F,4FAA4F;AAC5F,EAAE;AACF,gBAAgB;AAChB,6FAA6F;AAC7F,kGAAkG;AAClG,+FAA+F;AAC/F,wFAAwF;AACxF,mGAAmG;AACnG,wFAAwF;AACxF,gGAAgG;AAEhG,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAElC,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC;AACpC,MAAM,WAAW,GAAG,KAAK,CAAC;AAC1B,MAAM,cAAc,GAAG,EAAE,CAAC;AAC1B;;;qFAGqF;AACrF,MAAM,qBAAqB,GAAG,CAAC,CAAC;AAChC,MAAM,UAAU,GAAG,OAAO,CAAC;AAC3B,MAAM,cAAc,GAAG,SAAS,CAAC;AACjC,MAAM,UAAU,GAAG,WAAW,CAAC;AAE/B,oGAAoG;AACpG,MAAM,CAAC,MAAM,SAAS,GAA4E,EAAE,CAAC;AASrG;4EAC4E;AAC5E,SAAS,SAAS,CAAC,EAAU;IAC3B,OAAO,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,IAAI,iBAAiB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;AACnE,CAAC;AAED,0FAA0F;AAC1F,SAAS,YAAY,CAAC,QAAgB;IACpC,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC;IAC1D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AASD,SAAS,cAAc,CAAC,CAAS;IAC/B,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,uEAAuE;AACvE,SAAS,SAAS,CAAC,GAAW,EAAE,UAAkB;IAChD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IACpC,IAAI,cAAc,CAAC,KAAK,CAAC,KAAK,UAAU;QAAE,MAAM,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAC3E,CAAC;AAED;kGACkG;AAClG,SAAS,gBAAgB,CAAC,QAAgB,EAAE,OAAe;IACzD,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IACzC,IAAI,CAAC;QACH,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,OAAO,IAAI,OAAO;YAAE,OAAO;QAC5D,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACpC,MAAM,IAAI,GAAG,GAAG,KAAK,SAAS,UAAU,EAAE,EAAE,CAAC;QAC7C,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACxB,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9B,qFAAqF;QACrF,UAAU,CAAC,QAAQ,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;IACvD,CAAC;IAAC,MAAM,CAAC;QACP,mCAAmC;IACrC,CAAC;AACH,CAAC;AAED;;;;;0BAK0B;AAC1B,MAAM,UAAU,iBAAiB,CAAC,QAAgB,EAAE,QAA0B,EAAE,UAAkB,aAAa;IAC7G,MAAM,UAAU,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,UAAU,EAAE,EAAE,CAAC;IACpD,yFAAyF;IACzF,IAAI,MAAoC,CAAC;IACzC,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC9B,IAAI,YAAY,CAAC,QAAQ,CAAC,KAAK,QAAQ,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,OAAO,IAAI,OAAO;YAAE,OAAO,KAAK,CAAC,CAAC,qBAAqB;QACxH,MAAM,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC,CAAC,eAAe;IAC/B,CAAC;IACD,IAAI,CAAC;QACH,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACxE,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAK,CAA2B,CAAC,IAAI,KAAK,QAAQ;YAAE,gBAAgB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACxF,OAAO,KAAK,CAAC,CAAC,sDAAsD;IACtE,CAAC;IACD,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC9B,MAAM,GAAG,EAAE,CAAC,GAAG,KAAK,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,KAAK,MAAM,CAAC,GAAG,IAAI,YAAY,CAAC,QAAQ,CAAC,KAAK,QAAQ,CAAC,KAAK,CAAC;IACvG,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,GAAG,KAAK,CAAC;IACjB,CAAC;IACD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,sFAAsF;QACtF,yDAAyD;QACzD,SAAS,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAChC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,SAAS,CAAC,kBAAkB,EAAE,EAAE,CAAC;IACjC,MAAM,IAAI,GAAG,GAAG,QAAQ,GAAG,cAAc,GAAG,OAAO,CAAC,GAAG,IAAI,UAAU,EAAE,EAAE,CAAC;IAC1E,IAAI,CAAC;QACH,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,SAAS;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC,CAAC,qBAAqB;IACrC,CAAC;IACD,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,KAAK,UAAU,EAAE,CAAC;QAC1D,+FAA+F;QAC/F,SAAS,CAAC,qBAAqB,EAAE,EAAE,CAAC;QACpC,IAAI,CAAC;YACH,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,wBAAwB;QACtD,CAAC;QAAC,MAAM,CAAC;YACP,6FAA6F;YAC7F,6FAA6F;YAC7F,+CAA+C;YAC/C,GAAG,CAAC,OAAO,EAAE,qGAAqG,EAAE;gBAClH,QAAQ;gBACR,IAAI;aACL,CAAC,CAAC;QACL,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,OAAO,IAAI,CAAC;AACd,CAAC;AAED,yFAAyF;AACzF,MAAM,UAAU,mBAAmB,CAAC,QAAgB,EAAE,UAAkB,aAAa;IACnF,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC9B,MAAM,MAAM,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,cAAc,EAAE,CAAC;QACxD,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;YACpC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;gBAAE,SAAS;YACvC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAC1B,IAAI,CAAC;gBACH,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,OAAO,EAAE,CAAC;oBAC/C,MAAM,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;oBAC5C,OAAO,EAAE,CAAC;gBACZ,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,2BAA2B;YAC7B,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,iDAAiD;IACnD,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAID,+EAA+E;AAC/E,SAAS,UAAU,CAAC,QAAgB,EAAE,KAAa,EAAE,OAAe;IAClE,IAAI,CAAC;QACH,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,0DAA0D;IACjF,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAK,CAA2B,CAAC,IAAI,KAAK,QAAQ;YAAE,MAAM,CAAC,CAAC;QAC5D,IAAI,QAA0B,CAAC;QAC/B,IAAI,CAAC;YACH,QAAQ,GAAG,EAAE,KAAK,EAAE,YAAY,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAC;QACpF,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,OAAO,CAAC,CAAC,oDAAoD;QACtE,CAAC;QACD,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC,OAAO,GAAG,OAAO,EAAE,CAAC;YAC5C,+EAA+E;YAC/E,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;YAC/C,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,+FAA+F;IAC/F,wFAAwF;IACxF,IAAI,CAAC;QACH,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACnE,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAK,CAA2B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,MAAM,CAAC;QAClE,MAAM,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACnD,MAAM,CAAC,CAAC;IACV,CAAC;IACD,6EAA6E;IAC7E,IAAI,YAAY,CAAC,QAAQ,CAAC,KAAK,KAAK;QAAE,OAAO,MAAM,CAAC;IACpD,mBAAmB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACvC,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,OAAO,CAAC,QAAgB,EAAE,KAAa;IAC9C,gGAAgG;IAChG,oGAAoG;IACpG,yEAAyE;IACzE,IAAI,YAAY,CAAC,QAAQ,CAAC,KAAK,KAAK,EAAE,CAAC;QACrC,IAAI,CAAC;YACH,MAAM,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,CAAC;QAAC,MAAM,CAAC;YACP,wDAAwD;QAC1D,CAAC;IACH,CAAC;SAAM,CAAC;QACN,GAAG,CACD,MAAM,EACN,oKAAoK,EACpK,EAAE,QAAQ,EAAE,CACb,CAAC;QACF,mBAAmB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IACvC,CAAC;AACH,CAAC;AAED;wFACwF;AACxF,SAAS,mBAAmB,CAAC,QAAgB,EAAE,KAAa;IAC1D,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC9B,MAAM,MAAM,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,cAAc,EAAE,CAAC;QACxD,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;YACpC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;gBAAE,SAAS;YACvC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAC1B,IAAI,YAAY,CAAC,CAAC,CAAC,KAAK,KAAK;gBAAE,MAAM,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7E,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,iBAAiB;IACnB,CAAC;AACH,CAAC;AAED,SAAS,QAAQ;IACf,uFAAuF;IACvF,uCAAuC;IACvC,OAAO,GAAG,OAAO,CAAC,GAAG,IAAI,UAAU,EAAE,EAAE,CAAC;AAC1C,CAAC;AAED,SAAS,YAAY,CAAC,QAAgB;IACpC,GAAG,CAAC,OAAO,EAAE,+DAA+D,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC5F,OAAO,IAAI,KAAK,CAAC,mCAAmC,QAAQ,EAAE,CAAC,CAAC;AAClE,CAAC;AAED;;mFAEmF;AACnF,MAAM,UAAU,YAAY,CAAI,QAAgB,EAAE,EAAW,EAAE,OAAwB,EAAE;IACvF,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,aAAa,CAAC;IAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,WAAW,CAAC,CAAC;IAC9D,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IACzB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,SAAS,CAAC;QACR,MAAM,CAAC,GAAG,UAAU,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QAC/C,IAAI,CAAC,KAAK,UAAU;YAAE,MAAM;QAC5B,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ;YAAE,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC;QACxD,IAAI,CAAC,KAAK,OAAO,IAAI,SAAS,EAAE,GAAG,qBAAqB;YAAE,SAAS;QACnE,SAAS,GAAG,CAAC,CAAC;QACd,SAAS,CAAC,cAAc,CAAC,CAAC;IAC5B,CAAC;IACD,IAAI,CAAC;QACH,OAAO,EAAE,EAAE,CAAC;IACd,CAAC;YAAS,CAAC;QACT,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC3B,CAAC;AACH,CAAC;AAED;0FAC0F;AAC1F,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAI,QAAgB,EAAE,EAAoB,EAAE,OAAwB,EAAE;IAC3G,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,aAAa,CAAC;IAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,WAAW,CAAC,CAAC;IAC9D,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IACzB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,SAAS,CAAC;QACR,MAAM,CAAC,GAAG,UAAU,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QAC/C,IAAI,CAAC,KAAK,UAAU;YAAE,MAAM;QAC5B,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ;YAAE,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC;QACxD,IAAI,CAAC,KAAK,OAAO,IAAI,SAAS,EAAE,GAAG,qBAAqB;YAAE,SAAS;QACnE,SAAS,GAAG,CAAC,CAAC;QACd,MAAM,IAAI,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC;IAC9D,CAAC;IACD,MAAM,SAAS,GAAG,WAAW,CAC3B,GAAG,EAAE;QACH,yFAAyF;QACzF,IAAI,YAAY,CAAC,QAAQ,CAAC,KAAK,KAAK;YAAE,OAAO;QAC7C,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,UAAU,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QACjC,CAAC;QAAC,MAAM,CAAC;YACP,qCAAqC;QACvC,CAAC;IACH,CAAC,EACD,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CACtC,CAAC;IACF,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,EAAE,CAAC;IACpB,CAAC;YAAS,CAAC;QACT,aAAa,CAAC,SAAS,CAAC,CAAC;QACzB,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC3B,CAAC;AACH,CAAC;AAED,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;AAEjE;;kEAEkE;AAClE,MAAM,UAAU,eAAe,CAC7B,IAAY,EACZ,EAAU,EACV,OAAgG,EAAE;IAElG,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,IAAI,UAAU,CAAC;IAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC;IACjE,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;IACtD,KAAK,IAAI,OAAO,GAAG,CAAC,GAAI,OAAO,EAAE,EAAE,CAAC;QAClC,IAAI,CAAC;YACH,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACjB,OAAO;QACT,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,IAAI,GAAI,CAA2B,CAAC,IAAI,IAAI,EAAE,CAAC;YACrD,IAAI,CAAC,SAAS,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,OAAO,IAAI,MAAM,CAAC,MAAM;gBAAE,MAAM,CAAC,CAAC;YACrF,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;AACH,CAAC;AAED,uGAAuG;AACvG,MAAM,UAAU,mBAAmB,CAAC,IAAY,EAAE,IAAqB;IACrE,MAAM,GAAG,GAAG,GAAG,IAAI,IAAI,OAAO,CAAC,GAAG,IAAI,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC;IACrE,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACzB,IAAI,CAAC;QACH,eAAe,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7B,MAAM,CAAC,CAAC;IACV,CAAC;AACH,CAAC;AAED;2FAC2F;AAC3F,MAAM,UAAU,qBAAqB,CAAC,GAAW,EAAE,QAAgB,EAAE,WAAmB,EAAE,GAAG,MAAM;IACjG,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,CAAC;QACH,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;YACpC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,QAAQ,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAAE,SAAS;YACzE,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAC1B,IAAI,CAAC;gBACH,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,QAAQ,EAAE,CAAC;oBAChD,MAAM,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;oBAC3B,OAAO,EAAE,CAAC;gBACZ,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,2BAA2B;YAC7B,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,mCAAmC;IACrC,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
package/dist/lib/needsInput.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// NeedsInput protocol
|
|
1
|
+
// NeedsInput protocol: a single, consistent shape for the missing-input
|
|
2
2
|
// blockers a QA run hits, so an agent forwards ONE concise question to the user instead of
|
|
3
3
|
// improvising. It is NOT an error: the run is paused, recoverable, and resumable. The payload
|
|
4
4
|
// rides on a normal (ok:true) tool result with `needsInput:true`, and is also embeddable in a
|
|
@@ -10,14 +10,14 @@
|
|
|
10
10
|
// Developer 1 contract (Milestone B): EVERY NeedsInput response carries one concise question,
|
|
11
11
|
// typed fields (with secret flags), safe fallback options, the EXACT resume call, what Swipium
|
|
12
12
|
// already tried (`attempted`), and what happens if the user declines (`ifDeclined`). Agents ask
|
|
13
|
-
// one question
|
|
13
|
+
// one question (never a bundle of guesses) and resume deterministically.
|
|
14
14
|
import { currentResponseMode } from './result.js';
|
|
15
15
|
/** Default resume: hand the answer to qa_continue_from_blocker, which routes by kind. */
|
|
16
16
|
function resumeVia(kind) {
|
|
17
17
|
return { tool: 'qa_continue_from_blocker', args: { kind } };
|
|
18
18
|
}
|
|
19
19
|
/**
|
|
20
|
-
* The standardized QA questions
|
|
20
|
+
* The standardized QA questions. Builders, not constants, so callers can splice
|
|
21
21
|
* in context (which app, which screen) while keeping the field/fallback/resume contract stable.
|
|
22
22
|
* `attempted` is left empty here and filled by qaNeedsInput from the live session.
|
|
23
23
|
*/
|
|
@@ -26,8 +26,7 @@ export const NeedsInput = {
|
|
|
26
26
|
return {
|
|
27
27
|
needsInput: true,
|
|
28
28
|
kind: 'credentials',
|
|
29
|
-
question: (context ? `${context} ` : '') +
|
|
30
|
-
'This app appears to require login. Provide test credentials, or ask Swipium to stay pre-login.',
|
|
29
|
+
question: (context ? `${context} ` : '') + 'This app appears to require login. Provide test credentials, or ask Swipium to stay pre-login.',
|
|
31
30
|
fields: [
|
|
32
31
|
{ name: 'email', secret: false, description: 'Test account email/username' },
|
|
33
32
|
{ name: 'password', secret: true, description: 'Test account password' },
|
|
@@ -81,7 +80,11 @@ export const NeedsInput = {
|
|
|
81
80
|
kind: 'destructive_exploration_approval',
|
|
82
81
|
question: `${what} Exploring it may trigger destructive actions (delete/reset/purchase). Approve, or keep exploration read-only?`,
|
|
83
82
|
fields: [{ name: 'approveDestructive', secret: false, description: 'true to allow potentially destructive exploration' }],
|
|
84
|
-
fallbackOptions: [
|
|
83
|
+
fallbackOptions: [
|
|
84
|
+
'keep exploration non-destructive (skip risky controls)',
|
|
85
|
+
'approve destructive exploration',
|
|
86
|
+
'run destructive steps last',
|
|
87
|
+
],
|
|
85
88
|
resume: resumeVia('destructive_exploration_approval'),
|
|
86
89
|
attempted: [],
|
|
87
90
|
ifDeclined: 'Swipium explores non-destructively and skips controls flagged as risky.',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"needsInput.js","sourceRoot":"","sources":["../../src/lib/needsInput.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"needsInput.js","sourceRoot":"","sources":["../../src/lib/needsInput.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/png.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
// Minimal zero-dependency PNG decode
|
|
1
|
+
// Minimal zero-dependency PNG decode. Device screenshots come from
|
|
2
2
|
// `screencap -p` as non-interlaced 8-bit truecolor(+alpha) PNGs, so we support exactly that
|
|
3
3
|
// (color types 2 and 6, bit depth 8, interlace 0) and error clearly on anything else. Uses
|
|
4
|
-
// Node's built-in zlib
|
|
4
|
+
// Node's built-in zlib. No image library, no third-party code.
|
|
5
5
|
import { inflateSync } from 'node:zlib';
|
|
6
6
|
/** Read width/height from the IHDR without decoding pixels (for the coordinate-space audit). */
|
|
7
7
|
export function pngSize(buf) {
|
|
@@ -83,7 +83,8 @@ export function decodePng(buf) {
|
|
|
83
83
|
case 4:
|
|
84
84
|
val = cur + paeth(a, b, c);
|
|
85
85
|
break;
|
|
86
|
-
default:
|
|
86
|
+
default:
|
|
87
|
+
throw new Error(`bad PNG filter ${filter} at row ${y}`);
|
|
87
88
|
}
|
|
88
89
|
out[o + x] = val & 0xff;
|
|
89
90
|
}
|
package/dist/lib/png.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"png.js","sourceRoot":"","sources":["../../src/lib/png.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"png.js","sourceRoot":"","sources":["../../src/lib/png.ts"],"names":[],"mappings":"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"}
|