@qwen-code/qwen-code 0.21.14-preview.0 → 0.21.14

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 (145) hide show
  1. package/chunks/{MaxSizedBox-3PZITE2Y.js → MaxSizedBox-67IDQILY.js} +3 -3
  2. package/chunks/{StandaloneSessionPicker-2C34PNGO.js → StandaloneSessionPicker-G4QJIRMH.js} +17 -17
  3. package/chunks/{acpAgent-3J4NHAYT.js → acpAgent-BS3YYO33.js} +38 -38
  4. package/chunks/{agent-VFX4RPP5.js → agent-EHHEXKWN.js} +3 -3
  5. package/chunks/{agent-headless-6WCF4J6N.js → agent-headless-UT2ZF76T.js} +3 -3
  6. package/chunks/{bridge-XR5ZSR7U.js → bridge-WQ4IL2RF.js} +4 -4
  7. package/chunks/{channel-settings-store-Z7BUEUJE.js → channel-settings-store-ZDFXY7VY.js} +9 -9
  8. package/chunks/{chunk-QIHHJKXT.js → chunk-2A6VQJYK.js} +5 -5
  9. package/chunks/{chunk-FCTLOVYW.js → chunk-3PWNVF6N.js} +1 -1
  10. package/chunks/{chunk-L6CCLB3G.js → chunk-3SL2P3WX.js} +1 -1
  11. package/chunks/{chunk-LLR424CQ.js → chunk-3YRVPHT3.js} +3 -3
  12. package/chunks/{chunk-2OA3JMRD.js → chunk-47L5MLB5.js} +2 -2
  13. package/chunks/{chunk-57KOJ2KZ.js → chunk-4SR45OM4.js} +1 -1
  14. package/chunks/{chunk-VHPMDDPT.js → chunk-4ZS3BLER.js} +3 -3
  15. package/chunks/{chunk-SR2LYSMT.js → chunk-544KT7X4.js} +1 -1
  16. package/chunks/{chunk-2JXDFSVE.js → chunk-55VKMB7X.js} +2 -2
  17. package/chunks/{chunk-K3CECR5C.js → chunk-5IJSFWQO.js} +4 -4
  18. package/chunks/{chunk-25GHLMQQ.js → chunk-6BJSYAML.js} +10 -10
  19. package/chunks/{chunk-XO24LIZC.js → chunk-6RDZLBSJ.js} +22 -22
  20. package/chunks/{chunk-ZXEAEZFN.js → chunk-73JUK3ZW.js} +3 -3
  21. package/chunks/{chunk-X3YA3YGG.js → chunk-7VNHO4MN.js} +2 -2
  22. package/chunks/{chunk-YXC7JYUI.js → chunk-C3T6M24E.js} +1 -1
  23. package/chunks/{chunk-GV3OIADZ.js → chunk-CEXU72GE.js} +1 -1
  24. package/chunks/{chunk-YFPZ3NNC.js → chunk-CZK622ZK.js} +1 -1
  25. package/chunks/{chunk-AQBHJ2IG.js → chunk-DHUPMYMC.js} +9 -9
  26. package/chunks/{chunk-73G3Z7QS.js → chunk-DRAONPUW.js} +2 -2
  27. package/chunks/{chunk-55PIFSP2.js → chunk-E5WQMF3K.js} +1 -1
  28. package/chunks/{chunk-ISRHAMNL.js → chunk-EOPBFLA5.js} +3 -3
  29. package/chunks/{chunk-6PDOHRN6.js → chunk-FN6M5WUL.js} +3 -3
  30. package/chunks/{chunk-DZCV3ZYU.js → chunk-G6KI5UOJ.js} +1 -1
  31. package/chunks/{chunk-PPTM4O4R.js → chunk-H3SHU2XU.js} +1 -1
  32. package/chunks/{chunk-EOCQCNV4.js → chunk-K2Y45XXS.js} +3 -3
  33. package/chunks/{chunk-VGAAAMRD.js → chunk-L3T4V5GZ.js} +1 -1
  34. package/chunks/{chunk-I7NTHW4C.js → chunk-LSO6EL4Y.js} +1 -1
  35. package/chunks/{chunk-G6FFFICU.js → chunk-MDIGJH5X.js} +3 -3
  36. package/chunks/{chunk-SGLPDKRT.js → chunk-MVHJZ3FZ.js} +1 -1
  37. package/chunks/{chunk-P425IVUK.js → chunk-N6RSOOWJ.js} +4 -4
  38. package/chunks/{chunk-SA7GBPEA.js → chunk-OEYAK5O6.js} +2 -2
  39. package/chunks/{chunk-WVIABDXV.js → chunk-OEZCXK7Y.js} +2 -2
  40. package/chunks/{chunk-XC377TLN.js → chunk-OFTPCOGR.js} +32 -32
  41. package/chunks/{chunk-SBRIBTYN.js → chunk-OJB5FYVK.js} +1 -1
  42. package/chunks/{chunk-MCG53LWC.js → chunk-P3AA6S7O.js} +1 -1
  43. package/chunks/{chunk-6DFPR7CS.js → chunk-PCETXVVV.js} +1 -1
  44. package/chunks/{chunk-PMS7O6SA.js → chunk-PHN4R2ZV.js} +1 -1
  45. package/chunks/{chunk-U6RZRKNM.js → chunk-PJSD2FOR.js} +10 -10
  46. package/chunks/{chunk-4V4DFJBS.js → chunk-QAVTWAHL.js} +2 -2
  47. package/chunks/{chunk-TNPWODIZ.js → chunk-QEHH23OM.js} +1 -1
  48. package/chunks/{chunk-S6CXQKDD.js → chunk-QRVHGEVY.js} +3 -3
  49. package/chunks/{chunk-QECSDJET.js → chunk-S7N3HUIB.js} +4 -4
  50. package/chunks/{chunk-NV6LW6FT.js → chunk-SCZU65AI.js} +2 -2
  51. package/chunks/{chunk-7OCSX7FC.js → chunk-SFJMFZT5.js} +1 -1
  52. package/chunks/{chunk-BOJNAPUE.js → chunk-SFTKAX4O.js} +1 -1
  53. package/chunks/{chunk-YIWH3MKK.js → chunk-TSMPNGBC.js} +2 -2
  54. package/chunks/{chunk-HGPMOXLZ.js → chunk-U657UZJN.js} +4 -4
  55. package/chunks/{chunk-OSAFWBNR.js → chunk-V6WEMZPD.js} +2 -2
  56. package/chunks/{chunk-OLZSWUZR.js → chunk-VFP5YOHJ.js} +5 -5
  57. package/chunks/{chunk-IOTPI425.js → chunk-VTOLYFWM.js} +1 -1
  58. package/chunks/{chunk-E5RS7LF4.js → chunk-W7EYJGN7.js} +6 -6
  59. package/chunks/{chunk-DRKYT2TR.js → chunk-WAO53ZQF.js} +1 -1
  60. package/chunks/{chunk-LRDB2OLB.js → chunk-XITLNXLX.js} +2 -2
  61. package/chunks/{chunk-KSGWAYNE.js → chunk-XYRBK56E.js} +114 -62
  62. package/chunks/{chunk-6VDPDHIP.js → chunk-Y4RVDOXV.js} +3 -3
  63. package/chunks/{chunk-RAQBBGS6.js → chunk-Y7QY6DKW.js} +3 -3
  64. package/chunks/{chunk-4KQ2TI2K.js → chunk-YHXQK4SR.js} +2 -2
  65. package/chunks/{computer-use-ABECHPS5.js → computer-use-YORZJQE5.js} +3 -3
  66. package/chunks/{contextCommand-4CD5HZQQ.js → contextCommand-PACHGIF4.js} +5 -5
  67. package/chunks/{core-runtime-2MOVQ4VX.js → core-runtime-6HD5DSPX.js} +3 -3
  68. package/chunks/{create-sub-session-L6NNHG5N.js → create-sub-session-IQFIPUQA.js} +3 -3
  69. package/chunks/{daemon-git-worktree-guard-BLXFEG4Q.js → daemon-git-worktree-guard-6P27GKSU.js} +3 -3
  70. package/chunks/{daemon-status-provider-XGD3TPTO.js → daemon-status-provider-SXS66ZIR.js} +8 -8
  71. package/chunks/{daemon-trust-policy-THEGCWPO.js → daemon-trust-policy-5QJHAS3N.js} +9 -9
  72. package/chunks/{daemon-trust-policy-monitor-L7L4ACWQ.js → daemon-trust-policy-monitor-JA2WZRZ3.js} +9 -9
  73. package/chunks/{deferred-core-runtime-YQLHDUGE.js → deferred-core-runtime-R2VWOVG3.js} +3 -3
  74. package/chunks/{earlyInputCapture-PCTXNW7N.js → earlyInputCapture-PQEEOFKJ.js} +3 -3
  75. package/chunks/{edit-QX2EGWYW.js → edit-RASZHTU2.js} +3 -3
  76. package/chunks/{enter-worktree-EM3ZZ2SB.js → enter-worktree-CH5OMHJE.js} +3 -3
  77. package/chunks/{enterPlanMode-ESCMVAKB.js → enterPlanMode-AQKR3CAH.js} +3 -3
  78. package/chunks/{environment-TOJI56YV.js → environment-7QRYIEBA.js} +5 -5
  79. package/chunks/{errors-DZ5FWWEM.js → errors-P2LL5452.js} +5 -5
  80. package/chunks/{exit-worktree-KUIJ36XA.js → exit-worktree-WUDL26CY.js} +3 -3
  81. package/chunks/{exitPlanMode-NFVY54FV.js → exitPlanMode-JM75SAUI.js} +3 -3
  82. package/chunks/{fast-path-JLQXJSH6.js → fast-path-KVNSOHVA.js} +2 -2
  83. package/chunks/{gemini-I7OT4FWL.js → gemini-ADMD2EOS.js} +36 -36
  84. package/chunks/{geminiContentGenerator-GRIS77NJ.js → geminiContentGenerator-CS3M7SOS.js} +1 -1
  85. package/chunks/{glob-7TBUUV6R.js → glob-WIJOGYVV.js} +3 -3
  86. package/chunks/{grep-743SYWCZ.js → grep-CIFRQBR7.js} +3 -3
  87. package/chunks/{handleAutoUpdate-GAOYUYOD.js → handleAutoUpdate-KJ4SN7DM.js} +7 -7
  88. package/chunks/{i18n-2ITURYX6.js → i18n-36SZUO4C.js} +4 -4
  89. package/chunks/{image-gen-4OIWDZD6.js → image-gen-R4B5VUYB.js} +1 -1
  90. package/chunks/{initializer-OC7LWA6X.js → initializer-CW5YCAOL.js} +9 -9
  91. package/chunks/{installationInfo-CO47QX3Q.js → installationInfo-NMQIOUGY.js} +4 -4
  92. package/chunks/{list-ATR2SFWT.js → list-HHGT3S4P.js} +12 -12
  93. package/chunks/{loadedSettingsAdapter-NK4B7AGK.js → loadedSettingsAdapter-SJ2MJF35.js} +9 -9
  94. package/chunks/{loggingContentGenerator-3WXBU5TQ.js → loggingContentGenerator-GR2QQ2C5.js} +1 -1
  95. package/chunks/{managed-npm-update-4SSBWI2D.js → managed-npm-update-ADQJHKTO.js} +4 -4
  96. package/chunks/{mcp-C62AE2QI.js → mcp-QW3OTL5W.js} +9 -9
  97. package/chunks/{monitor-FEYEGASA.js → monitor-RJKPVERH.js} +3 -3
  98. package/chunks/{nonInteractiveCli-AJEV5ZWO.js → nonInteractiveCli-MROMHSTL.js} +33 -33
  99. package/chunks/{notebook-edit-SLLTEY4O.js → notebook-edit-2ENWDBZO.js} +3 -3
  100. package/chunks/{openaiContentGenerator-WLUGIAPX.js → openaiContentGenerator-Z3GPWJU4.js} +1 -1
  101. package/chunks/{pidfile-TV2VWUMB.js → pidfile-5G42YSTP.js} +3 -3
  102. package/chunks/{processUtils-3IN2ZR55.js → processUtils-ZDMXYKQY.js} +2 -2
  103. package/chunks/{qwenContentGenerator-GSGRFPJE.js → qwenContentGenerator-NLEMBZVU.js} +3 -3
  104. package/chunks/{qwenOAuth2-JLSTIS4Z.js → qwenOAuth2-EBV52DWJ.js} +1 -1
  105. package/chunks/{read-file-6PZZRGZZ.js → read-file-5BYIF53O.js} +1 -1
  106. package/chunks/{resumeHistoryUtils-5GEWKOOO.js → resumeHistoryUtils-AFTBRS3G.js} +6 -6
  107. package/chunks/{ripGrep-FX7GBGFN.js → ripGrep-NN7AOLQY.js} +3 -3
  108. package/chunks/{run-qwen-serve-7RHU3NSV.js → run-qwen-serve-UR3DYDAF.js} +29 -29
  109. package/chunks/{runtime-EPOXAMLP.js → runtime-PR5RKGNH.js} +10 -10
  110. package/chunks/{scheduler-F4Y7ENVV.js → scheduler-GPMLVKJM.js} +5 -5
  111. package/chunks/{serve-LQV4TN5A.js → serve-E7V2JVA2.js} +9 -9
  112. package/chunks/{server-IZCKLIYQ.js → server-YXB3DBN7.js} +28 -28
  113. package/chunks/{session-52ZGTDVB.js → session-DZEAUT7S.js} +34 -34
  114. package/chunks/{settings-WCVB34HW.js → settings-ESZ3NWAP.js} +8 -8
  115. package/chunks/{shell-33BIUBLH.js → shell-JMSK5WIL.js} +3 -3
  116. package/chunks/{skill-IYVQ2QNK.js → skill-5K5CSUJV.js} +1 -1
  117. package/chunks/{skill-settings-YG4ZS4OZ.js → skill-settings-V64NIOTI.js} +8 -8
  118. package/chunks/{spawnChannel-BLA4YT4W.js → spawnChannel-S63APBZZ.js} +3 -3
  119. package/chunks/{standalone-update-ALRIPWSM.js → standalone-update-P42HDFXX.js} +5 -5
  120. package/chunks/{startInteractiveUI-PISBXWKA.js → startInteractiveUI-LFBLFHJ4.js} +42 -42
  121. package/chunks/{team-create-CIQDCC6A.js → team-create-EDNOUM2U.js} +3 -3
  122. package/chunks/{team-plan-approval-664XCRB4.js → team-plan-approval-QRSNK2DX.js} +3 -3
  123. package/chunks/{terminal-image-renderer-TEBO6ONY.js → terminal-image-renderer-6J2NPL32.js} +3 -3
  124. package/chunks/{theme-manager-3CIFH2JV.js → theme-manager-WJMLRBXS.js} +3 -3
  125. package/chunks/{tool-search-IJX5JHJB.js → tool-search-MZ6WU7DM.js} +1 -1
  126. package/chunks/{total-session-admission-XBK2NVRV.js → total-session-admission-DQVW2LIP.js} +4 -4
  127. package/chunks/{trustedFolders-OOFNLRWK.js → trustedFolders-QMH25GOX.js} +4 -4
  128. package/chunks/{update-relaunch-EIG7EYAQ.js → update-relaunch-EG75LLW5.js} +5 -5
  129. package/chunks/{updateCheck-KYDCBLSF.js → updateCheck-MTZIVGT5.js} +6 -6
  130. package/chunks/{useAutoAcceptIndicator-RFX3KNBN.js → useAutoAcceptIndicator-IGCW5EPO.js} +9 -9
  131. package/chunks/{validateNonInterActiveAuth-MZXSAITU.js → validateNonInterActiveAuth-D5FPAB2C.js} +30 -30
  132. package/chunks/{version-PJC6ZNXV.js → version-UOLDLLRB.js} +1 -1
  133. package/chunks/{web-fetch-XXICVGKQ.js → web-fetch-QKKW6CWH.js} +1 -1
  134. package/chunks/{web-search-LHPM6QWC.js → web-search-JYRBZMCW.js} +2 -2
  135. package/chunks/{workflow-4CUO2BV7.js → workflow-SR7SEAU7.js} +4 -4
  136. package/chunks/{workspace-providers-status-G4MUGH3X.js → workspace-providers-status-OXGV4EFF.js} +11 -11
  137. package/chunks/{workspace-registration-store-QMDMFWBE.js → workspace-registration-store-V5EGKLBH.js} +1 -1
  138. package/chunks/{workspace-registry-FKBB4MZK.js → workspace-registry-KJVIYTF5.js} +4 -4
  139. package/chunks/{workspace-service-TIDTTA65.js → workspace-service-6RLSGUB5.js} +12 -12
  140. package/chunks/{workspace-skills-status-LBC2TZKM.js → workspace-skills-status-BHFEPDGH.js} +9 -9
  141. package/chunks/{workspace-trust-reconciler-4KJ567XP.js → workspace-trust-reconciler-DB5ERSUN.js} +10 -10
  142. package/chunks/{write-file-R6LAEER5.js → write-file-IUP4GTZ4.js} +3 -3
  143. package/chunks/{zoom-image-XLCK6DDK.js → zoom-image-SRBDTIVA.js} +1 -1
  144. package/cli.js +12 -12
  145. package/package.json +3 -3
@@ -2,13 +2,13 @@
2
2
  "use strict";
3
3
  import {
4
4
  listCommand
5
- } from "./chunk-K3CECR5C.js";
5
+ } from "./chunk-5IJSFWQO.js";
6
6
  import {
7
7
  getErrorMessage as getErrorMessage2
8
- } from "./chunk-LRDB2OLB.js";
8
+ } from "./chunk-XITLNXLX.js";
9
9
  import {
10
10
  serveCommand
11
- } from "./chunk-RAQBBGS6.js";
11
+ } from "./chunk-Y7QY6DKW.js";
12
12
  import {
13
13
  OBSERVED_CONTACT_MAX_FRESH_WITHIN_SECONDS,
14
14
  ObservedChannelContactStore
@@ -35,7 +35,7 @@ import {
35
35
  collectProviderModelsForProtocol,
36
36
  getAuthTypeFromEnv,
37
37
  resolveCliGenerationConfig
38
- } from "./chunk-ISRHAMNL.js";
38
+ } from "./chunk-EOPBFLA5.js";
39
39
  import {
40
40
  resolveSkillSettings
41
41
  } from "./chunk-Z4X5MTRT.js";
@@ -55,14 +55,14 @@ import {
55
55
  registerToolCallDispatch,
56
56
  selectFirstModel,
57
57
  sessionsPath
58
- } from "./chunk-2JXDFSVE.js";
58
+ } from "./chunk-55VKMB7X.js";
59
59
  import {
60
60
  getExtensionManager,
61
61
  requestChoicePluginNonInteractive,
62
62
  requestConsentNonInteractive,
63
63
  requestConsentOrFail,
64
64
  resolveExtensionCommandScope
65
- } from "./chunk-HGPMOXLZ.js";
65
+ } from "./chunk-U657UZJN.js";
66
66
  import {
67
67
  parseChannelConfig
68
68
  } from "./chunk-NRPXRNN4.js";
@@ -135,33 +135,33 @@ import {
135
135
  assembleMcpServers,
136
136
  getPendingGatedMcpServers,
137
137
  mcpCommand
138
- } from "./chunk-QECSDJET.js";
138
+ } from "./chunk-S7N3HUIB.js";
139
139
  import {
140
140
  loadSettings
141
- } from "./chunk-OLZSWUZR.js";
141
+ } from "./chunk-VFP5YOHJ.js";
142
142
  import {
143
143
  detectSystemLanguage,
144
144
  getCurrentLanguage,
145
145
  initializeI18n,
146
146
  resolveLanguageSetting,
147
147
  t
148
- } from "./chunk-IOTPI425.js";
148
+ } from "./chunk-VTOLYFWM.js";
149
149
  import {
150
150
  loadEnvironment
151
- } from "./chunk-SGLPDKRT.js";
151
+ } from "./chunk-MVHJZ3FZ.js";
152
152
  import {
153
153
  resolveAcpChannelFallback,
154
154
  scrubAndReportInheritedLoaderEnv
155
155
  } from "./chunk-CXJHQVEK.js";
156
156
  import {
157
157
  getCliVersion
158
- } from "./chunk-6DFPR7CS.js";
158
+ } from "./chunk-PCETXVVV.js";
159
159
  import {
160
160
  getPackageJson
161
161
  } from "./chunk-WZMH7II3.js";
162
162
  import {
163
163
  isWorkspaceTrusted
164
- } from "./chunk-YXC7JYUI.js";
164
+ } from "./chunk-C3T6M24E.js";
165
165
  import {
166
166
  require_strip_json_comments
167
167
  } from "./chunk-NPQ5ZKRP.js";
@@ -203,7 +203,7 @@ import {
203
203
  unquoteCStylePath,
204
204
  updateChannelMemoryEntry,
205
205
  updateSetting
206
- } from "./chunk-XC377TLN.js";
206
+ } from "./chunk-OFTPCOGR.js";
207
207
  import {
208
208
  parsePositiveIntegerEnv
209
209
  } from "./chunk-6PVPNMXU.js";
@@ -13226,7 +13226,7 @@ You are undirected on purpose. Do not restrict yourself to the list.`
13226
13226
  Read the JSON it prints:
13227
13227
 
13228
13228
  - \`toolchain: "npm"\` \u2192 use its \`build[]\` / \`test[]\` results. A failure in a file **the diff changed** is a **Critical** (\`Source: [build]\` or \`[test]\`); a failure in a file it did **not** touch is pre-existing \u2014 say so, do not file it against this PR. A non-empty \`timedOut\`, or a failed \`install\`, is environment/infrastructure \u2014 informational, never a Critical. On \`ok: true\`, name the workspaces built and the commands run; a return that names no command is a whiff. Report the TEST coverage from \`testScope\`, never from assumption. \`testScope.workspaces\` lists exactly the suites that ran \u2014 say "tests scoped to <list> \u2014 the changed workspaces and their declared dependents that define a test script". \`testScope.notRun\`, when present, names suites the whole-call budget stopped before they ran \u2014 say they did not run, never fold them into the coverage. When \`testScope.caveat\` is present, the scope may be incomplete \u2014 quote the caveat and say exactly that. A green run is a claim about those suites only \u2014 do not phrase it as the whole suite passing.
13229
- - **A suite left unrun is not a suite that passed \u2014 continue the run.** \`testScope.notRun\` names suites the whole-call budget could not reach, and a \`test[]\` entry with \`"clamped": true\` is a suite the budget started too late and killed (its deadline was shortened, so its timeout says nothing about the suite). A third shape carries no field at all \u2014 a single-package repo whose budget ran out before its one suite has an empty \`test[]\` and no \`testScope\`, and only the \`note\` says so; read it before calling the dimension finished. That third shape cannot be continued \u2014 a continuation has no recorded scope to read, and answers "ended before its test phase" without running anything \u2014 so report the dimension UNFINISHED and do not spend a continuation on it. The first two mean the dimension is unfinished AND continuable: re-run the SAME \`build-test\` command with \`--resume\` \u2014 it skips install and build, runs only what is left, and merges into the same report file. The ${SHELL_TOOL_MAX_TIMEOUT_MS / 1e3}-second ceiling is per CALL, so this is the only way a repo whose suites do not fit one call ever finishes them (measured on this repo: \`packages/cli\` alone needs 401s, and install + builds + \`packages/core\` had already spent 285s). Keep resuming while work is left, up to ${MAX_RESUME_CALLS} continuations; then report what the run has, with \`notRun\` disclosed.
13229
+ - **A suite left unrun is not a suite that passed \u2014 continue the run.** \`testScope.notRun\` names suites the whole-call budget could not reach, and a \`test[]\` entry with \`"clamped": true\` is a suite the budget started too late and killed (its deadline was shortened, so its timeout says nothing about the suite). A third shape ends before any suite \u2014 a single-package repo whose budget ran out before its one suite has an empty \`test[]\`, no \`testScope\`, and \`"endedBeforeTests": true\` (the report's own stamp), with the \`note\` naming the unrun suite; read them before calling the dimension finished. That third shape cannot be continued \u2014 a continuation has no recorded scope to read, and a \`--resume\` on it answers "ended before its test phase" and points at a fresh run \u2014 so report the dimension UNFINISHED and do not spend a continuation on it. The first two mean the dimension is unfinished AND continuable: re-run the SAME \`build-test\` command with \`--resume\` \u2014 it skips install and build, runs only what is left, and merges into the same report file. The ${SHELL_TOOL_MAX_TIMEOUT_MS / 1e3}-second ceiling is per CALL, so this is the only way a repo whose suites do not fit one call ever finishes them (measured on this repo: \`packages/cli\` alone needs 401s, and install + builds + \`packages/core\` had already spent 285s). Keep resuming while work is left, up to ${MAX_RESUME_CALLS} continuations; then report what the run has, with \`notRun\` disclosed.
13230
13230
  - **When any \`test[]\` command failed (exit non-zero, not a timeout), MEASURE which failures are the PR's before ruling by path.** The path rule above misclassifies in both directions \u2014 an environment-flaky test in a touched file gets filed as a Critical it did not cause, and a PR that breaks a test in an UNTOUCHED file gets waved through as pre-existing. The measurement is two commands: \`qwen review base-tree --plan <plan> --worktree <worktree> --out <plan dir>/qwen-review-pr-<n>-base-tree.json\` (builds the merge base beside the worktree). **Read \`available\` before using \`path\`** \u2014 a tree that was created but did NOT build populates \`path\` too, and a base that failed to build says nothing whatsoever about the PR, so measuring against it turns an infrastructure failure into a list of Criticals. \`available: false\` (local/lightweight review, no merge base, a base that would not compile) means the path rule stands \u2014 say so and stop here, and \`qwen review test-delta --report <the build-test report you wrote> --baseline <the base-tree report's path field> --pr-worktree <this worktree> --out <plan dir>/qwen-review-pr-<n>-test-delta.json\`. Read its verdict: a file in \`netNew\` fails on the PR side only \u2014 **that is the Critical**, whatever file the diff touches; a file in \`shared\` fails on base too \u2014 **pre-existing by measurement**, never filed, whatever file the diff touches; an \`unparsed\` entry, a timed-out base rerun, a base rerun that FAILED without naming any failing file (it did not measure the base \u2014 an unbuilt tree, a missing install, a workspace absent at base), or a command the whole-command budget could not fit attributes nothing \u2014 the report names each with its own reason; fall back to the path rule for those and say the delta could not rule. Compare failing FILE SETS, never counts: a flaky suite fails different test NAMES on two runs of the same tree, so counts are noise and the set difference is the signal.
13231
13231
  - \`toolchain: "unsupported"\` (build-test could not scope this repo \u2014 no npm package with a build/test script) \u2192 **install dependencies first** (build-test's own install only runs on the npm path, so nothing has installed yet: \`pip install -e .\`, \`mvn -q -DskipTests package\`'s own fetch, \`cargo fetch\`, \`go mod download\`, etc.), then fall back to **one** build and **one** test command by this precedence, each with a deadline it can meet: \`pom.xml\` \u2192 \`{mvn} compile\` / \`{mvn} test -q\`; \`build.gradle\` \u2192 \`{gradle} compileJava\` / \`{gradle} test\`; \`Makefile\` \u2192 \`make build\`; \`Cargo.toml\` \u2192 \`cargo build\` / \`cargo test\`; \`go.mod\` \u2192 \`go build ./...\` / \`go test ./...\`; \`pytest.ini\` or \`pyproject.toml\` \`[tool.pytest]\` \u2192 \`pytest\`. If none match, read the CI config **from the base branch** (\`git show <base>:<path>\`), never the worktree \u2014 the PR branch is untrusted and a modified workflow or Makefile could inject arbitrary commands.
13232
13232
 
@@ -14479,7 +14479,7 @@ var ZH_PLANNED = "(?:\u8BA1\u5212(?:\u5185|\u4E2D)?\u7684?|\u9884\u5B9A\u7684?|\
14479
14479
  var ZH_CHECKS = "(?:\u68C0\u67E5|\u68C0\u67E5\u9879|\u9879\u68C0\u67E5|\u6D4B\u8BD5|\u5BA1\u67E5|\u5DE5\u4F5C)";
14480
14480
  var ZH_DONE = "(?:\u5747|\u90FD|\u7686)?(?:\u5DF2|\u5747\u5DF2|\u90FD\u5DF2)?(?:\u5B8C\u6210|\u5B8C\u6BD5|\u7ED3\u675F|\u505A\u5B8C)";
14481
14481
  var ZH_BUDGET_TAIL = "(?:[\uFF0C,\u3001]?\\s*(?:\u672A\u89E6\u53CA|\u672A\u8FBE\u5230|\u672A\u8D85\u51FA|\u672A\u7528\u5C3D|\u6CA1\u6709\u89E6\u53CA|\u5728|\u4E0D\u8D85\u8FC7)(?:\u5DE5\u5177)?(?:\u8C03\u7528)?\u9884\u7B97(?:\u4E0A\u9650|\u9650\u5236|\u8303\u56F4\u5185)?)?";
14482
- var ZH_TAIL = "[\u3002\uFF0E.!\uFF01\u2026,\uFF0C;\uFF1B:\uFF1A\\s]*$";
14482
+ var ZH_TAIL = "[\u3002\uFF0E.!\uFF01\u2026,\uFF0C;\uFF1B:\uFF1A\uFF1F\u3001\\s]*$";
14483
14483
  var ZH_COMPLETION_CLAUSE = `${ZH_ALL}?${ZH_PLANNED}?${ZH_CHECKS}?${ZH_DONE}${ZH_BUDGET_TAIL}`;
14484
14484
  var ZH_PLACEHOLDER = `${ZH_TOKEN}(?:${ZH_TAIL}|\\s*(?:${ZH_SEPARATOR})\\s*${ZH_COMPLETION_CLAUSE}${ZH_TAIL})`;
14485
14485
  var PLACEHOLDER_GAP_RE = new RegExp(
@@ -14515,7 +14515,7 @@ function stripWrappers(s) {
14515
14515
  return out;
14516
14516
  }
14517
14517
  __name(stripWrappers, "stripWrappers");
14518
- var TRAILING_GAP_CHAR_RE = /[.!…,;:\s]/;
14518
+ var TRAILING_GAP_CHAR_RE = /[.!…,;:\s。,;:!?、.]/;
14519
14519
  function stripTrailingGapChars(s) {
14520
14520
  let end = s.length;
14521
14521
  while (end > 0 && TRAILING_GAP_CHAR_RE.test(s.charAt(end - 1))) end--;
@@ -14549,11 +14549,13 @@ function budgetGapDisclosures(finalText) {
14549
14549
  }
14550
14550
  raw = stripWrappers(raw.trim()).trim();
14551
14551
  const normalized = stripTrailingGapChars(raw).trim();
14552
- const unparenthesized = normalized.startsWith("(") && normalized.endsWith(")") ? normalized.slice(1, -1).trim() : normalized;
14552
+ const unparenthesized = stripTrailingGapChars(
14553
+ normalized.startsWith("(") && normalized.endsWith(")") || normalized.startsWith("\uFF08") && normalized.endsWith("\uFF09") ? normalized.slice(1, -1).trim() : normalized
14554
+ );
14553
14555
  if (normalized.length === 0 || PLACEHOLDER_GAP_RE.test(unparenthesized)) {
14554
14556
  continue;
14555
14557
  }
14556
- const key = stripTrailingGapChars(unparenthesized).toLowerCase();
14558
+ const key = unparenthesized.toLowerCase();
14557
14559
  if (seen.has(key)) continue;
14558
14560
  seen.add(key);
14559
14561
  gaps.push(truncateGap(raw));
@@ -14920,7 +14922,7 @@ function budgetStopDisclosure(round) {
14920
14922
  subject: "reverse audit",
14921
14923
  reason: `stopped before ${which} by the ${BUDGET_STOP_PHRASE}`,
14922
14924
  subjectZh: "\u53CD\u5411\u5BA1\u8BA1",
14923
- reasonZh: `\u8BC4\u5BA1\u65F6\u95F4\u9884\u7B97\u4E0D\u8DB3\uFF0C\u672A\u80FD\u5F00\u59CB${whichZh}`
14925
+ reasonZh: `${BUDGET_STOP_PHRASE_ZH}\u4E0D\u8DB3\uFF0C\u672A\u80FD\u5F00\u59CB${whichZh}`
14924
14926
  };
14925
14927
  }
14926
14928
  __name(budgetStopDisclosure, "budgetStopDisclosure");
@@ -14941,7 +14943,7 @@ function roundCapStopDisclosure(cap) {
14941
14943
  subject: "reverse audit",
14942
14944
  reason: `did not converge within the ${ROUND_CAP_PHRASE} of ${cap}`,
14943
14945
  subjectZh: "\u53CD\u5411\u5BA1\u8BA1",
14944
- reasonZh: `\u5728 ${cap} \u8F6E\u7684\u53CD\u5BA1\u8F6E\u6570\u4E0A\u9650\u5185\u672A\u6536\u655B`
14946
+ reasonZh: `\u5728 ${cap} \u8F6E\u7684${ROUND_CAP_PHRASE_ZH}\u5185\u672A\u6536\u655B`
14945
14947
  };
14946
14948
  }
14947
14949
  __name(roundCapStopDisclosure, "roundCapStopDisclosure");
@@ -17901,11 +17903,23 @@ function floorEnforcedReroute(severityFloor, contextUnavailable, prevRound, draf
17901
17903
  return { indices, entries };
17902
17904
  }
17903
17905
  __name(floorEnforcedReroute, "floorEnforcedReroute");
17906
+ function canonicalDimensionHead(s) {
17907
+ return s.toLowerCase().replace(/&/g, " and ").replace(/[-\s]+/g, "-").replace(/^the-/, "").replace(/-(?:check|verification)$/, "");
17908
+ }
17909
+ __name(canonicalDimensionHead, "canonicalDimensionHead");
17910
+ function squashedDimensionHead(s) {
17911
+ return canonicalDimensionHead(s).replace(/-/g, "");
17912
+ }
17913
+ __name(squashedDimensionHead, "squashedDimensionHead");
17914
+ var NON_DIFF_DIMENSION_HEADS = new Set(
17915
+ Object.values(BRIEFS).filter((b) => !b.readsDiff).map((b) => canonicalDimensionHead(b.publicLabel))
17916
+ );
17917
+ var NON_DIFF_DIMENSION_HEADS_SQUASHED = new Set(
17918
+ [...NON_DIFF_DIMENSION_HEADS].map((h) => h.replace(/-/g, ""))
17919
+ );
17904
17920
  function isNonDiffDimensionGap(entry) {
17905
- const head = entry.split(/[—–-]{1,2}\s/)[0].trim().toLowerCase();
17906
- return /^(?:the\s+)?build[-\s]?(?:and|&)[-\s]?test(?:\s+check|\s+verification)?$/.test(
17907
- head
17908
- );
17921
+ const head = entry.split(/[—–-]{1,2}\s/)[0].trim();
17922
+ return NON_DIFF_DIMENSION_HEADS.has(canonicalDimensionHead(head)) || NON_DIFF_DIMENSION_HEADS_SQUASHED.has(squashedDimensionHead(head));
17909
17923
  }
17910
17924
  __name(isNonDiffDimensionGap, "isNonDiffDimensionGap");
17911
17925
  var UNVERIFIED_FINDING_TAG_RE = /—\s*\[unverified\]/gi;
@@ -18240,9 +18254,9 @@ function composeReviewBody(input, cliVersion, attribution, prevRound, reroute =
18240
18254
  budgetStopEntryZh(stop.round ?? void 0)
18241
18255
  ]);
18242
18256
  const isRoundCap = stop.cause === "round-cap";
18243
- const phrases = isRoundCap ? [ROUND_CAP_PHRASE, ROUND_CAP_PHRASE_ZH] : [BUDGET_STOP_PHRASE, BUDGET_STOP_PHRASE_ZH];
18257
+ const entries = [...canonicalStopEntries];
18244
18258
  for (let i = unreviewed.length - 1; i >= 0; i--) {
18245
- if (phrases.some((ph) => unreviewed[i].includes(ph))) {
18259
+ if (entries.some((c2) => unreviewed[i].includes(c2))) {
18246
18260
  splicedForBudgetPhrase.push(unreviewed[i]);
18247
18261
  unreviewed.splice(i, 1);
18248
18262
  }
@@ -18887,7 +18901,7 @@ ${footer}`;
18887
18901
  ] : [];
18888
18902
  const deferredShown = deferredSuggestions.slice(0, MAX_DEFERRED_SUGGESTION_LINES).map(renderDeferredEntry).map(boundDeferredLine);
18889
18903
  const deferredMore = deferredSuggestions.length - deferredShown.length;
18890
- const deferredRound = deferredSuggestions.length ? prevRound + 1 : 0;
18904
+ const deferredRound = deferredSuggestions.length ? Math.min(prevRound + 1, LEDGER_MAX_ROUND) : 0;
18891
18905
  const unlicensedDeferralBlock = unlicensedDeferral === null ? [] : [
18892
18906
  {
18893
18907
  keep: 1,
@@ -22277,7 +22291,9 @@ function recoverLedger(reviews, login) {
22277
22291
  }
22278
22292
  if (!best) return { recovered: null, sawOwnReview };
22279
22293
  let ledger = best.foreign ? stripAnchor(best.ledger) : best.ledger;
22280
- if (best.foreign && bestOwn) {
22294
+ let mergedOverOwn = false;
22295
+ if (best.foreign && bestOwn && bestOwn.ledger.findings.length > 0) {
22296
+ mergedOverOwn = true;
22281
22297
  const ownIds = new Set(bestOwn.ledger.findings.map((f) => f.id));
22282
22298
  const merged = [
22283
22299
  ...bestOwn.ledger.findings,
@@ -22297,7 +22313,8 @@ function recoverLedger(reviews, login) {
22297
22313
  commitId: best.commitId,
22298
22314
  reviewId: best.id,
22299
22315
  foreign: best.foreign,
22300
- author: best.author
22316
+ author: best.author,
22317
+ merged: mergedOverOwn
22301
22318
  },
22302
22319
  sawOwnReview
22303
22320
  };
@@ -22312,7 +22329,8 @@ function persistedAnchorSha(sideFilePath) {
22312
22329
  }
22313
22330
  }
22314
22331
  __name(persistedAnchorSha, "persistedAnchorSha");
22315
- function persistRecoveredLedger(sideFilePath, recovered, noOwnReview, identityKnown) {
22332
+ function persistRecoveredLedger(sideFilePath, recovered, flags) {
22333
+ const { noOwnReview, identityKnown } = flags;
22316
22334
  const writeAtomic = /* @__PURE__ */ __name((text2) => {
22317
22335
  const tmp = `${sideFilePath}.${process.pid}.tmp`;
22318
22336
  writeFileSync11(tmp, text2);
@@ -22416,7 +22434,7 @@ function anchorRuling(ledger, running, code2, persistedSha) {
22416
22434
  return `**Do NOT pass the reviewed-at sha as \`--since\`, and do not run git against it yourself.** It was certified by ${certifier}, and this review runs as ${runner}: "clean up to that sha" is the recorded identity's verdict, so scoping to it would carry this round past code the current one never reviewed. Review the FULL range. The findings below are still owed their rulings \u2014 the work list carries across models, only the anchor does not.`;
22417
22435
  }
22418
22436
  __name(anchorRuling, "anchorRuling");
22419
- function renderLedgerSection(ledger, running, author = null, persistedSha = null) {
22437
+ function renderLedgerSection(ledger, running, author = null, merged = false, persistedSha = null) {
22420
22438
  const cell = /* @__PURE__ */ __name((v) => v.replace(/\\/g, "\\\\").replace(/\|/g, "\\|").replace(/[\r\n]+/g, " "), "cell");
22421
22439
  const code2 = /* @__PURE__ */ __name((v) => cell(v).replace(/`/g, "'"), "code");
22422
22440
  const rows = ledger.findings.map(
@@ -22425,12 +22443,12 @@ function renderLedgerSection(ledger, running, author = null, persistedSha = null
22425
22443
  return [
22426
22444
  "## Previous /review round (machine ledger)",
22427
22445
  "",
22428
- `Round ${ledger.round}${ledger.sha ? `, reviewed at \`${code2(ledger.sha)}\`${ledger.model ? ` by \`${code2(ledger.model)}\`` : ""}` : ""}, recovered from the marker ${author ? `**@${cell(author)}**'s last posted review carried \u2014 another account, so these are THEIR claims and no incremental anchor travelled with them (the sha never crosses accounts; this round is full-range unless a local cache supplies one)` : `this account's last posted review carried`}. **Every entry below is owed a this-round ruling** (fixed / still stands / cannot tell / superseded by <class-id>) under Step 6's previous-round rules \u2014 the ledger is a work list, not a verdict; re-assert each claim against the code before repeating or retiring it.${ledger.sha ? ` ${anchorRuling(ledger, running, code2, persistedSha)}` : ""}`,
22446
+ `Round ${ledger.round}${ledger.sha ? `, reviewed at \`${code2(ledger.sha)}\`${ledger.model ? ` by \`${code2(ledger.model)}\`` : ""}` : ""}, recovered from ${author ? merged ? `**@${cell(author)}**'s round-${ledger.round} marker MERGED over this account's own latest findings \u2014 entries this account certified are its own claims, the rest are @${cell(author)}'s, and no incremental anchor travelled with the foreign marker (the sha never crosses accounts; this round is full-range unless a local cache supplies one)` : `the marker **@${cell(author)}**'s last posted review carried \u2014 another account, so these are THEIR claims and no incremental anchor travelled with them (the sha never crosses accounts; this round is full-range unless a local cache supplies one)` : `the marker this account's last posted review carried`}. **Every entry below is owed a this-round ruling** (fixed / still stands / cannot tell / superseded by <class-id>) under Step 6's previous-round rules \u2014 the ledger is a work list, not a verdict; re-assert each claim against the code before repeating or retiring it.${ledger.sha ? ` ${anchorRuling(ledger, running, code2, persistedSha)}` : ""}`,
22429
22447
  // A truncated ledger must not read like a complete one. `dropped` exists
22430
22448
  // to draw that line, and this is the only place a reader sees the list.
22431
22449
  ...ledger.dropped ? [
22432
22450
  "",
22433
- `**This list is PARTIAL**: ${ledger.dropped} further finding(s) from round ${ledger.round} did not fit the marker's size cap and are not here. Absence below is not evidence a finding was fixed \u2014 say so rather than reporting the missing ones as retired.`
22451
+ merged ? `**This list is PARTIAL**: ${ledger.dropped} further finding(s) did not survive into this merged list \u2014 lost to a source marker's size cap or to the merge's own re-cap, and not attributable to any single round's marker. Absence below is not evidence a finding was fixed \u2014 say so rather than reporting the missing ones as retired.` : `**This list is PARTIAL**: ${ledger.dropped} further finding(s) from round ${ledger.round} did not fit the marker's size cap and are not here. Absence below is not evidence a finding was fixed \u2014 say so rather than reporting the missing ones as retired.`
22434
22452
  ] : [],
22435
22453
  "",
22436
22454
  "| id | severity | location | title |",
@@ -22440,7 +22458,7 @@ function renderLedgerSection(ledger, running, author = null, persistedSha = null
22440
22458
  ].join("\n");
22441
22459
  }
22442
22460
  __name(renderLedgerSection, "renderLedgerSection");
22443
- function buildMarkdown(prNumber, ownerRepo, meta, inline2, issue, reviews, prevLedger = null, me = "", prevLedgerAuthor = null, host, persistedSha = null) {
22461
+ function buildMarkdown(prNumber, ownerRepo, meta, inline2, issue, reviews, prevLedger = null, me = "", prevLedgerAuthor = null, prevLedgerMerged = false, host, persistedSha = null) {
22444
22462
  const {
22445
22463
  openRoots,
22446
22464
  openBlockerRoots,
@@ -22485,6 +22503,7 @@ function buildMarkdown(prNumber, ownerRepo, meta, inline2, issue, reviews, prevL
22485
22503
  prevLedger,
22486
22504
  roundModelIdFrom(process.env),
22487
22505
  prevLedgerAuthor,
22506
+ prevLedgerMerged,
22488
22507
  persistedSha
22489
22508
  )
22490
22509
  );
@@ -22640,23 +22659,27 @@ async function runPrContext(args) {
22640
22659
  }
22641
22660
  const prevLedger = prevRecovered?.ledger ?? null;
22642
22661
  const prevLedgerAuthor = prevRecovered?.foreign ? prevRecovered.author ?? null : null;
22662
+ const prevLedgerMerged = prevRecovered?.merged ?? false;
22643
22663
  persistRecoveredLedger(
22644
22664
  join17(dirname12(out), `qwen-review-pr-${prNumber}-prev-ledger.json`),
22645
22665
  prevRecovered,
22646
- // Deletion is licensed ONLY by proof of true absence: a CONFIRMED
22647
- // identity, and a non-empty list this run walked in which no submitted
22648
- // review by that identity exists. An empty `reviews` may be an error
22649
- // envelope ghApiAll flattened to []; an own review whose marker fails to
22650
- // parse is a persistent state, not absence; and a failed identity lookup
22651
- // proves nothing about anyone all take the conservative strip path.
22652
- // (A recovered foreign ledger also protects the file, but through the
22653
- // helper's own recovered-first branch, not through this flag.)
22654
- reviews.length > 0 && identityKnown && !recoveryThrew && !sawOwnReview,
22655
- // Separately from deletion: an ANONYMOUS recovery (identity unknown)
22656
- // must not replace the persisted work list the helper's fourth
22657
- // outcome. Every marker walks as foreign without a `me`, so the union
22658
- // never protected the own list this run.
22659
- identityKnown
22666
+ {
22667
+ // Deletion is licensed ONLY by proof of true absence: a CONFIRMED
22668
+ // identity, and a non-empty list this run walked in which no submitted
22669
+ // review by that identity exists. An empty `reviews` may be an error
22670
+ // envelope ghApiAll flattened to []; an own review whose marker fails
22671
+ // to parse is a persistent state, not absence; and a failed identity
22672
+ // lookup proves nothing about anyone all take the conservative strip
22673
+ // path. (A recovered foreign ledger also protects the file, but
22674
+ // through the helper's own recovered-first branch, not through this
22675
+ // flag.)
22676
+ noOwnReview: reviews.length > 0 && identityKnown && !recoveryThrew && !sawOwnReview,
22677
+ // Separately from deletion: an ANONYMOUS recovery (identity unknown)
22678
+ // must not replace the persisted work list the helper's fourth
22679
+ // outcome. Every marker walks as foreign without a `me`, so the union
22680
+ // never protected the own list this run.
22681
+ identityKnown
22682
+ }
22660
22683
  );
22661
22684
  const persistedSha = persistedAnchorSha(
22662
22685
  join17(dirname12(out), `qwen-review-pr-${prNumber}-prev-ledger.json`)
@@ -22673,6 +22696,7 @@ async function runPrContext(args) {
22673
22696
  prevLedger,
22674
22697
  me,
22675
22698
  prevLedgerAuthor,
22699
+ prevLedgerMerged,
22676
22700
  bakeHost,
22677
22701
  persistedSha
22678
22702
  );
@@ -25348,7 +25372,7 @@ function buildRoleBrief(report, role, opts = {}) {
25348
25372
  ` --out ${resolve18(dirname18(opts.planPath), outName)}`,
25349
25373
  "```",
25350
25374
  "",
25351
- `**If the report says work is left, run it again with \`--resume\`.** The ${SHELL_TOOL_MAX_TIMEOUT_MS / 1e3}-second ceiling is per CALL, not per run: this repo needs more than one call to finish its suites (install, the builds, then \`packages/core\` at 106s and \`packages/cli\` at 401s, before the rest). Work is left when \`testScope.notRun\` is non-empty, or when any \`test[]\` entry has \`"clamped": true\` \u2014 a suite the budget started too late and killed, which says nothing about the suite. A third shape carries no field at all: a single-package repo whose budget ran out before its one suite has an empty \`test[]\` and no \`testScope\`, and only its \`note\` says so \u2014 read the note before calling the dimension finished. That shape cannot be continued (a continuation has no recorded scope to read, and answers "ended before its test phase" without running anything): report the dimension UNFINISHED and do not spend a continuation on it. A resumed call skips install and build and runs only what is left, merging into the SAME report file. Same \`timeout: ${SHELL_TOOL_MAX_TIMEOUT_MS}\`, and at most ${MAX_RESUME_CALLS} continuations \u2014 then report what the run has:`,
25375
+ `**If the report says work is left, run it again with \`--resume\`.** The ${SHELL_TOOL_MAX_TIMEOUT_MS / 1e3}-second ceiling is per CALL, not per run: this repo needs more than one call to finish its suites (install, the builds, then \`packages/core\` at 106s and \`packages/cli\` at 401s, before the rest). Work is left when \`testScope.notRun\` is non-empty, or when any \`test[]\` entry has \`"clamped": true\` \u2014 a suite the budget started too late and killed, which says nothing about the suite. A third shape ends before any suite: a single-package repo whose budget ran out before its one suite has an empty \`test[]\`, no \`testScope\`, and \`"endedBeforeTests": true\` \u2014 the report's own stamp \u2014 with the note naming the unrun suite. That shape cannot be continued (a continuation has no recorded scope to read; a \`--resume\` on it answers "ended before its test phase" and points at a fresh run): report the dimension UNFINISHED and do not spend a continuation on it. A resumed call skips install and build and runs only what is left, merging into the SAME report file. Same \`timeout: ${SHELL_TOOL_MAX_TIMEOUT_MS}\`, and at most ${MAX_RESUME_CALLS} continuations \u2014 then report what the run has:`,
25352
25376
  "",
25353
25377
  "```bash",
25354
25378
  `"\${QWEN_CODE_CLI:-qwen}" review build-test \\`,
@@ -26516,8 +26540,9 @@ function resumeNpmToolchain(args, previous) {
26516
26540
  ];
26517
26541
  if (work.length === 0) {
26518
26542
  const neverTested = previous.test.length === 0 && !previous.testScope;
26543
+ const endedEarly = neverTested && (previous.buildOnly === true || previous.ok === false || previous.endedBeforeTests === true);
26519
26544
  return withNote(
26520
- neverTested ? "Nothing to resume: the run being continued ended before its test phase, so it left no scope to continue \u2014 no suite ran. Re-run build-test without --resume." : "Nothing to resume: the run being continued reached every suite in scope."
26545
+ endedEarly ? "Nothing to resume: the run being continued ended before its test phase, so it left no scope to continue \u2014 no suite ran. Re-run build-test without --resume." : neverTested ? "Nothing to resume: the run being continued completed with no suite to run." : "Nothing to resume: the run being continued reached every suite in scope."
26521
26546
  );
26522
26547
  }
26523
26548
  const ranDirs = [];
@@ -26559,9 +26584,13 @@ function resumeNpmToolchain(args, previous) {
26559
26584
  liveSegments.push(
26560
26585
  `a --resume call ran ${ranDirs.length + replaced.size} more command(s), ${outstanding.length} still to run: ` + outstanding.join(", ")
26561
26586
  );
26562
- } else if (stillClamped.length > 0) {
26587
+ }
26588
+ const provisionalOnly = stillClamped.filter(
26589
+ (c) => !outstanding.includes(c)
26590
+ );
26591
+ if (provisionalOnly.length > 0) {
26563
26592
  liveSegments.push(
26564
- `a --resume call left ${stillClamped.length} command(s) provisional (killed on a budget-shortened deadline): ${stillClamped.join(", ")}`
26593
+ `a --resume call left ${provisionalOnly.length} command(s) provisional (killed on a budget-shortened deadline): ${provisionalOnly.join(", ")}`
26565
26594
  );
26566
26595
  }
26567
26596
  const caveat = liveSegments.join("; ");
@@ -26585,6 +26614,11 @@ function resumeNpmToolchain(args, previous) {
26585
26614
  // Recomputed, not inherited: the previous `false` may have been nothing
26586
26615
  // but the clamped timeout this call just replaced with a pass.
26587
26616
  ok: previous.build.every(succeeded) && mergedTest.every(succeeded),
26617
+ // Recomputed for the same staleness reason: the stamp claims the test
26618
+ // phase ENTERED and ran nothing, which any suite in `mergedTest`
26619
+ // falsifies. A continuation that ran none keeps it — the claim still
26620
+ // holds then. JSON.stringify drops the undefined key.
26621
+ endedBeforeTests: mergedTest.length === 0 ? previous.endedBeforeTests : void 0,
26588
26622
  timedOut,
26589
26623
  // REPLACED, not appended. The note being continued says things that were
26590
26624
  // true when it was written and are not now — "the whole-call budget was
@@ -26633,9 +26667,10 @@ function resumedNote(previous, test2, timedOut, stillPending, stillClamped) {
26633
26667
  `The budget was spent with ${stillPending.length} command(s) still to run \u2014 not run: ${stillPending.join(", ")}. Resume again to reach them.`
26634
26668
  );
26635
26669
  }
26636
- if (stillClamped.length > 0) {
26670
+ const provisionalOnly = stillClamped.filter((c) => !stillPending.includes(c));
26671
+ if (provisionalOnly.length > 0) {
26637
26672
  parts.push(
26638
- `${stillClamped.length} command(s) are still provisional \u2014 killed on a deadline the budget shortened, not on their own: ${stillClamped.join(", ")}. Resume again to give them a full one.`
26673
+ `${provisionalOnly.length} command(s) are still provisional \u2014 killed on a deadline the budget shortened, not on their own: ${provisionalOnly.join(", ")}. Resume again to give them a full one.`
26639
26674
  );
26640
26675
  }
26641
26676
  if (stillPending.length === 0 && stillClamped.length === 0) {
@@ -26700,6 +26735,10 @@ function runNpmToolchain(args) {
26700
26735
  build: [],
26701
26736
  test: [],
26702
26737
  ...testScope ? { testScope } : {},
26738
+ // The probe stamp rides EVERY producer path: this return already
26739
+ // branches on args.buildOnly for its note, and a probe report without
26740
+ // the stamp lost its probe answer on --resume.
26741
+ ...args.buildOnly ? { buildOnly: true } : {},
26703
26742
  ok: true,
26704
26743
  timedOut: [],
26705
26744
  note: args.buildOnly ? `The diff changes ${changed.length} file(s), none of them inside a workspace. There is no package to build, and tests are out of scope for a build-only probe.` : testScope?.caveat ? `The diff changes ${changed.length} file(s), none of them inside a workspace. There is no package to build and no test to run, but the scope decision recorded a caveat: ${testScope.caveat}.` : `The diff changes ${changed.length} file(s), none of them inside a workspace (nothing the workspaces' tests can feel). There is no package to build and no test to run \u2014 this is a complete answer, not a skipped step.`
@@ -26722,7 +26761,12 @@ function runNpmToolchain(args) {
26722
26761
  test: [],
26723
26762
  ok: true,
26724
26763
  timedOut: [],
26725
- note: ""
26764
+ note: "",
26765
+ // Stamped structurally, not narrated: `--resume` on a report with no
26766
+ // tests and no scope needs to tell a deliberate probe apart from a
26767
+ // completed zero-suite run, and the note is prose an agent must never
26768
+ // have to parse.
26769
+ ...args.buildOnly ? { buildOnly: true } : {}
26726
26770
  };
26727
26771
  const npmLock = existsSync10(join20(root, "package-lock.json"));
26728
26772
  const installComplete = /* @__PURE__ */ __name(() => existsSync10(join20(root, "node_modules", ".package-lock.json")), "installComplete");
@@ -26876,6 +26920,9 @@ function runNpmToolchain(args) {
26876
26920
  if (r.timedOut) results.timedOut.push(r.command);
26877
26921
  if (r.exitCode !== 0) results.ok = false;
26878
26922
  }
26923
+ if (results.test.length === 0 && notRun.length > 0) {
26924
+ results.endedBeforeTests = true;
26925
+ }
26879
26926
  notRun.sort();
26880
26927
  const partialNote = [
26881
26928
  notBuilt.length > 0 ? `the build phase reached the whole-call budget \u2014 not built: ` + notBuilt.join(", ") : "",
@@ -27098,11 +27145,16 @@ function previousReport(out) {
27098
27145
  })();
27099
27146
  const strings = /* @__PURE__ */ __name((v) => Array.isArray(v) && v.every((e) => typeof e === "string" && e.length > 0), "strings");
27100
27147
  const affectedOk = strings(parsed.affected);
27148
+ const buildOnlyShape = parsed.buildOnly;
27149
+ const buildOnlyOk = buildOnlyShape === void 0 || typeof buildOnlyShape === "boolean";
27150
+ const endedBeforeShape = parsed.endedBeforeTests;
27151
+ const endedBeforeOk = endedBeforeShape === void 0 || typeof endedBeforeShape === "boolean";
27152
+ const okOk = typeof parsed.ok === "boolean";
27101
27153
  const notBuiltShape = parsed.notBuilt;
27102
27154
  const notBuiltOk = notBuiltShape === void 0 || strings(notBuiltShape);
27103
27155
  const scope = shape.testScope;
27104
27156
  const scopeOk = scope === void 0 || typeof scope === "object" && scope !== null && !Array.isArray(scope) && strings(scope.workspaces) && (scope.notRun === void 0 || strings(scope.notRun)) && (scope.caveat === void 0 || typeof scope.caveat === "string") && (scope.liveCaveat === void 0 || typeof scope.liveCaveat === "string");
27105
- if (!commandsOk(shape.test) || !commandsOk(shape.build) || !strings(shape.timedOut) || !affectedOk || !notBuiltOk || !scopeOk || !runOk) {
27157
+ if (!commandsOk(shape.test) || !commandsOk(shape.build) || !strings(shape.timedOut) || !affectedOk || !buildOnlyOk || !endedBeforeOk || !okOk || !notBuiltOk || !scopeOk || !runOk) {
27106
27158
  throw new Error(
27107
27159
  `build-test: --resume expected a build-test report at ${out}, and that file is not one. Run build-test without --resume first.`
27108
27160
  );
@@ -27500,7 +27552,7 @@ init_esbuild_shims();
27500
27552
  import { spawnSync as spawnSync6 } from "node:child_process";
27501
27553
  import { existsSync as existsSync13, mkdirSync as mkdirSync22, readFileSync as readFileSync29, writeFileSync as writeFileSync20 } from "node:fs";
27502
27554
  import { dirname as dirname20, resolve as resolve21 } from "node:path";
27503
- var RERUNNABLE_COMMAND_RE = /^npm test(?: --workspace="[\w@./-]+")?$/;
27555
+ var RERUNNABLE_COMMAND_RE = TEST_COMMAND_RE;
27504
27556
  var TRIM_MARKER_RE = /\.\.\. \[\d+ characters omitted/;
27505
27557
  function run2(command, cwd, timeoutMs) {
27506
27558
  const started = Date.now();
@@ -33226,10 +33278,10 @@ var updateCommand3 = {
33226
33278
  stdioHelpers,
33227
33279
  { updateEventEmitter }
33228
33280
  ] = await Promise.all([
33229
- import("./settings-WCVB34HW.js"),
33230
- import("./updateCheck-KYDCBLSF.js"),
33231
- import("./installationInfo-CO47QX3Q.js"),
33232
- import("./standalone-update-ALRIPWSM.js"),
33281
+ import("./settings-ESZ3NWAP.js"),
33282
+ import("./updateCheck-MTZIVGT5.js"),
33283
+ import("./installationInfo-NMQIOUGY.js"),
33284
+ import("./standalone-update-P42HDFXX.js"),
33233
33285
  import("./stdioHelpers-7A2EE64Z.js"),
33234
33286
  import("./updateEventEmitter-5MKC7BLQ.js")
33235
33287
  ]);
@@ -34420,7 +34472,7 @@ async function loadCliConfig(settings, argv, cwd = process.cwd(), overrideExtens
34420
34472
  disabledSlashCommands: disabledSlashCommands.length > 0 ? disabledSlashCommands : void 0,
34421
34473
  disabledSkillNamesProvider: bareMode || safeMode ? void 0 : disabledSkillNamesProvider,
34422
34474
  terminalImageRenderSupportProvider: interactive ? async () => {
34423
- const { getTerminalImageRenderSupport } = await import("./terminal-image-renderer-TEBO6ONY.js");
34475
+ const { getTerminalImageRenderSupport } = await import("./terminal-image-renderer-6J2NPL32.js");
34424
34476
  return getTerminalImageRenderSupport();
34425
34477
  } : void 0,
34426
34478
  disabledSkillLevels: bareMode || safeMode || !Array.isArray(settings.skills?.disabledLevels) ? void 0 : settings.skills.disabledLevels.filter(isSkillLevel),
@@ -2,16 +2,16 @@
2
2
  "use strict";
3
3
  import {
4
4
  functionResponsePartsToString
5
- } from "./chunk-XO24LIZC.js";
5
+ } from "./chunk-6RDZLBSJ.js";
6
6
  import {
7
7
  observeHeadlessToolResultProjection,
8
8
  observeHeadlessToolResultWire,
9
9
  projectJsonStringToByteBudget
10
- } from "./chunk-EOCQCNV4.js";
10
+ } from "./chunk-K2Y45XXS.js";
11
11
  import {
12
12
  parseAndFormatApiError,
13
13
  toolResultBoundaryArtifact
14
- } from "./chunk-XC377TLN.js";
14
+ } from "./chunk-OFTPCOGR.js";
15
15
  import {
16
16
  formatVisionBridgeNoticeDisplay,
17
17
  isVisionBridgeNoticeDisplay
@@ -27,10 +27,10 @@ import {
27
27
  } from "./chunk-3VUENPWF.js";
28
28
  import {
29
29
  loadSettings
30
- } from "./chunk-OLZSWUZR.js";
30
+ } from "./chunk-VFP5YOHJ.js";
31
31
  import {
32
32
  MCP_BUDGET_WARN_FRACTION
33
- } from "./chunk-XC377TLN.js";
33
+ } from "./chunk-OFTPCOGR.js";
34
34
  import {
35
35
  parsePositiveIntegerEnv
36
36
  } from "./chunk-6PVPNMXU.js";
@@ -422,7 +422,7 @@ var serveCommand = {
422
422
  }
423
423
  const externalToolGuardToken = process.env[EXTERNAL_TOOL_GUARD_TOKEN_ENV] ?? "";
424
424
  delete process.env[EXTERNAL_TOOL_GUARD_TOKEN_ENV];
425
- const { runQwenServe } = await import("./run-qwen-serve-7RHU3NSV.js");
425
+ const { runQwenServe } = await import("./run-qwen-serve-UR3DYDAF.js");
426
426
  try {
427
427
  const handle = await runQwenServe({
428
428
  port: argv.port,
@@ -5,10 +5,10 @@ import {
5
5
  } from "./chunk-2AUM35J5.js";
6
6
  import {
7
7
  getNpmCliPath
8
- } from "./chunk-DRKYT2TR.js";
8
+ } from "./chunk-WAO53ZQF.js";
9
9
  import {
10
10
  t
11
- } from "./chunk-IOTPI425.js";
11
+ } from "./chunk-VTOLYFWM.js";
12
12
  import {
13
13
  getPackageJson
14
14
  } from "./chunk-WZMH7II3.js";
@@ -4,7 +4,7 @@ import {
4
4
  Client,
5
5
  So,
6
6
  StdioClientTransport
7
- } from "./chunk-XC377TLN.js";
7
+ } from "./chunk-OFTPCOGR.js";
8
8
  import "./chunk-GOFAQQZA.js";
9
9
  import "./chunk-5M6IDOMF.js";
10
10
  import "./chunk-TWPJO254.js";
@@ -14,7 +14,7 @@ import "./chunk-SLILKYV2.js";
14
14
  import "./chunk-NVRMCWTP.js";
15
15
  import "./chunk-AKBOLMUF.js";
16
16
  import "./chunk-6PVPNMXU.js";
17
- import "./chunk-SR2LYSMT.js";
17
+ import "./chunk-544KT7X4.js";
18
18
  import "./chunk-IRH27ZC2.js";
19
19
  import "./chunk-QHWCP53L.js";
20
20
  import "./chunk-OBJYN4MX.js";
@@ -64,7 +64,7 @@ import {
64
64
  BaseDeclarativeTool,
65
65
  BaseToolInvocation
66
66
  } from "./chunk-6HY6IF3Z.js";
67
- import "./chunk-QIHHJKXT.js";
67
+ import "./chunk-2A6VQJYK.js";
68
68
  import "./chunk-F6WFNA7U.js";
69
69
  import "./chunk-WZAD4ZNJ.js";
70
70
  import "./chunk-FPGTNKCP.js";
@@ -4,12 +4,12 @@ import {
4
4
  collectContextData,
5
5
  contextCommand,
6
6
  formatContextUsageText
7
- } from "./chunk-X3YA3YGG.js";
7
+ } from "./chunk-7VNHO4MN.js";
8
8
  import "./chunk-4WGODMVR.js";
9
9
  import "./chunk-EKTCKZV5.js";
10
- import "./chunk-IOTPI425.js";
10
+ import "./chunk-VTOLYFWM.js";
11
11
  import "./chunk-5EJZE3FP.js";
12
- import "./chunk-XC377TLN.js";
12
+ import "./chunk-OFTPCOGR.js";
13
13
  import "./chunk-GOFAQQZA.js";
14
14
  import "./chunk-5M6IDOMF.js";
15
15
  import "./chunk-TWPJO254.js";
@@ -19,7 +19,7 @@ import "./chunk-SLILKYV2.js";
19
19
  import "./chunk-NVRMCWTP.js";
20
20
  import "./chunk-AKBOLMUF.js";
21
21
  import "./chunk-6PVPNMXU.js";
22
- import "./chunk-SR2LYSMT.js";
22
+ import "./chunk-544KT7X4.js";
23
23
  import "./chunk-IRH27ZC2.js";
24
24
  import "./chunk-QHWCP53L.js";
25
25
  import "./chunk-OBJYN4MX.js";
@@ -66,7 +66,7 @@ import "./chunk-CHHABXPE.js";
66
66
  import "./chunk-MA2HEDVP.js";
67
67
  import "./chunk-XUJNK7Y6.js";
68
68
  import "./chunk-6HY6IF3Z.js";
69
- import "./chunk-QIHHJKXT.js";
69
+ import "./chunk-2A6VQJYK.js";
70
70
  import "./chunk-F6WFNA7U.js";
71
71
  import "./chunk-WZAD4ZNJ.js";
72
72
  import "./chunk-FPGTNKCP.js";
@@ -6,7 +6,7 @@ import {
6
6
  findProviderById,
7
7
  getDefaultModelIds,
8
8
  resolveBaseUrl
9
- } from "./chunk-XC377TLN.js";
9
+ } from "./chunk-OFTPCOGR.js";
10
10
  import "./chunk-GOFAQQZA.js";
11
11
  import "./chunk-5M6IDOMF.js";
12
12
  import "./chunk-TWPJO254.js";
@@ -16,7 +16,7 @@ import "./chunk-SLILKYV2.js";
16
16
  import "./chunk-NVRMCWTP.js";
17
17
  import "./chunk-AKBOLMUF.js";
18
18
  import "./chunk-6PVPNMXU.js";
19
- import "./chunk-SR2LYSMT.js";
19
+ import "./chunk-544KT7X4.js";
20
20
  import "./chunk-IRH27ZC2.js";
21
21
  import "./chunk-QHWCP53L.js";
22
22
  import "./chunk-OBJYN4MX.js";
@@ -80,7 +80,7 @@ import "./chunk-CHHABXPE.js";
80
80
  import "./chunk-MA2HEDVP.js";
81
81
  import "./chunk-XUJNK7Y6.js";
82
82
  import "./chunk-6HY6IF3Z.js";
83
- import "./chunk-QIHHJKXT.js";
83
+ import "./chunk-2A6VQJYK.js";
84
84
  import "./chunk-F6WFNA7U.js";
85
85
  import "./chunk-WZAD4ZNJ.js";
86
86
  import "./chunk-FPGTNKCP.js";