taphound 0.2.0-dev.1 → 0.2.0-dev.12

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 (467) hide show
  1. package/README.md +49 -149
  2. package/README.zh-CN.md +47 -147
  3. package/assets/skills/taphound-case-suite/SKILL.md +363 -0
  4. package/assets/skills/taphound-case-suite/schemas/base-flow-record.schema.json +22 -0
  5. package/assets/skills/taphound-case-suite/schemas/case-catalog.schema.json +26 -0
  6. package/assets/skills/taphound-case-suite/schemas/case-ledger.schema.json +158 -0
  7. package/assets/skills/taphound-case-suite/schemas/suite-input.schema.json +41 -0
  8. package/assets/skills/taphound-case-suite/schemas/transition.schema.json +61 -0
  9. package/assets/skills/taphound-case-suite/scripts/ledger.mjs +1207 -0
  10. package/assets/skills/taphound-case-suite/templates/base-flow-record.example.json +20 -0
  11. package/assets/skills/taphound-case-suite/templates/suite-input.example.json +27 -0
  12. package/assets/skills/taphound-case-suite/templates/transition.example.json +8 -0
  13. package/assets/skills/taphound-flash/SKILL.md +115 -0
  14. package/assets/skills/taphound-flash/scripts/flash.mjs +585 -0
  15. package/assets/skills/taphound-flash/templates/flash-plan.example.json +15 -0
  16. package/assets/skills/taphound-journey-brief-author/CONTEXT-GUIDE.md +471 -0
  17. package/assets/skills/taphound-journey-brief-author/SKILL.md +494 -0
  18. package/assets/skills/taphound-journey-brief-author/prompts/brief-author-role.md +96 -0
  19. package/assets/skills/taphound-journey-brief-author/prompts/brief-author-role.zh-CN.md +80 -0
  20. package/assets/skills/taphound-journey-brief-author/prompts/context-analyze-project.md +309 -0
  21. package/assets/skills/taphound-journey-brief-author/schemas/context-refresh-result.json +123 -0
  22. package/assets/skills/taphound-journey-brief-author/schemas/project-context-module.json +192 -0
  23. package/assets/skills/taphound-journey-brief-author/schemas/project-context.json +152 -0
  24. package/assets/skills/taphound-journey-brief-author/templates/project-context-module.example.json +58 -0
  25. package/assets/skills/taphound-journey-brief-author/templates/project-context.example.json +51 -0
  26. package/assets/skills/taphound-journey-brief-author/templates/taphound-journey-brief.template.md +63 -0
  27. package/assets/skills/taphound-journey-generator/SKILL.md +507 -0
  28. package/assets/skills/{taphound-ai-journey → taphound-journey-generator}/prompts/check-completion.md +3 -0
  29. package/assets/skills/taphound-journey-generator/prompts/consume-journey-brief.md +52 -0
  30. package/assets/skills/taphound-journey-generator/prompts/generate-step.md +211 -0
  31. package/assets/skills/taphound-journey-generator/prompts/select-flow.md +91 -0
  32. package/assets/skills/taphound-journey-generator/references/bridge.md +35 -0
  33. package/assets/skills/taphound-journey-generator/references/mid-session.md +44 -0
  34. package/assets/skills/taphound-journey-generator/schemas/external-flow.json +37 -0
  35. package/assets/skills/taphound-journey-generator/schemas/flow.json +28 -0
  36. package/assets/skills/taphound-journey-generator/schemas/journey-source.json +25 -0
  37. package/assets/skills/{taphound-ai-journey → taphound-journey-generator}/schemas/observe-output.json +13 -4
  38. package/assets/skills/{taphound-ai-journey → taphound-journey-generator}/schemas/proposed-step-envelope.json +127 -5
  39. package/assets/skills/taphound-journey-generator/scripts/envelope.mjs +578 -0
  40. package/assets/skills/taphound-journey-generator/templates/external-flow.example.json +22 -0
  41. package/assets/skills/taphound-journey-generator/templates/flow.example.json +22 -0
  42. package/assets/skills/taphound-journey-generator/templates/journey-source.example.json +17 -0
  43. package/assets/skills/taphound-journey-generator/templates/taphound-journey-brief.example.md +70 -0
  44. package/assets/skills/taphound-verify-change/SKILL.md +91 -0
  45. package/assets/skills/taphound-verify-change/references/accept.md +38 -0
  46. package/assets/skills/taphound-verify-change/references/preserve.md +357 -0
  47. package/assets/skills/taphound-verify-change/schemas/workflow-manifest.schema.json +295 -0
  48. package/assets/skills/taphound-verify-change/scripts/handoff.mjs +482 -0
  49. package/assets/skills/taphound-verify-change/scripts/ui-refactor.mjs +505 -0
  50. package/dist/adapters/adb/adb-adapter.d.ts +16 -2
  51. package/dist/adapters/adb/adb-adapter.js +199 -0
  52. package/dist/adapters/adb/system-uiautomator-snapshot-provider.d.ts +13 -0
  53. package/dist/adapters/adb/system-uiautomator-snapshot-provider.js +122 -0
  54. package/dist/adapters/adb/ui-automator-parser.d.ts +3 -0
  55. package/dist/adapters/adb/ui-automator-parser.js +160 -0
  56. package/dist/adapters/adb/window-topology-parser.d.ts +2 -0
  57. package/dist/adapters/adb/window-topology-parser.js +101 -0
  58. package/dist/adapters/android-cli/android-cli-adapter.d.ts +16 -8
  59. package/dist/adapters/android-cli/android-cli-adapter.js +137 -15
  60. package/dist/adapters/android-cli/android-cli-snapshot-provider.d.ts +9 -0
  61. package/dist/adapters/android-cli/android-cli-snapshot-provider.js +99 -0
  62. package/dist/adapters/android-cli/layout-parser.js +12 -8
  63. package/dist/adapters/appium/appium-doctor.d.ts +7 -0
  64. package/dist/adapters/appium/appium-doctor.js +128 -0
  65. package/dist/adapters/appium/appium-ui-snapshot-provider.d.ts +42 -0
  66. package/dist/adapters/appium/appium-ui-snapshot-provider.js +309 -0
  67. package/dist/adapters/camera/camera-probe-adapter.d.ts +18 -0
  68. package/dist/adapters/camera/camera-probe-adapter.js +286 -0
  69. package/dist/adapters/filesystem/artifact-store.js +40 -1
  70. package/dist/adapters/filesystem/context-document-writer.d.ts +15 -0
  71. package/dist/adapters/filesystem/context-document-writer.js +112 -0
  72. package/dist/adapters/filesystem/diagnostics-journal.d.ts +17 -0
  73. package/dist/adapters/filesystem/diagnostics-journal.js +130 -0
  74. package/dist/adapters/filesystem/external-flow-registry.d.ts +17 -0
  75. package/dist/adapters/filesystem/external-flow-registry.js +325 -0
  76. package/dist/adapters/filesystem/generation-session-store.d.ts +17 -11
  77. package/dist/adapters/filesystem/generation-session-store.js +281 -855
  78. package/dist/adapters/filesystem/generation-store/session-lock.d.ts +29 -0
  79. package/dist/adapters/filesystem/generation-store/session-lock.js +202 -0
  80. package/dist/adapters/filesystem/generation-store/session-transitions.d.ts +24 -0
  81. package/dist/adapters/filesystem/generation-store/session-transitions.js +340 -0
  82. package/dist/adapters/filesystem/generation-store/store-files.d.ts +50 -0
  83. package/dist/adapters/filesystem/generation-store/store-files.js +363 -0
  84. package/dist/adapters/filesystem/journey-composition-store.d.ts +23 -0
  85. package/dist/adapters/filesystem/journey-composition-store.js +151 -0
  86. package/dist/adapters/filesystem/knowledge-registry.d.ts +12 -0
  87. package/dist/adapters/filesystem/knowledge-registry.js +223 -0
  88. package/dist/adapters/filesystem/project-bound-file.js +3 -5
  89. package/dist/adapters/filesystem/project-file-inspector.d.ts +2 -0
  90. package/dist/adapters/filesystem/project-file-inspector.js +57 -28
  91. package/dist/adapters/filesystem/project-identity-inspector.d.ts +7 -0
  92. package/dist/adapters/filesystem/project-identity-inspector.js +215 -0
  93. package/dist/adapters/filesystem/project-inventory-inspector.d.ts +8 -0
  94. package/dist/adapters/filesystem/project-inventory-inspector.js +93 -0
  95. package/dist/adapters/filesystem/project-module-discoverer.d.ts +6 -0
  96. package/dist/adapters/filesystem/project-module-discoverer.js +158 -0
  97. package/dist/adapters/filesystem/skill-installer.d.ts +7 -2
  98. package/dist/adapters/filesystem/skill-installer.js +40 -11
  99. package/dist/adapters/filesystem/workspace-layout.d.ts +7 -0
  100. package/dist/adapters/filesystem/workspace-layout.js +57 -0
  101. package/dist/adapters/git/node-git-diff.d.ts +17 -0
  102. package/dist/adapters/git/node-git-diff.js +114 -0
  103. package/dist/adapters/process/node-detached-process-launcher.d.ts +6 -0
  104. package/dist/adapters/process/node-detached-process-launcher.js +96 -0
  105. package/dist/adapters/process/node-process-runner.js +11 -2
  106. package/dist/adapters/prompt/inquirer-align-prompt.d.ts +27 -0
  107. package/dist/adapters/prompt/inquirer-align-prompt.js +65 -0
  108. package/dist/adapters/prompt/inquirer-generation-prompt.js +3 -0
  109. package/dist/adapters/prompt/inquirer-recorder-prompt.d.ts +9 -1
  110. package/dist/adapters/prompt/inquirer-recorder-prompt.js +63 -0
  111. package/dist/adapters/runtime/adb-runtime-backend.d.ts +67 -0
  112. package/dist/adapters/runtime/adb-runtime-backend.js +206 -0
  113. package/dist/adapters/runtime/fake-runtime-backend.d.ts +87 -0
  114. package/dist/adapters/runtime/fake-runtime-backend.js +240 -0
  115. package/dist/adapters/runtime/mobile-mcp/mcp-tool-client.d.ts +45 -0
  116. package/dist/adapters/runtime/mobile-mcp/mcp-tool-client.js +153 -0
  117. package/dist/adapters/runtime/mobile-mcp/mobile-mcp-errors.d.ts +23 -0
  118. package/dist/adapters/runtime/mobile-mcp/mobile-mcp-errors.js +39 -0
  119. package/dist/adapters/runtime/mobile-mcp/mobile-mcp-responses.d.ts +20 -0
  120. package/dist/adapters/runtime/mobile-mcp/mobile-mcp-responses.js +180 -0
  121. package/dist/adapters/runtime/mobile-mcp/mobile-mcp-runtime-backend.d.ts +78 -0
  122. package/dist/adapters/runtime/mobile-mcp/mobile-mcp-runtime-backend.js +379 -0
  123. package/dist/adapters/runtime/mobile-mcp/mobile-mcp-tools.d.ts +46 -0
  124. package/dist/adapters/runtime/session-adb-view.d.ts +53 -0
  125. package/dist/adapters/runtime/session-adb-view.js +193 -0
  126. package/dist/adapters/runtime/session-backed-ports.d.ts +21 -0
  127. package/dist/adapters/runtime/session-backed-ports.js +43 -0
  128. package/dist/adapters/runtime/shared-session-runtime-backend.d.ts +12 -0
  129. package/dist/adapters/runtime/shared-session-runtime-backend.js +64 -0
  130. package/dist/adapters/ui/auto-ui-snapshot-provider.d.ts +8 -0
  131. package/dist/adapters/ui/auto-ui-snapshot-provider.js +48 -0
  132. package/dist/adapters/ui/device-layout-temp.d.ts +6 -0
  133. package/dist/adapters/ui/device-layout-temp.js +18 -0
  134. package/dist/adapters/ui/device-ui-environment.d.ts +13 -0
  135. package/dist/adapters/ui/device-ui-environment.js +81 -0
  136. package/dist/adapters/ui/layout-normalization.d.ts +9 -0
  137. package/dist/adapters/ui/layout-normalization.js +44 -0
  138. package/dist/adapters/ui/ui-snapshot-error.d.ts +11 -0
  139. package/dist/adapters/ui/ui-snapshot-error.js +12 -0
  140. package/dist/adapters/ui/ui-snapshot-support.d.ts +15 -0
  141. package/dist/adapters/ui/ui-snapshot-support.js +12 -0
  142. package/dist/application/align/align-service.d.ts +42 -0
  143. package/dist/application/align/align-service.js +106 -0
  144. package/dist/application/assertion/expectation-evaluator.d.ts +18 -5
  145. package/dist/application/assertion/expectation-evaluator.js +156 -18
  146. package/dist/application/assertion/guarded-expectation.d.ts +45 -0
  147. package/dist/application/assertion/guarded-expectation.js +74 -0
  148. package/dist/application/checkpoint/baseline-capturer.d.ts +26 -0
  149. package/dist/application/checkpoint/baseline-capturer.js +163 -0
  150. package/dist/application/checkpoint/baseline-error.d.ts +5 -0
  151. package/dist/application/checkpoint/baseline-error.js +8 -0
  152. package/dist/application/checkpoint/baseline-service.d.ts +31 -0
  153. package/dist/application/checkpoint/baseline-service.js +147 -0
  154. package/dist/application/checkpoint/checkpoint-evaluator.d.ts +35 -0
  155. package/dist/application/checkpoint/checkpoint-evaluator.js +415 -0
  156. package/dist/application/checkpoint/regression-comparator.d.ts +18 -0
  157. package/dist/application/checkpoint/regression-comparator.js +192 -0
  158. package/dist/application/collector/logcat-collector.d.ts +22 -1
  159. package/dist/application/collector/logcat-collector.js +103 -15
  160. package/dist/application/collector/logcat-event.d.ts +8 -0
  161. package/dist/application/collector/logcat-event.js +79 -0
  162. package/dist/application/collector/logcat-stop.d.ts +2 -0
  163. package/dist/application/collector/logcat-stop.js +11 -0
  164. package/dist/application/context/context-generator.d.ts +45 -0
  165. package/dist/application/context/context-generator.js +228 -0
  166. package/dist/application/context/context-loader.d.ts +40 -0
  167. package/dist/application/context/context-loader.js +223 -0
  168. package/dist/application/context/context-refresher.d.ts +59 -0
  169. package/dist/application/context/context-refresher.js +349 -0
  170. package/dist/application/context/context-rehasher.d.ts +36 -0
  171. package/dist/application/context/context-rehasher.js +110 -0
  172. package/dist/application/context/context-validator.d.ts +23 -1
  173. package/dist/application/context/context-validator.js +116 -9
  174. package/dist/application/context/evidence-hash.d.ts +1 -0
  175. package/dist/application/context/evidence-hash.js +125 -0
  176. package/dist/application/context/evidence-match.d.ts +9 -0
  177. package/dist/application/context/evidence-match.js +8 -0
  178. package/dist/application/context/shard-identity.d.ts +2 -0
  179. package/dist/application/context/shard-identity.js +7 -0
  180. package/dist/application/contract/contract-loader.d.ts +25 -0
  181. package/dist/application/contract/contract-loader.js +68 -0
  182. package/dist/application/contract/contract-review.d.ts +25 -0
  183. package/dist/application/contract/contract-review.js +51 -0
  184. package/dist/application/contract/contract-verifier.d.ts +53 -0
  185. package/dist/application/contract/contract-verifier.js +645 -0
  186. package/dist/application/devices/resolve-device-assignments.d.ts +21 -0
  187. package/dist/application/devices/resolve-device-assignments.js +60 -0
  188. package/dist/application/diagnosis/failure-classifier.d.ts +23 -0
  189. package/dist/application/diagnosis/failure-classifier.js +179 -0
  190. package/dist/application/diagnostics/diagnostics-exporter.d.ts +29 -0
  191. package/dist/application/diagnostics/diagnostics-exporter.js +283 -0
  192. package/dist/application/diagnostics/ui-capture-telemetry.d.ts +16 -0
  193. package/dist/application/diagnostics/ui-capture-telemetry.js +81 -0
  194. package/dist/application/doctor/doctor-service.d.ts +36 -3
  195. package/dist/application/doctor/doctor-service.js +255 -25
  196. package/dist/application/generation/generation-app-preparer.d.ts +20 -0
  197. package/dist/application/generation/generation-app-preparer.js +28 -0
  198. package/dist/application/generation/generation-config-service.d.ts +21 -0
  199. package/dist/application/generation/generation-config-service.js +53 -0
  200. package/dist/application/generation/generation-confirmation-service.d.ts +14 -3
  201. package/dist/application/generation/generation-confirmation-service.js +109 -24
  202. package/dist/application/generation/generation-context-snapshot.d.ts +6 -0
  203. package/dist/application/generation/generation-context-snapshot.js +29 -0
  204. package/dist/application/generation/generation-finalizer.d.ts +15 -9
  205. package/dist/application/generation/generation-finalizer.js +167 -70
  206. package/dist/application/generation/generation-publisher.js +12 -8
  207. package/dist/application/generation/generation-recovery-service.d.ts +35 -0
  208. package/dist/application/generation/generation-recovery-service.js +144 -0
  209. package/dist/application/generation/generation-reopen-service.d.ts +15 -0
  210. package/dist/application/generation/generation-reopen-service.js +37 -0
  211. package/dist/application/generation/generation-replace-service.d.ts +32 -0
  212. package/dist/application/generation/generation-replace-service.js +116 -0
  213. package/dist/application/generation/generation-starter.d.ts +44 -4
  214. package/dist/application/generation/generation-starter.js +175 -8
  215. package/dist/application/generation/generation-step-executor.d.ts +67 -5
  216. package/dist/application/generation/generation-step-executor.js +471 -108
  217. package/dist/application/generation/proposed-step-validator.js +96 -30
  218. package/dist/application/generation/replay-policy-loader.d.ts +16 -0
  219. package/dist/application/generation/replay-policy-loader.js +29 -0
  220. package/dist/application/generation/risk-evaluator.d.ts +4 -1
  221. package/dist/application/generation/risk-evaluator.js +118 -3
  222. package/dist/application/generation/runtime-observer.d.ts +39 -7
  223. package/dist/application/generation/runtime-observer.js +193 -24
  224. package/dist/application/impact/impact-resolver.d.ts +32 -0
  225. package/dist/application/impact/impact-resolver.js +160 -0
  226. package/dist/application/init/init-service.js +26 -13
  227. package/dist/application/interaction/action-executor.d.ts +3 -2
  228. package/dist/application/interaction/action-executor.js +11 -1
  229. package/dist/application/interaction/action-target.d.ts +17 -0
  230. package/dist/application/interaction/action-target.js +40 -0
  231. package/dist/application/interaction/external-step-runner.d.ts +153 -0
  232. package/dist/application/interaction/external-step-runner.js +332 -0
  233. package/dist/application/interaction/fallback-resolver.d.ts +6 -3
  234. package/dist/application/interaction/fallback-resolver.js +7 -5
  235. package/dist/application/interaction/scroll-to-executor.d.ts +17 -3
  236. package/dist/application/interaction/scroll-to-executor.js +118 -36
  237. package/dist/application/journey/external-flow-resolver.d.ts +25 -0
  238. package/dist/application/journey/external-flow-resolver.js +22 -0
  239. package/dist/application/journey/journey-check-service.d.ts +54 -0
  240. package/dist/application/journey/journey-check-service.js +207 -0
  241. package/dist/application/journey/journey-promoter.d.ts +26 -0
  242. package/dist/application/journey/journey-promoter.js +123 -0
  243. package/dist/application/journey/journey-resolver.d.ts +42 -0
  244. package/dist/application/journey/journey-resolver.js +239 -0
  245. package/dist/application/journey/journey-retirer.d.ts +25 -0
  246. package/dist/application/journey/journey-retirer.js +87 -0
  247. package/dist/application/knowledge/anchor-resolver.d.ts +36 -0
  248. package/dist/application/knowledge/anchor-resolver.js +110 -0
  249. package/dist/application/knowledge/knowledge-loader.d.ts +16 -0
  250. package/dist/application/knowledge/knowledge-loader.js +36 -0
  251. package/dist/application/locator/layout-failure-summary.d.ts +2 -0
  252. package/dist/application/locator/layout-failure-summary.js +67 -0
  253. package/dist/application/locator/layout-traversal.d.ts +11 -0
  254. package/dist/application/locator/layout-traversal.js +18 -0
  255. package/dist/application/locator/locator-resolver.d.ts +13 -1
  256. package/dist/application/locator/locator-resolver.js +182 -18
  257. package/dist/application/observe/observe-service.d.ts +20 -0
  258. package/dist/application/observe/observe-service.js +91 -0
  259. package/dist/application/project/project-describer.d.ts +14 -6
  260. package/dist/application/project/project-describer.js +38 -5
  261. package/dist/application/recognition/screen-detector.d.ts +28 -0
  262. package/dist/application/recognition/screen-detector.js +111 -0
  263. package/dist/application/recorder/locator-selector.js +151 -17
  264. package/dist/application/recorder/recorder-service.d.ts +16 -4
  265. package/dist/application/recorder/recorder-service.js +420 -128
  266. package/dist/application/report/report-writer.d.ts +5 -0
  267. package/dist/application/report/report-writer.js +17 -1
  268. package/dist/application/runtime/cold-launch.d.ts +28 -0
  269. package/dist/application/runtime/cold-launch.js +59 -0
  270. package/dist/application/runtime/step-runner.d.ts +49 -4
  271. package/dist/application/runtime/step-runner.js +721 -130
  272. package/dist/application/runtime/verify-runtime.d.ts +57 -7
  273. package/dist/application/runtime/verify-runtime.js +577 -175
  274. package/dist/application/ui/cached-ui-snapshot-provider.d.ts +45 -0
  275. package/dist/application/ui/cached-ui-snapshot-provider.js +111 -0
  276. package/dist/application/ui/observed-ui-snapshot-provider.d.ts +15 -0
  277. package/dist/application/ui/observed-ui-snapshot-provider.js +66 -0
  278. package/dist/application/ui/ui-snapshot-lifecycle.d.ts +2 -0
  279. package/dist/application/ui/ui-snapshot-lifecycle.js +8 -0
  280. package/dist/application/ui/ui-stability-probe.d.ts +9 -0
  281. package/dist/application/ui/ui-stability-probe.js +24 -0
  282. package/dist/application/wait/idle-advice.d.ts +6 -0
  283. package/dist/application/wait/idle-advice.js +27 -0
  284. package/dist/application/wait/idle-profiles.d.ts +15 -0
  285. package/dist/application/wait/idle-profiles.js +75 -0
  286. package/dist/application/wait/idle-waiter.d.ts +28 -4
  287. package/dist/application/wait/idle-waiter.js +201 -15
  288. package/dist/cli/commands/align.d.ts +3 -0
  289. package/dist/cli/commands/align.js +124 -0
  290. package/dist/cli/commands/baseline.d.ts +3 -0
  291. package/dist/cli/commands/baseline.js +130 -0
  292. package/dist/cli/commands/context.js +300 -27
  293. package/dist/cli/commands/contract.d.ts +3 -0
  294. package/dist/cli/commands/contract.js +120 -0
  295. package/dist/cli/commands/diagnose.d.ts +3 -0
  296. package/dist/cli/commands/diagnose.js +84 -0
  297. package/dist/cli/commands/doctor.js +16 -9
  298. package/dist/cli/commands/failure.d.ts +3 -0
  299. package/dist/cli/commands/failure.js +63 -0
  300. package/dist/cli/commands/generation/lifecycle-commands.d.ts +5 -0
  301. package/dist/cli/commands/generation/lifecycle-commands.js +211 -0
  302. package/dist/cli/commands/generation/session-commands.d.ts +11 -0
  303. package/dist/cli/commands/generation/session-commands.js +472 -0
  304. package/dist/cli/commands/generation/shared.d.ts +1414 -0
  305. package/dist/cli/commands/generation/shared.js +291 -0
  306. package/dist/cli/commands/generation/step-commands.d.ts +8 -0
  307. package/dist/cli/commands/generation/step-commands.js +315 -0
  308. package/dist/cli/commands/generation.js +10 -507
  309. package/dist/cli/commands/impact.d.ts +3 -0
  310. package/dist/cli/commands/impact.js +87 -0
  311. package/dist/cli/commands/init.js +13 -6
  312. package/dist/cli/commands/journey.d.ts +3 -0
  313. package/dist/cli/commands/journey.js +382 -0
  314. package/dist/cli/commands/knowledge.d.ts +3 -0
  315. package/dist/cli/commands/knowledge.js +93 -0
  316. package/dist/cli/commands/observe.d.ts +3 -0
  317. package/dist/cli/commands/observe.js +127 -0
  318. package/dist/cli/commands/project.js +2 -1
  319. package/dist/cli/commands/record.js +18 -5
  320. package/dist/cli/commands/verify.js +326 -64
  321. package/dist/cli/dependencies.d.ts +136 -1
  322. package/dist/cli/dependencies.js +504 -52
  323. package/dist/cli/diagnostics-recorder.d.ts +31 -0
  324. package/dist/cli/diagnostics-recorder.js +82 -0
  325. package/dist/cli/diff-verification.d.ts +41 -0
  326. package/dist/cli/diff-verification.js +192 -0
  327. package/dist/cli/main.d.ts +1 -1
  328. package/dist/cli/main.js +107 -2
  329. package/dist/cli/output.d.ts +5 -3
  330. package/dist/cli/output.js +12 -0
  331. package/dist/cli/program.js +21 -1
  332. package/dist/cli/project-root.d.ts +1 -0
  333. package/dist/cli/project-root.js +6 -0
  334. package/dist/cli/runtime-selection.d.ts +22 -0
  335. package/dist/cli/runtime-selection.js +92 -0
  336. package/dist/cli/version.d.ts +1 -0
  337. package/dist/cli/version.js +14 -0
  338. package/dist/cli/workspace-guard.d.ts +2 -0
  339. package/dist/cli/workspace-guard.js +3 -0
  340. package/dist/domain/binding-reference.d.ts +4 -0
  341. package/dist/domain/binding-reference.js +23 -0
  342. package/dist/domain/checkpoint.d.ts +404 -0
  343. package/dist/domain/checkpoint.js +297 -0
  344. package/dist/domain/config.d.ts +107 -1
  345. package/dist/domain/config.js +52 -6
  346. package/dist/domain/contract.d.ts +413 -0
  347. package/dist/domain/contract.js +196 -0
  348. package/dist/domain/diagnostics.d.ts +1396 -0
  349. package/dist/domain/diagnostics.js +193 -0
  350. package/dist/domain/external-flow.d.ts +493 -0
  351. package/dist/domain/external-flow.js +15 -0
  352. package/dist/domain/failure-classification.d.ts +176 -0
  353. package/dist/domain/failure-classification.js +169 -0
  354. package/dist/domain/failure.d.ts +2 -1
  355. package/dist/domain/failure.js +123 -0
  356. package/dist/domain/generation.d.ts +1671 -132
  357. package/dist/domain/generation.js +202 -13
  358. package/dist/domain/geometry.d.ts +13 -0
  359. package/dist/domain/geometry.js +16 -0
  360. package/dist/domain/impact.d.ts +71 -0
  361. package/dist/domain/impact.js +76 -0
  362. package/dist/domain/init.d.ts +12 -4
  363. package/dist/domain/init.js +24 -18
  364. package/dist/domain/journey-composition.d.ts +2285 -0
  365. package/dist/domain/journey-composition.js +85 -0
  366. package/dist/domain/journey-lifecycle.d.ts +10 -0
  367. package/dist/domain/journey-lifecycle.js +9 -0
  368. package/dist/domain/journey.d.ts +2419 -212
  369. package/dist/domain/journey.js +384 -14
  370. package/dist/domain/knowledge.d.ts +165 -0
  371. package/dist/domain/knowledge.js +188 -0
  372. package/dist/domain/layout.d.ts +34 -5
  373. package/dist/domain/layout.js +64 -6
  374. package/dist/domain/locator-evidence.d.ts +3 -0
  375. package/dist/domain/locator-evidence.js +36 -0
  376. package/dist/domain/logcat-event.d.ts +54 -0
  377. package/dist/domain/logcat-event.js +40 -0
  378. package/dist/domain/observation.d.ts +33 -0
  379. package/dist/domain/observation.js +18 -0
  380. package/dist/domain/project-context.d.ts +219 -1
  381. package/dist/domain/project-context.js +209 -6
  382. package/dist/domain/proposed-step.d.ts +340 -60
  383. package/dist/domain/proposed-step.js +23 -3
  384. package/dist/domain/report.d.ts +1455 -28
  385. package/dist/domain/report.js +211 -14
  386. package/dist/domain/runtime-snapshot.d.ts +58 -1
  387. package/dist/domain/runtime-snapshot.js +14 -3
  388. package/dist/domain/runtime.d.ts +50 -0
  389. package/dist/domain/runtime.js +36 -0
  390. package/dist/domain/system-app-profiles.d.ts +6 -0
  391. package/dist/domain/system-app-profiles.js +43 -0
  392. package/dist/domain/ui-backend.d.ts +28 -0
  393. package/dist/domain/ui-backend.js +33 -0
  394. package/dist/domain/ui-cache.d.ts +11 -0
  395. package/dist/domain/ui-cache.js +10 -0
  396. package/dist/domain/verify-receipt.d.ts +17 -0
  397. package/dist/domain/verify-receipt.js +17 -0
  398. package/dist/domain/window-hierarchy.d.ts +84 -0
  399. package/dist/domain/window-hierarchy.js +172 -0
  400. package/dist/domain/workflow-manifest.d.ts +77 -0
  401. package/dist/domain/workflow-manifest.js +136 -0
  402. package/dist/domain/workspace.d.ts +30 -0
  403. package/dist/domain/workspace.js +74 -0
  404. package/dist/ports/adb.d.ts +34 -1
  405. package/dist/ports/align-prompt.d.ts +11 -0
  406. package/dist/ports/align-prompt.js +6 -0
  407. package/dist/ports/anchor-resolver.d.ts +30 -0
  408. package/dist/ports/anchor-resolver.js +1 -0
  409. package/dist/ports/annotated-screen-resolver.d.ts +4 -0
  410. package/dist/ports/annotated-screen-resolver.js +1 -0
  411. package/dist/ports/camera-probe.d.ts +23 -0
  412. package/dist/ports/camera-probe.js +8 -0
  413. package/dist/ports/context-document-writer.d.ts +24 -0
  414. package/dist/ports/context-document-writer.js +1 -0
  415. package/dist/ports/detached-process-launcher.d.ts +12 -0
  416. package/dist/ports/detached-process-launcher.js +1 -0
  417. package/dist/ports/diagnostics.d.ts +15 -0
  418. package/dist/ports/diagnostics.js +1 -0
  419. package/dist/ports/external-flow-registry.d.ts +37 -0
  420. package/dist/ports/external-flow-registry.js +1 -0
  421. package/dist/ports/generation-prompt.d.ts +2 -1
  422. package/dist/ports/generation-session-store.d.ts +12 -2
  423. package/dist/ports/git-diff.d.ts +9 -0
  424. package/dist/ports/git-diff.js +1 -0
  425. package/dist/ports/journey-composition-store.d.ts +17 -0
  426. package/dist/ports/journey-composition-store.js +1 -0
  427. package/dist/ports/knowledge-registry.d.ts +20 -0
  428. package/dist/ports/knowledge-registry.js +1 -0
  429. package/dist/ports/process-runner.d.ts +7 -0
  430. package/dist/ports/project-file-inspector.d.ts +1 -0
  431. package/dist/ports/project-identity-inspector.d.ts +24 -0
  432. package/dist/ports/project-identity-inspector.js +1 -0
  433. package/dist/ports/project-inventory-inspector.d.ts +21 -0
  434. package/dist/ports/project-inventory-inspector.js +1 -0
  435. package/dist/ports/project-module-discoverer.d.ts +26 -0
  436. package/dist/ports/project-module-discoverer.js +1 -0
  437. package/dist/ports/recorder-prompt.d.ts +10 -1
  438. package/dist/ports/runtime-backend.d.ts +89 -0
  439. package/dist/ports/runtime-backend.js +13 -0
  440. package/dist/ports/runtime-capability.d.ts +12 -0
  441. package/dist/ports/runtime-capability.js +20 -0
  442. package/dist/ports/runtime-session-ports.d.ts +25 -0
  443. package/dist/ports/runtime-session-ports.js +1 -0
  444. package/dist/ports/screenshot.d.ts +11 -0
  445. package/dist/ports/screenshot.js +1 -0
  446. package/dist/ports/skill-installer.d.ts +2 -2
  447. package/dist/ports/ui-snapshot.d.ts +35 -0
  448. package/dist/ports/ui-snapshot.js +1 -0
  449. package/dist/ports/ui-stability.d.ts +19 -0
  450. package/dist/ports/ui-stability.js +1 -0
  451. package/dist/ports/workspace-layout.d.ts +4 -0
  452. package/dist/ports/workspace-layout.js +1 -0
  453. package/dist/shared/errors.d.ts +2 -0
  454. package/dist/shared/errors.js +22 -0
  455. package/dist/shared/paths.d.ts +2 -0
  456. package/dist/shared/paths.js +24 -0
  457. package/dist/shared/strings.d.ts +2 -0
  458. package/dist/shared/strings.js +16 -0
  459. package/package.json +7 -2
  460. package/assets/skills/taphound-ai-journey/GUIDE.md +0 -862
  461. package/assets/skills/taphound-ai-journey/SKILL.md +0 -377
  462. package/assets/skills/taphound-ai-journey/prompts/analyze-project.md +0 -526
  463. package/assets/skills/taphound-ai-journey/prompts/generate-step.md +0 -109
  464. package/assets/skills/taphound-ai-journey/schemas/project-context.json +0 -81
  465. package/assets/skills/taphound-ai-journey/templates/project-context.example.json +0 -49
  466. package/dist/ports/android-cli.d.ts +0 -21
  467. /package/dist/{ports/android-cli.js → adapters/runtime/mobile-mcp/mobile-mcp-tools.js} +0 -0
@@ -0,0 +1,291 @@
1
+ // Options, output, failure mapping, and configuration shared by the `generation` subcommands.
2
+ import { resolve } from "node:path";
3
+ import { z } from "zod";
4
+ import { exitCodeForFailure, failureCodeFromUnknown } from "../../../domain/failure.js";
5
+ import { GenerationFinalizationError } from "../../../application/generation/generation-finalizer.js";
6
+ import { GenerationOperationError } from "../../../application/generation/generation-starter.js";
7
+ import { ContextLoadError } from "../../../application/context/context-loader.js";
8
+ import { TapHoundConfigSchema } from "../../../domain/config.js";
9
+ import { verificationPhaseLabel } from "../../../domain/generation.js";
10
+ import { ProposedStepSchema } from "../../../domain/proposed-step.js";
11
+ import { RuntimeSnapshotSchema } from "../../../domain/runtime-snapshot.js";
12
+ import { assertArtifactDirectory, CONFIG_PATH } from "../../../domain/workspace.js";
13
+ import { GenerationSessionStoreError } from "../../../ports/generation-session-store.js";
14
+ import { GenerationPromptCancelledError } from "../../../ports/generation-prompt.js";
15
+ import { contextLoadHint, errorMessage, writeJson, writeLine } from "../../output.js";
16
+ import { prepareWorkspace } from "../../workspace-guard.js";
17
+ import { canonicalProjectRoot } from "../../project-root.js";
18
+ import { idlePolicyText } from "./session-commands.js";
19
+ export const PlannerEnvelopeSchema = z.union([
20
+ z.strictObject({
21
+ version: z.literal(1),
22
+ proposal: ProposedStepSchema,
23
+ snapshot: RuntimeSnapshotSchema
24
+ }),
25
+ z.strictObject({
26
+ version: z.literal(1),
27
+ proposal: ProposedStepSchema,
28
+ snapshotRef: z.string().min(1)
29
+ })
30
+ ]);
31
+ export const ManualActionSchema = z.enum([
32
+ "click",
33
+ "longClick",
34
+ "inputText",
35
+ "swipe",
36
+ "scrollTo",
37
+ "back",
38
+ "wait"
39
+ ]);
40
+ export function writeFailure(dependencies, options, exitCode, code, error, outputOptions = {}) {
41
+ const output = {
42
+ status: outputOptions.status ?? "error",
43
+ exitCode,
44
+ ...(outputOptions.generationId === undefined
45
+ ? {}
46
+ : { generationId: outputOptions.generationId }),
47
+ ...(outputOptions.timing === undefined
48
+ ? {}
49
+ : { timing: outputOptions.timing }),
50
+ failure: {
51
+ code,
52
+ message: errorMessage(error),
53
+ ...(outputOptions.details !== undefined
54
+ ? { details: outputOptions.details }
55
+ : error instanceof GenerationFinalizationError
56
+ && error.details !== undefined
57
+ ? { details: error.details }
58
+ : error instanceof GenerationOperationError
59
+ && error.details !== undefined
60
+ ? { details: error.details }
61
+ : {}),
62
+ ...(outputOptions.hint === undefined ? {} : { hint: outputOptions.hint })
63
+ }
64
+ };
65
+ if (options.json === true) {
66
+ writeJson(dependencies.stdout, output);
67
+ }
68
+ else {
69
+ writeLine(dependencies.stderr, output.failure.message);
70
+ }
71
+ dependencies.setExitCode(exitCode);
72
+ }
73
+ export async function loadConfig(dependencies, options) {
74
+ try {
75
+ const config = TapHoundConfigSchema.parse(await dependencies.readJson(resolve(options.project, options.config)));
76
+ assertArtifactDirectory(options.project, config.artifactsDir);
77
+ await prepareWorkspace(dependencies, options.project);
78
+ return config;
79
+ }
80
+ catch (error) {
81
+ throw new GenerationOperationError("CONFIG_INVALID", errorMessage(error));
82
+ }
83
+ }
84
+ export async function generationConfig(dependencies, options) {
85
+ const projectRoot = await canonicalProjectRoot(dependencies.cwd(), options.project);
86
+ return {
87
+ projectRoot,
88
+ config: await loadConfig(dependencies, {
89
+ project: projectRoot,
90
+ config: options.config
91
+ })
92
+ };
93
+ }
94
+ export function tools(checks) {
95
+ return Object.fromEntries(checks.flatMap((check) => (check.status === "passed" && check.version !== undefined
96
+ ? [[check.name, check.version]]
97
+ : [])));
98
+ }
99
+ export function writeSuccess(dependencies, options, output, message) {
100
+ if (options.json === true) {
101
+ writeJson(dependencies.stdout, output);
102
+ }
103
+ else {
104
+ writeLine(dependencies.stdout, message);
105
+ }
106
+ dependencies.setExitCode(0);
107
+ }
108
+ export function compactOutput(options) {
109
+ return "compact" in options && options.compact === true;
110
+ }
111
+ export function envelopeHint(options) {
112
+ if ("input" in options && options.input !== undefined) {
113
+ return "Planner envelope must be a strict object with exactly three top-level fields: version (1), proposal (object), and either snapshot (the full RuntimeSnapshot object) or snapshotRef (the snapshotRef string from the preceding observe output). Unknown or missing fields are rejected. See docs/agent-integration.md and assets/skills/taphound-journey-generator/schemas/proposed-step-envelope.json.";
114
+ }
115
+ return "TapHound rejected the JSON input. See docs/agent-integration.md for the command contract.";
116
+ }
117
+ export function generationStatusText(status) {
118
+ const verificationAttempt = status.verification.status === "running"
119
+ || status.verification.status === "passed"
120
+ || status.verification.status === "failed"
121
+ ? ("attemptId" in status.verification
122
+ ? status.verification.attemptId
123
+ : "none")
124
+ : "none";
125
+ const owner = status.verification.status === "running"
126
+ && status.verification.ownerPid !== undefined
127
+ ? `${String(status.verification.ownerPid)} (${status.recovery.ownerAlive === null
128
+ ? "unknown"
129
+ : status.recovery.ownerAlive ? "alive" : "not alive"})`
130
+ : "none";
131
+ const phase = status.verification.status === "running"
132
+ && status.verification.phase !== undefined
133
+ ? verificationPhaseLabel(status.verification.phase)
134
+ : null;
135
+ const inFlight = status.inFlight === null
136
+ ? "none"
137
+ : `step ${String(status.inFlight.stepIndex)}, attempt ${status.inFlight.attemptId}`;
138
+ const confirmation = status.pendingConfirmation === null
139
+ ? "none"
140
+ : `${status.pendingConfirmation.challengeId} (${status.pendingConfirmation.expired
141
+ ? "expired"
142
+ : status.pendingConfirmation.status}, expires ${status.pendingConfirmation.expiresAt})`;
143
+ const recovery = status.recovery.available
144
+ ? `${status.recovery.kind ?? "unknown"}; decision=${status.recovery.requiredDecision ?? "none"}; outcome=${status.recovery.attemptOutcome ?? "unknown"}`
145
+ : "unavailable";
146
+ return [
147
+ `Generation: ${status.generationId}`,
148
+ `State: ${status.state}`,
149
+ `Revision: ${String(status.revision)}`,
150
+ `Candidate steps: ${String(status.candidateStepCount)}`,
151
+ ...(status.idlePolicy === undefined
152
+ ? []
153
+ : [`Idle policy: ${idlePolicyText(status.idlePolicy)}`]),
154
+ `In flight: ${inFlight}`,
155
+ `Pending confirmation: ${confirmation}`,
156
+ `Verification: ${status.verification.status} (attempt ${verificationAttempt})`,
157
+ `Verification owner: ${owner}`,
158
+ ...(phase === null ? [] : [`Verification phase: ${phase}`]),
159
+ `Publication: ${status.publication.status}`,
160
+ `Recovery: ${recovery}`,
161
+ `Action may have executed: ${status.recovery.actionMayHaveExecuted ? "yes" : "no"}`
162
+ ].join("\n");
163
+ }
164
+ export function mappedFailure(dependencies, options, error) {
165
+ if (error instanceof z.ZodError || error instanceof SyntaxError) {
166
+ writeFailure(dependencies, options, 2, "CONTEXT_INVALID", error, {
167
+ hint: envelopeHint(options)
168
+ });
169
+ return;
170
+ }
171
+ if (error instanceof ContextLoadError) {
172
+ const hint = contextLoadHint(error);
173
+ writeFailure(dependencies, options, error.code === "CONTEXT_STALE" ? 1 : 2, error.code, error, hint === undefined ? {} : { hint });
174
+ return;
175
+ }
176
+ if (dependencies.signal?.aborted === true) {
177
+ writeFailure(dependencies, options, 1, "RECOVERY_REQUIRED", "Generation command was cancelled");
178
+ return;
179
+ }
180
+ if (error instanceof GenerationFinalizationError) {
181
+ writeFailure(dependencies, options, 1, error.code, error);
182
+ return;
183
+ }
184
+ if (error instanceof GenerationOperationError) {
185
+ const exitCode = error.code === "CONFIG_INVALID"
186
+ || error.code === "CONTEXT_INVALID"
187
+ || error.code === "BRIEF_INVALID"
188
+ || error.code === "FLOW_INVALID"
189
+ || error.code === "EXTERNAL_FLOW_NOT_FOUND"
190
+ || error.code === "EXTERNAL_FLOW_STALE"
191
+ || error.code === "EXTERNAL_LOCATOR_STRICTNESS"
192
+ ? 2
193
+ : error.code === "EXTERNAL_PACKAGE_MISMATCH"
194
+ || error.code === "EXTERNAL_ACTIVITY_MISMATCH"
195
+ || error.code === "EXTERNAL_STEP_FAILED"
196
+ ? 1
197
+ : 1;
198
+ writeFailure(dependencies, options, exitCode, error.code, error);
199
+ return;
200
+ }
201
+ if (error instanceof GenerationSessionStoreError) {
202
+ const exitCode = error.code === "INVALID_ID"
203
+ || error.code === "INVALID_SESSION"
204
+ || error.code === "INVALID_REVISION"
205
+ ? 2
206
+ : error.code === "IO_ERROR" || error.code === "LOCK_TIMEOUT"
207
+ ? 4
208
+ : 1;
209
+ writeFailure(dependencies, options, exitCode, error.code, error);
210
+ return;
211
+ }
212
+ if (error instanceof GenerationPromptCancelledError) {
213
+ writeFailure(dependencies, options, 1, "RECOVERY_REQUIRED", error);
214
+ return;
215
+ }
216
+ if (error instanceof Error
217
+ && error.message.includes("requires local TTY")) {
218
+ writeFailure(dependencies, options, 1, "RISK_CONFIRMATION_REQUIRED", error);
219
+ return;
220
+ }
221
+ const failureCode = failureCodeFromUnknown(error);
222
+ if (failureCode !== undefined) {
223
+ writeFailure(dependencies, options, exitCodeForFailure(failureCode), failureCode, error);
224
+ return;
225
+ }
226
+ writeFailure(dependencies, options, 4, "INTERNAL_ERROR", error);
227
+ }
228
+ export async function executeApproved(dependencies, options, runtime, input) {
229
+ const result = await runtime.executor.execute({
230
+ ...input,
231
+ ...(dependencies.signal === undefined
232
+ ? {}
233
+ : { signal: dependencies.signal })
234
+ });
235
+ if (result.status !== "succeeded") {
236
+ writeFailure(dependencies, options, 1, result.failure.code, result.failure.message, {
237
+ status: "recoveryRequired",
238
+ generationId: input.generationId,
239
+ ...(result.timing === undefined ? {} : { timing: result.timing }),
240
+ ...(result.failure.details === undefined
241
+ ? {}
242
+ : { details: result.failure.details })
243
+ });
244
+ return;
245
+ }
246
+ const session = await runtime.readSession(input.generationId);
247
+ writeSuccess(dependencies, options, {
248
+ status: "succeeded",
249
+ exitCode: 0,
250
+ generationId: input.generationId,
251
+ revision: session.revision,
252
+ stepIndex: session.candidateSteps.length - 1,
253
+ step: result.step,
254
+ source: input.source,
255
+ ...(result.timing === undefined ? {} : { timing: result.timing }),
256
+ ...(result.nextObservation === undefined
257
+ ? {}
258
+ : compactOutput(options)
259
+ ? {
260
+ nextBinding: result.nextObservation.binding,
261
+ nextSnapshotRef: result.nextObservation.snapshotRef
262
+ }
263
+ : {
264
+ nextBinding: result.nextObservation.binding,
265
+ nextSnapshot: result.nextObservation.snapshot,
266
+ nextSnapshotRef: result.nextObservation.snapshotRef
267
+ }),
268
+ ...(result.nextObservationFailure === undefined
269
+ ? {}
270
+ : { nextObservationFailure: result.nextObservationFailure })
271
+ }, `Generation step ${String(session.candidateSteps.length - 1)} succeeded`);
272
+ }
273
+ export function requireRuntime(dependencies, projectRoot, config) {
274
+ if (dependencies.generationRuntime === undefined) {
275
+ throw new Error("Generation command runtime is unavailable");
276
+ }
277
+ return dependencies.generationRuntime({
278
+ projectRoot,
279
+ config
280
+ });
281
+ }
282
+ export async function assertRuntimeConfig(runtime, generationId) {
283
+ await runtime.assertConfigIdentity(generationId);
284
+ }
285
+ export function addCommonOptions(command, dependencies) {
286
+ return command
287
+ .option("--project <path>", "Android project root", dependencies.cwd())
288
+ .option("--config <path>", "TapHound config path", CONFIG_PATH)
289
+ .requiredOption("--session <id>", "Generation session id")
290
+ .option("--json", "Emit one machine-readable JSON value");
291
+ }
@@ -0,0 +1,8 @@
1
+ import { Command } from "commander";
2
+ import { type BridgeScenario } from "../../../domain/journey.js";
3
+ import type { CliDependencies } from "../../dependencies.js";
4
+ export declare function createStepCommand(dependencies: CliDependencies): Command;
5
+ export declare function createConfirmCommand(dependencies: CliDependencies): Command;
6
+ export declare function createManualCommand(dependencies: CliDependencies): Command;
7
+ export declare function resolveBridgeDescription(scenario: BridgeScenario, description: string | undefined): string;
8
+ export declare function createBridgeCommand(dependencies: CliDependencies): Command;
@@ -0,0 +1,315 @@
1
+ // `generation` subcommands that bind and execute steps: step, confirm, manual, and bridge.
2
+ import { resolve } from "node:path";
3
+ import { Command } from "commander";
4
+ import { z } from "zod";
5
+ import { GenerationOperationError } from "../../../application/generation/generation-starter.js";
6
+ import { GenerationSessionIdSchema } from "../../../domain/generation.js";
7
+ import { BridgeScenarioSchema } from "../../../domain/journey.js";
8
+ import { LocatorSchema } from "../../../domain/layout.js";
9
+ import { ManualActionSchema, PlannerEnvelopeSchema, addCommonOptions, assertRuntimeConfig, executeApproved, generationConfig, mappedFailure, requireRuntime, tools, writeFailure, writeSuccess } from "./shared.js";
10
+ export function createStepCommand(dependencies) {
11
+ return addCommonOptions(new Command("step")
12
+ .description("Accept and execute one strict planner proposal")
13
+ .option("--compact", "Return authoritative nextSnapshotRef instead of the full next snapshot")
14
+ .option("--input <path>", "Strict proposal envelope path")
15
+ .option("--replace <index>", "Truncate candidate steps at <index>, replay the stored prefix, and bind a fresh snapshot"), dependencies).action(async (options) => {
16
+ try {
17
+ const generationId = GenerationSessionIdSchema.parse(options.session);
18
+ const { projectRoot, config } = await generationConfig(dependencies, options);
19
+ const runtime = requireRuntime(dependencies, projectRoot, config);
20
+ await assertRuntimeConfig(runtime, generationId);
21
+ if (options.replace !== undefined) {
22
+ if (options.input !== undefined) {
23
+ throw new GenerationOperationError("CONFIG_INVALID", "generation step accepts either --input or --replace, not both");
24
+ }
25
+ const stepIndex = z.coerce.number().int().nonnegative().parse(options.replace);
26
+ const session = await runtime.readSession(generationId);
27
+ const doctor = await dependencies.doctor.run({
28
+ packageName: config.run.packageName,
29
+ skipPermissionProbe: true,
30
+ requestedDevice: session.target.deviceSerial,
31
+ ...(config.ui?.backend === undefined
32
+ ? {}
33
+ : { requestedUiBackend: config.ui.backend }),
34
+ ...(dependencies.signal === undefined
35
+ ? {}
36
+ : { signal: dependencies.signal })
37
+ });
38
+ if (doctor.status === "failed") {
39
+ writeFailure(dependencies, options, 3, doctor.failureCode ?? "ENVIRONMENT_MISSING_TOOL", doctor.checks.find((check) => check.status === "failed")?.message
40
+ ?? "TapHound environment preflight failed");
41
+ return;
42
+ }
43
+ const result = await runtime.replace({
44
+ generationId,
45
+ stepIndex,
46
+ projectRoot: projectRoot,
47
+ config,
48
+ toolVersions: tools(doctor.checks),
49
+ manualReplay: process.stdin.isTTY,
50
+ ...(dependencies.signal === undefined
51
+ ? {}
52
+ : { signal: dependencies.signal })
53
+ });
54
+ writeSuccess(dependencies, options, {
55
+ status: "replaced",
56
+ exitCode: 0,
57
+ stepIndex: result.stepIndex,
58
+ remainingStepCount: result.remainingStepCount,
59
+ truncatedStepCount: result.truncatedStepCount,
60
+ ...result.observation.binding,
61
+ snapshotRef: result.observation.snapshotRef,
62
+ ...(options.compact === true
63
+ ? {}
64
+ : { snapshot: result.observation.snapshot })
65
+ }, `Generation truncated to ${String(result.remainingStepCount)} step(s) at index ${String(result.stepIndex)} and re-observed`);
66
+ return;
67
+ }
68
+ if (options.input === undefined) {
69
+ throw new GenerationOperationError("CONFIG_INVALID", "generation step requires either --input <envelope> or --replace <index>");
70
+ }
71
+ const envelope = PlannerEnvelopeSchema.parse(await dependencies.readJson(resolve(projectRoot, options.input)));
72
+ const confirmation = await runtime.confirmation.request({
73
+ generationId,
74
+ proposal: envelope.proposal,
75
+ ...("snapshot" in envelope
76
+ ? { snapshot: envelope.snapshot }
77
+ : { snapshotRef: envelope.snapshotRef }),
78
+ source: "planner"
79
+ });
80
+ if (confirmation.status === "confirmationRequired") {
81
+ writeSuccess(dependencies, options, {
82
+ status: "confirmationRequired",
83
+ exitCode: 0,
84
+ generationId,
85
+ revision: confirmation.revision,
86
+ challenge: confirmation.challenge
87
+ }, `Confirmation required: ${confirmation.challenge.challengeId}`);
88
+ return;
89
+ }
90
+ await executeApproved(dependencies, options, runtime, {
91
+ generationId,
92
+ proposal: confirmation.proposal,
93
+ snapshot: confirmation.snapshot,
94
+ source: "planner"
95
+ });
96
+ }
97
+ catch (error) {
98
+ mappedFailure(dependencies, options, error);
99
+ }
100
+ });
101
+ }
102
+ export function createConfirmCommand(dependencies) {
103
+ return addCommonOptions(new Command("confirm")
104
+ .description("Approve and execute Core-owned challenge evidence")
105
+ .option("--compact", "Return authoritative nextSnapshotRef instead of the full next snapshot")
106
+ .option("--decision <decision>", "Delegated non-TTY decision after explicit human review: approve or decline")
107
+ .requiredOption("--challenge <id>", "Core confirmation challenge id"), dependencies).action(async (options) => {
108
+ try {
109
+ const generationId = GenerationSessionIdSchema.parse(options.session);
110
+ const challengeId = GenerationSessionIdSchema.parse(options.challenge);
111
+ if (options.decision !== undefined
112
+ && options.decision !== "approve"
113
+ && options.decision !== "decline") {
114
+ throw new GenerationOperationError("CONFIG_INVALID", "generation confirm --decision must be approve or decline");
115
+ }
116
+ const decision = options.decision;
117
+ const { projectRoot, config } = await generationConfig(dependencies, options);
118
+ const runtime = requireRuntime(dependencies, projectRoot, config);
119
+ await assertRuntimeConfig(runtime, generationId);
120
+ const approved = await runtime.confirmation.confirmStored({
121
+ generationId,
122
+ challengeId,
123
+ ...(decision === undefined ? {} : { decision }),
124
+ ...(dependencies.signal === undefined
125
+ ? {}
126
+ : { signal: dependencies.signal })
127
+ });
128
+ if (approved.status === "declined") {
129
+ writeSuccess(dependencies, options, {
130
+ status: "declined",
131
+ exitCode: 0,
132
+ generationId,
133
+ challengeId
134
+ }, `Generation confirmation declined: ${challengeId}`);
135
+ return;
136
+ }
137
+ await executeApproved(dependencies, options, runtime, {
138
+ generationId,
139
+ proposal: approved.proposal,
140
+ snapshot: approved.snapshot,
141
+ source: approved.source
142
+ });
143
+ }
144
+ catch (error) {
145
+ mappedFailure(dependencies, options, error);
146
+ }
147
+ });
148
+ }
149
+ export function createManualCommand(dependencies) {
150
+ return addCommonOptions(new Command("manual")
151
+ .description("Interactively build, execute, and record one manual Journey step")
152
+ .option("--compact", "Return authoritative nextSnapshotRef instead of the full next snapshot")
153
+ .requiredOption("--action <action>", "Journey action to execute through deterministic Core controls"), dependencies).action(async (options) => {
154
+ try {
155
+ const generationId = GenerationSessionIdSchema.parse(options.session);
156
+ const action = ManualActionSchema.parse(options.action);
157
+ const { projectRoot, config } = await generationConfig(dependencies, options);
158
+ const runtime = requireRuntime(dependencies, projectRoot, config);
159
+ await assertRuntimeConfig(runtime, generationId);
160
+ const existing = await runtime.confirmation.findPendingManual({
161
+ generationId,
162
+ action
163
+ });
164
+ if (existing !== null) {
165
+ writeSuccess(dependencies, options, {
166
+ status: "confirmationRequired",
167
+ exitCode: 0,
168
+ generationId,
169
+ revision: existing.revision,
170
+ challenge: existing.challenge
171
+ }, `Confirmation required: ${existing.challenge.challengeId}`);
172
+ return;
173
+ }
174
+ const observation = await runtime.observer.observe({
175
+ generationId,
176
+ ...(dependencies.signal === undefined
177
+ ? {}
178
+ : { signal: dependencies.signal })
179
+ });
180
+ const confirmation = await runtime.confirmation.requestManual({
181
+ generationId,
182
+ snapshot: observation.snapshot,
183
+ manual: {
184
+ action,
185
+ binding: observation.binding,
186
+ before: observation.snapshot.activity,
187
+ layout: observation.snapshot.layout
188
+ },
189
+ ...(dependencies.signal === undefined
190
+ ? {}
191
+ : { signal: dependencies.signal })
192
+ });
193
+ if (confirmation.status === "confirmationRequired") {
194
+ writeSuccess(dependencies, options, {
195
+ status: "confirmationRequired",
196
+ exitCode: 0,
197
+ generationId,
198
+ revision: confirmation.revision,
199
+ challenge: confirmation.challenge
200
+ }, `Confirmation required: ${confirmation.challenge.challengeId}`);
201
+ return;
202
+ }
203
+ await executeApproved(dependencies, options, runtime, {
204
+ generationId,
205
+ proposal: confirmation.proposal,
206
+ snapshot: observation.snapshot,
207
+ source: "manualOverride"
208
+ });
209
+ }
210
+ catch (error) {
211
+ mappedFailure(dependencies, options, error);
212
+ }
213
+ });
214
+ }
215
+ export function resolveBridgeDescription(scenario, description) {
216
+ if (description !== undefined) {
217
+ return z.string().trim().min(1).parse(description);
218
+ }
219
+ switch (scenario) {
220
+ case "photoCapture":
221
+ return "Capture photo via system camera";
222
+ case "pickImage":
223
+ return "Pick image via system picker";
224
+ case "pickFile":
225
+ return "Pick file via system picker";
226
+ case "custom":
227
+ throw new GenerationOperationError("CONTEXT_INVALID", "Bridge scenario 'custom' requires --description");
228
+ }
229
+ }
230
+ export function createBridgeCommand(dependencies) {
231
+ return addCommonOptions(new Command("bridge")
232
+ .description("Execute a cross-application bridge step through Core controls")
233
+ .option("--compact", "Return authoritative nextSnapshotRef instead of the full next snapshot")
234
+ .requiredOption("--scenario <scenario>", "Bridge scenario: photoCapture, pickImage, pickFile, or custom")
235
+ .requiredOption("--trigger-locator <json>", "JSON locator for the trigger element")
236
+ .option("--description <text>", "Bridge description (required for custom scenario)")
237
+ .option("--return-timeout-ms <ms>", "Maximum time to wait for return to the target app in milliseconds", "60000")
238
+ .option("--flow <name>", "External flow name for deterministic bridge replay (requires --external-flow at session start)")
239
+ .option("--escape-timeout-ms <ms>", "Maximum time to wait for package escape after trigger click in milliseconds"), dependencies).action(async (options) => {
240
+ try {
241
+ const generationId = GenerationSessionIdSchema.parse(options.session);
242
+ const scenario = BridgeScenarioSchema.parse(options.scenario);
243
+ const triggerLocator = LocatorSchema.parse(JSON.parse(options.triggerLocator));
244
+ const returnTimeoutMs = z.number().int().positive().parse(Number(options.returnTimeoutMs));
245
+ const escapeTimeoutMs = options.escapeTimeoutMs === undefined
246
+ ? undefined
247
+ : z.number().int().positive().parse(Number(options.escapeTimeoutMs));
248
+ const description = resolveBridgeDescription(scenario, options.description);
249
+ const { projectRoot, config } = await generationConfig(dependencies, options);
250
+ const runtime = requireRuntime(dependencies, projectRoot, config);
251
+ await assertRuntimeConfig(runtime, generationId);
252
+ const session = await runtime.readSession(generationId);
253
+ if (session.pendingConfirmation?.status === "pending") {
254
+ writeSuccess(dependencies, options, {
255
+ status: "confirmationRequired",
256
+ exitCode: 0,
257
+ generationId,
258
+ revision: session.revision,
259
+ challenge: session.pendingConfirmation
260
+ }, `Confirmation required: ${session.pendingConfirmation.challengeId}`);
261
+ return;
262
+ }
263
+ let flowName;
264
+ if (options.flow !== undefined) {
265
+ flowName = z.string().trim().min(1).parse(options.flow);
266
+ const binding = session.externalFlows.find((entry) => entry.name === flowName);
267
+ if (binding === undefined) {
268
+ throw new GenerationOperationError("EXTERNAL_FLOW_NOT_FOUND", `External Flow "${flowName}" is not bound to generation session ${generationId}`);
269
+ }
270
+ }
271
+ const observation = await runtime.observer.observe({
272
+ generationId,
273
+ ...(dependencies.signal === undefined
274
+ ? {}
275
+ : { signal: dependencies.signal })
276
+ });
277
+ const proposal = {
278
+ action: "bridge",
279
+ scenario,
280
+ description,
281
+ triggerLocator,
282
+ returnTimeoutMs,
283
+ ...(flowName === undefined ? {} : { flow: flowName }),
284
+ ...(escapeTimeoutMs === undefined ? {} : { escapeTimeoutMs }),
285
+ binding: observation.binding,
286
+ activity: { before: observation.snapshot.activity }
287
+ };
288
+ const confirmation = await runtime.confirmation.request({
289
+ generationId,
290
+ proposal,
291
+ snapshot: observation.snapshot,
292
+ source: "manualOverride"
293
+ });
294
+ if (confirmation.status === "confirmationRequired") {
295
+ writeSuccess(dependencies, options, {
296
+ status: "confirmationRequired",
297
+ exitCode: 0,
298
+ generationId,
299
+ revision: confirmation.revision,
300
+ challenge: confirmation.challenge
301
+ }, `Confirmation required: ${confirmation.challenge.challengeId}`);
302
+ return;
303
+ }
304
+ await executeApproved(dependencies, options, runtime, {
305
+ generationId,
306
+ proposal: confirmation.proposal,
307
+ snapshot: observation.snapshot,
308
+ source: "manualOverride"
309
+ });
310
+ }
311
+ catch (error) {
312
+ mappedFailure(dependencies, options, error);
313
+ }
314
+ });
315
+ }