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,35 @@
1
+ // Screen signatures (Phase 3.3 §6.4). Identify a screen so revisiting Home dedupes to one node
2
+ // while a modal becomes a distinct node. Layered: structured (UI tree) when available, visual
3
+ // (screenshot hash) when the tree is poor, plus context (foreground + modal/keyboard). PURE.
4
+ import { createHash } from 'node:crypto';
5
+ function short(s) {
6
+ return createHash('sha256').update(s).digest('hex').slice(0, 12);
7
+ }
8
+ function ctxSuffix(ctx) {
9
+ return `${ctx.foreground ?? ''}|${ctx.modalPresent ? 'modal' : ''}|${ctx.keyboardShown ? 'kbd' : ''}`;
10
+ }
11
+ /**
12
+ * Structured signature: stable ids + normalized visible text + a coarse element-count bucket. Text
13
+ * is included but bucketed/sorted so transient toasts don't shift identity; ids dominate when present.
14
+ */
15
+ export function structuredSignature(elements, ctx = {}) {
16
+ const ids = [...new Set(elements.map((e) => e.id).filter(Boolean))].sort();
17
+ const labels = [...new Set(elements.map((e) => (e.label || e.text || '').trim().toLowerCase()).filter((t) => t.length > 0 && t.length <= 40))].sort();
18
+ // Coarse count bucket so one extra list row doesn't fork the screen identity.
19
+ const bucket = Math.min(10, Math.floor(elements.length / 5));
20
+ const body = `ids:${ids.join(',')}|labels:${labels.slice(0, 25).join(',')}|n:${bucket}`;
21
+ return `struct:${short(body + '|' + ctxSuffix(ctx))}`;
22
+ }
23
+ /**
24
+ * Visual signature: screen dimensions + a cheap content hash of the screenshot bytes (sampled).
25
+ * Not a perceptual hash — good enough to dedupe an unchanged canvas/map screen across revisits.
26
+ */
27
+ export function visualSignature(png, screen, ctx = {}) {
28
+ // Sample bytes across the buffer so a large PNG hashes quickly and stably.
29
+ const step = Math.max(1, Math.floor(png.length / 4096));
30
+ let sample = '';
31
+ for (let i = 0; i < png.length; i += step)
32
+ sample += png[i].toString(16);
33
+ return `visual:${short(`${screen.width}x${screen.height}|${png.length}|${short(sample)}|${ctxSuffix(ctx)}`)}`;
34
+ }
35
+ //# sourceMappingURL=signatures.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signatures.js","sourceRoot":"","sources":["../../src/explore/signatures.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAC/F,8FAA8F;AAC9F,6FAA6F;AAE7F,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AASzC,SAAS,KAAK,CAAC,CAAS;IACtB,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACnE,CAAC;AAED,SAAS,SAAS,CAAC,GAAqB;IACtC,OAAO,GAAG,GAAG,CAAC,UAAU,IAAI,EAAE,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AACxG,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,QAA2B,EAAE,MAAwB,EAAE;IACzF,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3E,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACtJ,8EAA8E;IAC9E,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;IAC7D,MAAM,IAAI,GAAG,OAAO,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,MAAM,EAAE,CAAC;IACxF,OAAO,UAAU,KAAK,CAAC,IAAI,GAAG,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;AACxD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,GAAW,EAAE,MAAyC,EAAE,MAAwB,EAAE;IAChH,2EAA2E;IAC3E,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;IACxD,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,IAAI;QAAE,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACzE,OAAO,UAAU,KAAK,CAAC,GAAG,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;AAChH,CAAC"}
@@ -0,0 +1,55 @@
1
+ function nodeById(nodes) {
2
+ return new Map(nodes.map((n) => [n.id, n]));
3
+ }
4
+ function scoreEdge(edge, nodes) {
5
+ const to = edge.to ? nodes.get(edge.to) : undefined;
6
+ const reasons = [];
7
+ let score = 0;
8
+ if (edge.outcome === 'changed_screen') {
9
+ score += 30;
10
+ reasons.push('changes screen');
11
+ }
12
+ if (edge.action.locator) {
13
+ const durability = String(edge.action.locator.durability ?? '');
14
+ if (durability === 'high')
15
+ score += 30;
16
+ else if (durability === 'medium')
17
+ score += 15;
18
+ else
19
+ score -= 20;
20
+ }
21
+ else {
22
+ score -= 25;
23
+ reasons.push('no structured locator provenance');
24
+ }
25
+ if (to?.locatorQuality?.grade === 'A' || to?.locatorQuality?.grade === 'B')
26
+ score += 15;
27
+ if (to?.mode === 'visual') {
28
+ score -= 15;
29
+ reasons.push('depends on visual-only screen');
30
+ }
31
+ if (edge.outcome === 'unsafe_refused' || /destructive|payment|delete|send/i.test(edge.riskDecision ?? '')) {
32
+ score -= 50;
33
+ reasons.push('unsafe or destructive path');
34
+ }
35
+ return { score, reasons };
36
+ }
37
+ export function scorePromotionCandidates(graph) {
38
+ const nodes = nodeById(graph.allNodes());
39
+ const candidates = graph
40
+ .allEdges()
41
+ .filter((edge) => edge.outcome === 'changed_screen' && edge.to)
42
+ .map((edge) => {
43
+ const scored = scoreEdge(edge, nodes);
44
+ const path = [edge.from, edge.to];
45
+ const status = scored.score >= 45 ? 'promote' : 'reject';
46
+ return {
47
+ path,
48
+ score: scored.score,
49
+ status,
50
+ reasons: status === 'promote' ? ['semantic path has enough replay confidence', ...scored.reasons] : ['replay confidence below threshold', ...scored.reasons],
51
+ };
52
+ });
53
+ return candidates.sort((a, b) => b.score - a.score);
54
+ }
55
+ //# sourceMappingURL=suite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suite.js","sourceRoot":"","sources":["../../src/explore/suite.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,140 @@
1
+ // Bootstrap a prepared simulator session for the public v1 automation generator. Reuses the same
2
+ // resolver/planner/prepare path as qa_test_this, with the same consent gate. When a supported
3
+ // simulator target or artifact is not available, it returns a typed preparation blocker.
4
+ import { existsSync, readFileSync } from 'node:fs';
5
+ import { sep } from 'node:path';
6
+ import { createHash } from 'node:crypto';
7
+ import { qaError } from '../lib/result.js';
8
+ import { requireConsent, consumeConsent } from '../consent/consent.js';
9
+ import { scanProject } from '../context/scan.js';
10
+ import { resolveArtifact } from '../artifacts/resolve.js';
11
+ import { planTarget } from '../core/targetPlan.js';
12
+ import { adbDevices, listAvds, which, apkPackageId } from '../lib/android.js';
13
+ import { simctlAvailable, listSimulators } from '../lib/simctl.js';
14
+ import { buildTestThisPreflight } from '../services/preflight.js';
15
+ import { prepareAndroid } from '../services/prepareAndroid.js';
16
+ import { prepareIos } from '../services/prepareIos.js';
17
+ import { DirectDriver } from '../drivers/DirectDriver.js';
18
+ import { getDriver } from '../session/attach.js';
19
+ const SEL_TO_PLATFORM = {
20
+ 'android-emulator': 'android', 'android-real': 'android', 'ios-simulator': 'ios', 'ios-real': 'ios',
21
+ };
22
+ /** Resolve project → create session → resolve artifact/target → (consent) prepare the device. */
23
+ export async function bootstrapFeatureExecution(a) {
24
+ const { resolveProjectRoot } = await import('../context/projectRoot.js');
25
+ const resolved = await resolveProjectRoot(a.server, a.projectRoot);
26
+ if (!resolved.root) {
27
+ return { ok: false, result: qaError({ what: 'Could not resolve a project root for feature execution', changedState: false, retrySafe: true, nextSteps: ['Pass projectRoot="/abs/path" or a sessionId from qa_test_this.'], clientHint: resolved.hint }) };
28
+ }
29
+ const session = a.sessions.create(resolved.root, undefined, {});
30
+ const root = session.root;
31
+ const scan = await scanProject(root);
32
+ const routeToTestThis = (failureCode, what, extraSteps = []) => ({
33
+ ok: false,
34
+ result: qaError({
35
+ what, changedState: false, retrySafe: true, failureCode,
36
+ nextSteps: [...extraSteps, `Or run qa_test_this { projectRoot:"${root}", mode:"execute" } to prepare a simulator with consent, then retry qa_automation_generate.`],
37
+ }, { sessionId: session.id }),
38
+ });
39
+ // ---- artifact (same resolver as qa_test_this) ----
40
+ const art = await resolveArtifact({ projectRoot: root, platform: a.platform ?? 'any' });
41
+ if (!art.best) {
42
+ return routeToTestThis('NO_BUILD_ARTIFACT', `No installable artifact under ${root} to test "${a.feature}".`, [
43
+ 'Build the app artifact, then retry.',
44
+ `Searched: ${art.searchedLocations.slice(0, 5).join('; ') || '(root only)'}.`,
45
+ ]);
46
+ }
47
+ if (art.best.type === 'aab') {
48
+ return routeToTestThis('AAB_NEEDS_BUNDLETOOL', 'Only a .aab is present. Convert it to an installable APK first.', [`AAB path: ${art.best.path}`]);
49
+ }
50
+ // ---- target (same planner as qa_test_this) ----
51
+ const [adbPresent, simPresent] = await Promise.all([which('adb'), simctlAvailable()]);
52
+ const [online, avds, sims] = await Promise.all([
53
+ adbPresent ? adbDevices() : Promise.resolve([]),
54
+ adbPresent ? listAvds() : Promise.resolve([]),
55
+ simPresent ? listSimulators() : Promise.resolve([]),
56
+ ]);
57
+ const tInputs = {
58
+ requestedPlatform: a.platform,
59
+ requestedDevice: a.device,
60
+ artifactPlatform: art.best.platform,
61
+ artifactInstallTargets: art.best.installableOn,
62
+ android: { online, avds },
63
+ ios: {
64
+ bootedSimulators: sims.filter((s) => s.state === 'Booted').map((s) => ({ udid: s.udid, name: s.name })),
65
+ availableSimulators: sims.filter((s) => s.state !== 'Booted').map((s) => ({ udid: s.udid, name: s.name })),
66
+ realDevices: [],
67
+ },
68
+ };
69
+ const target = planTarget(tInputs);
70
+ if (target.blocked) {
71
+ return {
72
+ ok: false,
73
+ result: qaError({ what: target.blocked.detail, changedState: false, retrySafe: true, failureCode: target.blocked.failureCode, nextSteps: ['Bring a device online or create one (qa_doctor), then retry.', `Or run qa_test_this { projectRoot:"${root}", mode:"execute" }.`] }, { sessionId: session.id }),
74
+ };
75
+ }
76
+ if (target.selected === 'ios-real') {
77
+ return routeToTestThis('IPA_INSTALL_UNSUPPORTED', 'This artifact installs only on a real iOS device. Real-device workflows are outside the public v1 scope.');
78
+ }
79
+ const isAndroid = SEL_TO_PLATFORM[target.selected] === 'android';
80
+ const effectiveApk = isAndroid ? art.best.path : undefined;
81
+ const iosApp = !isAndroid ? art.best.path : undefined;
82
+ // ---- consent: never less safe than qa_test_this ----
83
+ let externalApk;
84
+ if (isAndroid && effectiveApk && existsSync(effectiveApk) && !effectiveApk.startsWith(root + sep)) {
85
+ try {
86
+ externalApk = { path: effectiveApk, sha256: createHash('sha256').update(readFileSync(effectiveApk)).digest('hex') };
87
+ }
88
+ catch {
89
+ /* unreadable — treated as in-root install */
90
+ }
91
+ }
92
+ const preflight = buildTestThisPreflight({
93
+ isAndroid, needBuild: false, willBoot: target.willBoot, bootTarget: target.bootTarget, isAab: false,
94
+ apkPath: effectiveApk, externalApk, iosApp, iosAppOutsideRoot: iosApp ? !iosApp.startsWith(root + sep) : undefined, iosReal: false,
95
+ });
96
+ let mutationConsent;
97
+ if (preflight.consentRequired) {
98
+ const gate = consumeConsent(a.consentId, a.approve, { action: 'test_this_plan', affects: preflight.consentAffects });
99
+ if (!gate.approved) {
100
+ a.sessions.recordMutation(session, { tool: 'qa_automation_generate', action: 'test_this_plan', risk: preflight.risk, target: preflight.consentAffects, consent: { required: true, approved: false }, status: 'requested' });
101
+ return {
102
+ ok: false,
103
+ result: requireConsent({
104
+ action: 'test_this_plan', risk: preflight.risk, exactCommand: preflight.exactCommand, affects: preflight.consentAffects,
105
+ explain: `Preparing a device to test "${a.feature}" needs these privileged steps (approved together):\n${preflight.exactCommand}\nApprove to boot/install/launch, then Swipium runs the focused feature test.`,
106
+ }),
107
+ };
108
+ }
109
+ mutationConsent = { required: true, consentId: a.consentId, approved: true };
110
+ a.sessions.recordMutation(session, { tool: 'qa_automation_generate', action: 'test_this_plan', risk: preflight.risk, target: preflight.consentAffects, consent: mutationConsent, status: 'approved' });
111
+ }
112
+ // ---- prepare (boot/install/launch) ----
113
+ try {
114
+ if (isAndroid) {
115
+ let appId = art.best.appId ?? scan.appId ?? undefined;
116
+ if (!appId && effectiveApk)
117
+ appId = (await apkPackageId(effectiveApk)) ?? undefined;
118
+ if (!appId)
119
+ return { ok: false, result: qaError({ what: 'Could not determine the app id from the APK.', changedState: false, retrySafe: false, failureCode: 'BUNDLE_ID_NOT_FOUND', nextSteps: ['Provide an APK with a readable manifest, or pass an explicit bundleId via qa_test_this.'] }, { sessionId: session.id }) };
120
+ const driver = session.driver ?? new DirectDriver();
121
+ driver.setSignal?.(a.signal);
122
+ const res = await prepareAndroid(a.sessions, session, driver, { needBoot: target.willBoot, bootTarget: target.bootTarget, serial: target.device, resolvedAppId: appId, apk: effectiveApk, rnDebug: scan.metroNeed === 'likely', allowLaunchWithoutMetro: false, mutationConsent }, { signal: a.signal });
123
+ if (!res.ok)
124
+ return { ok: false, result: qaError({ what: `Device preparation failed: ${res.error ?? res.failureCode}`, changedState: true, retrySafe: true, failureCode: res.failureCode ?? 'APP_LAUNCH_FAILED', nextSteps: ['Resolve the blocker and retry, or run qa_test_this { mode:"execute" }.'] }, { sessionId: session.id }) };
125
+ }
126
+ else {
127
+ const res = await prepareIos(a.sessions, session, { app: iosApp, bundleId: art.best.appId ?? undefined, simulator: target.device, attachWda: 'auto', mutationConsent }, {});
128
+ if (!res.ok)
129
+ return { ok: false, result: qaError({ what: `iOS preparation failed: ${res.error ?? res.failureCode}`, changedState: true, retrySafe: true, failureCode: res.failureCode ?? 'APP_LAUNCH_FAILED', nextSteps: ['Resolve the blocker and retry, or run qa_test_this { mode:"execute" }.'] }, { sessionId: session.id }) };
130
+ }
131
+ }
132
+ catch (e) {
133
+ return { ok: false, result: qaError({ what: `Device preparation error: ${String(e)}`, changedState: true, retrySafe: true, nextSteps: ['Retry, or run qa_test_this { mode:"execute" } to prepare a device.'] }, { sessionId: session.id }) };
134
+ }
135
+ const { driver } = await getDriver(session);
136
+ if (!driver)
137
+ return { ok: false, result: qaError({ what: 'No driver bound after device preparation.', changedState: true, retrySafe: true, failureCode: 'NO_DEVICE', nextSteps: ['Run qa_test_this { mode:"execute" } to prepare a simulator, then retry qa_automation_generate with that sessionId.'] }, { sessionId: session.id }) };
138
+ return { ok: true, session, driver };
139
+ }
140
+ //# sourceMappingURL=executionBootstrap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executionBootstrap.js","sourceRoot":"","sources":["../../src/featureTesting/executionBootstrap.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ // SWIPIUM-REQ-02 — auth/create-account reasoning across screens. Given a classified auth screen and
2
+ // the per-field input plans, decide the intent (login vs. create-account) and assemble the ordered
3
+ // actions: fill every required field, then tap the matching submit control. PURE.
4
+ const SUBMIT_CREATE = /\b(sign\s?up|create\s+(an\s+)?account|register|join|get\s+started|continue|next|done|submit)\b/i;
5
+ const SUBMIT_LOGIN = /\b(sign\s?in|log\s?in|continue|next|done|submit)\b/i;
6
+ /** Does the session already carry user-provided credentials (so we log in rather than create one)? */
7
+ export function hasProvidedCredentials(session) {
8
+ return session.inputs.some((i) => /EMAIL|PASSWORD/.test(i.varName)) || session.inputValues.has('SWIPIUM_TEST_EMAIL');
9
+ }
10
+ /** Choose login vs. create-account for the screen. */
11
+ export function chooseAuthIntent(purpose, session, generationAllowed) {
12
+ if (purpose === 'login')
13
+ return 'login';
14
+ if (purpose === 'create_account')
15
+ return 'create_account';
16
+ // credential_setup is a dedicated password/username step inside a signup flow: it IS account
17
+ // creation. Log in only when the user already supplied credentials to reuse; otherwise create.
18
+ if (purpose === 'credential_setup')
19
+ return hasProvidedCredentials(session) ? 'login' : 'create_account';
20
+ // login_or_create_account (or ambiguous): prefer login when the user gave credentials, else create
21
+ // a throwaway account when generation is allowed.
22
+ if (hasProvidedCredentials(session))
23
+ return 'login';
24
+ return generationAllowed ? 'create_account' : 'login';
25
+ }
26
+ function findSubmit(elements, intent) {
27
+ const re = intent === 'create_account' ? SUBMIT_CREATE : SUBMIT_LOGIN;
28
+ // Prefer a non-field clickable button matching the verb; exclude editable fields.
29
+ const buttons = elements.filter((e) => e.clickable && !/EditText|TextField|TextInput|text-field/i.test(e.role));
30
+ return (buttons.find((e) => re.test(`${e.label ?? ''} ${e.text ?? ''} ${e.id ?? ''}`)) ??
31
+ buttons.find((e) => /\b(continue|next|done|submit)\b/i.test(`${e.label ?? ''} ${e.text ?? ''}`)));
32
+ }
33
+ /** Assemble the ordered auth actions. `planFor` maps a requirement to its already-computed InputPlan. */
34
+ export function planAuthActions(classification, elements, intent, planFor) {
35
+ const actions = [];
36
+ const needsInput = [];
37
+ const blockedReasons = [];
38
+ for (const req of classification.requiredInputs) {
39
+ const plan = planFor(req);
40
+ if (plan.decision === 'needs_input') {
41
+ needsInput.push({ kind: plan.kind, reason: plan.reason });
42
+ continue;
43
+ }
44
+ if (plan.decision === 'skip') {
45
+ blockedReasons.push(plan.reason);
46
+ continue;
47
+ }
48
+ actions.push({
49
+ type: 'type',
50
+ targetRef: req.ref,
51
+ label: req.label,
52
+ locator: req.locator,
53
+ bounds: req.bounds,
54
+ field: req.field,
55
+ value: { varName: plan.varName, secret: plan.secret, source: plan.source, generator: plan.generator },
56
+ reason: `fill ${req.field} via ${plan.source}`,
57
+ risk: 'safe',
58
+ });
59
+ }
60
+ // Only add the submit step if every required field could be filled (no outstanding NeedsInput).
61
+ if (needsInput.length === 0) {
62
+ const submit = findSubmit(elements, intent);
63
+ if (submit) {
64
+ actions.push({
65
+ type: 'tap',
66
+ targetRef: submit.ref,
67
+ label: submit.label ?? submit.text,
68
+ locator: { strategy: submit.id ? 'id' : submit.label ? 'accessibility' : 'text', value: submit.id ?? submit.label ?? submit.text },
69
+ bounds: submit.bounds,
70
+ reason: `submit the ${intent === 'create_account' ? 'account-creation' : 'login'} form`,
71
+ risk: 'safe',
72
+ });
73
+ }
74
+ else {
75
+ blockedReasons.push(`no ${intent} submit control found on the screen`);
76
+ }
77
+ }
78
+ const expectedNextPurposes = intent === 'create_account'
79
+ ? ['otp_or_email_verification', 'onboarding', 'permissions_prompt', 'paywall', 'home', 'feature']
80
+ : ['onboarding', 'permissions_prompt', 'paywall', 'home', 'feature', 'otp_or_email_verification'];
81
+ return { intent, actions, needsInput, blockedReasons, expectedNextPurposes };
82
+ }
83
+ //# sourceMappingURL=authStateMachine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authStateMachine.js","sourceRoot":"","sources":["../../src/firstRun/authStateMachine.ts"],"names":[],"mappings":"AAAA,oGAAoG;AACpG,mGAAmG;AACnG,kFAAkF;AASlF,MAAM,aAAa,GAAG,iGAAiG,CAAC;AACxH,MAAM,YAAY,GAAG,qDAAqD,CAAC;AAE3E,sGAAsG;AACtG,MAAM,UAAU,sBAAsB,CAAC,OAAgB;IACrD,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;AACvH,CAAC;AAED,sDAAsD;AACtD,MAAM,UAAU,gBAAgB,CAAC,OAAsB,EAAE,OAAgB,EAAE,iBAA0B;IACnG,IAAI,OAAO,KAAK,OAAO;QAAE,OAAO,OAAO,CAAC;IACxC,IAAI,OAAO,KAAK,gBAAgB;QAAE,OAAO,gBAAgB,CAAC;IAC1D,6FAA6F;IAC7F,+FAA+F;IAC/F,IAAI,OAAO,KAAK,kBAAkB;QAAE,OAAO,sBAAsB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC;IACxG,mGAAmG;IACnG,kDAAkD;IAClD,IAAI,sBAAsB,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAC;IACpD,OAAO,iBAAiB,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC;AACxD,CAAC;AAED,SAAS,UAAU,CAAC,QAA2B,EAAE,MAAkB;IACjE,MAAM,EAAE,GAAG,MAAM,KAAK,gBAAgB,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,YAAY,CAAC;IACtE,kFAAkF;IAClF,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,0CAA0C,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAChH,OAAO,CACL,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;QAC9E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,kCAAkC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC,CACjG,CAAC;AACJ,CAAC;AAWD,yGAAyG;AACzG,MAAM,UAAU,eAAe,CAC7B,cAAoC,EACpC,QAA2B,EAC3B,MAAkB,EAClB,OAA6C;IAE7C,MAAM,OAAO,GAAoB,EAAE,CAAC;IACpC,MAAM,UAAU,GAAiC,EAAE,CAAC;IACpD,MAAM,cAAc,GAAa,EAAE,CAAC;IAEpC,KAAK,MAAM,GAAG,IAAI,cAAc,CAAC,cAAc,EAAE,CAAC;QAChD,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC1B,IAAI,IAAI,CAAC,QAAQ,KAAK,aAAa,EAAE,CAAC;YACpC,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;YAC1D,SAAS;QACX,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;YAC7B,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACjC,SAAS;QACX,CAAC;QACD,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,MAAM;YACZ,SAAS,EAAE,GAAG,CAAC,GAAG;YAClB,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE;YACrG,MAAM,EAAE,QAAQ,GAAG,CAAC,KAAK,QAAQ,IAAI,CAAC,MAAM,EAAE;YAC9C,IAAI,EAAE,MAAM;SACb,CAAC,CAAC;IACL,CAAC;IAED,gGAAgG;IAChG,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC5C,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,KAAK;gBACX,SAAS,EAAE,MAAM,CAAC,GAAG;gBACrB,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI;gBAClC,OAAO,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,EAAE;gBAClI,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,MAAM,EAAE,cAAc,MAAM,KAAK,gBAAgB,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,OAAO;gBACvF,IAAI,EAAE,MAAM;aACb,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,cAAc,CAAC,IAAI,CAAC,MAAM,MAAM,qCAAqC,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;IAED,MAAM,oBAAoB,GACxB,MAAM,KAAK,gBAAgB;QACzB,CAAC,CAAC,CAAC,2BAA2B,EAAE,YAAY,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC;QACjG,CAAC,CAAC,CAAC,YAAY,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,2BAA2B,CAAC,CAAC;IAEtG,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,oBAAoB,EAAE,CAAC;AAC/E,CAAC"}
@@ -0,0 +1,201 @@
1
+ // SWIPIUM-REQ-02 — first-screen / runtime-screen classifier.
2
+ //
3
+ // classifyCurrentScreen() decides what a screen IS (login, create-account, onboarding, paywall,
4
+ // permissions, home, …) from BOTH the runtime UI snapshot and any static app-map/code context.
5
+ // PURE: it takes an already-observed snapshot (elements + visible text + foreground + auth state)
6
+ // so the driver loop in firstRunRunner.ts is the only side-effecting part. Output carries a
7
+ // confidence and the evidence behind it so callers can validate against code / the app map and so
8
+ // the classification can be stored with provenance.
9
+ import { classifyRisk } from '../explore/policy.js';
10
+ const FIELD_RULES = [
11
+ { field: 'confirm_password', re: /\b(confirm|repeat|re-?enter)\s*pass/i },
12
+ { field: 'password', re: /\b(pass(word)?|secret|pwd)\b/i },
13
+ { field: 'username', re: /\b(user\s?name|handle|nickname|display\s*handle)\b/i },
14
+ { field: 'email', re: /\b(e-?mail|login|account)\b/i },
15
+ { field: 'otp', re: /\b(otp|code|2fa|mfa|verification|verify)\b/i },
16
+ { field: 'first_name', re: /\b(first\s*name|given\s*name)\b/i },
17
+ { field: 'last_name', re: /\b(last\s*name|family\s*name|surname)\b/i },
18
+ { field: 'name', re: /\b(full\s*name|display\s*name|your\s*name|name)\b/i },
19
+ { field: 'phone', re: /\b(phone|mobile|tel)\b/i },
20
+ { field: 'date_of_birth', re: /\b(birth|dob|birthday)\b/i },
21
+ { field: 'city', re: /\bcity\b/i },
22
+ { field: 'address', re: /\b(address|street)\b/i },
23
+ { field: 'search', re: /\b(search|query|find|filter)\b/i },
24
+ ];
25
+ /** Classify a field kind from its visible hints (label / id / text) and secure flag. */
26
+ export function fieldKindFromHints(label, id, text, secure) {
27
+ const hay = `${label ?? ''} ${id ?? ''} ${text ?? ''}`.trim();
28
+ if (secure) {
29
+ return /\b(confirm|repeat|re-?enter)\b/i.test(hay) ? 'confirm_password' : 'password';
30
+ }
31
+ for (const rule of FIELD_RULES) {
32
+ if (rule.re.test(hay))
33
+ return rule.field;
34
+ }
35
+ return 'generic';
36
+ }
37
+ function classifyField(el) {
38
+ return fieldKindFromHints(el.label, el.id, el.text, el.secure);
39
+ }
40
+ function isEditable(el) {
41
+ return el.role === 'text-field' || /EditText|TextField|TextInput/i.test(el.role) || el.secure === true;
42
+ }
43
+ /** Build the typed input requirements from the editable fields on the screen. */
44
+ export function requiredInputsFor(elements) {
45
+ return elements.filter(isEditable).map((el) => {
46
+ const field = classifyField(el);
47
+ const strategy = el.id ? 'id' : el.label ? 'accessibility' : el.text ? 'text' : 'coordinate';
48
+ const value = el.id ?? el.label ?? el.text;
49
+ return {
50
+ ref: el.ref,
51
+ field,
52
+ label: el.label ?? el.text,
53
+ secure: el.secure === true || field === 'password' || field === 'confirm_password',
54
+ required: true,
55
+ locator: { strategy, value },
56
+ bounds: el.bounds,
57
+ };
58
+ });
59
+ }
60
+ function visibleTextOf(obs) {
61
+ if (obs.visibleText)
62
+ return obs.visibleText;
63
+ return obs.elements.map((e) => `${e.text ?? ''} ${e.label ?? ''}`).join(' ').trim();
64
+ }
65
+ // Lexical signals per purpose. Confidence is the summed weight of matched signals, squashed to 0..1.
66
+ const LOGIN = /\b(sign\s?in|log\s?in)\b/i;
67
+ const REGISTER = /\b(sign\s?up|create\s+(an?\s+|your\s+)?account|register|join now|join free|get\s+started\s+free)\b/i;
68
+ const CREDENTIAL_SETUP = /\b(create\s+(a\s+)?password|set\s+(a\s+|your\s+)?password|choose\s+(a\s+)?password|create\s+(a\s+)?username|choose\s+(a\s+)?username|set\s+up\s+(your\s+)?(login|credentials?)|credential\s+setup)\b/i;
69
+ const OTP = /\b(verification code|one-?time|enter the code|otp|magic link|we sent|6-digit|verify your (email|phone|number))\b/i;
70
+ const ONBOARDING = /\b(get started|next|skip|continue|welcome|let'?s go|swipe|tour|set up your)\b/i;
71
+ const PAYWALL = /\b(subscribe|free trial|start trial|restore purchase|upgrade|premium|unlock|per month|per year|\/mo\b|\$\d|monthly|annually|billed)\b/i;
72
+ const PERMISSION = /\b(allow|don'?t allow|while using the app|location|camera|microphone|notifications?|photos|contacts|bluetooth)\b/i;
73
+ const HOME = /\b(home|feed|dashboard|explore|search|profile|settings|library|inbox|for you)\b/i;
74
+ const SETTINGS = /\b(settings|preferences|account settings|privacy|notifications)\b/i;
75
+ const ERROR = /\b(something went wrong|unfortunately|has stopped|isn'?t responding|render error|unhandled|red\s?box|try again later)\b/i;
76
+ /**
77
+ * Classify the current screen. Combines field structure (password + email → auth) with lexical
78
+ * signals and any static app-map candidate matches.
79
+ */
80
+ export function classifyCurrentScreen(obs) {
81
+ const text = visibleTextOf(obs);
82
+ const requiredInputs = requiredInputsFor(obs.elements);
83
+ const hasPassword = requiredInputs.some((i) => i.field === 'password' || i.field === 'confirm_password');
84
+ const hasConfirmPassword = requiredInputs.some((i) => i.field === 'confirm_password');
85
+ const hasEmail = requiredInputs.some((i) => i.field === 'email');
86
+ const hasOtpField = requiredInputs.some((i) => i.field === 'otp');
87
+ const evidence = [];
88
+ const blockedReasons = [];
89
+ const hasLogin = LOGIN.test(text);
90
+ const hasRegister = REGISTER.test(text);
91
+ const hasUsername = requiredInputs.some((i) => i.field === 'username');
92
+ const hasCredentialSetupCopy = CREDENTIAL_SETUP.test(text);
93
+ // Scored candidates → pick the strongest.
94
+ const scores = {};
95
+ const note = (p, w, why) => {
96
+ scores[p] = (scores[p] ?? 0) + w;
97
+ evidence.push(`${p}: ${why}`);
98
+ };
99
+ // Hard error first.
100
+ if (obs.nativeError) {
101
+ note('error', 5, 'native error/ANR/crash dialog');
102
+ }
103
+ if (obs.appError || ERROR.test(text))
104
+ note('error', 3, 'error/redbox copy on screen');
105
+ // Auth family.
106
+ if (hasOtpField || OTP.test(text))
107
+ note('otp_or_email_verification', 3, hasOtpField ? 'OTP/code field present' : 'verification/one-time-code copy');
108
+ // Credential-setup step: "create/set/choose password|username" copy, or a password (+confirm)
109
+ // and/or username field with no email and no sign-in verb — a dedicated credential-creation step
110
+ // inside a multi-step signup. Detected BEFORE the email+password auth branch so it wins when the
111
+ // copy is explicit.
112
+ const credentialSetupByFields = (hasPassword || hasUsername) && !hasEmail && !hasLogin;
113
+ if (hasCredentialSetupCopy)
114
+ note('credential_setup', 3.5, 'create/set/choose password or username copy');
115
+ else if (credentialSetupByFields && (hasConfirmPassword || hasUsername || hasRegister)) {
116
+ note('credential_setup', 2.5, 'password/username setup fields without email or sign-in verb');
117
+ }
118
+ if (hasPassword && hasEmail) {
119
+ if (hasRegister && hasLogin)
120
+ note('login_or_create_account', 3, 'both sign-in and sign-up choices present');
121
+ else if (hasConfirmPassword || hasRegister)
122
+ note('create_account', 3, 'register/create copy with email+password (confirm field)');
123
+ else if (hasLogin)
124
+ note('login', 3, 'sign-in copy with email+password');
125
+ else
126
+ note('login', 1.5, 'email+password fields without explicit verb');
127
+ }
128
+ else if (hasPassword) {
129
+ note(hasRegister ? 'create_account' : 'login', 1.5, 'password field present');
130
+ }
131
+ else {
132
+ if (hasLogin)
133
+ note('login', 1, 'sign-in copy (no detected password field yet)');
134
+ if (hasRegister)
135
+ note('create_account', 1, 'register/create-account copy');
136
+ }
137
+ // Other gates.
138
+ if (PAYWALL.test(text))
139
+ note('paywall', 3, 'subscribe/trial/restore/price copy');
140
+ if (PERMISSION.test(text) && /\b(allow|don'?t allow|while using)\b/i.test(text))
141
+ note('permissions_prompt', 2.5, 'permission dialog copy');
142
+ if (ONBOARDING.test(text) && !hasPassword)
143
+ note('onboarding', 2, 'onboarding/get-started/next/skip copy');
144
+ if (SETTINGS.test(text))
145
+ note('settings', 1, 'settings/preferences copy');
146
+ if (HOME.test(text) && !hasPassword && !PAYWALL.test(text))
147
+ note('home', 1.5, 'home/feed/dashboard/tabs with no blocking gate');
148
+ // Static app-map candidates corroborate a purpose.
149
+ const mapLinks = [];
150
+ for (const cand of obs.staticCandidates ?? []) {
151
+ const matched = (cand.hints ?? []).some((h) => text.toLowerCase().includes(h.toLowerCase()));
152
+ if (cand.purpose && (matched || (obs.staticCandidates ?? []).length === 1)) {
153
+ note(cand.purpose, matched ? 1.5 : 0.5, `app-map static screen "${cand.id}" suggests ${cand.purpose}`);
154
+ mapLinks.push({ kind: 'staticScreen', id: cand.id, confidence: matched ? 0.6 : 0.3 });
155
+ }
156
+ }
157
+ const ranked = Object.entries(scores).sort((a, b) => b[1] - a[1]);
158
+ const [purpose, topScore] = ranked[0] ?? ['unknown', 0];
159
+ const total = ranked.reduce((s, [, w]) => s + w, 0) || 1;
160
+ // Confidence blends the absolute evidence weight and its dominance over the runner-up.
161
+ const dominance = ranked.length > 1 ? topScore / total : 1;
162
+ const confidence = topScore === 0 ? 0.2 : Math.min(0.98, 0.35 + Math.min(topScore, 5) * 0.1) * (0.6 + 0.4 * dominance);
163
+ if (purpose === 'unknown' || topScore === 0) {
164
+ blockedReasons.push('no decisive structural or lexical signal — screen purpose is unknown');
165
+ }
166
+ // Safe actions: navigation/forward controls that are non-destructive (for onboarding/permission).
167
+ const safeActions = [];
168
+ for (const el of obs.elements) {
169
+ if (!el.clickable)
170
+ continue;
171
+ const label = el.label ?? el.text;
172
+ const risk = classifyRisk({ label, id: el.id, role: el.role });
173
+ if (risk.risk === 'safe') {
174
+ safeActions.push({
175
+ type: 'tap',
176
+ targetRef: el.ref,
177
+ label,
178
+ locator: { strategy: el.id ? 'id' : el.label ? 'accessibility' : 'text', value: el.id ?? el.label ?? el.text },
179
+ bounds: el.bounds,
180
+ reason: risk.reason,
181
+ risk: 'safe',
182
+ });
183
+ }
184
+ }
185
+ const runtimeId = obs.screenSignature ? `runtime:${obs.screenSignature}` : `runtime:${obs.foreground}`;
186
+ mapLinks.unshift({ kind: 'runtimeScreen', id: runtimeId, confidence });
187
+ return {
188
+ purpose: purpose ?? 'unknown',
189
+ confidence: Number(confidence.toFixed(3)),
190
+ evidence,
191
+ requiredInputs,
192
+ safeActions,
193
+ blockedReasons,
194
+ mapLinks,
195
+ };
196
+ }
197
+ /** Convenience: the set of field kinds a classification needs filled (deduped, required first). */
198
+ export function neededFieldKinds(c) {
199
+ return [...new Set(c.requiredInputs.map((i) => i.field))];
200
+ }
201
+ //# sourceMappingURL=classifyScreen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classifyScreen.js","sourceRoot":"","sources":["../../src/firstRun/classifyScreen.ts"],"names":[],"mappings":"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"}