swipium 1.4.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (541) hide show
  1. package/CHANGELOG.md +313 -0
  2. package/README.md +175 -219
  3. package/THREAT_MODEL.md +223 -47
  4. package/dist/appMap/automationLink.js +39 -26
  5. package/dist/appMap/automationLink.js.map +1 -1
  6. package/dist/appMap/build.js +68 -20
  7. package/dist/appMap/build.js.map +1 -1
  8. package/dist/appMap/codeIndex.js +31 -5
  9. package/dist/appMap/codeIndex.js.map +1 -1
  10. package/dist/appMap/featureIndex.js +23 -5
  11. package/dist/appMap/featureIndex.js.map +1 -1
  12. package/dist/appMap/featureModel.js +44 -8
  13. package/dist/appMap/featureModel.js.map +1 -1
  14. package/dist/appMap/firstRunApply.js +24 -6
  15. package/dist/appMap/firstRunApply.js.map +1 -1
  16. package/dist/appMap/fsWalk.js +19 -2
  17. package/dist/appMap/fsWalk.js.map +1 -1
  18. package/dist/appMap/issues.js +10 -30
  19. package/dist/appMap/issues.js.map +1 -1
  20. package/dist/appMap/migrations.js +6 -6
  21. package/dist/appMap/migrations.js.map +1 -1
  22. package/dist/appMap/prelaunch.js +2 -2
  23. package/dist/appMap/prelaunch.js.map +1 -1
  24. package/dist/appMap/projectRegistry.js +83 -11
  25. package/dist/appMap/projectRegistry.js.map +1 -1
  26. package/dist/appMap/provenance.js +2 -2
  27. package/dist/appMap/provenance.js.map +1 -1
  28. package/dist/appMap/query.js +21 -5
  29. package/dist/appMap/query.js.map +1 -1
  30. package/dist/appMap/runtimeMerge.js +12 -5
  31. package/dist/appMap/runtimeMerge.js.map +1 -1
  32. package/dist/appMap/schema.js +1 -1
  33. package/dist/appMap/schema.js.map +1 -1
  34. package/dist/appMap/screenMatch.js +6 -2
  35. package/dist/appMap/screenMatch.js.map +1 -1
  36. package/dist/appMap/staticScan.js +151 -39
  37. package/dist/appMap/staticScan.js.map +1 -1
  38. package/dist/appMap/store.js +58 -85
  39. package/dist/appMap/store.js.map +1 -1
  40. package/dist/appMap/tsAstScan.js +34 -12
  41. package/dist/appMap/tsAstScan.js.map +1 -1
  42. package/dist/artifacts/bundletool.js +49 -12
  43. package/dist/artifacts/bundletool.js.map +1 -1
  44. package/dist/artifacts/resolve.js +41 -14
  45. package/dist/artifacts/resolve.js.map +1 -1
  46. package/dist/automation/capabilities.js +112 -30
  47. package/dist/automation/capabilities.js.map +1 -1
  48. package/dist/automation/gestures.js +6 -2
  49. package/dist/automation/gestures.js.map +1 -1
  50. package/dist/automation/plan.js +71 -23
  51. package/dist/automation/plan.js.map +1 -1
  52. package/dist/automation/report.js +15 -5
  53. package/dist/automation/report.js.map +1 -1
  54. package/dist/automation/selectors.js +22 -28
  55. package/dist/automation/selectors.js.map +1 -1
  56. package/dist/automation/types.js +1 -1
  57. package/dist/automation/types.js.map +1 -1
  58. package/dist/automation/waits.js +14 -8
  59. package/dist/automation/waits.js.map +1 -1
  60. package/dist/automation/webview.js +9 -3
  61. package/dist/automation/webview.js.map +1 -1
  62. package/dist/automationGen/appiumModel.js +16 -8
  63. package/dist/automationGen/appiumModel.js.map +1 -1
  64. package/dist/automationGen/ciEmitter.js +6 -6
  65. package/dist/automationGen/ciEmitter.js.map +1 -1
  66. package/dist/automationGen/identifiers.js +224 -0
  67. package/dist/automationGen/identifiers.js.map +1 -0
  68. package/dist/automationGen/jsEmitter.js +288 -121
  69. package/dist/automationGen/jsEmitter.js.map +1 -1
  70. package/dist/automationGen/packagePatch.js +2 -2
  71. package/dist/automationGen/packagePatch.js.map +1 -1
  72. package/dist/automationGen/platformResolve.js +36 -0
  73. package/dist/automationGen/platformResolve.js.map +1 -0
  74. package/dist/automationGen/projectProfile.js +76 -27
  75. package/dist/automationGen/projectProfile.js.map +1 -1
  76. package/dist/automationGen/pythonEmitter.js +278 -107
  77. package/dist/automationGen/pythonEmitter.js.map +1 -1
  78. package/dist/automationGen/readmeEmitter.js +7 -6
  79. package/dist/automationGen/readmeEmitter.js.map +1 -1
  80. package/dist/automationGen/run.js +388 -0
  81. package/dist/automationGen/run.js.map +1 -0
  82. package/dist/automationGen/suitePlan.js +17 -10
  83. package/dist/automationGen/suitePlan.js.map +1 -1
  84. package/dist/automationGen/validation.js +52 -12
  85. package/dist/automationGen/validation.js.map +1 -1
  86. package/dist/build/parseBuildLog.js +235 -31
  87. package/dist/build/parseBuildLog.js.map +1 -1
  88. package/dist/build/plan.js +39 -18
  89. package/dist/build/plan.js.map +1 -1
  90. package/dist/ci/preflight.js +13 -4
  91. package/dist/ci/preflight.js.map +1 -1
  92. package/dist/cli/gc.js +74 -0
  93. package/dist/cli/gc.js.map +1 -0
  94. package/dist/cli/init.js +217 -26
  95. package/dist/cli/init.js.map +1 -1
  96. package/dist/cli/main.js +50 -0
  97. package/dist/cli/main.js.map +1 -0
  98. package/dist/cli/report.js +218 -0
  99. package/dist/cli/report.js.map +1 -0
  100. package/dist/cli/scan.js +36 -15
  101. package/dist/cli/scan.js.map +1 -1
  102. package/dist/cli/suite.js +7 -7
  103. package/dist/cli/suite.js.map +1 -1
  104. package/dist/cli/verify.js +7 -7
  105. package/dist/cli/verify.js.map +1 -1
  106. package/dist/consent/consent.js +162 -5
  107. package/dist/consent/consent.js.map +1 -1
  108. package/dist/context/detect.js +55 -18
  109. package/dist/context/detect.js.map +1 -1
  110. package/dist/context/findApps.js +22 -8
  111. package/dist/context/findApps.js.map +1 -1
  112. package/dist/context/projectRoot.js +174 -19
  113. package/dist/context/projectRoot.js.map +1 -1
  114. package/dist/context/scan.js +1 -1
  115. package/dist/context/scan.js.map +1 -1
  116. package/dist/core/capabilityGroups.js +90 -0
  117. package/dist/core/capabilityGroups.js.map +1 -0
  118. package/dist/core/target.js +10 -8
  119. package/dist/core/target.js.map +1 -1
  120. package/dist/core/targetPlan.js +160 -39
  121. package/dist/core/targetPlan.js.map +1 -1
  122. package/dist/drivers/DirectDriver.js +317 -43
  123. package/dist/drivers/DirectDriver.js.map +1 -1
  124. package/dist/drivers/SimctlDriver.js +124 -8
  125. package/dist/drivers/SimctlDriver.js.map +1 -1
  126. package/dist/drivers/WdaDriver.js +365 -55
  127. package/dist/drivers/WdaDriver.js.map +1 -1
  128. package/dist/explore/candidates.js +7 -3
  129. package/dist/explore/candidates.js.map +1 -1
  130. package/dist/explore/graph.js +15 -6
  131. package/dist/explore/graph.js.map +1 -1
  132. package/dist/explore/memory.js +4 -1
  133. package/dist/explore/memory.js.map +1 -1
  134. package/dist/explore/planner.js +54 -9
  135. package/dist/explore/planner.js.map +1 -1
  136. package/dist/explore/policy.js +11 -6
  137. package/dist/explore/policy.js.map +1 -1
  138. package/dist/explore/runner.js +363 -190
  139. package/dist/explore/runner.js.map +1 -1
  140. package/dist/explore/signatures.js +4 -2
  141. package/dist/explore/signatures.js.map +1 -1
  142. package/dist/explore/suite.js +3 -1
  143. package/dist/explore/suite.js.map +1 -1
  144. package/dist/featureTesting/executionBootstrap.js +137 -29
  145. package/dist/featureTesting/executionBootstrap.js.map +1 -1
  146. package/dist/featureTesting/featureMap.js +6 -3
  147. package/dist/featureTesting/featureMap.js.map +1 -1
  148. package/dist/featureTesting/featureScope.js +101 -20
  149. package/dist/featureTesting/featureScope.js.map +1 -1
  150. package/dist/featureTesting/mapFeatureScope.js +44 -15
  151. package/dist/featureTesting/mapFeatureScope.js.map +1 -1
  152. package/dist/featureTesting/objectiveModel.js +15 -11
  153. package/dist/featureTesting/objectiveModel.js.map +1 -1
  154. package/dist/featureTesting/resultMerge.js +16 -8
  155. package/dist/featureTesting/resultMerge.js.map +1 -1
  156. package/dist/featureTesting/sources.js +8 -5
  157. package/dist/featureTesting/sources.js.map +1 -1
  158. package/dist/featureTesting/suiteBridge.js +8 -2
  159. package/dist/featureTesting/suiteBridge.js.map +1 -1
  160. package/dist/featureTesting/synonyms.js +32 -4
  161. package/dist/featureTesting/synonyms.js.map +1 -1
  162. package/dist/featureTesting/testCaseFactory.js +27 -15
  163. package/dist/featureTesting/testCaseFactory.js.map +1 -1
  164. package/dist/featureTesting/testPlan.js +34 -12
  165. package/dist/featureTesting/testPlan.js.map +1 -1
  166. package/dist/firstRun/authStateMachine.js +1 -1
  167. package/dist/firstRun/authStateMachine.js.map +1 -1
  168. package/dist/firstRun/classifyScreen.js +9 -6
  169. package/dist/firstRun/classifyScreen.js.map +1 -1
  170. package/dist/firstRun/firstRunPlanner.js +16 -13
  171. package/dist/firstRun/firstRunPlanner.js.map +1 -1
  172. package/dist/firstRun/firstRunRunner.js +92 -31
  173. package/dist/firstRun/firstRunRunner.js.map +1 -1
  174. package/dist/firstRun/generatedDataPolicy.js +25 -15
  175. package/dist/firstRun/generatedDataPolicy.js.map +1 -1
  176. package/dist/firstRun/inputPlanner.js +45 -11
  177. package/dist/firstRun/inputPlanner.js.map +1 -1
  178. package/dist/firstRun/onboardingStateMachine.js +1 -1
  179. package/dist/firstRun/onboardingStateMachine.js.map +1 -1
  180. package/dist/firstRun/paywallPolicy.js +3 -3
  181. package/dist/firstRun/paywallPolicy.js.map +1 -1
  182. package/dist/firstRun/types.js +1 -1
  183. package/dist/firstRun/types.js.map +1 -1
  184. package/dist/fixtures/catalog.js +72 -9
  185. package/dist/fixtures/catalog.js.map +1 -1
  186. package/dist/fixtures/load.js +50 -0
  187. package/dist/fixtures/load.js.map +1 -0
  188. package/dist/flows/discover.js +2 -2
  189. package/dist/flows/discover.js.map +1 -1
  190. package/dist/flows/generate.js +68 -17
  191. package/dist/flows/generate.js.map +1 -1
  192. package/dist/flows/lint.js +88 -14
  193. package/dist/flows/lint.js.map +1 -1
  194. package/dist/flows/pack.js +21 -5
  195. package/dist/flows/pack.js.map +1 -1
  196. package/dist/flows/paths.js +57 -0
  197. package/dist/flows/paths.js.map +1 -0
  198. package/dist/flows/repair.js +176 -37
  199. package/dist/flows/repair.js.map +1 -1
  200. package/dist/flows/run.js +308 -99
  201. package/dist/flows/run.js.map +1 -1
  202. package/dist/flows/schema.js +107 -25
  203. package/dist/flows/schema.js.map +1 -1
  204. package/dist/flows/seedExec.js +8 -4
  205. package/dist/flows/seedExec.js.map +1 -1
  206. package/dist/flows/templates.js +5 -5
  207. package/dist/index.js +50 -8
  208. package/dist/index.js.map +1 -1
  209. package/dist/ios/signing.js +32 -3
  210. package/dist/ios/signing.js.map +1 -1
  211. package/dist/issues/classify.js +28 -20
  212. package/dist/issues/classify.js.map +1 -1
  213. package/dist/issues/fingerprint.js +35 -9
  214. package/dist/issues/fingerprint.js.map +1 -1
  215. package/dist/issues/index.js +93 -46
  216. package/dist/issues/index.js.map +1 -1
  217. package/dist/issues/metrics.js +6 -5
  218. package/dist/issues/metrics.js.map +1 -1
  219. package/dist/issues/recurrence.js +35 -8
  220. package/dist/issues/recurrence.js.map +1 -1
  221. package/dist/issues/report.js +12 -8
  222. package/dist/issues/report.js.map +1 -1
  223. package/dist/issues/reportBridge.js +40 -9
  224. package/dist/issues/reportBridge.js.map +1 -1
  225. package/dist/issues/schema.js +2 -2
  226. package/dist/issues/schema.js.map +1 -1
  227. package/dist/issues/sourceRevision.js +2 -2
  228. package/dist/issues/sourceRevision.js.map +1 -1
  229. package/dist/issues/store.js +110 -32
  230. package/dist/issues/store.js.map +1 -1
  231. package/dist/lib/abortScope.js +48 -0
  232. package/dist/lib/abortScope.js.map +1 -0
  233. package/dist/lib/android.js +84 -8
  234. package/dist/lib/android.js.map +1 -1
  235. package/dist/lib/coordSpace.js +1 -1
  236. package/dist/lib/coordSpace.js.map +1 -1
  237. package/dist/lib/device.js +53 -12
  238. package/dist/lib/device.js.map +1 -1
  239. package/dist/lib/gestures.js +141 -0
  240. package/dist/lib/gestures.js.map +1 -0
  241. package/dist/lib/gitignore.js +4 -3
  242. package/dist/lib/gitignore.js.map +1 -1
  243. package/dist/lib/image.js +12 -3
  244. package/dist/lib/image.js.map +1 -1
  245. package/dist/lib/lockfile.js +399 -0
  246. package/dist/lib/lockfile.js.map +1 -0
  247. package/dist/lib/needsInput.js +9 -6
  248. package/dist/lib/needsInput.js.map +1 -1
  249. package/dist/lib/png.js +4 -3
  250. package/dist/lib/png.js.map +1 -1
  251. package/dist/lib/redact.js +170 -9
  252. package/dist/lib/redact.js.map +1 -1
  253. package/dist/lib/result.js +94 -10
  254. package/dist/lib/result.js.map +1 -1
  255. package/dist/lib/schemaHash.js +7 -5
  256. package/dist/lib/schemaHash.js.map +1 -1
  257. package/dist/lib/sensitive.js +6 -3
  258. package/dist/lib/sensitive.js.map +1 -1
  259. package/dist/lib/simctl.js +3 -3
  260. package/dist/lib/simctl.js.map +1 -1
  261. package/dist/lib/spawn.js +78 -17
  262. package/dist/lib/spawn.js.map +1 -1
  263. package/dist/lib/toolAnnotations.js +114 -0
  264. package/dist/lib/toolAnnotations.js.map +1 -0
  265. package/dist/lib/wda.js +321 -25
  266. package/dist/lib/wda.js.map +1 -1
  267. package/dist/lib/wdaConfig.js +12 -5
  268. package/dist/lib/wdaConfig.js.map +1 -1
  269. package/dist/lib/wdaTune.js +52 -23
  270. package/dist/lib/wdaTune.js.map +1 -1
  271. package/dist/mobileAudit/checks.js +150 -28
  272. package/dist/mobileAudit/checks.js.map +1 -1
  273. package/dist/mobileAudit/evidence.js +4 -4
  274. package/dist/mobileAudit/evidence.js.map +1 -1
  275. package/dist/mobileAudit/profiles.js +121 -20
  276. package/dist/mobileAudit/profiles.js.map +1 -1
  277. package/dist/mobileAudit/results.js +9 -4
  278. package/dist/mobileAudit/results.js.map +1 -1
  279. package/dist/mobileAudit/runner.js +214 -35
  280. package/dist/mobileAudit/runner.js.map +1 -1
  281. package/dist/oracle/auth.js +1 -1
  282. package/dist/oracle/auth.js.map +1 -1
  283. package/dist/oracle/failures.js +1085 -145
  284. package/dist/oracle/failures.js.map +1 -1
  285. package/dist/oracle/health.js +148 -26
  286. package/dist/oracle/health.js.map +1 -1
  287. package/dist/oracle/locator.js +148 -19
  288. package/dist/oracle/locator.js.map +1 -1
  289. package/dist/oracle/record.js +3 -3
  290. package/dist/oracle/record.js.map +1 -1
  291. package/dist/orchestration/envelope.js +2 -2
  292. package/dist/orchestration/envelope.js.map +1 -1
  293. package/dist/orchestration/goal.js +7 -13
  294. package/dist/orchestration/goal.js.map +1 -1
  295. package/dist/orchestration/testThis/execute.js +167 -0
  296. package/dist/orchestration/testThis/execute.js.map +1 -0
  297. package/dist/orchestration/testThis/pipeline.js +413 -0
  298. package/dist/orchestration/testThis/pipeline.js.map +1 -0
  299. package/dist/orchestration/testThis/plan.js +519 -0
  300. package/dist/orchestration/testThis/plan.js.map +1 -0
  301. package/dist/orchestration/testThis/sessionIntent.js +72 -0
  302. package/dist/orchestration/testThis/sessionIntent.js.map +1 -0
  303. package/dist/orchestration/testThis/terminal.js +136 -0
  304. package/dist/orchestration/testThis/terminal.js.map +1 -0
  305. package/dist/orchestration/testThis/types.js +12 -0
  306. package/dist/orchestration/testThis/types.js.map +1 -0
  307. package/dist/plan/plan.js +9 -9
  308. package/dist/plan/plan.js.map +1 -1
  309. package/dist/prompts/index.js +24 -24
  310. package/dist/prompts/index.js.map +1 -1
  311. package/dist/report/coverage.js +0 -1
  312. package/dist/report/coverage.js.map +1 -1
  313. package/dist/report/evidence.js.map +1 -1
  314. package/dist/report/export.js +449 -72
  315. package/dist/report/export.js.map +1 -1
  316. package/dist/report/findingsDedupe.js +41 -0
  317. package/dist/report/findingsDedupe.js.map +1 -0
  318. package/dist/report/flake.js +13 -14
  319. package/dist/report/flake.js.map +1 -1
  320. package/dist/report/history.js +72 -38
  321. package/dist/report/history.js.map +1 -1
  322. package/dist/report/policy.js +18 -7
  323. package/dist/report/policy.js.map +1 -1
  324. package/dist/report/qaLevel.js +10 -16
  325. package/dist/report/qaLevel.js.map +1 -1
  326. package/dist/report/readiness.js +42 -12
  327. package/dist/report/readiness.js.map +1 -1
  328. package/dist/report/sarifSources.js +160 -0
  329. package/dist/report/sarifSources.js.map +1 -0
  330. package/dist/report/summary.js +2 -2
  331. package/dist/report/summary.js.map +1 -1
  332. package/dist/report/testCatalog.js +4 -4
  333. package/dist/report/testCatalog.js.map +1 -1
  334. package/dist/report/timing.js +23 -23
  335. package/dist/report/timing.js.map +1 -1
  336. package/dist/report/toolHealth.js +124 -0
  337. package/dist/report/toolHealth.js.map +1 -0
  338. package/dist/server.js +501 -69
  339. package/dist/server.js.map +1 -1
  340. package/dist/services/automationGenerate.js +8 -2
  341. package/dist/services/automationGenerate.js.map +1 -1
  342. package/dist/services/build.js +10 -4
  343. package/dist/services/build.js.map +1 -1
  344. package/dist/services/flowGenerate.js +75 -0
  345. package/dist/services/flowGenerate.js.map +1 -0
  346. package/dist/services/preflight.js +40 -8
  347. package/dist/services/preflight.js.map +1 -1
  348. package/dist/services/prepareAndroid.js +92 -18
  349. package/dist/services/prepareAndroid.js.map +1 -1
  350. package/dist/services/prepareIos.js +94 -17
  351. package/dist/services/prepareIos.js.map +1 -1
  352. package/dist/services/report.js +271 -80
  353. package/dist/services/report.js.map +1 -1
  354. package/dist/services/smoke.js +68 -22
  355. package/dist/services/smoke.js.map +1 -1
  356. package/dist/services/suiteGenerate.js +43 -6
  357. package/dist/services/suiteGenerate.js.map +1 -1
  358. package/dist/services/testSuiteKnowledge.js +78 -33
  359. package/dist/services/testSuiteKnowledge.js.map +1 -1
  360. package/dist/session/attach.js +284 -4
  361. package/dist/session/attach.js.map +1 -1
  362. package/dist/session/processRegistry.js +433 -0
  363. package/dist/session/processRegistry.js.map +1 -0
  364. package/dist/session/progress.js +1 -1
  365. package/dist/session/progress.js.map +1 -1
  366. package/dist/session/retention.js +201 -0
  367. package/dist/session/retention.js.map +1 -0
  368. package/dist/session/store.js +459 -59
  369. package/dist/session/store.js.map +1 -1
  370. package/dist/snapshot/overlays.js +60 -10
  371. package/dist/snapshot/overlays.js.map +1 -1
  372. package/dist/snapshot/parse.js +30 -12
  373. package/dist/snapshot/parse.js.map +1 -1
  374. package/dist/snapshot/present.js +36 -6
  375. package/dist/snapshot/present.js.map +1 -1
  376. package/dist/snapshot/settle.js +39 -9
  377. package/dist/snapshot/settle.js.map +1 -1
  378. package/dist/state/consent.js +99 -0
  379. package/dist/state/consent.js.map +1 -0
  380. package/dist/state/profile.js +82 -11
  381. package/dist/state/profile.js.map +1 -1
  382. package/dist/suite/compile.js +15 -6
  383. package/dist/suite/compile.js.map +1 -1
  384. package/dist/suite/lint.js +22 -4
  385. package/dist/suite/lint.js.map +1 -1
  386. package/dist/suite/pom.js +75 -44
  387. package/dist/suite/pom.js.map +1 -1
  388. package/dist/suite/secretGuard.js +266 -0
  389. package/dist/suite/secretGuard.js.map +1 -0
  390. package/dist/suite/testcase.js +15 -11
  391. package/dist/suite/testcase.js.map +1 -1
  392. package/dist/testSuite/exporter.js +7 -3
  393. package/dist/testSuite/exporter.js.map +1 -1
  394. package/dist/testSuite/generator.js +43 -14
  395. package/dist/testSuite/generator.js.map +1 -1
  396. package/dist/testSuite/history.js +1 -1
  397. package/dist/testSuite/history.js.map +1 -1
  398. package/dist/testSuite/issueLinks.js +3 -3
  399. package/dist/testSuite/issueLinks.js.map +1 -1
  400. package/dist/testSuite/lint.js +4 -4
  401. package/dist/testSuite/lint.js.map +1 -1
  402. package/dist/testSuite/merge.js +13 -7
  403. package/dist/testSuite/merge.js.map +1 -1
  404. package/dist/testSuite/schema.js +21 -16
  405. package/dist/testSuite/schema.js.map +1 -1
  406. package/dist/testSuite/store.js +12 -4
  407. package/dist/testSuite/store.js.map +1 -1
  408. package/dist/testSuite/traceability.js +2 -2
  409. package/dist/testSuite/traceability.js.map +1 -1
  410. package/dist/tools/act.js +868 -174
  411. package/dist/tools/act.js.map +1 -1
  412. package/dist/tools/agent.js +521 -112
  413. package/dist/tools/agent.js.map +1 -1
  414. package/dist/tools/appControl.js +82 -19
  415. package/dist/tools/appControl.js.map +1 -1
  416. package/dist/tools/appMap.js +393 -189
  417. package/dist/tools/appMap.js.map +1 -1
  418. package/dist/tools/build.js +92 -51
  419. package/dist/tools/build.js.map +1 -1
  420. package/dist/tools/bundletool.js +141 -40
  421. package/dist/tools/bundletool.js.map +1 -1
  422. package/dist/tools/clearOverlay.js +98 -18
  423. package/dist/tools/clearOverlay.js.map +1 -1
  424. package/dist/tools/device.js +108 -19
  425. package/dist/tools/device.js.map +1 -1
  426. package/dist/tools/doctor.js +98 -35
  427. package/dist/tools/doctor.js.map +1 -1
  428. package/dist/tools/explore.js +110 -42
  429. package/dist/tools/explore.js.map +1 -1
  430. package/dist/tools/featureTesting.js +152 -130
  431. package/dist/tools/featureTesting.js.map +1 -1
  432. package/dist/tools/firstRun.js +94 -66
  433. package/dist/tools/firstRun.js.map +1 -1
  434. package/dist/tools/flow.js +347 -132
  435. package/dist/tools/flow.js.map +1 -1
  436. package/dist/tools/flowRepair.js +42 -10
  437. package/dist/tools/flowRepair.js.map +1 -1
  438. package/dist/tools/generate.js +199 -0
  439. package/dist/tools/generate.js.map +1 -0
  440. package/dist/tools/getArtifact.js +37 -8
  441. package/dist/tools/getArtifact.js.map +1 -1
  442. package/dist/tools/health.js +17 -12
  443. package/dist/tools/health.js.map +1 -1
  444. package/dist/tools/ios.js +148 -194
  445. package/dist/tools/ios.js.map +1 -1
  446. package/dist/tools/issues.js +256 -171
  447. package/dist/tools/issues.js.map +1 -1
  448. package/dist/tools/jobs.js +55 -11
  449. package/dist/tools/jobs.js.map +1 -1
  450. package/dist/tools/metro.js +84 -38
  451. package/dist/tools/metro.js.map +1 -1
  452. package/dist/tools/mobileAudit.js +83 -26
  453. package/dist/tools/mobileAudit.js.map +1 -1
  454. package/dist/tools/network.js +36 -14
  455. package/dist/tools/network.js.map +1 -1
  456. package/dist/tools/note.js +31 -17
  457. package/dist/tools/note.js.map +1 -1
  458. package/dist/tools/prepareIosTarget.js +31 -14
  459. package/dist/tools/prepareIosTarget.js.map +1 -1
  460. package/dist/tools/prepareTarget.js +193 -47
  461. package/dist/tools/prepareTarget.js.map +1 -1
  462. package/dist/tools/report.js +16 -8
  463. package/dist/tools/report.js.map +1 -1
  464. package/dist/tools/resolveArtifact.js +12 -12
  465. package/dist/tools/resolveArtifact.js.map +1 -1
  466. package/dist/tools/resolveTarget.js +81 -18
  467. package/dist/tools/resolveTarget.js.map +1 -1
  468. package/dist/tools/screenRecord.js +85 -20
  469. package/dist/tools/screenRecord.js.map +1 -1
  470. package/dist/tools/screenshot.js +42 -18
  471. package/dist/tools/screenshot.js.map +1 -1
  472. package/dist/tools/smoke.js +29 -12
  473. package/dist/tools/smoke.js.map +1 -1
  474. package/dist/tools/snapshot.js +157 -107
  475. package/dist/tools/snapshot.js.map +1 -1
  476. package/dist/tools/startSession.js +117 -84
  477. package/dist/tools/startSession.js.map +1 -1
  478. package/dist/tools/suite.js +391 -310
  479. package/dist/tools/suite.js.map +1 -1
  480. package/dist/tools/testSuite.js +112 -36
  481. package/dist/tools/testSuite.js.map +1 -1
  482. package/dist/tools/testThis.js +35 -802
  483. package/dist/tools/testThis.js.map +1 -1
  484. package/dist/tools/visual.js +698 -116
  485. package/dist/tools/visual.js.map +1 -1
  486. package/dist/tools/wait.js +9 -23
  487. package/dist/tools/wait.js.map +1 -1
  488. package/dist/tools/wda.js +312 -54
  489. package/dist/tools/wda.js.map +1 -1
  490. package/dist/version.js +37 -64
  491. package/dist/version.js.map +1 -1
  492. package/dist/visual/ocr.js +65 -8
  493. package/dist/visual/ocr.js.map +1 -1
  494. package/dist/visual/provider.js +87 -15
  495. package/dist/visual/provider.js.map +1 -1
  496. package/docs/README.md +24 -10
  497. package/docs/ci-reports.md +328 -0
  498. package/docs/concepts.md +227 -0
  499. package/docs/flows.md +153 -0
  500. package/docs/mcp-server.md +210 -104
  501. package/docs/physical-devices.md +84 -0
  502. package/docs/tools.md +808 -217
  503. package/package.json +16 -6
  504. package/dist/appMap/diff.js +0 -60
  505. package/dist/appMap/diff.js.map +0 -1
  506. package/dist/automation/maestroIr.js +0 -282
  507. package/dist/automation/maestroIr.js.map +0 -1
  508. package/dist/interop/maestro.js +0 -151
  509. package/dist/interop/maestro.js.map +0 -1
  510. package/dist/tools/assertVisual.js +0 -74
  511. package/dist/tools/assertVisual.js.map +0 -1
  512. package/dist/tools/automationGenerate.js +0 -394
  513. package/dist/tools/automationGenerate.js.map +0 -1
  514. package/dist/tools/capabilities.js +0 -209
  515. package/dist/tools/capabilities.js.map +0 -1
  516. package/dist/tools/detectContext.js +0 -41
  517. package/dist/tools/detectContext.js.map +0 -1
  518. package/dist/tools/flowGenerate.js +0 -55
  519. package/dist/tools/flowGenerate.js.map +0 -1
  520. package/dist/tools/history.js +0 -56
  521. package/dist/tools/history.js.map +0 -1
  522. package/dist/tools/idling.js +0 -104
  523. package/dist/tools/idling.js.map +0 -1
  524. package/dist/tools/inputCapabilities.js +0 -30
  525. package/dist/tools/inputCapabilities.js.map +0 -1
  526. package/dist/tools/locator.js +0 -57
  527. package/dist/tools/locator.js.map +0 -1
  528. package/dist/tools/maestro.js +0 -78
  529. package/dist/tools/maestro.js.map +0 -1
  530. package/dist/tools/permissions.js +0 -149
  531. package/dist/tools/permissions.js.map +0 -1
  532. package/dist/tools/plan.js +0 -49
  533. package/dist/tools/plan.js.map +0 -1
  534. package/dist/tools/screenInfo.js +0 -70
  535. package/dist/tools/screenInfo.js.map +0 -1
  536. package/dist/tools/seed.js +0 -101
  537. package/dist/tools/seed.js.map +0 -1
  538. package/dist/tools/state.js +0 -170
  539. package/dist/tools/state.js.map +0 -1
  540. package/dist/tools/visualText.js +0 -61
  541. package/dist/tools/visualText.js.map +0 -1
@@ -1,20 +1,23 @@
1
- // SWIPIUM Issue Log MCP tools (SWIPIUM-REQ-07). Expose the durable project issue ledger:
2
- // qa_issue_log — list current issues + counts + recurrence candidates
3
- // qa_issue_history — the append-only event trail for one issue
4
- // qa_issue_mark_fixed — record a fix (date, commit, version, how-fixed) for regression detection
5
- // qa_issue_triage — change category / severity / owner / note
6
- // qa_issue_suppress — suppress known noise (stays visible under known-noise, never hidden)
1
+ // SWIPIUM Issue Log MCP tools. qa_issue_log is still the only exposed issue
2
+ // tool, but it now carries the full ledger lifecycle via `mode`:
3
+ // history (default): list current issues + counts + recurrence candidates (original behavior)
4
+ // log: record a new observation (re-observing a fixed fingerprint reopens it)
5
+ // mark_fixed: transition an issue to fixed (commit/version/how-fixed provenance)
6
+ // verify_fixed: confirm a fixed issue held, with current-run evidence
7
+ // suppress: hide expected noise from default history (stays under known-noise);
8
+ // `suppressedUntil` expires it automatically, `unsuppress:true` lifts it early
9
+ // metrics: opened/fixed/reopened/verified counts + trends from the event log
7
10
  //
8
11
  // Thin wrappers over src/issues/*; heavy logic lives there. Large lists are returned inline but
9
12
  // compact (issue ids + summaries), with a resource URI for the full index.
10
13
  import { z } from 'zod';
11
- import { qaOk, qaError } from '../lib/result.js';
12
- import { resolveProjectRoot } from '../context/projectRoot.js';
13
- import { markFixed, queryIssues, suppressIssue, triageIssue, verifyFixed, } from '../issues/index.js';
14
+ import { qaOk, qaError, unknownSessionError } from '../lib/result.js';
15
+ import { resolveProjectRoot, unresolvedProjectRootError } from '../context/projectRoot.js';
16
+ import { makeRedactor } from '../lib/redact.js';
17
+ import { markFixed, markSuppressed, markUnsuppressed, queryIssues, recordObservation, verifyFixed, } from '../issues/index.js';
18
+ import { fingerprintTokens, hasIdentitySignal } from '../issues/fingerprint.js';
14
19
  import { computeIssueMetrics } from '../issues/metrics.js';
15
- import { issuesResourceUri, readEvents } from '../issues/store.js';
16
- import { resolveSourceRevision } from '../issues/sourceRevision.js';
17
- import { loadPolicy } from '../issues/store.js';
20
+ import { readEvents } from '../issues/store.js';
18
21
  import { ALL_ISSUE_CATEGORIES, ALL_ISSUE_SEVERITIES, ALL_ISSUE_STATES, } from '../issues/schema.js';
19
22
  function nowIso() {
20
23
  return new Date().toISOString();
@@ -23,46 +26,255 @@ async function rootFor(server, sessions, args) {
23
26
  if (args.sessionId) {
24
27
  const s = sessions.get(args.sessionId);
25
28
  if (!s)
26
- return { hint: `Unknown sessionId ${args.sessionId}` };
27
- return { root: s.root };
29
+ return { error: unknownSessionError(args.sessionId) };
30
+ return { root: s.root, appId: s.appId };
28
31
  }
29
32
  const resolved = await resolveProjectRoot(server, args.projectRoot);
30
33
  if (!resolved.root)
31
34
  return { hint: resolved.hint };
32
35
  return { root: resolved.root };
33
36
  }
34
- const KEY_SCHEMA = {
35
- issueId: z.string().optional().describe('Issue id (iss_…). Provide this OR fingerprint.'),
36
- fingerprint: z.string().optional().describe('Issue fingerprint (sha256:…). Provide this OR issueId.'),
37
- };
37
+ /** Compact lifecycle view of one record for write-mode responses (undefined fields drop out). */
38
+ function lifecycleRecord(r) {
39
+ return {
40
+ issueId: r.issueId,
41
+ fingerprint: r.fingerprint,
42
+ state: r.state,
43
+ category: r.category,
44
+ severity: r.severity,
45
+ summary: r.summary,
46
+ observationCount: r.observationCount,
47
+ lastSeenAt: r.lastSeenAt,
48
+ fixedAt: r.fixedAt,
49
+ fixedInCommit: r.fixedInCommit,
50
+ fixedInVersion: r.fixedInVersion,
51
+ howFixed: r.howFixed,
52
+ reopenedAt: r.reopenedAt,
53
+ recurrence: r.lastRecurrenceMessage,
54
+ suppressionReason: r.suppressionReason,
55
+ suppressedUntil: r.suppressedUntil,
56
+ stateBeforeSuppression: r.stateBeforeSuppression,
57
+ lastVerifiedFixedAt: r.lastVerifiedFixedAt,
58
+ };
59
+ }
60
+ /** Free-text qa_issue_log fields persisted to .swipium/issues-log.jsonl. */
61
+ const FREE_TEXT_FIELDS = ['title', 'summary', 'howFixed', 'suppressionReason', 'fixedBy'];
62
+ function sessionSecrets(sessions, sessionId) {
63
+ return (sessionId ? sessions.get(sessionId)?.secrets : undefined) ?? [];
64
+ }
65
+ /** Redact registered session secrets from the agent-supplied free-text fields (exported for tests). */
66
+ export function redactIssueArgs(args, secrets) {
67
+ const redact = makeRedactor(secrets);
68
+ const out = { ...args };
69
+ for (const k of FREE_TEXT_FIELDS) {
70
+ const v = out[k];
71
+ if (typeof v === 'string')
72
+ out[k] = redact(v) ?? v;
73
+ }
74
+ return out;
75
+ }
38
76
  export function registerIssues(server, sessions) {
39
77
  // --- qa_issue_log ------------------------------------------------------------------------
40
78
  server.registerTool('qa_issue_log', {
41
- title: 'List project issues',
42
- description: 'List the durable project issue ledger (`.swipium/issues-log.jsonl`). Returns current issue records, counts by state/category/severity, and recurrence candidates (previously-fixed issues seen again). Filter by state, category, severity, platform, or since (ISO date). Suppressed issues are hidden unless includeSuppressed=true (they stay visible under known-noise in reports either way).',
79
+ title: 'Project issue ledger (list + lifecycle)',
80
+ description: 'Durable project issue ledger (.swipium/issues-log.jsonl). mode: history (default; list + counts + recurrence, filterable), ' +
81
+ 'log (record an observation; identity = normalized title + category + platform; re-observing a fixed issue reopens it), ' +
82
+ 'mark_fixed (active issues only), verify_fixed (needs current-run evidence), suppress (suppressedUntil auto-expires; ' +
83
+ 'unsuppress:true lifts it), metrics (trends from the event log). Transitions take issueId (or fingerprint).',
43
84
  inputSchema: {
44
85
  projectRoot: z.string().optional(),
45
86
  sessionId: z.string().optional(),
46
- state: z.enum(ALL_ISSUE_STATES).optional(),
47
- category: z.enum(ALL_ISSUE_CATEGORIES).optional(),
48
- severity: z.enum(ALL_ISSUE_SEVERITIES).optional(),
49
- platform: z.enum(['ios', 'android', 'web', 'unknown']).optional(),
50
- since: z.string().optional().describe('ISO timestamp; only issues last seen on/after this.'),
51
- includeSuppressed: z.boolean().optional(),
87
+ mode: z.enum(['history', 'log', 'mark_fixed', 'verify_fixed', 'suppress', 'metrics']).optional(),
88
+ state: z
89
+ .enum(ALL_ISSUE_STATES)
90
+ .optional()
91
+ .describe('history filter.'),
92
+ category: z
93
+ .enum(ALL_ISSUE_CATEGORIES)
94
+ .optional()
95
+ .describe('history filter; log: category hint.'),
96
+ severity: z
97
+ .enum(ALL_ISSUE_SEVERITIES)
98
+ .optional()
99
+ .describe('history filter; log: severity hint.'),
100
+ platform: z.enum(['ios', 'android', 'web', 'unknown']).optional().describe('history filter; log: platform observed on.'),
101
+ since: z.string().optional().describe('history/metrics: ISO start.'),
102
+ includeSuppressed: z.boolean().optional().describe('history/metrics: include suppressed issues.'),
103
+ issueId: z.string().optional().describe('Transition key (from history).'),
104
+ fingerprint: z.string().optional().describe('Alternative transition key.'),
105
+ title: z.string().optional().describe('log (required): what was observed, descriptive.'),
106
+ summary: z.string().optional().describe('log: one-line summary.'),
107
+ failureCode: z.string().optional().describe('log: typed code (e.g. REDBOX, ANR); sharpens the fingerprint.'),
108
+ evidenceUris: z.array(z.string()).optional().describe('log/verify_fixed: swipium:// evidence URIs.'),
109
+ fixedInCommit: z.string().optional().describe('mark_fixed'),
110
+ fixedInVersion: z.string().optional().describe('mark_fixed'),
111
+ howFixed: z.string().optional().describe('mark_fixed (quoted on recurrence)'),
112
+ fixedBy: z.string().optional().describe('mark_fixed'),
113
+ reportUri: z.string().optional().describe('verify_fixed evidence'),
114
+ testCaseId: z.string().optional().describe('verify_fixed evidence'),
115
+ auditCheckId: z.string().optional().describe('verify_fixed evidence'),
116
+ suppressionReason: z.string().optional().describe('suppress'),
117
+ suppressedUntil: z.string().optional().describe('suppress: ISO expiry (then the issue returns to its prior state).'),
118
+ unsuppress: z.boolean().optional().describe('suppress: lift an existing suppression now.'),
119
+ suppressionScope: z.enum(['fingerprint', 'platform', 'environment', 'appVersion']).optional().describe('suppress'),
120
+ until: z.string().optional().describe('metrics: ISO end; suppress: alias of suppressedUntil.'),
121
+ groupBy: z
122
+ .enum(['day', 'week', 'version', 'commit', 'category', 'owner', 'screen', 'feature'])
123
+ .optional()
124
+ .describe('metrics bucketing (default week).'),
52
125
  },
53
- }, async ({ projectRoot, sessionId, state, category, severity, platform, since, includeSuppressed }) => {
54
- const { root, hint } = await rootFor(server, sessions, { projectRoot, sessionId });
126
+ }, async (rawArgs) => {
127
+ // The ledger is a committed repo file: scrub every registered session secret (typed
128
+ // passwords, OTPs, secret flow variables) out of agent-supplied free text before it lands.
129
+ const args = redactIssueArgs(rawArgs, sessionSecrets(sessions, rawArgs.sessionId));
130
+ const { root, hint, appId, error } = await rootFor(server, sessions, { projectRoot: args.projectRoot, sessionId: args.sessionId });
55
131
  if (!root)
56
- return qaError({ what: 'Could not resolve a project root', changedState: false, retrySafe: true, nextSteps: ['Pass projectRoot or sessionId.'], clientHint: hint });
132
+ return error ?? unresolvedProjectRootError({ source: 'none', hint });
133
+ const mode = args.mode ?? 'history';
134
+ const now = nowIso();
135
+ // --- log: record a new observation (may reopen a previously fixed issue) ---------------
136
+ if (mode === 'log') {
137
+ if (!args.title && !args.summary)
138
+ return qaError({
139
+ what: 'mode "log" needs a title (and ideally a summary) describing what was observed',
140
+ changedState: false,
141
+ retrySafe: true,
142
+ nextSteps: ['Pass title and summary; optionally category, severity, platform, failureCode, evidenceUris.'],
143
+ });
144
+ const title = (args.title ?? args.summary).trim();
145
+ // Identity: the normalized title rides the fingerprint's `text:` token (the same token the
146
+ // report bridge uses for visible text), plus category/platform/app scope, so two different
147
+ // defects logged on one platform are two issues, and re-logging the same title matches.
148
+ const observation = {
149
+ title,
150
+ summary: args.summary ?? title,
151
+ failureCode: args.failureCode,
152
+ visibleText: title.replace(/[\s.!?…:;,]+$/u, ''),
153
+ };
154
+ // The `app:` token is NEVER part of a manual entry's identity: the ledger is already
155
+ // project-scoped, and appId is only known when a sessionId was passed. Including it made
156
+ // the same title logged via sessionId vs via projectRoot two different issues. appId is
157
+ // still stored on the event as metadata. (Pre-1.6 manual issues keep their old
158
+ // platform-only fingerprint; they are never auto-merged; close them via mark_fixed/suppress.)
159
+ const meta = {
160
+ appId,
161
+ fingerprintWithoutAppId: true,
162
+ fingerprintCategory: args.category,
163
+ platform: args.platform,
164
+ links: args.evidenceUris?.length ? { evidenceRefs: args.evidenceUris.map((uri) => ({ kind: 'evidence', uri })) } : undefined,
165
+ };
166
+ if (!hasIdentitySignal(fingerprintTokens({
167
+ ...meta,
168
+ appId: undefined,
169
+ category: meta.fingerprintCategory,
170
+ failureCode: args.failureCode,
171
+ observation,
172
+ })))
173
+ return qaError({
174
+ failureCode: 'ISSUE_LOG_TOO_VAGUE',
175
+ what: `The title "${title}" has no identifying words once ids/numbers are scrubbed, so it would merge with unrelated issues`,
176
+ changedState: false,
177
+ retrySafe: true,
178
+ nextSteps: ['Use a descriptive title (what broke, where), or pass failureCode.'],
179
+ });
180
+ const res = recordObservation(root, observation, now, { categoryHint: args.category, severityHint: args.severity }, meta);
181
+ return qaOk({
182
+ mode,
183
+ issue: lifecycleRecord(res.record),
184
+ issueId: res.issueId,
185
+ fingerprint: res.fingerprint,
186
+ isNew: res.isNew,
187
+ reopened: res.reopened,
188
+ recurrenceMessage: res.recurrenceMessage,
189
+ }, res.reopened
190
+ ? `Reopened ${res.issueId}: ${res.recurrenceMessage}`
191
+ : `${res.isNew ? 'Logged new' : 'Updated'} issue ${res.issueId} (${res.record.state}, ${res.record.category}/${res.record.severity})`);
192
+ }
193
+ // --- metrics: trends computed from the full event log -----------------------------------
194
+ if (mode === 'metrics') {
195
+ const m = computeIssueMetrics(readEvents(root), {
196
+ since: args.since,
197
+ until: args.until,
198
+ groupBy: args.groupBy,
199
+ includeSuppressed: args.includeSuppressed,
200
+ });
201
+ return qaOk({
202
+ mode,
203
+ metrics: {
204
+ ...m,
205
+ topRecurringIssues: m.topRecurringIssues.map(lifecycleRecord),
206
+ topAgingIssues: m.topAgingIssues.map(lifecycleRecord),
207
+ },
208
+ }, `Issue metrics: opened=${m.opened} fixed=${m.fixed} reopened=${m.reopened} verifiedFixed=${m.verifiedFixed} suppressed=${m.suppressed} reopenRate=${m.reopenRatePct}% fixVerification=${m.fixVerificationRatePct}%`);
209
+ }
210
+ // --- mark_fixed / verify_fixed / suppress: lifecycle transitions on an existing issue ---
211
+ if (mode === 'mark_fixed' || mode === 'verify_fixed' || mode === 'suppress') {
212
+ const key = { issueId: args.issueId, fingerprint: args.fingerprint };
213
+ if (!key.issueId && !key.fingerprint)
214
+ return qaError({
215
+ what: `mode "${mode}" needs the issue key`,
216
+ changedState: false,
217
+ retrySafe: true,
218
+ nextSteps: ['Pass issueId (or fingerprint) from mode "history".'],
219
+ });
220
+ const suppressedUntil = args.suppressedUntil ?? args.until;
221
+ if (mode === 'suppress' && !args.unsuppress && suppressedUntil !== undefined && !Number.isFinite(Date.parse(suppressedUntil)))
222
+ return qaError({
223
+ failureCode: 'INVALID_ARGUMENT',
224
+ what: `suppressedUntil "${suppressedUntil}" is not an ISO timestamp`,
225
+ changedState: false,
226
+ retrySafe: true,
227
+ nextSteps: ['Pass an ISO timestamp such as 2026-12-31T00:00:00Z, or omit it for an open-ended suppression.'],
228
+ });
229
+ const res = mode === 'suppress' && args.unsuppress
230
+ ? markUnsuppressed(root, key, now)
231
+ : mode === 'mark_fixed'
232
+ ? markFixed(root, key, {
233
+ fixedInCommit: args.fixedInCommit,
234
+ fixedInVersion: args.fixedInVersion,
235
+ howFixed: args.howFixed,
236
+ fixedBy: args.fixedBy,
237
+ }, now)
238
+ : mode === 'verify_fixed'
239
+ ? verifyFixed(root, key, {
240
+ reportUri: args.reportUri,
241
+ testCaseId: args.testCaseId,
242
+ auditCheckId: args.auditCheckId,
243
+ evidenceUris: args.evidenceUris,
244
+ }, now)
245
+ : markSuppressed(root, key, {
246
+ suppressionReason: args.suppressionReason,
247
+ suppressedUntil,
248
+ suppressionScope: args.suppressionScope,
249
+ }, now);
250
+ if (!res.ok || !res.record)
251
+ return qaError({
252
+ failureCode: res.code,
253
+ what: res.reason ?? `Could not apply ${mode}`,
254
+ changedState: false,
255
+ retrySafe: true,
256
+ nextSteps: ['Check the issue key with mode "history" (includeSuppressed=true shows suppressed issues).'],
257
+ });
258
+ const r = res.record;
259
+ const summary = mode === 'mark_fixed'
260
+ ? `Marked ${r.issueId} fixed${r.fixedInCommit ? ` in ${r.fixedInCommit}` : ''}`
261
+ : mode === 'verify_fixed'
262
+ ? `Verified fix for ${r.issueId} with current-run evidence`
263
+ : args.unsuppress
264
+ ? `Unsuppressed ${r.issueId} (now ${r.state})`
265
+ : `Suppressed ${r.issueId}${r.suppressionReason ? ` (${r.suppressionReason})` : ''} (hidden from default history${r.suppressedUntil ? ` until ${r.suppressedUntil}` : ''}; still visible under known-noise)`;
266
+ return qaOk({ mode, issue: lifecycleRecord(r) }, summary);
267
+ }
268
+ // --- history (default): the original query/list behavior --------------------------------
57
269
  const query = {
58
- state: state,
59
- category: category,
60
- severity: severity,
61
- platform: platform,
62
- since,
63
- includeSuppressed,
270
+ state: args.state,
271
+ category: args.category,
272
+ severity: args.severity,
273
+ platform: args.platform,
274
+ since: args.since,
275
+ includeSuppressed: args.includeSuppressed,
64
276
  };
65
- const res = queryIssues(root, nowIso(), query);
277
+ const res = queryIssues(root, now, query);
66
278
  const compact = res.records.map((r) => ({
67
279
  issueId: r.issueId,
68
280
  state: r.state,
@@ -72,147 +284,20 @@ export function registerIssues(server, sessions) {
72
284
  lastSeenAt: r.lastSeenAt,
73
285
  observationCount: r.observationCount,
74
286
  recurrence: r.lastRecurrenceMessage,
75
- // REQ-08: linked app-map screens/features, test cases, and fix-verification status.
287
+ // Linked app-map screens/features, test cases, and fix-verification status.
76
288
  linkedScreens: r.appMapRefs?.map((a) => a.screenId).filter(Boolean) ?? [],
77
289
  linkedFeatures: r.appMapRefs?.map((a) => a.featureId).filter(Boolean) ?? [],
78
290
  linkedTestCases: r.testRefs?.map((t) => t.testCaseId) ?? [],
79
291
  verifiedFixedAt: r.lastVerifiedFixedAt,
80
292
  verificationStatus: r.state === 'fixed' ? (r.lastVerifiedFixedAt ? 'verified_this_history' : 'unverified') : undefined,
81
293
  }));
82
- return qaOk({ issues: compact, counts: res.counts, recurrenceCandidates: res.recurrenceCandidates.map((r) => r.issueId), resourceUri: issuesResourceUri(root) }, `${res.counts.total} issue(s) — ${Object.entries(res.counts.byState).map(([k, v]) => `${k}=${v}`).join(' ')}${res.recurrenceCandidates.length ? ` | ${res.recurrenceCandidates.length} recurrence candidate(s)` : ''}`);
83
- });
84
- // --- qa_issue_history --------------------------------------------------------------------
85
- server.registerTool('qa_issue_history', {
86
- title: 'Issue event history',
87
- description: 'Return the append-only event trail (observed / classified / triaged / fixed / reopened / suppressed) for one issue, so you can audit why it is currently open, fixed, reopened, or suppressed.',
88
- inputSchema: { projectRoot: z.string().optional(), sessionId: z.string().optional(), ...KEY_SCHEMA },
89
- }, async ({ projectRoot, sessionId, issueId, fingerprint }) => {
90
- const { root, hint } = await rootFor(server, sessions, { projectRoot, sessionId });
91
- if (!root)
92
- return qaError({ what: 'Could not resolve a project root', changedState: false, retrySafe: true, nextSteps: ['Pass projectRoot or sessionId.'], clientHint: hint });
93
- if (!issueId && !fingerprint)
94
- return qaError({ what: 'Provide issueId or fingerprint', changedState: false, retrySafe: true, nextSteps: ['Re-call with issueId or fingerprint (from qa_issue_log).'] });
95
- const events = readEvents(root).filter((e) => (issueId && e.issueId === issueId) || (fingerprint && e.fingerprint === fingerprint));
96
- if (events.length === 0)
97
- return qaError({ what: `No events for ${issueId ?? fingerprint}`, changedState: false, retrySafe: true, nextSteps: ['Check the id via qa_issue_log.'] });
98
- return qaOk({ issueId: events[0].issueId, fingerprint: events[0].fingerprint, events }, `${events.length} event(s) for ${events[0].issueId}`);
99
- });
100
- // --- qa_issue_mark_fixed -----------------------------------------------------------------
101
- server.registerTool('qa_issue_mark_fixed', {
102
- title: 'Mark an issue fixed',
103
- description: 'Record that a developer fixed an issue: appends a `fixed` event with date, commit, version, how-fixed note, and fixedBy, then updates the derived index to state=fixed. Previous observations are NEVER deleted. If the same fingerprint is observed again later, the issue is reopened with a recurrence message that cites this fix metadata.',
104
- inputSchema: {
105
- projectRoot: z.string().optional(),
106
- sessionId: z.string().optional(),
107
- ...KEY_SCHEMA,
108
- fixedInCommit: z.string().optional().describe('Commit sha the fix landed in. Defaults from sourceRevision/CI env when omitted.'),
109
- fixedInVersion: z.string().optional(),
110
- howFixed: z.string().optional().describe('Plain-language note: what changed.'),
111
- fixedBy: z.string().optional(),
112
- },
113
- }, async ({ projectRoot, sessionId, issueId, fingerprint, fixedInCommit, fixedInVersion, howFixed, fixedBy }) => {
114
- const { root, hint } = await rootFor(server, sessions, { projectRoot, sessionId });
115
- if (!root)
116
- return qaError({ what: 'Could not resolve a project root', changedState: false, retrySafe: true, nextSteps: ['Pass projectRoot or sessionId.'], clientHint: hint });
117
- if (!issueId && !fingerprint)
118
- return qaError({ what: 'Provide issueId or fingerprint', changedState: false, retrySafe: true, nextSteps: ['Re-call with issueId or fingerprint.'] });
119
- const policy = loadPolicy(root);
120
- const sourceRevision = resolveSourceRevision({ env: process.env, allowGitMetadataRead: policy.allowGitMetadataRead, root, explicit: fixedInCommit ? { provider: 'explicit', commit: fixedInCommit } : undefined });
121
- const res = markFixed(root, { issueId, fingerprint }, { fixedInCommit, fixedInVersion, howFixed, fixedBy, sourceRevision }, nowIso());
122
- if (!res.ok)
123
- return qaError({ what: res.reason ?? 'mark-fixed failed', changedState: false, retrySafe: true, nextSteps: ['Confirm the issueId/fingerprint via qa_issue_log.'] });
124
- return qaOk({ record: res.record, resourceUri: issuesResourceUri(root) }, `marked ${res.record.issueId} fixed${res.record.fixedInCommit ? ` in ${res.record.fixedInCommit}` : ''}`);
125
- });
126
- // --- qa_issue_triage ---------------------------------------------------------------------
127
- server.registerTool('qa_issue_triage', {
128
- title: 'Triage an issue',
129
- description: 'Change an issue\'s category, severity, owner, or add a note. Appends a `triaged` event (append-only audit trail).',
130
- inputSchema: {
131
- projectRoot: z.string().optional(),
132
- sessionId: z.string().optional(),
133
- ...KEY_SCHEMA,
134
- category: z.enum(ALL_ISSUE_CATEGORIES).optional(),
135
- severity: z.enum(ALL_ISSUE_SEVERITIES).optional(),
136
- owner: z.enum(['app', 'backend', 'test_env', 'mcp', 'unknown']).optional(),
137
- note: z.string().optional(),
138
- },
139
- }, async ({ projectRoot, sessionId, issueId, fingerprint, category, severity, owner, note }) => {
140
- const { root, hint } = await rootFor(server, sessions, { projectRoot, sessionId });
141
- if (!root)
142
- return qaError({ what: 'Could not resolve a project root', changedState: false, retrySafe: true, nextSteps: ['Pass projectRoot or sessionId.'], clientHint: hint });
143
- if (!issueId && !fingerprint)
144
- return qaError({ what: 'Provide issueId or fingerprint', changedState: false, retrySafe: true, nextSteps: ['Re-call with issueId or fingerprint.'] });
145
- const res = triageIssue(root, { issueId, fingerprint }, { category: category, severity: severity, owner: owner, note }, nowIso());
146
- if (!res.ok)
147
- return qaError({ what: res.reason ?? 'triage failed', changedState: false, retrySafe: true, nextSteps: ['Confirm the issueId/fingerprint via qa_issue_log.'] });
148
- return qaOk({ record: res.record }, `triaged ${res.record.issueId} → ${res.record.category}/${res.record.severity}`);
149
- });
150
- // --- qa_issue_suppress -------------------------------------------------------------------
151
- server.registerTool('qa_issue_suppress', {
152
- title: 'Suppress known noise',
153
- description: 'Suppress a known-noise issue with a reason and optional expiration. Suppressed issues are moved OUT of blockers but REMAIN VISIBLE in reports under known-noise — they are never silently hidden.',
154
- inputSchema: {
155
- projectRoot: z.string().optional(),
156
- sessionId: z.string().optional(),
157
- ...KEY_SCHEMA,
158
- reason: z.string().describe('Why this is known noise.'),
159
- until: z.string().optional().describe('ISO timestamp the suppression expires.'),
160
- scope: z.enum(['fingerprint', 'platform', 'environment', 'appVersion']).optional(),
161
- },
162
- }, async ({ projectRoot, sessionId, issueId, fingerprint, reason, until, scope }) => {
163
- const { root, hint } = await rootFor(server, sessions, { projectRoot, sessionId });
164
- if (!root)
165
- return qaError({ what: 'Could not resolve a project root', changedState: false, retrySafe: true, nextSteps: ['Pass projectRoot or sessionId.'], clientHint: hint });
166
- if (!issueId && !fingerprint)
167
- return qaError({ what: 'Provide issueId or fingerprint', changedState: false, retrySafe: true, nextSteps: ['Re-call with issueId or fingerprint.'] });
168
- const res = suppressIssue(root, { issueId, fingerprint }, { reason, until, scope: scope }, nowIso());
169
- if (!res.ok)
170
- return qaError({ what: res.reason ?? 'suppress failed', changedState: false, retrySafe: true, nextSteps: ['Confirm the issueId/fingerprint via qa_issue_log.'] });
171
- return qaOk({ record: res.record }, `suppressed ${res.record.issueId} (${reason}) — still visible under known-noise`);
172
- });
173
- // --- qa_issue_verify_fixed ---------------------------------------------------------------
174
- server.registerTool('qa_issue_verify_fixed', {
175
- title: 'Verify a fixed issue with evidence',
176
- description: 'Link a passing test/audit result to a FIXED issue and record `verified_fixed` evidence. Requires the issue to be in state "fixed" AND current-run evidence (a reportUri, testCaseId, auditCheckId, or evidenceUris) — a fix cannot be claimed verified without proof. After this, reports may list the issue under "fixed issues verified this run". A reappearance still reopens it with recurrence text.',
177
- inputSchema: {
178
- projectRoot: z.string().optional(),
179
- sessionId: z.string().optional(),
180
- ...KEY_SCHEMA,
181
- testCaseId: z.string().optional(),
182
- auditCheckId: z.string().optional(),
183
- reportUri: z.string().optional(),
184
- evidenceUris: z.array(z.string()).optional(),
185
- note: z.string().optional(),
186
- },
187
- }, async ({ projectRoot, sessionId, issueId, fingerprint, testCaseId, auditCheckId, reportUri, evidenceUris, note }) => {
188
- const { root, hint } = await rootFor(server, sessions, { projectRoot, sessionId });
189
- if (!root)
190
- return qaError({ what: 'Could not resolve a project root', changedState: false, retrySafe: true, nextSteps: ['Pass projectRoot or sessionId.'], clientHint: hint });
191
- if (!issueId && !fingerprint)
192
- return qaError({ what: 'Provide issueId or fingerprint', changedState: false, retrySafe: true, nextSteps: ['Re-call with issueId or fingerprint.'] });
193
- const res = verifyFixed(root, { issueId, fingerprint }, { testCaseId, auditCheckId, reportUri, evidenceUris, note }, nowIso());
194
- if (!res.ok)
195
- return qaError({ what: res.reason ?? 'verify-fixed failed', changedState: false, retrySafe: true, nextSteps: ['Mark the issue fixed first (qa_issue_mark_fixed), and provide current-run evidence.'] });
196
- return qaOk({ record: res.record }, `verified ${res.record.issueId} fixed with current-run evidence`);
197
- });
198
- // --- qa_issue_metrics --------------------------------------------------------------------
199
- server.registerTool('qa_issue_metrics', {
200
- title: 'Issue quality metrics',
201
- description: 'Project-level issue quality metrics derived from the append-only event log: opened/fixed/reopened/verified-fixed counts, issue aging (avg + p95), reopen rate (fixed issues that later reopened), fix-verification rate (fixed issues with verified_fixed evidence), open blocker/high counts, top recurring + aging issues, and a time/version/category series. Answers "is the product improving?".',
202
- inputSchema: {
203
- projectRoot: z.string().optional(),
204
- sessionId: z.string().optional(),
205
- since: z.string().optional().describe('ISO start of the window.'),
206
- until: z.string().optional().describe('ISO end of the window (defaults to the latest event).'),
207
- groupBy: z.enum(['day', 'week', 'version', 'commit', 'category', 'owner', 'screen', 'feature']).optional().describe('Series bucket (default week).'),
208
- includeSuppressed: z.boolean().optional(),
209
- },
210
- }, async ({ projectRoot, sessionId, since, until, groupBy, includeSuppressed }) => {
211
- const { root, hint } = await rootFor(server, sessions, { projectRoot, sessionId });
212
- if (!root)
213
- return qaError({ what: 'Could not resolve a project root', changedState: false, retrySafe: true, nextSteps: ['Pass projectRoot or sessionId.'], clientHint: hint });
214
- const metrics = computeIssueMetrics(readEvents(root), { since, until, groupBy: groupBy, includeSuppressed });
215
- return qaOk({ metrics, resourceUri: issuesResourceUri(root) }, `issue metrics: opened=${metrics.opened} fixed=${metrics.fixed} reopened=${metrics.reopened} verifiedFixed=${metrics.verifiedFixed} | reopenRate=${metrics.reopenRatePct}% fixVerify=${metrics.fixVerificationRatePct}% | openBlocker=${metrics.blockerOpenCount} openHigh=${metrics.highOpenCount}`);
294
+ return qaOk({
295
+ issues: compact,
296
+ counts: res.counts,
297
+ recurrenceCandidates: res.recurrenceCandidates.map((r) => r.issueId),
298
+ }, `${res.counts.total} issue(s): ${Object.entries(res.counts.byState)
299
+ .map(([k, v]) => `${k}=${v}`)
300
+ .join(' ')}${res.recurrenceCandidates.length ? ` | ${res.recurrenceCandidates.length} recurrence candidate(s)` : ''}`);
216
301
  });
217
302
  }
218
303
  //# sourceMappingURL=issues.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"issues.js","sourceRoot":"","sources":["../../src/tools/issues.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"issues.js","sourceRoot":"","sources":["../../src/tools/issues.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,iEAAiE;AACjE,gGAAgG;AAChG,8FAA8F;AAC9F,0FAA0F;AAC1F,6EAA6E;AAC7E,2FAA2F;AAC3F,qGAAqG;AACrG,yFAAyF;AACzF,EAAE;AACF,gGAAgG;AAChG,2EAA2E;AAE3E,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AAE3F,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EACL,SAAS,EACT,cAAc,EACd,gBAAgB,EAChB,WAAW,EACX,iBAAiB,EACjB,WAAW,GAEZ,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAChF,OAAO,EAAE,mBAAmB,EAAuB,MAAM,sBAAsB,CAAC;AAChF,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,gBAAgB,GAMjB,MAAM,qBAAqB,CAAC;AAE7B,SAAS,MAAM;IACb,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AAClC,CAAC;AAED,KAAK,UAAU,OAAO,CACpB,MAAiB,EACjB,QAAsB,EACtB,IAAkD;IAElD,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QACnB,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACvC,IAAI,CAAC,CAAC;YAAE,OAAO,EAAE,KAAK,EAAE,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9D,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;IAC1C,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IACpE,IAAI,CAAC,QAAQ,CAAC,IAAI;QAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC;IACnD,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC;AACjC,CAAC;AAED,iGAAiG;AACjG,SAAS,eAAe,CAAC,CAAc;IACrC,OAAO;QACL,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,WAAW,EAAE,CAAC,CAAC,WAAW;QAC1B,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpB,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpB,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,gBAAgB,EAAE,CAAC,CAAC,gBAAgB;QACpC,UAAU,EAAE,CAAC,CAAC,UAAU;QACxB,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,aAAa,EAAE,CAAC,CAAC,aAAa;QAC9B,cAAc,EAAE,CAAC,CAAC,cAAc;QAChC,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpB,UAAU,EAAE,CAAC,CAAC,UAAU;QACxB,UAAU,EAAE,CAAC,CAAC,qBAAqB;QACnC,iBAAiB,EAAE,CAAC,CAAC,iBAAiB;QACtC,eAAe,EAAE,CAAC,CAAC,eAAe;QAClC,sBAAsB,EAAE,CAAC,CAAC,sBAAsB;QAChD,mBAAmB,EAAE,CAAC,CAAC,mBAAmB;KAC3C,CAAC;AACJ,CAAC;AAED,4EAA4E;AAC5E,MAAM,gBAAgB,GAAG,CAAC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,mBAAmB,EAAE,SAAS,CAAU,CAAC;AAEnG,SAAS,cAAc,CAAC,QAAsB,EAAE,SAAkB;IAChE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;AAC1E,CAAC;AAED,uGAAuG;AACvG,MAAM,UAAU,eAAe,CAC7B,IAAO,EACP,OAAyB;IAEzB,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACrC,MAAM,GAAG,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC;IACxB,KAAK,MAAM,CAAC,IAAI,gBAAgB,EAAE,CAAC;QACjC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QACjB,IAAI,OAAO,CAAC,KAAK,QAAQ;YAAG,GAA+B,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAClF,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAiB,EAAE,QAAsB;IACtE,4FAA4F;IAC5F,MAAM,CAAC,YAAY,CACjB,cAAc,EACd;QACE,KAAK,EAAE,yCAAyC;QAChD,WAAW,EACT,6HAA6H;YAC7H,yHAAyH;YACzH,sHAAsH;YACtH,4GAA4G;QAC9G,WAAW,EAAE;YACX,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YAClC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YAChC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE;YAChG,KAAK,EAAE,CAAC;iBACL,IAAI,CAAC,gBAAyC,CAAC;iBAC/C,QAAQ,EAAE;iBACV,QAAQ,CAAC,iBAAiB,CAAC;YAC9B,QAAQ,EAAE,CAAC;iBACR,IAAI,CAAC,oBAA6C,CAAC;iBACnD,QAAQ,EAAE;iBACV,QAAQ,CAAC,qCAAqC,CAAC;YAClD,QAAQ,EAAE,CAAC;iBACR,IAAI,CAAC,oBAA6C,CAAC;iBACnD,QAAQ,EAAE;iBACV,QAAQ,CAAC,qCAAqC,CAAC;YAClD,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4CAA4C,CAAC;YACxH,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;YACpE,iBAAiB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6CAA6C,CAAC;YACjG,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;YACzE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;YAC1E,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iDAAiD,CAAC;YACxF,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;YACjE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+DAA+D,CAAC;YAC5G,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6CAA6C,CAAC;YACpG,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;YAC3D,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;YAC5D,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;YAC7E,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;YACrD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;YAClE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;YACnE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;YACrE,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC;YAC7D,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mEAAmE,CAAC;YACpH,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6CAA6C,CAAC;YAC1F,gBAAgB,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,UAAU,EAAE,aAAa,EAAE,YAAY,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC;YAClH,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uDAAuD,CAAC;YAC9F,OAAO,EAAE,CAAC;iBACP,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;iBACpF,QAAQ,EAAE;iBACV,QAAQ,CAAC,mCAAmC,CAAC;SACjD;KACF,EACD,KAAK,EAAE,OAAO,EAAE,EAAE;QAChB,oFAAoF;QACpF,2FAA2F;QAC3F,MAAM,IAAI,GAAG,eAAe,CAAC,OAAO,EAAE,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;QACnF,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;QACnI,IAAI,CAAC,IAAI;YAAE,OAAO,KAAK,IAAI,0BAA0B,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAChF,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,SAAS,CAAC;QACpC,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;QAErB,0FAA0F;QAC1F,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;YACnB,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,OAAO;gBAC9B,OAAO,OAAO,CAAC;oBACb,IAAI,EAAE,+EAA+E;oBACrF,YAAY,EAAE,KAAK;oBACnB,SAAS,EAAE,IAAI;oBACf,SAAS,EAAE,CAAC,6FAA6F,CAAC;iBAC3G,CAAC,CAAC;YACL,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,OAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;YACnD,2FAA2F;YAC3F,2FAA2F;YAC3F,wFAAwF;YACxF,MAAM,WAAW,GAAG;gBAClB,KAAK;gBACL,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,KAAK;gBAC9B,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC;aACjD,CAAC;YACF,qFAAqF;YACrF,yFAAyF;YACzF,wFAAwF;YACxF,+EAA+E;YAC/E,8FAA8F;YAC9F,MAAM,IAAI,GAAG;gBACX,KAAK;gBACL,uBAAuB,EAAE,IAAI;gBAC7B,mBAAmB,EAAE,IAAI,CAAC,QAAqC;gBAC/D,QAAQ,EAAE,IAAI,CAAC,QAAqC;gBACpD,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS;aAC7H,CAAC;YACF,IACE,CAAC,iBAAiB,CAChB,iBAAiB,CAAC;gBAChB,GAAG,IAAI;gBACP,KAAK,EAAE,SAAS;gBAChB,QAAQ,EAAE,IAAI,CAAC,mBAAmB;gBAClC,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,WAAW;aACZ,CAAC,CACH;gBAED,OAAO,OAAO,CAAC;oBACb,WAAW,EAAE,qBAAqB;oBAClC,IAAI,EAAE,cAAc,KAAK,mGAAmG;oBAC5H,YAAY,EAAE,KAAK;oBACnB,SAAS,EAAE,IAAI;oBACf,SAAS,EAAE,CAAC,mEAAmE,CAAC;iBACjF,CAAC,CAAC;YACL,MAAM,GAAG,GAAG,iBAAiB,CAC3B,IAAI,EACJ,WAAW,EACX,GAAG,EACH,EAAE,YAAY,EAAE,IAAI,CAAC,QAAqC,EAAE,YAAY,EAAE,IAAI,CAAC,QAAqC,EAAE,EACtH,IAAI,CACL,CAAC;YACF,OAAO,IAAI,CACT;gBACE,IAAI;gBACJ,KAAK,EAAE,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC;gBAClC,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,WAAW,EAAE,GAAG,CAAC,WAAW;gBAC5B,KAAK,EAAE,GAAG,CAAC,KAAK;gBAChB,QAAQ,EAAE,GAAG,CAAC,QAAQ;gBACtB,iBAAiB,EAAE,GAAG,CAAC,iBAAiB;aACzC,EACD,GAAG,CAAC,QAAQ;gBACV,CAAC,CAAC,YAAY,GAAG,CAAC,OAAO,KAAK,GAAG,CAAC,iBAAiB,EAAE;gBACrD,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,UAAU,GAAG,CAAC,OAAO,KAAK,GAAG,CAAC,MAAM,CAAC,KAAK,KAAK,GAAG,CAAC,MAAM,CAAC,QAAQ,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,GAAG,CACxI,CAAC;QACJ,CAAC;QAED,2FAA2F;QAC3F,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,MAAM,CAAC,GAAG,mBAAmB,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;gBAC9C,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,OAAO,EAAE,IAAI,CAAC,OAAqC;gBACnD,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;aAC1C,CAAC,CAAC;YACH,OAAO,IAAI,CACT;gBACE,IAAI;gBACJ,OAAO,EAAE;oBACP,GAAG,CAAC;oBACJ,kBAAkB,EAAE,CAAC,CAAC,kBAAkB,CAAC,GAAG,CAAC,eAAe,CAAC;oBAC7D,cAAc,EAAE,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,eAAe,CAAC;iBACtD;aACF,EACD,yBAAyB,CAAC,CAAC,MAAM,UAAU,CAAC,CAAC,KAAK,aAAa,CAAC,CAAC,QAAQ,kBAAkB,CAAC,CAAC,aAAa,eAAe,CAAC,CAAC,UAAU,eAAe,CAAC,CAAC,aAAa,qBAAqB,CAAC,CAAC,sBAAsB,GAAG,CACpN,CAAC;QACJ,CAAC;QAED,2FAA2F;QAC3F,IAAI,IAAI,KAAK,YAAY,IAAI,IAAI,KAAK,cAAc,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;YAC5E,MAAM,GAAG,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;YACrE,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,WAAW;gBAClC,OAAO,OAAO,CAAC;oBACb,IAAI,EAAE,SAAS,IAAI,uBAAuB;oBAC1C,YAAY,EAAE,KAAK;oBACnB,SAAS,EAAE,IAAI;oBACf,SAAS,EAAE,CAAC,oDAAoD,CAAC;iBAClE,CAAC,CAAC;YACL,MAAM,eAAe,GAAG,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,KAAK,CAAC;YAC3D,IAAI,IAAI,KAAK,UAAU,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,eAAe,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;gBAC3H,OAAO,OAAO,CAAC;oBACb,WAAW,EAAE,kBAAkB;oBAC/B,IAAI,EAAE,oBAAoB,eAAe,2BAA2B;oBACpE,YAAY,EAAE,KAAK;oBACnB,SAAS,EAAE,IAAI;oBACf,SAAS,EAAE,CAAC,+FAA+F,CAAC;iBAC7G,CAAC,CAAC;YACL,MAAM,GAAG,GACP,IAAI,KAAK,UAAU,IAAI,IAAI,CAAC,UAAU;gBACpC,CAAC,CAAC,gBAAgB,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC;gBAClC,CAAC,CAAC,IAAI,KAAK,YAAY;oBACrB,CAAC,CAAC,SAAS,CACP,IAAI,EACJ,GAAG,EACH;wBACE,aAAa,EAAE,IAAI,CAAC,aAAa;wBACjC,cAAc,EAAE,IAAI,CAAC,cAAc;wBACnC,QAAQ,EAAE,IAAI,CAAC,QAAQ;wBACvB,OAAO,EAAE,IAAI,CAAC,OAAO;qBACtB,EACD,GAAG,CACJ;oBACH,CAAC,CAAC,IAAI,KAAK,cAAc;wBACvB,CAAC,CAAC,WAAW,CACT,IAAI,EACJ,GAAG,EACH;4BACE,SAAS,EAAE,IAAI,CAAC,SAAS;4BACzB,UAAU,EAAE,IAAI,CAAC,UAAU;4BAC3B,YAAY,EAAE,IAAI,CAAC,YAAY;4BAC/B,YAAY,EAAE,IAAI,CAAC,YAAY;yBAChC,EACD,GAAG,CACJ;wBACH,CAAC,CAAC,cAAc,CACZ,IAAI,EACJ,GAAG,EACH;4BACE,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;4BACzC,eAAe;4BACf,gBAAgB,EAAE,IAAI,CAAC,gBAAgD;yBACxE,EACD,GAAG,CACJ,CAAC;YACZ,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM;gBACxB,OAAO,OAAO,CAAC;oBACb,WAAW,EAAE,GAAG,CAAC,IAAI;oBACrB,IAAI,EAAE,GAAG,CAAC,MAAM,IAAI,mBAAmB,IAAI,EAAE;oBAC7C,YAAY,EAAE,KAAK;oBACnB,SAAS,EAAE,IAAI;oBACf,SAAS,EAAE,CAAC,2FAA2F,CAAC;iBACzG,CAAC,CAAC;YACL,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC;YACrB,MAAM,OAAO,GACX,IAAI,KAAK,YAAY;gBACnB,CAAC,CAAC,UAAU,CAAC,CAAC,OAAO,SAAS,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;gBAC/E,CAAC,CAAC,IAAI,KAAK,cAAc;oBACvB,CAAC,CAAC,oBAAoB,CAAC,CAAC,OAAO,4BAA4B;oBAC3D,CAAC,CAAC,IAAI,CAAC,UAAU;wBACf,CAAC,CAAC,gBAAgB,CAAC,CAAC,OAAO,SAAS,CAAC,CAAC,KAAK,GAAG;wBAC9C,CAAC,CAAC,cAAc,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,iBAAiB,GAAG,CAAC,CAAC,CAAC,EAAE,gCAAgC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,oCAAoC,CAAC;YACrN,OAAO,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QAC5D,CAAC;QAED,2FAA2F;QAC3F,MAAM,KAAK,GAAe;YACxB,KAAK,EAAE,IAAI,CAAC,KAA4B;YACxC,QAAQ,EAAE,IAAI,CAAC,QAAqC;YACpD,QAAQ,EAAE,IAAI,CAAC,QAAqC;YACpD,QAAQ,EAAE,IAAI,CAAC,QAAkC;YACjD,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;SAC1C,CAAC;QACF,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QAC1C,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACtC,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,gBAAgB,EAAE,CAAC,CAAC,gBAAgB;YACpC,UAAU,EAAE,CAAC,CAAC,qBAAqB;YACnC,4EAA4E;YAC5E,aAAa,EAAE,CAAC,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE;YACzE,cAAc,EAAE,CAAC,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE;YAC3E,eAAe,EAAE,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE;YAC3D,eAAe,EAAE,CAAC,CAAC,mBAAmB;YACtC,kBAAkB,EAAE,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS;SACvH,CAAC,CAAC,CAAC;QACJ,OAAO,IAAI,CACT;YACE,MAAM,EAAE,OAAO;YACf,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,oBAAoB,EAAE,GAAG,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;SACrE,EACD,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,cAAc,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC;aAChE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;aAC5B,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,oBAAoB,CAAC,MAAM,0BAA0B,CAAC,CAAC,CAAC,EAAE,EAAE,CACxH,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -1,29 +1,73 @@
1
- // qa_job_status / qa_job_cancel — poll or cancel a long-running job (boot/install).
1
+ // qa_job_status / qa_job_cancel: poll (or long-poll with waitMs) or cancel a background job.
2
2
  // Lets a client reconnect after a tool-call timeout instead of restarting the work.
3
3
  import { z } from 'zod';
4
- import { qaOk, qaError } from '../lib/result.js';
4
+ import { qaOk, qaError, unknownSessionError } from '../lib/result.js';
5
5
  import { progressLine } from '../session/progress.js';
6
+ /** Upper bound for qa_job_status waitMs. Keeps one call well under typical client tool timeouts. */
7
+ export const MAX_JOB_WAIT_MS = 120_000;
8
+ const JOB_POLL_INTERVAL_MS = 500;
9
+ const sleep = (ms) => new Promise((r) => setTimeout(r, Math.max(0, ms)));
6
10
  export function registerJobs(server, sessions) {
7
11
  server.registerTool('qa_job_status', {
8
- title: 'Job status',
9
- description: 'Status of a long-running job (e.g. from qa_prepare_target / qa_test_this execute): running/done/failed/cancelled, the structured progressDetail (phase/elapsed/statusText/nextExpected/logUri/userActionRequired), and the result/error when finished. For a qa_test_this execute job the result carries the terminal state (completed/blocked/unsafe), reportUri, suite, smoke, and health.',
10
- inputSchema: { sessionId: z.string(), jobId: z.string() },
11
- }, async ({ sessionId, jobId }) => {
12
- const job = sessions.get(sessionId)?.jobs.get(jobId);
12
+ title: 'Job status (optionally wait)',
13
+ description: 'Status of a background job (qa_test_this, qa_prepare_target, qa_explore, qa_build run, …): status ' +
14
+ '(running/done/failed/cancelled), progressDetail, and result/error when finished (for qa_test_this: state completed/blocked/unsafe/needs_input, ' +
15
+ 'reportUri, suite, smoke, health). waitMs long-polls: returns once the job leaves "running", or with ' +
16
+ 'waited.timedOut:true.',
17
+ inputSchema: {
18
+ sessionId: z.string(),
19
+ jobId: z.string(),
20
+ waitMs: z
21
+ .number()
22
+ .int()
23
+ .min(0)
24
+ .optional()
25
+ .describe(`Block up to this many ms for the job to finish (capped at ${MAX_JOB_WAIT_MS}). Default 0 = return immediately.`),
26
+ },
27
+ }, async ({ sessionId, jobId, waitMs }, extra) => {
28
+ const session = sessions.get(sessionId);
29
+ let job = session?.jobs.get(jobId);
30
+ if (!session)
31
+ return unknownSessionError(sessionId);
13
32
  if (!job) {
14
- return qaError({ what: `Unknown job ${jobId}`, changedState: false, retrySafe: true, nextSteps: ['Check the jobId returned by qa_prepare_target.'] });
33
+ return qaError({
34
+ what: `Unknown job ${jobId}`,
35
+ failureCode: 'INVALID_ARGUMENT',
36
+ changedState: false,
37
+ retrySafe: true,
38
+ nextSteps: ['Use the sessionId + jobId returned by the tool that started the job (qa_status lists the last job).'],
39
+ });
40
+ }
41
+ const budget = Math.min(Math.max(0, waitMs ?? 0), MAX_JOB_WAIT_MS);
42
+ const started = Date.now();
43
+ while (budget > 0 && job.status === 'running' && Date.now() - started < budget && !extra?.signal?.aborted) {
44
+ await sleep(Math.min(JOB_POLL_INTERVAL_MS, budget - (Date.now() - started)));
45
+ job = session.jobs.get(jobId) ?? job;
15
46
  }
47
+ const waited = budget > 0 ? { waitedMs: Date.now() - started, timedOut: job.status === 'running' } : undefined;
16
48
  const progLine = progressLine(job.progressDetail);
17
- return qaOk({ jobId: job.jobId, kind: job.kind, status: job.status, progress: job.progress, progressDetail: job.progressDetail ?? null, error: job.error, result: job.result, artifactUris: job.artifactUris }, `job ${job.jobId} [${job.kind}] = ${job.status}${progLine ? `\n ${progLine}` : job.progress ? ` (${job.progress})` : ''}${job.resultText ? `\n${job.resultText}` : ''}${job.error ? `\nerror: ${job.error}` : ''}`);
49
+ return qaOk({
50
+ jobId: job.jobId,
51
+ kind: job.kind,
52
+ status: job.status,
53
+ progress: job.progress,
54
+ progressDetail: job.progressDetail ?? null,
55
+ error: job.error,
56
+ result: job.result,
57
+ artifactUris: job.artifactUris,
58
+ ...(waited ? { waited } : {}),
59
+ }, `job ${job.jobId} [${job.kind}] = ${job.status}${progLine ? `\n ${progLine}` : job.progress ? ` (${job.progress})` : ''}${job.resultText ? `\n${job.resultText}` : ''}${job.error ? `\nerror: ${job.error}` : ''}` +
60
+ (waited?.timedOut ? `\nstill running after ${waited.waitedMs}ms, call again (waitMs) or qa_job_cancel.` : ''));
18
61
  });
19
62
  server.registerTool('qa_job_cancel', {
20
63
  title: 'Cancel a job',
21
- description: 'Cancel a running job; aborts its spawned child processes.',
64
+ description: 'Cancel a running background job and abort its child processes (build/boot/install/record). Returns {jobId, cancelled}; ' +
65
+ 'cancelled:false means it already finished or is unknown. Side effects already applied are not rolled back.',
22
66
  inputSchema: { sessionId: z.string(), jobId: z.string() },
23
67
  }, async ({ sessionId, jobId }) => {
24
68
  const session = sessions.get(sessionId);
25
69
  if (!session)
26
- return qaError({ what: `Unknown sessionId ${sessionId}`, changedState: false, retrySafe: true, nextSteps: ['Call qa_start_session first.'] });
70
+ return unknownSessionError(sessionId);
27
71
  const ok = sessions.cancelJob(session, jobId);
28
72
  return qaOk({ jobId, cancelled: ok }, ok ? `cancelled ${jobId}` : `job ${jobId} not running (already finished or unknown)`);
29
73
  });