swipium 1.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.
Files changed (387) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +295 -0
  3. package/dist/appMap/automationLink.js +74 -0
  4. package/dist/appMap/automationLink.js.map +1 -0
  5. package/dist/appMap/build.js +193 -0
  6. package/dist/appMap/build.js.map +1 -0
  7. package/dist/appMap/codeIndex.js +73 -0
  8. package/dist/appMap/codeIndex.js.map +1 -0
  9. package/dist/appMap/featureModel.js +83 -0
  10. package/dist/appMap/featureModel.js.map +1 -0
  11. package/dist/appMap/firstRunApply.js +131 -0
  12. package/dist/appMap/firstRunApply.js.map +1 -0
  13. package/dist/appMap/fsWalk.js +75 -0
  14. package/dist/appMap/fsWalk.js.map +1 -0
  15. package/dist/appMap/issues.js +227 -0
  16. package/dist/appMap/issues.js.map +1 -0
  17. package/dist/appMap/migrations.js +87 -0
  18. package/dist/appMap/migrations.js.map +1 -0
  19. package/dist/appMap/prelaunch.js +66 -0
  20. package/dist/appMap/prelaunch.js.map +1 -0
  21. package/dist/appMap/projectRegistry.js +70 -0
  22. package/dist/appMap/projectRegistry.js.map +1 -0
  23. package/dist/appMap/provenance.js +52 -0
  24. package/dist/appMap/provenance.js.map +1 -0
  25. package/dist/appMap/query.js +118 -0
  26. package/dist/appMap/query.js.map +1 -0
  27. package/dist/appMap/runtimeMerge.js +207 -0
  28. package/dist/appMap/runtimeMerge.js.map +1 -0
  29. package/dist/appMap/schema.js +65 -0
  30. package/dist/appMap/schema.js.map +1 -0
  31. package/dist/appMap/screenMatch.js +75 -0
  32. package/dist/appMap/screenMatch.js.map +1 -0
  33. package/dist/appMap/staticScan.js +614 -0
  34. package/dist/appMap/staticScan.js.map +1 -0
  35. package/dist/appMap/store.js +173 -0
  36. package/dist/appMap/store.js.map +1 -0
  37. package/dist/appMap/tsAstScan.js +184 -0
  38. package/dist/appMap/tsAstScan.js.map +1 -0
  39. package/dist/artifacts/bundletool.js +199 -0
  40. package/dist/artifacts/bundletool.js.map +1 -0
  41. package/dist/artifacts/resolve.js +388 -0
  42. package/dist/artifacts/resolve.js.map +1 -0
  43. package/dist/automationGen/appiumModel.js +129 -0
  44. package/dist/automationGen/appiumModel.js.map +1 -0
  45. package/dist/automationGen/ciEmitter.js +80 -0
  46. package/dist/automationGen/ciEmitter.js.map +1 -0
  47. package/dist/automationGen/jsEmitter.js +440 -0
  48. package/dist/automationGen/jsEmitter.js.map +1 -0
  49. package/dist/automationGen/packagePatch.js +56 -0
  50. package/dist/automationGen/packagePatch.js.map +1 -0
  51. package/dist/automationGen/projectProfile.js +317 -0
  52. package/dist/automationGen/projectProfile.js.map +1 -0
  53. package/dist/automationGen/pythonEmitter.js +386 -0
  54. package/dist/automationGen/pythonEmitter.js.map +1 -0
  55. package/dist/automationGen/readmeEmitter.js +66 -0
  56. package/dist/automationGen/readmeEmitter.js.map +1 -0
  57. package/dist/automationGen/suitePlan.js +94 -0
  58. package/dist/automationGen/suitePlan.js.map +1 -0
  59. package/dist/automationGen/validation.js +150 -0
  60. package/dist/automationGen/validation.js.map +1 -0
  61. package/dist/build/parseBuildLog.js +119 -0
  62. package/dist/build/parseBuildLog.js.map +1 -0
  63. package/dist/build/plan.js +150 -0
  64. package/dist/build/plan.js.map +1 -0
  65. package/dist/ci/preflight.js +85 -0
  66. package/dist/ci/preflight.js.map +1 -0
  67. package/dist/cli/init.js +105 -0
  68. package/dist/cli/init.js.map +1 -0
  69. package/dist/cli/scan.js +85 -0
  70. package/dist/cli/scan.js.map +1 -0
  71. package/dist/cli/suite.js +85 -0
  72. package/dist/cli/suite.js.map +1 -0
  73. package/dist/cli/verify.js +62 -0
  74. package/dist/cli/verify.js.map +1 -0
  75. package/dist/consent/consent.js +43 -0
  76. package/dist/consent/consent.js.map +1 -0
  77. package/dist/context/detect.js +156 -0
  78. package/dist/context/detect.js.map +1 -0
  79. package/dist/context/findApps.js +198 -0
  80. package/dist/context/findApps.js.map +1 -0
  81. package/dist/context/projectRoot.js +41 -0
  82. package/dist/context/projectRoot.js.map +1 -0
  83. package/dist/context/scan.js +167 -0
  84. package/dist/context/scan.js.map +1 -0
  85. package/dist/core/target.js +115 -0
  86. package/dist/core/target.js.map +1 -0
  87. package/dist/core/targetPlan.js +140 -0
  88. package/dist/core/targetPlan.js.map +1 -0
  89. package/dist/drivers/DirectDriver.js +228 -0
  90. package/dist/drivers/DirectDriver.js.map +1 -0
  91. package/dist/drivers/Driver.js +4 -0
  92. package/dist/drivers/Driver.js.map +1 -0
  93. package/dist/drivers/SimctlDriver.js +127 -0
  94. package/dist/drivers/SimctlDriver.js.map +1 -0
  95. package/dist/drivers/WdaDriver.js +250 -0
  96. package/dist/drivers/WdaDriver.js.map +1 -0
  97. package/dist/explore/candidates.js +93 -0
  98. package/dist/explore/candidates.js.map +1 -0
  99. package/dist/explore/graph.js +116 -0
  100. package/dist/explore/graph.js.map +1 -0
  101. package/dist/explore/memory.js +35 -0
  102. package/dist/explore/memory.js.map +1 -0
  103. package/dist/explore/planner.js +105 -0
  104. package/dist/explore/planner.js.map +1 -0
  105. package/dist/explore/policy.js +85 -0
  106. package/dist/explore/policy.js.map +1 -0
  107. package/dist/explore/runner.js +475 -0
  108. package/dist/explore/runner.js.map +1 -0
  109. package/dist/explore/signatures.js +35 -0
  110. package/dist/explore/signatures.js.map +1 -0
  111. package/dist/explore/suite.js +55 -0
  112. package/dist/explore/suite.js.map +1 -0
  113. package/dist/featureTesting/executionBootstrap.js +140 -0
  114. package/dist/featureTesting/executionBootstrap.js.map +1 -0
  115. package/dist/firstRun/authStateMachine.js +83 -0
  116. package/dist/firstRun/authStateMachine.js.map +1 -0
  117. package/dist/firstRun/classifyScreen.js +201 -0
  118. package/dist/firstRun/classifyScreen.js.map +1 -0
  119. package/dist/firstRun/firstRunPlanner.js +207 -0
  120. package/dist/firstRun/firstRunPlanner.js.map +1 -0
  121. package/dist/firstRun/firstRunRunner.js +331 -0
  122. package/dist/firstRun/firstRunRunner.js.map +1 -0
  123. package/dist/firstRun/generatedDataPolicy.js +215 -0
  124. package/dist/firstRun/generatedDataPolicy.js.map +1 -0
  125. package/dist/firstRun/inputPlanner.js +67 -0
  126. package/dist/firstRun/inputPlanner.js.map +1 -0
  127. package/dist/firstRun/onboardingStateMachine.js +46 -0
  128. package/dist/firstRun/onboardingStateMachine.js.map +1 -0
  129. package/dist/firstRun/paywallPolicy.js +54 -0
  130. package/dist/firstRun/paywallPolicy.js.map +1 -0
  131. package/dist/firstRun/types.js +7 -0
  132. package/dist/firstRun/types.js.map +1 -0
  133. package/dist/fixtures/catalog.js +131 -0
  134. package/dist/fixtures/catalog.js.map +1 -0
  135. package/dist/flows/discover.js +18 -0
  136. package/dist/flows/discover.js.map +1 -0
  137. package/dist/flows/generate.js +211 -0
  138. package/dist/flows/generate.js.map +1 -0
  139. package/dist/flows/lint.js +97 -0
  140. package/dist/flows/lint.js.map +1 -0
  141. package/dist/flows/pack.js +68 -0
  142. package/dist/flows/pack.js.map +1 -0
  143. package/dist/flows/run.js +738 -0
  144. package/dist/flows/run.js.map +1 -0
  145. package/dist/flows/schema.js +240 -0
  146. package/dist/flows/schema.js.map +1 -0
  147. package/dist/flows/seedExec.js +108 -0
  148. package/dist/flows/seedExec.js.map +1 -0
  149. package/dist/flows/templates.js +155 -0
  150. package/dist/flows/templates.js.map +1 -0
  151. package/dist/flows/waitGuards.js +12 -0
  152. package/dist/flows/waitGuards.js.map +1 -0
  153. package/dist/index.js +33 -0
  154. package/dist/index.js.map +1 -0
  155. package/dist/ios/signing.js +182 -0
  156. package/dist/ios/signing.js.map +1 -0
  157. package/dist/issues/classify.js +186 -0
  158. package/dist/issues/classify.js.map +1 -0
  159. package/dist/issues/fingerprint.js +130 -0
  160. package/dist/issues/fingerprint.js.map +1 -0
  161. package/dist/issues/index.js +240 -0
  162. package/dist/issues/index.js.map +1 -0
  163. package/dist/issues/metrics.js +155 -0
  164. package/dist/issues/metrics.js.map +1 -0
  165. package/dist/issues/recurrence.js +193 -0
  166. package/dist/issues/recurrence.js.map +1 -0
  167. package/dist/issues/report.js +110 -0
  168. package/dist/issues/report.js.map +1 -0
  169. package/dist/issues/reportBridge.js +119 -0
  170. package/dist/issues/reportBridge.js.map +1 -0
  171. package/dist/issues/schema.js +90 -0
  172. package/dist/issues/schema.js.map +1 -0
  173. package/dist/issues/sourceRevision.js +108 -0
  174. package/dist/issues/sourceRevision.js.map +1 -0
  175. package/dist/issues/store.js +155 -0
  176. package/dist/issues/store.js.map +1 -0
  177. package/dist/lib/android.js +278 -0
  178. package/dist/lib/android.js.map +1 -0
  179. package/dist/lib/commandTemplate.js +55 -0
  180. package/dist/lib/commandTemplate.js.map +1 -0
  181. package/dist/lib/coordSpace.js +23 -0
  182. package/dist/lib/coordSpace.js.map +1 -0
  183. package/dist/lib/device.js +87 -0
  184. package/dist/lib/device.js.map +1 -0
  185. package/dist/lib/gitignore.js +22 -0
  186. package/dist/lib/gitignore.js.map +1 -0
  187. package/dist/lib/image.js +97 -0
  188. package/dist/lib/image.js.map +1 -0
  189. package/dist/lib/logger.js +8 -0
  190. package/dist/lib/logger.js.map +1 -0
  191. package/dist/lib/metroState.js +45 -0
  192. package/dist/lib/metroState.js.map +1 -0
  193. package/dist/lib/needsInput.js +201 -0
  194. package/dist/lib/needsInput.js.map +1 -0
  195. package/dist/lib/png.js +103 -0
  196. package/dist/lib/png.js.map +1 -0
  197. package/dist/lib/redact.js +21 -0
  198. package/dist/lib/redact.js.map +1 -0
  199. package/dist/lib/result.js +87 -0
  200. package/dist/lib/result.js.map +1 -0
  201. package/dist/lib/schemaHash.js +65 -0
  202. package/dist/lib/schemaHash.js.map +1 -0
  203. package/dist/lib/sensitive.js +13 -0
  204. package/dist/lib/sensitive.js.map +1 -0
  205. package/dist/lib/simctl.js +149 -0
  206. package/dist/lib/simctl.js.map +1 -0
  207. package/dist/lib/spawn.js +144 -0
  208. package/dist/lib/spawn.js.map +1 -0
  209. package/dist/lib/wda.js +347 -0
  210. package/dist/lib/wda.js.map +1 -0
  211. package/dist/lib/wdaConfig.js +69 -0
  212. package/dist/lib/wdaConfig.js.map +1 -0
  213. package/dist/lib/wdaTune.js +58 -0
  214. package/dist/lib/wdaTune.js.map +1 -0
  215. package/dist/oracle/auth.js +22 -0
  216. package/dist/oracle/auth.js.map +1 -0
  217. package/dist/oracle/failures.js +193 -0
  218. package/dist/oracle/failures.js.map +1 -0
  219. package/dist/oracle/health.js +123 -0
  220. package/dist/oracle/health.js.map +1 -0
  221. package/dist/oracle/record.js +36 -0
  222. package/dist/oracle/record.js.map +1 -0
  223. package/dist/orchestration/envelope.js +52 -0
  224. package/dist/orchestration/envelope.js.map +1 -0
  225. package/dist/orchestration/goal.js +98 -0
  226. package/dist/orchestration/goal.js.map +1 -0
  227. package/dist/plan/plan.js +124 -0
  228. package/dist/plan/plan.js.map +1 -0
  229. package/dist/prompts/index.js +63 -0
  230. package/dist/prompts/index.js.map +1 -0
  231. package/dist/report/artifactManifest.js +44 -0
  232. package/dist/report/artifactManifest.js.map +1 -0
  233. package/dist/report/coverage.js +60 -0
  234. package/dist/report/coverage.js.map +1 -0
  235. package/dist/report/evidence.js +84 -0
  236. package/dist/report/evidence.js.map +1 -0
  237. package/dist/report/export.js +447 -0
  238. package/dist/report/export.js.map +1 -0
  239. package/dist/report/flake.js +61 -0
  240. package/dist/report/flake.js.map +1 -0
  241. package/dist/report/history.js +564 -0
  242. package/dist/report/history.js.map +1 -0
  243. package/dist/report/policy.js +98 -0
  244. package/dist/report/policy.js.map +1 -0
  245. package/dist/report/qaLevel.js +96 -0
  246. package/dist/report/qaLevel.js.map +1 -0
  247. package/dist/report/readiness.js +213 -0
  248. package/dist/report/readiness.js.map +1 -0
  249. package/dist/report/summary.js +42 -0
  250. package/dist/report/summary.js.map +1 -0
  251. package/dist/report/testCatalog.js +93 -0
  252. package/dist/report/testCatalog.js.map +1 -0
  253. package/dist/report/timing.js +37 -0
  254. package/dist/report/timing.js.map +1 -0
  255. package/dist/server.js +180 -0
  256. package/dist/server.js.map +1 -0
  257. package/dist/services/automationGenerate.js +60 -0
  258. package/dist/services/automationGenerate.js.map +1 -0
  259. package/dist/services/build.js +66 -0
  260. package/dist/services/build.js.map +1 -0
  261. package/dist/services/preflight.js +51 -0
  262. package/dist/services/preflight.js.map +1 -0
  263. package/dist/services/prepareAndroid.js +183 -0
  264. package/dist/services/prepareAndroid.js.map +1 -0
  265. package/dist/services/prepareIos.js +162 -0
  266. package/dist/services/prepareIos.js.map +1 -0
  267. package/dist/services/report.js +537 -0
  268. package/dist/services/report.js.map +1 -0
  269. package/dist/services/smoke.js +120 -0
  270. package/dist/services/smoke.js.map +1 -0
  271. package/dist/services/suiteGenerate.js +123 -0
  272. package/dist/services/suiteGenerate.js.map +1 -0
  273. package/dist/services/testSuiteKnowledge.js +150 -0
  274. package/dist/services/testSuiteKnowledge.js.map +1 -0
  275. package/dist/session/attach.js +47 -0
  276. package/dist/session/attach.js.map +1 -0
  277. package/dist/session/progress.js +56 -0
  278. package/dist/session/progress.js.map +1 -0
  279. package/dist/session/store.js +329 -0
  280. package/dist/session/store.js.map +1 -0
  281. package/dist/snapshot/overlays.js +132 -0
  282. package/dist/snapshot/overlays.js.map +1 -0
  283. package/dist/snapshot/parse.js +204 -0
  284. package/dist/snapshot/parse.js.map +1 -0
  285. package/dist/snapshot/present.js +12 -0
  286. package/dist/snapshot/present.js.map +1 -0
  287. package/dist/snapshot/settle.js +36 -0
  288. package/dist/snapshot/settle.js.map +1 -0
  289. package/dist/state/profile.js +318 -0
  290. package/dist/state/profile.js.map +1 -0
  291. package/dist/suite/compile.js +176 -0
  292. package/dist/suite/compile.js.map +1 -0
  293. package/dist/suite/lint.js +45 -0
  294. package/dist/suite/lint.js.map +1 -0
  295. package/dist/suite/pom.js +285 -0
  296. package/dist/suite/pom.js.map +1 -0
  297. package/dist/suite/testcase.js +87 -0
  298. package/dist/suite/testcase.js.map +1 -0
  299. package/dist/testSuite/generator.js +222 -0
  300. package/dist/testSuite/generator.js.map +1 -0
  301. package/dist/testSuite/history.js +44 -0
  302. package/dist/testSuite/history.js.map +1 -0
  303. package/dist/testSuite/issueLinks.js +96 -0
  304. package/dist/testSuite/issueLinks.js.map +1 -0
  305. package/dist/testSuite/merge.js +190 -0
  306. package/dist/testSuite/merge.js.map +1 -0
  307. package/dist/testSuite/schema.js +86 -0
  308. package/dist/testSuite/schema.js.map +1 -0
  309. package/dist/testSuite/store.js +116 -0
  310. package/dist/testSuite/store.js.map +1 -0
  311. package/dist/testSuite/traceability.js +55 -0
  312. package/dist/testSuite/traceability.js.map +1 -0
  313. package/dist/tools/act.js +457 -0
  314. package/dist/tools/act.js.map +1 -0
  315. package/dist/tools/agent.js +225 -0
  316. package/dist/tools/agent.js.map +1 -0
  317. package/dist/tools/appMap.js +317 -0
  318. package/dist/tools/appMap.js.map +1 -0
  319. package/dist/tools/assertVisual.js +74 -0
  320. package/dist/tools/assertVisual.js.map +1 -0
  321. package/dist/tools/automationGenerate.js +394 -0
  322. package/dist/tools/automationGenerate.js.map +1 -0
  323. package/dist/tools/capabilities.js +114 -0
  324. package/dist/tools/capabilities.js.map +1 -0
  325. package/dist/tools/clearOverlay.js +150 -0
  326. package/dist/tools/clearOverlay.js.map +1 -0
  327. package/dist/tools/detectContext.js +41 -0
  328. package/dist/tools/detectContext.js.map +1 -0
  329. package/dist/tools/doctor.js +116 -0
  330. package/dist/tools/doctor.js.map +1 -0
  331. package/dist/tools/explore.js +289 -0
  332. package/dist/tools/explore.js.map +1 -0
  333. package/dist/tools/firstRun.js +136 -0
  334. package/dist/tools/firstRun.js.map +1 -0
  335. package/dist/tools/flow.js +331 -0
  336. package/dist/tools/flow.js.map +1 -0
  337. package/dist/tools/flowGenerate.js +55 -0
  338. package/dist/tools/flowGenerate.js.map +1 -0
  339. package/dist/tools/getArtifact.js +39 -0
  340. package/dist/tools/getArtifact.js.map +1 -0
  341. package/dist/tools/health.js +41 -0
  342. package/dist/tools/health.js.map +1 -0
  343. package/dist/tools/ios.js +492 -0
  344. package/dist/tools/ios.js.map +1 -0
  345. package/dist/tools/jobs.js +20 -0
  346. package/dist/tools/jobs.js.map +1 -0
  347. package/dist/tools/network.js +50 -0
  348. package/dist/tools/network.js.map +1 -0
  349. package/dist/tools/note.js +69 -0
  350. package/dist/tools/note.js.map +1 -0
  351. package/dist/tools/plan.js +49 -0
  352. package/dist/tools/plan.js.map +1 -0
  353. package/dist/tools/prepareIosTarget.js +99 -0
  354. package/dist/tools/prepareIosTarget.js.map +1 -0
  355. package/dist/tools/prepareTarget.js +257 -0
  356. package/dist/tools/prepareTarget.js.map +1 -0
  357. package/dist/tools/report.js +42 -0
  358. package/dist/tools/report.js.map +1 -0
  359. package/dist/tools/screenRecord.js +24 -0
  360. package/dist/tools/screenRecord.js.map +1 -0
  361. package/dist/tools/screenshot.js +63 -0
  362. package/dist/tools/screenshot.js.map +1 -0
  363. package/dist/tools/smoke.js +39 -0
  364. package/dist/tools/smoke.js.map +1 -0
  365. package/dist/tools/snapshot.js +129 -0
  366. package/dist/tools/snapshot.js.map +1 -0
  367. package/dist/tools/startSession.js +169 -0
  368. package/dist/tools/startSession.js.map +1 -0
  369. package/dist/tools/state.js +87 -0
  370. package/dist/tools/state.js.map +1 -0
  371. package/dist/tools/suite.js +412 -0
  372. package/dist/tools/suite.js.map +1 -0
  373. package/dist/tools/testThis.js +774 -0
  374. package/dist/tools/testThis.js.map +1 -0
  375. package/dist/tools/wda.js +477 -0
  376. package/dist/tools/wda.js.map +1 -0
  377. package/dist/version.js +62 -0
  378. package/dist/version.js.map +1 -0
  379. package/dist/visual/ocr.js +72 -0
  380. package/dist/visual/ocr.js.map +1 -0
  381. package/dist/visual/provider.js +75 -0
  382. package/dist/visual/provider.js.map +1 -0
  383. package/docs/README.md +19 -0
  384. package/docs/assets/swipium-lockup-ink-on-light.png +0 -0
  385. package/docs/mcp-server.md +135 -0
  386. package/docs/tools.md +130 -0
  387. package/package.json +70 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"planner.js","sourceRoot":"","sources":["../../src/explore/planner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,85 @@
1
+ // Exploration safety policy (Phase 3.3 §7). Classify an actionable control's risk so strict-mode
2
+ // exploration never taps something destructive (delete / pay / send / logout / confirm-of-destruction)
3
+ // without explicit approval. Lexical + structural (Android button1/button2, role) signals; PURE.
4
+ // Verbs that mutate data, money, identity, or messaging — never auto-tapped in strict mode.
5
+ const DESTRUCTIVE = /\b(delete|remove|clear|reset|wipe|erase|discard|pay|buy|purchase|checkout|subscribe|unsubscribe|place\s+order|submit\s+order|send|invite|log\s?out|sign\s?out|deactivate|deregister|block|report|withdraw|transfer|export|share|permission|allow|deny)\b/i;
6
+ const HIGH_IMPACT = [
7
+ ['payment', /\b(pay|buy|purchase|checkout|subscribe|place\s+order|submit\s+order|transfer|withdraw)\b/i],
8
+ ['message_send', /\b(send|message|sms|email)\b/i],
9
+ ['external_invite', /\b(invite|share)\b/i],
10
+ ['account_delete', /\b(delete|deactivate|deregister|close)\s+(account|profile)\b/i],
11
+ ['bulk_delete', /\b(delete|remove|clear|wipe|erase)\s+(all|everything|history|data|items|records)\b/i],
12
+ ['permission_change', /\b(permission|allow|deny|grant|revoke|location|camera|photos|contacts|microphone)\b/i],
13
+ ['logout', /\b(log\s?out|sign\s?out)\b/i],
14
+ ['data_export', /\b(export|download|share)\s+(data|report|records|history)\b/i],
15
+ ];
16
+ // Confirmation-style verbs: dangerous only as the YES of a destructive dialog — treat as unknown
17
+ // (skipped in strict) unless paired with a destructive verb.
18
+ const CONFIRM = /\b(confirm|submit|proceed|ok|yes|agree|accept|continue)\b/i;
19
+ // Clearly-safe navigation/inspection words.
20
+ const SAFE = /\b(home|back|close|cancel|dismiss|settings?|search|menu|profile|account|info|details?|tab|next|explore|discover|map|list|history|help|about|notifications?|messages?|filter|sort|view|open|show|more|overview|dashboard|library|feed|favou?rites?)\b/i;
21
+ /**
22
+ * Classify an action's risk. Destructive verbs win; a bare confirm/submit is `unknown` (skipped in
23
+ * strict); recognizable navigation is `safe`; everything else is `unknown`.
24
+ */
25
+ export function classifyHighImpact(i) {
26
+ const hay = `${i.label ?? ''} ${i.id ?? ''}`.trim();
27
+ for (const [riskClass, re] of HIGH_IMPACT) {
28
+ if (!re.test(hay))
29
+ continue;
30
+ const stepUp = riskClass === 'payment' || riskClass === 'account_delete' || riskClass === 'bulk_delete' || riskClass === 'message_send';
31
+ return { riskClass, stepUp, requiresTwoStepConfirmation: stepUp || riskClass === 'permission_change' };
32
+ }
33
+ if (DESTRUCTIVE.test(hay))
34
+ return { riskClass: 'generic_destructive', stepUp: false, requiresTwoStepConfirmation: true };
35
+ return undefined;
36
+ }
37
+ export function classifyRisk(i) {
38
+ const hay = `${i.label ?? ''} ${i.id ?? ''}`.trim();
39
+ if (!hay)
40
+ return { risk: 'unknown', reason: 'unlabeled control — no text/accessibility id to judge safety' };
41
+ const impact = classifyHighImpact(i);
42
+ if (impact)
43
+ return { risk: 'destructive', reason: `matches a high-impact action (${impact.riskClass})`, ...impact };
44
+ if (DESTRUCTIVE.test(hay))
45
+ return { risk: 'destructive', reason: `matches a destructive action ("${(hay.match(DESTRUCTIVE) ?? [''])[0]}")`, riskClass: 'generic_destructive', requiresTwoStepConfirmation: true };
46
+ // Android dialog negative button is safe (backs out); positive button is the confirm.
47
+ if (/(^|[:/])button2$/i.test(i.id ?? ''))
48
+ return { risk: 'safe', reason: 'dialog negative/cancel button' };
49
+ if (/(^|[:/])button1$/i.test(i.id ?? '') || CONFIRM.test(hay))
50
+ return { risk: 'unknown', reason: 'confirmation control — risky as the YES of a destructive dialog; skipped in strict mode' };
51
+ if (SAFE.test(hay))
52
+ return { risk: 'safe', reason: `recognized navigation/inspection control ("${(hay.match(SAFE) ?? [''])[0]}")` };
53
+ return { risk: 'unknown', reason: 'unrecognized control — risk cannot be inferred from its label' };
54
+ }
55
+ /** Should this action run under the given safe mode? */
56
+ export function allowedUnder(risk, mode) {
57
+ if (risk === 'safe')
58
+ return true;
59
+ if (risk === 'destructive')
60
+ return false;
61
+ return mode === 'balanced'; // unknown controls are only allowed in explicit balanced exploration.
62
+ }
63
+ /**
64
+ * Logout is classified destructive for broad exploration (a sensible default). The mobile QA
65
+ * toolkit needs a NARROW exception: inside the controlled account-cycle workflow, on a disposable
66
+ * generated account, logout is an expected step. This never relaxes other destructive actions
67
+ * (delete/pay/send) and never applies outside the account-cycle workflow.
68
+ */
69
+ export function allowsControlledLogout(i, ctx) {
70
+ if (!ctx.accountCycle || !ctx.disposableAccount)
71
+ return false;
72
+ const impact = classifyHighImpact(i);
73
+ return impact?.riskClass === 'logout';
74
+ }
75
+ /**
76
+ * Resolve whether an action runs, honoring the controlled account-cycle logout exception. Falls
77
+ * back to the standard allowedUnder() decision for everything else.
78
+ */
79
+ export function allowedUnderWithAccountCycle(i, mode, ctx) {
80
+ const { risk } = classifyRisk(i);
81
+ if (risk === 'destructive' && ctx && allowsControlledLogout(i, ctx))
82
+ return true;
83
+ return allowedUnder(risk, mode);
84
+ }
85
+ //# sourceMappingURL=policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.js","sourceRoot":"","sources":["../../src/explore/policy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,475 @@
1
+ // Guided exploration runner (Phase 3.3 Milestones D/E/G). Bounded, safe-by-default screen crawl:
2
+ // observe → signature → rank safe candidates → act → health-check → record edge, until a budget is
3
+ // reached. Visual-only screens (poor UI tree) are verified with a screenshot + visual assertion
4
+ // instead of blind coordinate crawling. Honest: unsafe actions are skipped with a note; an auth
5
+ // wall with no credentials returns NeedsInput. Drives only the Driver interface — no MCP-over-MCP.
6
+ import { parseSnapshot } from '../snapshot/parse.js';
7
+ import { settle } from '../snapshot/settle.js';
8
+ import { checkHealth } from '../oracle/health.js';
9
+ import { recordHealthFindings } from '../oracle/record.js';
10
+ import { ExploreGraph } from './graph.js';
11
+ import { structuredSignature, visualSignature } from './signatures.js';
12
+ import { rankCandidates, locatorQuality } from './candidates.js';
13
+ import { allowedUnder, allowsControlledLogout } from './policy.js';
14
+ import { coverageClaimsFrom, estimateFeatureCoverage, inferAppDomain, proposeTasks, reflectExploration } from './planner.js';
15
+ import { scorePromotionCandidates } from './suite.js';
16
+ import { hasDisposableState, resolveFixtureValue } from '../fixtures/catalog.js';
17
+ import { fieldKindFromHints } from '../firstRun/classifyScreen.js';
18
+ import { generateFieldValue } from '../firstRun/generatedDataPolicy.js';
19
+ import { resolveFirstRunPolicy } from '../firstRun/firstRunRunner.js';
20
+ import { NeedsInput } from '../lib/needsInput.js';
21
+ const AUTH_RE = /\b(sign in|log\s?in|password|email|username|continue with|create account)\b/i;
22
+ function hasCredentials(session) {
23
+ return session.inputs.some((i) => /EMAIL|PASSWORD/.test(i.varName));
24
+ }
25
+ function generatorVarFor(field) {
26
+ if (field === 'email')
27
+ return 'SWIPIUM_TEST_EMAIL';
28
+ if (field === 'password' || field === 'confirm_password')
29
+ return 'SWIPIUM_TEST_PASSWORD';
30
+ if (field === 'otp')
31
+ return 'SWIPIUM_TEST_OTP';
32
+ return `SWIPIUM_GEN_${field.toUpperCase()}`;
33
+ }
34
+ function valueForField(session, label, locatorValue, role, secure, gen) {
35
+ const key = `${label ?? ''} ${locatorValue ?? ''}`.toLowerCase();
36
+ const fromStore = (varName, isSecret) => {
37
+ const value = session.inputValues.get(varName);
38
+ return value ? { value, varName, secret: isSecret, source: 'secure_input' } : undefined;
39
+ };
40
+ if (/pass/.test(key) || secure) {
41
+ const v = fromStore('SWIPIUM_TEST_PASSWORD', true);
42
+ if (v)
43
+ return v;
44
+ }
45
+ if (/email|user|account|login/.test(key)) {
46
+ const v = fromStore('SWIPIUM_TEST_EMAIL', false);
47
+ if (v)
48
+ return v;
49
+ }
50
+ if (/otp|code|2fa|mfa/.test(key)) {
51
+ const v = fromStore('SWIPIUM_TEST_OTP', true);
52
+ if (v)
53
+ return v;
54
+ }
55
+ const resolved = resolveFixtureValue(session, label, locatorValue, { role });
56
+ if (resolved)
57
+ return resolved;
58
+ // Built-in safe generator — only when generation is explicitly allowed for this environment.
59
+ if (gen?.allowed) {
60
+ const field = fieldKindFromHints(label, locatorValue, undefined, secure);
61
+ const g = generateFieldValue(field, gen.policy);
62
+ if (g) {
63
+ const varName = generatorVarFor(field);
64
+ session.inputValues.set(varName, g.value);
65
+ if (g.secret)
66
+ session.secrets.add(g.value);
67
+ session.generatedValues.push({ at: Date.now(), fixture: 'generated', field, varName, generator: g.generator, value: g.value, secret: g.secret });
68
+ return { value: g.value, varName, secret: g.secret, fixture: 'generated', field, source: 'generator' };
69
+ }
70
+ }
71
+ return undefined;
72
+ }
73
+ function strategyToKind(strategy) {
74
+ switch (strategy) {
75
+ case 'accessibility':
76
+ return 'accessibility_id';
77
+ case 'id':
78
+ return 'resource_id'; // Android resource-id → durable id= selector (not a text match)
79
+ case 'text':
80
+ return 'text';
81
+ default:
82
+ return 'coords';
83
+ }
84
+ }
85
+ function boundsBucket(bounds) {
86
+ if (!bounds)
87
+ return undefined;
88
+ const bucket = (n) => Math.floor(n / 50) * 50;
89
+ return `${bucket(bounds.x)},${bucket(bounds.y)},${bucket(bounds.x + bounds.w)},${bucket(bounds.y + bounds.h)}`;
90
+ }
91
+ function provenanceForCandidate(node, candidate) {
92
+ return {
93
+ originalScreenSignature: node.signature,
94
+ elementRole: candidate.role,
95
+ text: candidate.label,
96
+ resourceId: candidate.locator?.strategy === 'id' ? candidate.locator.value : undefined,
97
+ boundsBucket: boundsBucket(candidate.bounds),
98
+ screenshotUri: node.screenshotUri,
99
+ selectorKind: candidate.locator?.strategy,
100
+ selectorValue: candidate.locator?.value,
101
+ };
102
+ }
103
+ function destructiveMutationTarget(session, node, candidate, approval) {
104
+ return {
105
+ sessionId: session.id,
106
+ screenSignature: node.signature,
107
+ candidateSignature: candidate.signatureKey,
108
+ label: candidate.label ?? null,
109
+ locator: candidate.locator ?? null,
110
+ riskClass: candidate.riskClass ?? null,
111
+ stepUp: candidate.stepUp ?? false,
112
+ requiresTwoStepConfirmation: candidate.requiresTwoStepConfirmation ?? false,
113
+ confirmHighImpact: approval?.confirmHighImpact === true,
114
+ requiresDisposableState: true,
115
+ };
116
+ }
117
+ export async function runExplore(sessions, session, driver, opts, ctx = {}) {
118
+ const platform = driver.kind === 'wda' || driver.kind === 'simulator' ? 'ios' : 'android';
119
+ const graph = new ExploreGraph(platform);
120
+ const safeMode = opts.safeMode === 'approved_destructive' ? 'strict' : (opts.safeMode ?? 'strict');
121
+ const maxActions = opts.maxActions ?? 20;
122
+ const maxScreens = opts.maxScreens ?? 12;
123
+ const depth = opts.depth ?? 3;
124
+ const stopOnAuth = opts.stopOnAuth ?? true;
125
+ // SWIPIUM-REQ-02: resolve the generated-data decision once. Only "allowed" when policy + the
126
+ // classified environment (test/staging) permit safe throwaway data; otherwise generation is off.
127
+ const genCtx = opts.allowGeneratedData
128
+ ? (() => { const r = resolveFirstRunPolicy(session, { testDataPolicyPath: opts.testDataPolicyPath, allowGeneratedAccount: true }); return { allowed: r.decision.allowed, policy: r.policy }; })()
129
+ : undefined;
130
+ const startedAt = Date.now();
131
+ const deadline = startedAt + (opts.maxDurationMs ?? 6 * 60_000);
132
+ const signal = ctx.signal;
133
+ const progress = (t) => ctx.onProgress?.(t);
134
+ const summary = {
135
+ screensVisited: 0,
136
+ actionsTried: 0,
137
+ workflowsFound: 0,
138
+ blockers: 0,
139
+ appErrors: 0,
140
+ visualOnlyScreens: 0,
141
+ unsafeActionsSkipped: 0,
142
+ featureCoverage: Object.create(null),
143
+ destructiveCandidates: 0,
144
+ promotedSuiteCandidates: 0,
145
+ };
146
+ const exploredPerScreen = new Map(); // nodeId → explored signatureKeys
147
+ const skippedNotedScreens = new Set();
148
+ const destructiveCandidates = new Map();
149
+ let lastNodeId;
150
+ let consecutiveNoChange = 0;
151
+ let sameScreenEdges = 0;
152
+ let planned = false;
153
+ const note = (n) => sessions.addNote(session, { at: Date.now(), ...n });
154
+ /** Observe the current screen → a graph node (structured or visual-only). */
155
+ const observe = async () => {
156
+ const foreground = await driver.foregroundOwner().catch(() => 'unknown');
157
+ let xml = '';
158
+ let elements = [];
159
+ let webviewDominance = 0;
160
+ try {
161
+ xml = await driver.dumpXml();
162
+ const parsed = parseSnapshot(xml);
163
+ elements = parsed.elements;
164
+ webviewDominance = parsed.quality.signals.webviewDominance;
165
+ }
166
+ catch {
167
+ /* snapshot failed → treated as visual-only below */
168
+ }
169
+ const health = await checkHealth(driver, session.appId, xml || undefined);
170
+ await recordHealthFindings(sessions, session, health.findings, driver, health.foreground);
171
+ if (!health.nativeHealthy)
172
+ summary.appErrors += 0; // native handled separately below
173
+ const healthSnap = { native: (health.nativeHealthy ? 'OK' : 'error'), app: health.appStatus === 'error' ? 'error' : health.appStatus === 'degraded' ? 'degraded' : 'OK' };
174
+ let screenshotUri;
175
+ let png;
176
+ // Respect the SESSION screenshot budget (not a separate fixed counter) so two observes per
177
+ // action can't overshoot the cap (P2 fix).
178
+ if (!session.sensitive && session.counters.screenshots < session.budget.maxScreenshots) {
179
+ try {
180
+ png = await driver.screenshot();
181
+ screenshotUri = sessions.saveArtifact(session, 'screenshot', `explore-${Date.now()}.png`, png, 'image/png', 'exploration evidence');
182
+ sessions.bump(session, 'screenshots');
183
+ }
184
+ catch {
185
+ /* best-effort */
186
+ }
187
+ }
188
+ // Visual-only (Milestone E): no usable structured elements (canvas/map/webview/empty) → visual
189
+ // node + assertion, no blind coordinate crawl. A low automation-readiness verdict on a screen
190
+ // that DOES expose identified elements is still structured (we can act on it).
191
+ const visual = elements.length === 0 || webviewDominance > 0.5;
192
+ const authWall = elements.some((e) => e.secure) || AUTH_RE.test(elements.map((e) => e.text || e.label || '').join(' '));
193
+ const ctxSig = { foreground, keyboardShown: false };
194
+ let signature;
195
+ let candidates = [];
196
+ if (visual) {
197
+ const size = (await driver.screenSize().catch(() => null)) ?? { width: 0, height: 0 };
198
+ signature = png ? visualSignature(png, size, ctxSig) : `visual:noshot:${foreground}`;
199
+ }
200
+ else {
201
+ signature = structuredSignature(elements, ctxSig);
202
+ candidates = rankCandidates(elements, { includeTextEntry: opts.includeTextEntry });
203
+ }
204
+ const { node, isNew } = graph.upsert({
205
+ signature,
206
+ title: foreground,
207
+ mode: visual ? 'visual' : 'structured',
208
+ platform,
209
+ screenshotUri,
210
+ health: healthSnap,
211
+ authState: authWall ? 'auth_required' : undefined,
212
+ visualOnlyReason: visual ? 'no reliable UI tree (canvas/map/webview or empty snapshot)' : undefined,
213
+ locatorQuality: visual ? undefined : locatorQuality(elements),
214
+ elements: candidates.map((c) => ({ ref: c.ref, candidateSignature: c.signatureKey, label: c.label, role: c.role, bounds: c.bounds, locator: c.locator, actionType: c.actionType, risk: c.risk, riskClass: c.riskClass, stepUp: c.stepUp, requiresTwoStepConfirmation: c.requiresTwoStepConfirmation, reason: c.reason })),
215
+ });
216
+ if (isNew)
217
+ summary.screensVisited++;
218
+ if (isNew && visual)
219
+ summary.visualOnlyScreens++;
220
+ if (healthSnap.app === 'error')
221
+ summary.appErrors++;
222
+ // Visual-only screens get a recorded visual assertion as their oracle (Milestone E).
223
+ if (visual && isNew) {
224
+ note({ workflow: 'guided_exploration', outcome: 'pass', category: undefined, reason: `visual-only screen "${foreground}" — verified by screenshot`, verifiedVisually: true, method: 'visual', artifactUris: screenshotUri ? [screenshotUri] : undefined });
225
+ }
226
+ return { node, isNew, candidates, visual, authWall };
227
+ };
228
+ const allowedCandidate = (candidate, node) => {
229
+ if (candidate.risk !== 'destructive')
230
+ return allowedUnder(candidate.risk, safeMode);
231
+ // Controlled account-cycle exception (REQ-07): logout — and only logout — is an expected step
232
+ // on a disposable generated account inside the mobile-audit account-cycle workflow.
233
+ if (opts.accountCycle?.enabled &&
234
+ allowsControlledLogout({ label: candidate.label, id: candidate.locator?.value, role: candidate.locator?.strategy }, { accountCycle: true, disposableAccount: opts.accountCycle.disposableAccount })) {
235
+ return true;
236
+ }
237
+ const rec = {
238
+ screenSignature: node.signature,
239
+ candidateSignature: candidate.signatureKey,
240
+ label: candidate.label,
241
+ locator: candidate.locator,
242
+ riskClass: candidate.riskClass,
243
+ };
244
+ destructiveCandidates.set(`${node.signature}:${candidate.signatureKey}`, rec);
245
+ if (safeMode !== 'approved_destructive_candidate')
246
+ return false;
247
+ const approval = opts.destructiveApproval;
248
+ if (!approval)
249
+ return false;
250
+ if (approval.expiresAt && Date.now() > approval.expiresAt)
251
+ return false;
252
+ if (approval.sessionId !== session.id)
253
+ return false;
254
+ if (approval.requiresDisposableState !== false && !hasDisposableState(session))
255
+ return false;
256
+ if (approval.screenSignature !== node.signature)
257
+ return false;
258
+ if (approval.candidateSignature !== candidate.signatureKey)
259
+ return false;
260
+ if (approval.label && candidate.label && approval.label !== candidate.label)
261
+ return false;
262
+ if (approval.locator?.value && candidate.locator?.value !== approval.locator.value)
263
+ return false;
264
+ if ((candidate.stepUp || candidate.requiresTwoStepConfirmation) && approval.confirmHighImpact !== true)
265
+ return false;
266
+ return true;
267
+ };
268
+ // ---- main loop ----
269
+ let stoppedReason = 'exploration complete';
270
+ while (true) {
271
+ if (signal?.aborted) {
272
+ stoppedReason = 'cancelled';
273
+ break;
274
+ }
275
+ if (summary.actionsTried >= maxActions) {
276
+ stoppedReason = `action budget reached (${maxActions})`;
277
+ break;
278
+ }
279
+ if (graph.nodeCount() >= maxScreens) {
280
+ stoppedReason = `screen budget reached (${maxScreens})`;
281
+ break;
282
+ }
283
+ if (Date.now() >= deadline) {
284
+ stoppedReason = 'time budget reached';
285
+ break;
286
+ }
287
+ const budgetStop = sessions.budgetStop(session);
288
+ if (budgetStop) {
289
+ stoppedReason = `session budget: ${budgetStop}`;
290
+ break;
291
+ }
292
+ const obs = await observe();
293
+ progress(`exploring: ${summary.screensVisited} screens, ${summary.actionsTried} actions${obs.visual ? ', visual-only' : ''}`);
294
+ if (!planned && (opts.strategy === 'task_planner' || opts.strategy === 'hybrid')) {
295
+ planned = true;
296
+ const screenText = obs.candidates.map((c) => `${c.label ?? ''} ${c.locator?.value ?? ''}`).join(' ');
297
+ const domain = inferAppDomain({ packageId: session.appId, goal: opts.goal, screenText, fixtures: session.fixtures.map((f) => f.name) });
298
+ const tasks = proposeTasks({ packageId: session.appId, goal: opts.goal, screenText, fixtures: session.fixtures.map((f) => f.name), candidates: obs.candidates });
299
+ graph.setTasks(tasks);
300
+ graph.setHypotheses([`domain:${domain.domain}`, ...tasks.map((t) => `${t.feature}:${t.title}`)]);
301
+ graph.setBlockedPreconditions([...new Set(tasks.flatMap((t) => t.preconditions))]);
302
+ }
303
+ // App error → record + stop this path (do not hide bugs; do not keep crawling a broken screen).
304
+ if (obs.node.health.app === 'error') {
305
+ note({ workflow: 'guided_exploration', outcome: 'fail', category: 'app_bug', reason: `app-layer error on "${obs.node.title}"`, artifactUris: obs.node.screenshotUri ? [obs.node.screenshotUri] : undefined });
306
+ summary.blockers++;
307
+ if (lastNodeId)
308
+ graph.addEdge({ from: lastNodeId, to: obs.node.id, action: { type: 'tap', targetDescription: 'prev action' }, outcome: 'app_error', evidenceUris: obs.node.screenshotUri ? [obs.node.screenshotUri] : [] });
309
+ stoppedReason = 'app-layer error encountered';
310
+ break;
311
+ }
312
+ if (obs.node.health.native === 'error') {
313
+ summary.blockers++;
314
+ stoppedReason = 'native error encountered';
315
+ break;
316
+ }
317
+ // Auth wall with no credentials.
318
+ if (obs.authWall && !hasCredentials(session)) {
319
+ note({ workflow: 'guided_exploration', outcome: 'blocked', category: 'missing_test_data', reason: 'login required, no credentials available', missingPrecondition: 'test account credentials', recommendedSetup: 'Provide TEST_EMAIL/TEST_PASSWORD (qa_continue_from_blocker) or accept pre-login coverage.' });
320
+ summary.blockers++;
321
+ if (stopOnAuth) {
322
+ const suitePromotion = finalizeGraph(graph, summary, sameScreenEdges, destructiveCandidates, ['auth wall blocked exploration']);
323
+ return { graph, summary, needsInput: NeedsInput.credentials('Exploration hit a login screen.'), state: 'needs_input', stoppedReason: 'auth required (credentials missing)', suitePromotion, destructiveCandidates: [...destructiveCandidates.values()] };
324
+ }
325
+ // stopOnAuth:false → record blocked and stop crawling further (only public screens were reachable).
326
+ stoppedReason = 'auth required — recorded blocked, no credentials to proceed';
327
+ break;
328
+ }
329
+ const explored = exploredPerScreen.get(obs.node.id) ?? new Set();
330
+ exploredPerScreen.set(obs.node.id, explored);
331
+ // Visual-only screens: no safe structured target → step back to keep the graph connected.
332
+ const pick = obs.candidates.find((c) => !explored.has(c.signatureKey) && allowedCandidate(c, obs.node));
333
+ const blockedCandidates = obs.candidates.filter((c) => !allowedCandidate(c, obs.node));
334
+ if (blockedCandidates.length && !skippedNotedScreens.has(obs.node.id)) {
335
+ skippedNotedScreens.add(obs.node.id);
336
+ const ex = blockedCandidates[0];
337
+ note({ workflow: 'guided_exploration', outcome: 'skipped', category: ex.risk === 'destructive' ? 'destructive_refused' : 'other', reason: `Skipped ${ex.risk} action "${ex.label ?? ex.locator?.value}": ${ex.reason}`, recommendedSetup: ex.risk === 'destructive' ? 'Run dry_run_destructive to list candidate-bound approvals, then approve one exact candidate with disposable test state.' : 'Add accessibilityLabel/testID so the action can be judged + automated.' });
338
+ summary.unsafeActionsSkipped += blockedCandidates.length;
339
+ }
340
+ if (!pick) {
341
+ // Nothing safe+new here. Go back to keep exploring; if we're at the root with nothing, stop.
342
+ if (lastNodeId && obs.node.id !== graph.rootId && depth > 1) {
343
+ await driver.pressKey('back').catch(() => { });
344
+ graph.addEdge({ from: obs.node.id, action: { type: 'back', targetDescription: 'back' }, outcome: 'changed_screen', evidenceUris: [] });
345
+ await settle(driver, { timeoutMs: 4000 }).catch(() => { });
346
+ lastNodeId = obs.node.id;
347
+ continue;
348
+ }
349
+ stoppedReason = 'no further safe, unexplored actions';
350
+ break;
351
+ }
352
+ // ---- act on the chosen candidate ----
353
+ explored.add(pick.signatureKey);
354
+ const cx = (pick.bounds?.x ?? 0) + (pick.bounds?.w ?? 0) / 2;
355
+ const cy = (pick.bounds?.y ?? 0) + (pick.bounds?.h ?? 0) / 2;
356
+ const fromId = obs.node.id;
357
+ // Text entry only with a value source (P1 fix): never type blindly. If none, skip honestly.
358
+ if (pick.actionType === 'type') {
359
+ const v = valueForField(session, pick.label, pick.locator?.value, pick.role, pick.secure, genCtx);
360
+ if (!v) {
361
+ note({ workflow: 'guided_exploration', outcome: 'skipped', category: 'missing_test_data', reason: `text field "${pick.label ?? pick.locator?.value}" needs a value to exercise`, missingPrecondition: 'a fixture value or credential for this field', recommendedSetup: 'Provide credentials (qa_continue_from_blocker) or a fixture { name, value }.' });
362
+ summary.blockers++;
363
+ continue;
364
+ }
365
+ try {
366
+ await driver.tapXY(Math.round(cx), Math.round(cy)); // focus the field
367
+ await driver.inputText(v.value);
368
+ }
369
+ catch {
370
+ graph.addEdge({ from: fromId, action: { type: 'type', targetDescription: pick.label ?? 'field' }, outcome: 'blocked', evidenceUris: [] });
371
+ continue;
372
+ }
373
+ summary.actionsTried++;
374
+ sessions.bump(session, 'actions');
375
+ if (v.secret)
376
+ session.secrets.add(v.value);
377
+ if (v.source === 'generator') {
378
+ const rec = session.generatedValues.find((g) => g.varName === v.varName && g.fixture === v.fixture && g.field === v.field);
379
+ if (rec && !rec.artifactUri) {
380
+ rec.artifactUri = sessions.saveArtifact(session, 'generated_data', `generated-${v.varName.toLowerCase()}-${Date.now()}.json`, JSON.stringify({ schema: 'swipium.generated_value.v1', fixture: rec.fixture, field: rec.field, varName: rec.varName, generator: rec.generator, value: rec.secret ? '<redacted>' : rec.value, secret: rec.secret }, null, 2), 'application/json', `generated fixture value ${rec.fixture}.${rec.field}`);
381
+ sessions.persist(session);
382
+ }
383
+ }
384
+ if (pick.locator && pick.locator.strategy !== 'coordinate') {
385
+ sessions.addRecordedAction(session, { at: Date.now(), action: 'type', selector: pick.locator.value, selectorKind: strategyToKind(pick.locator.strategy), text: `\${${v.varName}}`, secret: v.secret, exportability: v.secret ? 'needs-human-data' : 'semantic', screen: obs.node.title, provenance: provenanceForCandidate(obs.node, pick) });
386
+ }
387
+ await settle(driver, { timeoutMs: 5000 }).catch(() => { });
388
+ const afterType = await observe();
389
+ graph.addEdge({ from: fromId, to: afterType.node.id, action: { type: 'type', targetDescription: pick.label ?? 'field' }, outcome: afterType.node.id === fromId ? 'same_screen' : 'changed_screen', evidenceUris: [] });
390
+ lastNodeId = afterType.node.id;
391
+ continue;
392
+ }
393
+ try {
394
+ await driver.tapXY(Math.round(cx), Math.round(cy));
395
+ }
396
+ catch {
397
+ if (pick.risk === 'destructive') {
398
+ sessions.recordMutation(session, {
399
+ tool: 'qa_explore',
400
+ action: 'destructive_ui_candidate',
401
+ risk: 'high',
402
+ target: destructiveMutationTarget(session, obs.node, pick, opts.destructiveApproval),
403
+ consent: { required: true, consentId: opts.destructiveApproval?.consentId, approved: true },
404
+ status: 'blocked',
405
+ detail: 'Approved destructive exploration candidate could not be tapped.',
406
+ });
407
+ }
408
+ graph.addEdge({ from: fromId, action: { type: 'tap', targetDescription: pick.label ?? pick.locator?.value ?? 'control' }, outcome: 'blocked', evidenceUris: [] });
409
+ continue;
410
+ }
411
+ if (pick.risk === 'destructive') {
412
+ sessions.recordMutation(session, {
413
+ tool: 'qa_explore',
414
+ action: 'destructive_ui_candidate',
415
+ risk: 'high',
416
+ target: destructiveMutationTarget(session, obs.node, pick, opts.destructiveApproval),
417
+ consent: { required: true, consentId: opts.destructiveApproval?.consentId, approved: true },
418
+ status: 'executed',
419
+ detail: 'Approved destructive exploration candidate tapped.',
420
+ });
421
+ }
422
+ summary.actionsTried++;
423
+ sessions.bump(session, 'actions');
424
+ // Record durable taps so qa_suite_generate can promote the path (§9.3).
425
+ if (pick.locator && pick.locator.strategy !== 'coordinate') {
426
+ sessions.addRecordedAction(session, { at: Date.now(), action: 'tap', selector: pick.locator.value, selectorKind: strategyToKind(pick.locator.strategy), exportability: 'semantic', screen: obs.node.title, provenance: provenanceForCandidate(obs.node, pick) });
427
+ }
428
+ await settle(driver, { timeoutMs: 5000 }).catch(() => { });
429
+ // ---- observe outcome to classify the transition ----
430
+ const after = await observe();
431
+ const outcome = after.node.id === fromId ? 'same_screen' : 'changed_screen';
432
+ if (outcome === 'changed_screen') {
433
+ summary.workflowsFound++;
434
+ consecutiveNoChange = 0;
435
+ }
436
+ else {
437
+ consecutiveNoChange++;
438
+ }
439
+ if (outcome === 'same_screen')
440
+ sameScreenEdges++;
441
+ graph.addEdge({ from: fromId, to: after.node.id, action: { type: 'tap', targetDescription: pick.label ?? pick.locator?.value ?? 'control', locator: pick.locator }, outcome, evidenceUris: after.node.screenshotUri ? [after.node.screenshotUri] : [], riskDecision: pick.riskClass ?? pick.risk, preActionState: obs.node.signature, postActionState: after.node.signature, oracle: outcome === 'changed_screen' ? 'screen_signature_changed' : 'screen_signature_same' });
442
+ lastNodeId = after.node.id;
443
+ if (consecutiveNoChange >= 3) {
444
+ stoppedReason = 'repeated no-change actions';
445
+ break;
446
+ }
447
+ }
448
+ const suitePromotion = finalizeGraph(graph, summary, sameScreenEdges, destructiveCandidates, []);
449
+ return { graph, summary, state: summary.appErrors > 0 || summary.blockers > 0 ? 'blocked' : 'completed', stoppedReason, suitePromotion, destructiveCandidates: [...destructiveCandidates.values()] };
450
+ }
451
+ function finalizeGraph(graph, summary, sameScreenEdges, destructiveCandidates, reasons) {
452
+ const nodes = graph.allNodes();
453
+ const existing = graph.serialize(new Date(0).toISOString());
454
+ const features = estimateFeatureCoverage(nodes, existing.tasks);
455
+ summary.featureCoverage = features;
456
+ summary.destructiveCandidates = destructiveCandidates.size;
457
+ if (existing.tasks.length) {
458
+ graph.setTasks(existing.tasks.map((task) => ({
459
+ ...task,
460
+ status: features[task.feature] === 'covered'
461
+ ? 'completed'
462
+ : features[task.feature] === 'unsafe'
463
+ ? 'unsafe'
464
+ : features[task.feature] === 'blocked' || features[task.feature] === 'needs_fixture'
465
+ ? 'blocked'
466
+ : 'not_applicable',
467
+ })));
468
+ }
469
+ graph.setCoverageClaims(coverageClaimsFrom(features, nodes));
470
+ graph.setReflection(reflectExploration(nodes, sameScreenEdges, reasons));
471
+ const promotion = scorePromotionCandidates(graph);
472
+ summary.promotedSuiteCandidates = promotion.filter((p) => p.status === 'promote').length;
473
+ return promotion;
474
+ }
475
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/explore/runner.ts"],"names":[],"mappings":"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"}