audit-tools 0.44.0 → 0.46.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 (266) hide show
  1. package/README.md +15 -2
  2. package/dist/audit/cli/charterExtractionPrompt.d.ts.map +1 -1
  3. package/dist/audit/cli/charterExtractionPrompt.js +11 -1
  4. package/dist/audit/cli/charterExtractionPrompt.js.map +1 -1
  5. package/dist/audit/cli/cleanupCommand.d.ts +25 -0
  6. package/dist/audit/cli/cleanupCommand.d.ts.map +1 -1
  7. package/dist/audit/cli/cleanupCommand.js +69 -0
  8. package/dist/audit/cli/cleanupCommand.js.map +1 -1
  9. package/dist/audit/cli/dispatch/hostHandoff.d.ts +64 -3
  10. package/dist/audit/cli/dispatch/hostHandoff.d.ts.map +1 -1
  11. package/dist/audit/cli/dispatch/hostHandoff.js +247 -99
  12. package/dist/audit/cli/dispatch/hostHandoff.js.map +1 -1
  13. package/dist/audit/cli/dispatch/packetFilter.d.ts +1 -1
  14. package/dist/audit/cli/dispatch.d.ts +1 -1
  15. package/dist/audit/cli/dispatch.d.ts.map +1 -1
  16. package/dist/audit/cli/dispatch.js +1 -1
  17. package/dist/audit/cli/dispatch.js.map +1 -1
  18. package/dist/audit/cli/fanoutLanes.d.ts.map +1 -1
  19. package/dist/audit/cli/fanoutLanes.js +6 -1
  20. package/dist/audit/cli/fanoutLanes.js.map +1 -1
  21. package/dist/audit/cli/laneSubmissions.d.ts +16 -2
  22. package/dist/audit/cli/laneSubmissions.d.ts.map +1 -1
  23. package/dist/audit/cli/laneSubmissions.js +38 -27
  24. package/dist/audit/cli/laneSubmissions.js.map +1 -1
  25. package/dist/audit/cli/nextStepCommand.d.ts.map +1 -1
  26. package/dist/audit/cli/nextStepCommand.js +9 -6
  27. package/dist/audit/cli/nextStepCommand.js.map +1 -1
  28. package/dist/audit/cli/nextStepHelpers.d.ts +39 -4
  29. package/dist/audit/cli/nextStepHelpers.d.ts.map +1 -1
  30. package/dist/audit/cli/nextStepHelpers.js +132 -42
  31. package/dist/audit/cli/nextStepHelpers.js.map +1 -1
  32. package/dist/audit/cli/reviewRun.d.ts +1 -1
  33. package/dist/audit/cli/reviewRun.d.ts.map +1 -1
  34. package/dist/audit/cli/reviewRun.js +2 -9
  35. package/dist/audit/cli/reviewRun.js.map +1 -1
  36. package/dist/audit/cli/sampleRunCommand.d.ts.map +1 -1
  37. package/dist/audit/cli/sampleRunCommand.js +12 -1
  38. package/dist/audit/cli/sampleRunCommand.js.map +1 -1
  39. package/dist/audit/cli/semanticReviewStep.d.ts +5 -2
  40. package/dist/audit/cli/semanticReviewStep.d.ts.map +1 -1
  41. package/dist/audit/cli/semanticReviewStep.js +28 -1
  42. package/dist/audit/cli/semanticReviewStep.js.map +1 -1
  43. package/dist/audit/cli/steps.d.ts +6 -6
  44. package/dist/audit/cli/unacceptResultsCommand.d.ts +18 -0
  45. package/dist/audit/cli/unacceptResultsCommand.d.ts.map +1 -0
  46. package/dist/audit/cli/unacceptResultsCommand.js +49 -0
  47. package/dist/audit/cli/unacceptResultsCommand.js.map +1 -0
  48. package/dist/audit/cli.d.ts +6 -0
  49. package/dist/audit/cli.d.ts.map +1 -1
  50. package/dist/audit/cli.js +34 -59
  51. package/dist/audit/cli.js.map +1 -1
  52. package/dist/audit/contracts/findingContractPrompt.d.ts +11 -0
  53. package/dist/audit/contracts/findingContractPrompt.d.ts.map +1 -0
  54. package/dist/audit/contracts/findingContractPrompt.js +112 -0
  55. package/dist/audit/contracts/findingContractPrompt.js.map +1 -0
  56. package/dist/audit/contracts/workerSchemas.d.ts +106 -42
  57. package/dist/audit/contracts/workerSchemas.d.ts.map +1 -1
  58. package/dist/audit/contracts/workerSchemas.js +16 -7
  59. package/dist/audit/contracts/workerSchemas.js.map +1 -1
  60. package/dist/audit/contracts/wrapperResponse.d.ts +52 -28
  61. package/dist/audit/contracts/wrapperResponse.d.ts.map +1 -1
  62. package/dist/audit/contracts/wrapperResponse.js +8 -5
  63. package/dist/audit/contracts/wrapperResponse.js.map +1 -1
  64. package/dist/audit/decompose/sources.d.ts.map +1 -1
  65. package/dist/audit/decompose/sources.js +21 -5
  66. package/dist/audit/decompose/sources.js.map +1 -1
  67. package/dist/audit/extractors/analyzers/registry.d.ts +8 -5
  68. package/dist/audit/extractors/analyzers/registry.d.ts.map +1 -1
  69. package/dist/audit/extractors/analyzers/registry.js +28 -7
  70. package/dist/audit/extractors/analyzers/registry.js.map +1 -1
  71. package/dist/audit/extractors/designAssessment.js +1 -1
  72. package/dist/audit/extractors/gitHistory.d.ts +1 -1
  73. package/dist/audit/extractors/gitHistory.js +1 -1
  74. package/dist/audit/extractors/graph.d.ts +1 -1
  75. package/dist/audit/extractors/graph.js +1 -1
  76. package/dist/audit/extractors/risk.d.ts +1 -1
  77. package/dist/audit/extractors/risk.js +1 -1
  78. package/dist/audit/io/artifacts.d.ts.map +1 -1
  79. package/dist/audit/io/artifacts.js +5 -5
  80. package/dist/audit/io/artifacts.js.map +1 -1
  81. package/dist/audit/orchestrator/acquisitionExecutor.d.ts +11 -6
  82. package/dist/audit/orchestrator/acquisitionExecutor.d.ts.map +1 -1
  83. package/dist/audit/orchestrator/acquisitionExecutor.js +1 -1
  84. package/dist/audit/orchestrator/acquisitionExecutor.js.map +1 -1
  85. package/dist/audit/orchestrator/advance.d.ts +14 -10
  86. package/dist/audit/orchestrator/advance.d.ts.map +1 -1
  87. package/dist/audit/orchestrator/advance.js +49 -24
  88. package/dist/audit/orchestrator/advance.js.map +1 -1
  89. package/dist/audit/orchestrator/advanceTypes.d.ts +14 -0
  90. package/dist/audit/orchestrator/advanceTypes.d.ts.map +1 -1
  91. package/dist/audit/orchestrator/autoFixExecutor.d.ts +20 -1
  92. package/dist/audit/orchestrator/autoFixExecutor.d.ts.map +1 -1
  93. package/dist/audit/orchestrator/autoFixExecutor.js +77 -15
  94. package/dist/audit/orchestrator/autoFixExecutor.js.map +1 -1
  95. package/dist/audit/orchestrator/dependencyMap.js +1 -1
  96. package/dist/audit/orchestrator/dependencyMap.js.map +1 -1
  97. package/dist/audit/orchestrator/executorRunners.d.ts.map +1 -1
  98. package/dist/audit/orchestrator/executorRunners.js +18 -4
  99. package/dist/audit/orchestrator/executorRunners.js.map +1 -1
  100. package/dist/audit/orchestrator/executors.d.ts +54 -0
  101. package/dist/audit/orchestrator/executors.d.ts.map +1 -1
  102. package/dist/audit/orchestrator/executors.js +352 -0
  103. package/dist/audit/orchestrator/executors.js.map +1 -1
  104. package/dist/audit/orchestrator/hostInputPause.d.ts +20 -11
  105. package/dist/audit/orchestrator/hostInputPause.d.ts.map +1 -1
  106. package/dist/audit/orchestrator/hostInputPause.js +17 -11
  107. package/dist/audit/orchestrator/hostInputPause.js.map +1 -1
  108. package/dist/audit/orchestrator/localCommands.d.ts +24 -1
  109. package/dist/audit/orchestrator/localCommands.d.ts.map +1 -1
  110. package/dist/audit/orchestrator/localCommands.js +44 -9
  111. package/dist/audit/orchestrator/localCommands.js.map +1 -1
  112. package/dist/audit/orchestrator/nextStep.d.ts +13 -0
  113. package/dist/audit/orchestrator/nextStep.d.ts.map +1 -1
  114. package/dist/audit/orchestrator/nextStep.js +13 -0
  115. package/dist/audit/orchestrator/nextStep.js.map +1 -1
  116. package/dist/audit/orchestrator/requeueCommand.d.ts +1 -1
  117. package/dist/audit/orchestrator/runtimeCommand.d.ts +32 -1
  118. package/dist/audit/orchestrator/runtimeCommand.d.ts.map +1 -1
  119. package/dist/audit/orchestrator/runtimeCommand.js +90 -3
  120. package/dist/audit/orchestrator/runtimeCommand.js.map +1 -1
  121. package/dist/audit/orchestrator/structureExecutors.js +1 -1
  122. package/dist/audit/orchestrator/structureExecutors.js.map +1 -1
  123. package/dist/audit/orchestrator/syntaxResolutionExecutor.d.ts +11 -1
  124. package/dist/audit/orchestrator/syntaxResolutionExecutor.d.ts.map +1 -1
  125. package/dist/audit/orchestrator/syntaxResolutionExecutor.js +25 -9
  126. package/dist/audit/orchestrator/syntaxResolutionExecutor.js.map +1 -1
  127. package/dist/audit/supervisor/operatorHandoff.d.ts +0 -1
  128. package/dist/audit/supervisor/operatorHandoff.d.ts.map +1 -1
  129. package/dist/audit/supervisor/operatorHandoff.js +2 -1
  130. package/dist/audit/supervisor/operatorHandoff.js.map +1 -1
  131. package/dist/audit/types.d.ts +33 -19
  132. package/dist/audit/types.d.ts.map +1 -1
  133. package/dist/audit/validation/auditResults.d.ts +39 -0
  134. package/dist/audit/validation/auditResults.d.ts.map +1 -1
  135. package/dist/audit/validation/auditResults.js +111 -53
  136. package/dist/audit/validation/auditResults.js.map +1 -1
  137. package/dist/audit/validation/ingestIssueCodes.d.ts +18 -0
  138. package/dist/audit/validation/ingestIssueCodes.d.ts.map +1 -0
  139. package/dist/audit/validation/ingestIssueCodes.js +26 -0
  140. package/dist/audit/validation/ingestIssueCodes.js.map +1 -0
  141. package/dist/remediate/contractPipeline/derive.d.ts.map +1 -1
  142. package/dist/remediate/contractPipeline/derive.js +1 -0
  143. package/dist/remediate/contractPipeline/derive.js.map +1 -1
  144. package/dist/remediate/contractPipeline/semanticProjection.d.ts +5 -4
  145. package/dist/remediate/contractPipeline/semanticProjection.d.ts.map +1 -1
  146. package/dist/remediate/contractPipeline/semanticProjection.js +34 -19
  147. package/dist/remediate/contractPipeline/semanticProjection.js.map +1 -1
  148. package/dist/remediate/index.d.ts.map +1 -1
  149. package/dist/remediate/index.js +3 -2
  150. package/dist/remediate/index.js.map +1 -1
  151. package/dist/remediate/phases/close.d.ts +37 -2
  152. package/dist/remediate/phases/close.d.ts.map +1 -1
  153. package/dist/remediate/phases/close.js +100 -31
  154. package/dist/remediate/phases/close.js.map +1 -1
  155. package/dist/remediate/phases/closeVerifyAnalyzerLeads.js +2 -2
  156. package/dist/remediate/phases/closeVerifyAnalyzerLeads.js.map +1 -1
  157. package/dist/remediate/phases/triage.d.ts.map +1 -1
  158. package/dist/remediate/phases/triage.js +61 -19
  159. package/dist/remediate/phases/triage.js.map +1 -1
  160. package/dist/remediate/state/types.d.ts +15 -1
  161. package/dist/remediate/state/types.d.ts.map +1 -1
  162. package/dist/remediate/steps/contractPipeline.d.ts +13 -0
  163. package/dist/remediate/steps/contractPipeline.d.ts.map +1 -1
  164. package/dist/remediate/steps/contractPipeline.js +82 -3
  165. package/dist/remediate/steps/contractPipeline.js.map +1 -1
  166. package/dist/remediate/steps/dispatch/hostHandoff.d.ts +1 -1
  167. package/dist/remediate/steps/dispatch/hostHandoff.d.ts.map +1 -1
  168. package/dist/remediate/steps/dispatch/hostHandoff.js +297 -139
  169. package/dist/remediate/steps/dispatch/hostHandoff.js.map +1 -1
  170. package/dist/remediate/steps/nextStep.d.ts.map +1 -1
  171. package/dist/remediate/steps/nextStep.js +37 -7
  172. package/dist/remediate/steps/nextStep.js.map +1 -1
  173. package/dist/remediate/types/options.d.ts +1 -1
  174. package/dist/shared/analyzers/acquisitionEngine.d.ts +61 -28
  175. package/dist/shared/analyzers/acquisitionEngine.d.ts.map +1 -1
  176. package/dist/shared/analyzers/acquisitionEngine.js +83 -24
  177. package/dist/shared/analyzers/acquisitionEngine.js.map +1 -1
  178. package/dist/shared/analyzers/binaryAcquisition.d.ts +8 -2
  179. package/dist/shared/analyzers/binaryAcquisition.d.ts.map +1 -1
  180. package/dist/shared/analyzers/binaryAcquisition.js +4 -4
  181. package/dist/shared/analyzers/binaryAcquisition.js.map +1 -1
  182. package/dist/shared/constitutionalDocPaths.d.ts.map +1 -1
  183. package/dist/shared/constitutionalDocPaths.js +7 -0
  184. package/dist/shared/constitutionalDocPaths.js.map +1 -1
  185. package/dist/shared/decompose/systemicChallenge.d.ts +15 -1
  186. package/dist/shared/decompose/systemicChallenge.d.ts.map +1 -1
  187. package/dist/shared/engine/obligationEngine.d.ts +44 -3
  188. package/dist/shared/engine/obligationEngine.d.ts.map +1 -1
  189. package/dist/shared/engine/obligationEngine.js +53 -7
  190. package/dist/shared/engine/obligationEngine.js.map +1 -1
  191. package/dist/shared/findings/dedupe.d.ts.map +1 -1
  192. package/dist/shared/findings/dedupe.js +8 -0
  193. package/dist/shared/findings/dedupe.js.map +1 -1
  194. package/dist/shared/friction/frictionRecord.d.ts +42 -2
  195. package/dist/shared/friction/frictionRecord.d.ts.map +1 -1
  196. package/dist/shared/friction/frictionRecord.js +111 -3
  197. package/dist/shared/friction/frictionRecord.js.map +1 -1
  198. package/dist/shared/friction/triage.d.ts +15 -0
  199. package/dist/shared/friction/triage.d.ts.map +1 -1
  200. package/dist/shared/friction/triage.js +33 -2
  201. package/dist/shared/friction/triage.js.map +1 -1
  202. package/dist/shared/index.d.ts +16 -11
  203. package/dist/shared/index.d.ts.map +1 -1
  204. package/dist/shared/index.js +16 -9
  205. package/dist/shared/index.js.map +1 -1
  206. package/dist/shared/io/fileLock.d.ts.map +1 -1
  207. package/dist/shared/io/fileLock.js +22 -3
  208. package/dist/shared/io/fileLock.js.map +1 -1
  209. package/dist/shared/io/frictionCapture.d.ts +73 -19
  210. package/dist/shared/io/frictionCapture.d.ts.map +1 -1
  211. package/dist/shared/io/frictionCapture.js +21 -30
  212. package/dist/shared/io/frictionCapture.js.map +1 -1
  213. package/dist/shared/io/lockedJsonStore.d.ts +24 -3
  214. package/dist/shared/io/lockedJsonStore.d.ts.map +1 -1
  215. package/dist/shared/io/lockedJsonStore.js +35 -7
  216. package/dist/shared/io/lockedJsonStore.js.map +1 -1
  217. package/dist/shared/io/stepContractWriter.d.ts +3 -3
  218. package/dist/shared/io/stepContractWriter.d.ts.map +1 -1
  219. package/dist/shared/io/stepContractWriter.js +97 -13
  220. package/dist/shared/io/stepContractWriter.js.map +1 -1
  221. package/dist/shared/submission/expectedSubmissions.d.ts +18 -0
  222. package/dist/shared/submission/expectedSubmissions.d.ts.map +1 -1
  223. package/dist/shared/submission/expectedSubmissions.js +17 -0
  224. package/dist/shared/submission/expectedSubmissions.js.map +1 -1
  225. package/dist/shared/submission/handRecovery.d.ts.map +1 -1
  226. package/dist/shared/submission/handRecovery.js +9 -11
  227. package/dist/shared/submission/handRecovery.js.map +1 -1
  228. package/dist/shared/submission/hostHandoffCore.d.ts +155 -0
  229. package/dist/shared/submission/hostHandoffCore.d.ts.map +1 -0
  230. package/dist/shared/submission/hostHandoffCore.js +210 -0
  231. package/dist/shared/submission/hostHandoffCore.js.map +1 -0
  232. package/dist/shared/submission/submissionClassifier.d.ts +4 -1
  233. package/dist/shared/submission/submissionClassifier.d.ts.map +1 -1
  234. package/dist/shared/submission/submissionClassifier.js.map +1 -1
  235. package/dist/shared/submission/submissionLedger.d.ts +16 -5
  236. package/dist/shared/submission/submissionLedger.d.ts.map +1 -1
  237. package/dist/shared/submission/submissionLedger.js +42 -3
  238. package/dist/shared/submission/submissionLedger.js.map +1 -1
  239. package/dist/shared/tooling/commandShape.d.ts +29 -0
  240. package/dist/shared/tooling/commandShape.d.ts.map +1 -1
  241. package/dist/shared/tooling/commandShape.js +82 -10
  242. package/dist/shared/tooling/commandShape.js.map +1 -1
  243. package/dist/shared/tooling/exec.d.ts +32 -0
  244. package/dist/shared/tooling/exec.d.ts.map +1 -1
  245. package/dist/shared/tooling/exec.js +189 -0
  246. package/dist/shared/tooling/exec.js.map +1 -1
  247. package/dist/shared/types/finding.d.ts +132 -20
  248. package/dist/shared/types/finding.d.ts.map +1 -1
  249. package/dist/shared/types/finding.js +70 -63
  250. package/dist/shared/types/finding.js.map +1 -1
  251. package/docs/audit-pkg/contracts.md +8 -1
  252. package/docs/audit-pkg/operator-guide.md +13 -2
  253. package/docs/audit-pkg/product.md +22 -6
  254. package/package.json +10 -6
  255. package/schemas/audit-code-v1alpha1.schema.json +297 -0
  256. package/schemas/audit_result.schema.json +5 -1
  257. package/schemas/audit_results.schema.json +5 -1
  258. package/schemas/finding.schema.json +1 -1
  259. package/scripts/shared/install-host-assets.mjs +8 -5
  260. package/skills/audit-code/SKILL.md +4 -2
  261. package/skills/audit-code/audit-code.prompt.md +5 -2
  262. package/skills/audit-code/opencode-command-template.txt +1 -1
  263. package/wrapper/audit-code-wrapper-lib.mjs +82 -16
  264. package/wrapper/installer-verb-help.mjs +14 -4
  265. package/docs/audit-pkg/development.md +0 -113
  266. package/docs/audit-pkg/release.md +0 -140
@@ -17,6 +17,8 @@
17
17
  import { join } from "node:path";
18
18
  import { readFile } from "node:fs/promises";
19
19
  import { appendNdjsonFile } from "../io/json.js";
20
+ import { siblingLockPath } from "../io/lockedJsonStore.js";
21
+ import { withFileLock } from "../io/fileLock.js";
20
22
  import { discardOnSchemaVersionMismatch } from "../io/schemaVersion.js";
21
23
  import { submissionsDir } from "../io/auditToolsPaths.js";
22
24
  export const SUBMISSION_LEDGER_EVENT_CONTRACT_VERSION = "submission-ledger-event/v1alpha1";
@@ -37,14 +39,41 @@ export const SUBMISSION_EVENT_KINDS = [
37
39
  * record must say so rather than let the run read as clean.
38
40
  */
39
41
  "accepted_via_recovery",
42
+ /**
43
+ * An operator-facing verb REMOVED an already-accepted submission (the
44
+ * audit host-handoff's `unaccept-results`). Without this kind, a dropped
45
+ * entry was indistinguishable from one never accepted — exactly the
46
+ * clean-vs-repaired collapse the ledger exists to prevent, on the removal
47
+ * side. A later re-acceptance of the same work item then reads as what it
48
+ * is: a second event after a recorded withdrawal.
49
+ */
50
+ "removed_by_operator",
40
51
  ];
41
52
  /** `<artifactsDir>/submissions/submission-ledger.jsonl`. */
42
53
  export function submissionLedgerPath(artifactsDir) {
43
54
  return join(submissionsDir(artifactsDir), "submission-ledger.jsonl");
44
55
  }
45
- /** Append one event. The parent directory is created on demand. */
56
+ // Sibling lock serializing every append. Two concurrent appends used to be two
57
+ // independent open-append syscalls on one file: on Windows (and wherever O_APPEND
58
+ // is not what the runtime actually performs) they can interleave so one event's
59
+ // line lands INSIDE the other's, and both lines are then torn — the ledger
60
+ // silently loses an event, which is precisely the clean-vs-repaired collapse it
61
+ // exists to prevent. The name is the locked-JSON-store module's OWN derivation
62
+ // (`siblingLockPath`), so the ledger's lock is the same rule the stores use
63
+ // rather than a second spelling of it.
64
+ function ledgerLockPath(ledgerPath) {
65
+ return siblingLockPath(ledgerPath);
66
+ }
67
+ /**
68
+ * Append one event under the shared file lock, so concurrent appends cannot
69
+ * interleave mid-line. The parent directory is created on demand (the lock
70
+ * acquire creates its own parent; `appendNdjsonFile` creates the ledger's).
71
+ */
46
72
  export async function appendSubmissionEvent(artifactsDir, event) {
47
- await appendNdjsonFile(submissionLedgerPath(artifactsDir), event);
73
+ const ledgerPath = submissionLedgerPath(artifactsDir);
74
+ await withFileLock(ledgerLockPath(ledgerPath), async () => {
75
+ await appendNdjsonFile(ledgerPath, event);
76
+ });
48
77
  }
49
78
  function ledgerRead(events, dropped) {
50
79
  Object.defineProperty(events, "events", {
@@ -106,7 +135,17 @@ export async function readSubmissionLedger(artifactsDir) {
106
135
  continue;
107
136
  let parsed;
108
137
  try {
109
- parsed = JSON.parse(line);
138
+ const value = JSON.parse(line);
139
+ // A line that is valid JSON but not an OBJECT is still not an event: the
140
+ // version check below reads properties off it (`in`), which throws on a
141
+ // primitive or array and broke this function's documented never-throw
142
+ // guarantee — one stray line failed the whole call that records drift.
143
+ // Classified exactly like a torn line instead.
144
+ if (value === null || typeof value !== "object" || Array.isArray(value)) {
145
+ dropped.push({ line: lineNumber, reason: "unparsable" });
146
+ continue;
147
+ }
148
+ parsed = value;
110
149
  }
111
150
  catch {
112
151
  dropped.push({ line: lineNumber, reason: "unparsable" });
@@ -1 +1 @@
1
- {"version":3,"file":"submissionLedger.js","sourceRoot":"","sources":["../../../src/shared/submission/submissionLedger.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"submissionLedger.js","sourceRoot":"","sources":["../../../src/shared/submission/submissionLedger.ts"],"names":[],"mappings":"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"}
@@ -18,4 +18,33 @@ export declare function partitionCommandsByDeclaredShape(commands: readonly stri
18
18
  commands: string[];
19
19
  refusals: string[];
20
20
  };
21
+ /**
22
+ * Split a command string into an argv array, so it can be spawned with
23
+ * `shell: false`.
24
+ *
25
+ * TOTAL, and its guarantee is stated in terms of `shell: false` — not in terms
26
+ * of a precondition a caller has to remember. Exactly two characters are
27
+ * special: an unquoted space ENDS a token, and a double quote toggles grouping
28
+ * and is dropped. EVERY other byte — including `' \ ^ % $` and backtick, and
29
+ * including `& | ; < > ( )` — is copied into the token literally, which under
30
+ * `shell: false` is precisely what the child receives, because no shell ever
31
+ * parses the result. So for any input this produces the argv that a shell-free
32
+ * spawn will actually deliver; it never silently drops meaning.
33
+ *
34
+ * What it does NOT do is decide whether a command was ADMISSIBLE. A string that
35
+ * fails {@link commandLeavesDeclaredShape} still splits — `a && b` becomes
36
+ * `["a", "&&", "b"]`, three literal argv tokens — and that argv is a faithful
37
+ * rendering of what `shell: false` would run, not an execution of the chain the
38
+ * author wrote. That is a declaration the contract cannot honour, so it must be
39
+ * REFUSED by the gate before it reaches a spawn; this function is not the place
40
+ * that decision is made, and it is not a shell parser standing in for one.
41
+ *
42
+ * Windows note: because `\` is an ordinary byte here, an absolute Windows path
43
+ * survives intact through the split (`C:\Program Files\nodejs\node.exe` stays
44
+ * one token when double-quoted). The declared-shape gate refuses `\` in every
45
+ * position, so such a path can only reach this function from a caller that did
46
+ * not gate — see {@link commandLeavesDeclaredShape}'s header for why the
47
+ * refusal is about the declaration rather than the spawn.
48
+ */
49
+ export declare function parseCommandString(command: string): string[];
21
50
  //# sourceMappingURL=commandShape.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"commandShape.d.ts","sourceRoot":"","sources":["../../../src/shared/tooling/commandShape.ts"],"names":[],"mappings":"AAgEA;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CA6BnE;AAED;;;;;;;;GAQG;AACH,wBAAgB,gCAAgC,CAC9C,QAAQ,EAAE,SAAS,MAAM,EAAE,EAC3B,eAAe,EAAE,CAAC,IAAI,EAAE,OAAO,GAAG,cAAc,EAAE,GAAG,EAAE,OAAO,KAAK,MAAM,GACxE;IAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CAgB5C"}
1
+ {"version":3,"file":"commandShape.d.ts","sourceRoot":"","sources":["../../../src/shared/tooling/commandShape.ts"],"names":[],"mappings":"AAgFA;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CA6BnE;AAED;;;;;;;;GAQG;AACH,wBAAgB,gCAAgC,CAC9C,QAAQ,EAAE,SAAS,MAAM,EAAE,EAC3B,eAAe,EAAE,CAAC,IAAI,EAAE,OAAO,GAAG,cAAc,EAAE,GAAG,EAAE,OAAO,KAAK,MAAM,GACxE;IAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CAgB5C;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAyB5D"}
@@ -2,18 +2,34 @@ import { scanStringAware } from "../parsing/stringAwareScanner.js";
2
2
  /**
3
3
  * THE declared single-invocation command shape — one rule, every boundary.
4
4
  *
5
- * A declared command (a block's `targeted_commands`) is executed VERBATIM
6
- * through `shell: true` in the repository root, so anything that chains,
7
- * redirects, substitutes or subshells turns one declared test into arbitrary
8
- * execution. A flat regex cannot decide this: `node -e "process.exit(0)"` is an
9
- * ordinary test invocation whose parens are inside quotes, and refusing it would
10
- * refuse the normal case.
5
+ * A declared command (a block's `targeted_commands`) is a string an operator
6
+ * wrote and this tool then RUNS. The rule exists because such a string must
7
+ * denote exactly ONE invocation: anything that chains, redirects, substitutes
8
+ * or subshells turns one declared test into arbitrary execution. A flat regex
9
+ * cannot decide this: `node -e "process.exit(0)"` is an ordinary test
10
+ * invocation whose parens are inside quotes, and refusing it would refuse the
11
+ * normal case.
12
+ *
13
+ * WHAT THE RULE IS *NOT*: an escaping scheme for one particular spawn. The
14
+ * consumers no longer agree on how they spawn — the closing suites and the
15
+ * required-test rerun split the string with {@link parseCommandString} and
16
+ * spawn `shell: false`, while the triage re-verification path still hands it to
17
+ * a shell — and the rule is identical for all of them. That is the point of
18
+ * stating it once here: the property enforced belongs to the DECLARATION, not
19
+ * to the spawner. A string carrying `&&` or a redirect declares work this
20
+ * contract cannot faithfully run as ONE invocation, and must be refused up
21
+ * front — whether the consumer would have let a shell act on it or would have
22
+ * silently reduced it to literal argv bytes. Enforcing the same rule at every
23
+ * boundary is also what keeps producer and consumer agreeing about which
24
+ * declarations are admissible at all.
11
25
  *
12
26
  * So the scan is QUOTE-AWARE — a tiny, fully-owned grammar, not a shell parser.
13
- * It is deliberately narrower than EITHER shell's grammar, because `shell: true`
14
- * is TWO grammars and no per-grammar state machine is sound for both: `/bin/sh
15
- * -c` on posix, `cmd.exe /d /s /c` on win32. Where they disagree, tracking state
16
- * under one of them MIS-CLASSIFIES the other:
27
+ * It is deliberately narrower than EITHER shell's grammar, because a declared
28
+ * command historically reached `shell: true` — TWO grammars, and no per-grammar
29
+ * state machine is sound for both: `/bin/sh -c` on posix, `cmd.exe /d /s /c` on
30
+ * win32. Where they disagree, tracking state under one of them MIS-CLASSIFIES
31
+ * the other, and keeping the union-of-both-grammars refusal is what lets the
32
+ * same admission decision hold on every platform:
17
33
  *
18
34
  * - `'` quotes on sh and is an ORDINARY CHARACTER on cmd.exe, so crediting it
19
35
  * reads `echo '& evil.exe'` as fully quoted while cmd.exe reads `&` as a
@@ -117,4 +133,60 @@ export function partitionCommandsByDeclaredShape(commands, describeRefusal) {
117
133
  }
118
134
  return { commands: admitted, refusals };
119
135
  }
136
+ /**
137
+ * Split a command string into an argv array, so it can be spawned with
138
+ * `shell: false`.
139
+ *
140
+ * TOTAL, and its guarantee is stated in terms of `shell: false` — not in terms
141
+ * of a precondition a caller has to remember. Exactly two characters are
142
+ * special: an unquoted space ENDS a token, and a double quote toggles grouping
143
+ * and is dropped. EVERY other byte — including `' \ ^ % $` and backtick, and
144
+ * including `& | ; < > ( )` — is copied into the token literally, which under
145
+ * `shell: false` is precisely what the child receives, because no shell ever
146
+ * parses the result. So for any input this produces the argv that a shell-free
147
+ * spawn will actually deliver; it never silently drops meaning.
148
+ *
149
+ * What it does NOT do is decide whether a command was ADMISSIBLE. A string that
150
+ * fails {@link commandLeavesDeclaredShape} still splits — `a && b` becomes
151
+ * `["a", "&&", "b"]`, three literal argv tokens — and that argv is a faithful
152
+ * rendering of what `shell: false` would run, not an execution of the chain the
153
+ * author wrote. That is a declaration the contract cannot honour, so it must be
154
+ * REFUSED by the gate before it reaches a spawn; this function is not the place
155
+ * that decision is made, and it is not a shell parser standing in for one.
156
+ *
157
+ * Windows note: because `\` is an ordinary byte here, an absolute Windows path
158
+ * survives intact through the split (`C:\Program Files\nodejs\node.exe` stays
159
+ * one token when double-quoted). The declared-shape gate refuses `\` in every
160
+ * position, so such a path can only reach this function from a caller that did
161
+ * not gate — see {@link commandLeavesDeclaredShape}'s header for why the
162
+ * refusal is about the declaration rather than the spawn.
163
+ */
164
+ export function parseCommandString(command) {
165
+ const argv = [];
166
+ let current = "";
167
+ let quoted = false;
168
+ let started = false;
169
+ for (const char of command) {
170
+ if (char === '"') {
171
+ // A quote both toggles the state and MARKS the token as started, so an
172
+ // explicit empty argument (`""`) survives as an empty string rather than
173
+ // vanishing at the length check below.
174
+ quoted = !quoted;
175
+ started = true;
176
+ continue;
177
+ }
178
+ if (char === " " && !quoted) {
179
+ if (started)
180
+ argv.push(current);
181
+ current = "";
182
+ started = false;
183
+ continue;
184
+ }
185
+ current += char;
186
+ started = true;
187
+ }
188
+ if (started)
189
+ argv.push(current);
190
+ return argv;
191
+ }
120
192
  //# sourceMappingURL=commandShape.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"commandShape.js","sourceRoot":"","sources":["../../../src/shared/tooling/commandShape.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAEnE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDG;AAEH;;;;;GAKG;AACH,MAAM,uBAAuB,GAAG,8BAA8B,CAAC;AAE/D,+EAA+E;AAC/E,MAAM,qBAAqB,GAAG,SAAS,CAAC;AAExC;;;;;GAKG;AACH,MAAM,UAAU,0BAA0B,CAAC,OAAe;IACxD,IAAI,uBAAuB,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IAEvD,6EAA6E;IAC7E,8EAA8E;IAC9E,sEAAsE;IACtE,6EAA6E;IAC7E,IAAI,IAAI,GAAG,KAAK,CAAC;IACjB,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,eAAe,CACb,OAAO,EACP,EAAE,UAAU,EAAE,CAAC,GAAG,CAAC,EAAE,aAAa,EAAE,EAAE,EAAE,EACxC;QACE,WAAW,EAAE,GAAG,EAAE;YAChB,IAAI,GAAG,IAAI,CAAC;QACd,CAAC;QACD,YAAY,EAAE,GAAG,EAAE;YACjB,IAAI,GAAG,KAAK,CAAC;QACf,CAAC;QACD,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE;YACnB,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAAE,OAAO;YAClD,OAAO,GAAG,IAAI,CAAC;YACf,OAAO,KAAK,CAAC;QACf,CAAC;KACF,CACF,CAAC;IACF,8EAA8E;IAC9E,wCAAwC;IACxC,OAAO,OAAO,IAAI,IAAI,CAAC;AACzB,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,gCAAgC,CAC9C,QAA2B,EAC3B,eAAyE;IAEzE,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;YAC7C,SAAS;QACX,CAAC;QACD,IAAI,0BAA0B,CAAC,OAAO,CAAC,EAAE,CAAC;YACxC,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC,CAAC;YACpD,SAAS;QACX,CAAC;QACD,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;AAC1C,CAAC"}
1
+ {"version":3,"file":"commandShape.js","sourceRoot":"","sources":["../../../src/shared/tooling/commandShape.ts"],"names":[],"mappings":"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"}
@@ -22,6 +22,16 @@ export interface RunTrackedResult {
22
22
  /** Elapsed wall-clock time in milliseconds for the spawned command. */
23
23
  duration_ms: number;
24
24
  error?: Error;
25
+ /**
26
+ * The signal that killed the child, or `null` when it exited on its own.
27
+ *
28
+ * Reported, never DISCRIMINATED on by callers that need to know WHY a child
29
+ * died: a deadline miss, a `maxBuffer` overflow and an external `kill` all
30
+ * set it. The `error.code` (`ETIMEDOUT` / `ENOBUFS`) is what separates those
31
+ * three; `signal` is the residue that names an external kill once they are
32
+ * ruled out.
33
+ */
34
+ signal?: string | null;
25
35
  }
26
36
  /**
27
37
  * Quote a single argv token for embedding into the `cmd.exe /d /s /c "..."`
@@ -134,6 +144,28 @@ export declare function resolveExecArgv(argv: string[], options?: {
134
144
  export declare function stripAuditToolsControlEnv(base?: NodeJS.ProcessEnv): NodeJS.ProcessEnv;
135
145
  /** Run a command synchronously. argv[0] is the command, the rest are args. */
136
146
  export declare function runTracked(argv: string[], options?: RunTrackedOptions): RunTrackedResult;
147
+ /**
148
+ * Async twin of {@link runTracked}: same argv resolution, control-env scrub, and
149
+ * result shape, driven by {@link spawnHidden} instead of `spawnSync`. Analyzer
150
+ * acquisition runs HERE rather than on the synchronous runner because a
151
+ * synchronous child blocks the event loop for the whole spawn — which starves
152
+ * every `setInterval` liveness heartbeat in the process (the advance
153
+ * heartbeat, and each held file lock's mtime heartbeat), so one stalled
154
+ * `npx --version` probe classified a LIVE lock stale and stole it mid-flight.
155
+ * Awaited by the acquisition engine, the binary resolver, and every closing /
156
+ * required-test spawn; never mixed with {@link runTracked} in one call path.
157
+ *
158
+ * DEADLINE AND OVERFLOW ARE CLASSIFIED, not left as a bare signal. `spawnSync`
159
+ * reports an over-deadline child as `ETIMEDOUT` and an over-`maxBuffer` child
160
+ * as `ENOBUFS`, and callers discriminate on those codes precisely because
161
+ * `signal` conflates them with an external `kill`. Node's own `timeout` option
162
+ * on the async path would surface both as an ordinary SIGTERM close and throw
163
+ * that distinction away, so this runner enforces BOTH bounds itself and stamps
164
+ * the same two codes — one classification serves both twins, and the bounds
165
+ * themselves are measured the same way (`maxBuffer` PER STREAM, as `spawnSync`
166
+ * measures it) so the two twins cannot disagree about which children overflow.
167
+ */
168
+ export declare function runTrackedAsync(argv: string[], options?: RunTrackedOptions): Promise<RunTrackedResult>;
137
169
  /**
138
170
  * `child_process.spawnSync` with `windowsHide` forced on. A windowless parent
139
171
  * (node launched by an IDE/agent) spawning a console child (git, sqlite3, …) pops
@@ -1 +1 @@
1
- {"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../../src/shared/tooling/exec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AASzE,MAAM,WAAW,iBAAiB;IAChC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,wEAAwE;IACxE,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;CAC5B;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,0DAA0D;IAC1D,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,mGAAmG;IACnG,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,uEAAuE;IACvE,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,KAAK,CAAC;CACf;AAiDD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAgB/C;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CACxB,GAAG,EAAE,MAAM,EACX,QAAQ,GAAE,MAAM,CAAC,QAA2B,GAC3C,MAAM,CAGR;AAWD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEvD;AAWD;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAI3D;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAEnE;AAED,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnE,KAAK,EAAE,CAAC,GAAG,MAAM,GAAG,SAAS,EAC7B,KAAK,EAAE,MAAM,GACZ,CAAC,CAeH;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EACf,QAAQ,GAAE,MAAM,CAAC,QAA2B,GAC3C,MAAM,CAKR;AAkBD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGjE;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAA;CAAO,GAC3C,MAAM,EAAE,CAOV;AAOD;;;;GAIG;AACH,wBAAgB,yBAAyB,CACvC,IAAI,CAAC,EAAE,MAAM,CAAC,UAAU,GACvB,MAAM,CAAC,UAAU,CAWnB;AAED,8EAA8E;AAC9E,wBAAgB,UAAU,CACxB,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,GAAE,iBAAsB,GAC9B,gBAAgB,CAoClB;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,eAAe,EAQnB,OAAO,SAAS,CAAC;AAE1B;;;;;;;GAOG;AACH,eAAO,MAAM,WAAW,EAQf,OAAO,KAAK,CAAC"}
1
+ {"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../../src/shared/tooling/exec.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,12 @@
1
1
  import { spawn, spawnSync } from "node:child_process";
2
2
  const SHELL_SHIM_COMMANDS = new Set(["npm", "npx", "pnpm", "yarn"]);
3
+ /**
4
+ * How long {@link runTrackedAsync} waits after SIGTERM before escalating to an
5
+ * unignorable SIGKILL for a child it killed on its own deadline/overflow bound.
6
+ * Long enough for an ordinary child to flush and exit, short enough that a
7
+ * child which ignores SIGTERM cannot hang the awaiting caller.
8
+ */
9
+ const KILL_ESCALATION_GRACE_MS = 2_000;
3
10
  // --- cmd.exe quoting helpers ---
4
11
  //
5
12
  // There are two distinct contexts in which a token must be quoted for cmd.exe,
@@ -293,8 +300,190 @@ export function runTracked(argv, options = {}) {
293
300
  cwd: options.cwd,
294
301
  duration_ms: Date.now() - start,
295
302
  error: result.error,
303
+ signal: result.signal ?? null,
296
304
  };
297
305
  }
306
+ /**
307
+ * Async twin of {@link runTracked}: same argv resolution, control-env scrub, and
308
+ * result shape, driven by {@link spawnHidden} instead of `spawnSync`. Analyzer
309
+ * acquisition runs HERE rather than on the synchronous runner because a
310
+ * synchronous child blocks the event loop for the whole spawn — which starves
311
+ * every `setInterval` liveness heartbeat in the process (the advance
312
+ * heartbeat, and each held file lock's mtime heartbeat), so one stalled
313
+ * `npx --version` probe classified a LIVE lock stale and stole it mid-flight.
314
+ * Awaited by the acquisition engine, the binary resolver, and every closing /
315
+ * required-test spawn; never mixed with {@link runTracked} in one call path.
316
+ *
317
+ * DEADLINE AND OVERFLOW ARE CLASSIFIED, not left as a bare signal. `spawnSync`
318
+ * reports an over-deadline child as `ETIMEDOUT` and an over-`maxBuffer` child
319
+ * as `ENOBUFS`, and callers discriminate on those codes precisely because
320
+ * `signal` conflates them with an external `kill`. Node's own `timeout` option
321
+ * on the async path would surface both as an ordinary SIGTERM close and throw
322
+ * that distinction away, so this runner enforces BOTH bounds itself and stamps
323
+ * the same two codes — one classification serves both twins, and the bounds
324
+ * themselves are measured the same way (`maxBuffer` PER STREAM, as `spawnSync`
325
+ * measures it) so the two twins cannot disagree about which children overflow.
326
+ */
327
+ export async function runTrackedAsync(argv, options = {}) {
328
+ if (argv.length === 0) {
329
+ return {
330
+ status: null,
331
+ stdout: "",
332
+ stderr: "",
333
+ argv: [],
334
+ cwd: options.cwd,
335
+ duration_ms: 0,
336
+ error: new Error("runTrackedAsync requires a non-empty argv"),
337
+ };
338
+ }
339
+ const resolved = resolveExecArgv(argv, {
340
+ platform: options.platform,
341
+ });
342
+ const start = Date.now();
343
+ return await new Promise((resolve) => {
344
+ const child = spawnHidden(resolved[0], resolved.slice(1), {
345
+ cwd: options.cwd,
346
+ env: stripAuditToolsControlEnv(options.env),
347
+ windowsHide: true,
348
+ shell: false,
349
+ stdio: ["pipe", "pipe", "pipe"],
350
+ });
351
+ let stdout = "";
352
+ let stderr = "";
353
+ // Bytes SEEN on each pipe, which is not the same as bytes kept: the counters
354
+ // keep rising after MAX_CAPTURE stops appending. See `capture`.
355
+ let stdoutBytes = 0;
356
+ let stderrBytes = 0;
357
+ let settled = false;
358
+ // Which bound killed the child, when one did. Read on `close` to stamp the
359
+ // matching `spawnSync` error code.
360
+ let killedBy = null;
361
+ // Bounded: a hostile/oversized emitter cannot grow the heap without limit.
362
+ // An explicit `maxBuffer` is the caller's stricter bound and is REPORTED as
363
+ // an overflow; the 10MiB default is the silent backstop.
364
+ const MAX_CAPTURE = 10 * 1024 * 1024;
365
+ const overflowLimit = options.maxBuffer;
366
+ let killTimer = null;
367
+ /**
368
+ * Terminate the child for a bound this runner owns, and make the
369
+ * termination ACTUALLY terminal.
370
+ *
371
+ * `child.kill()` sends SIGTERM, which is a request: a child that installs a
372
+ * handler and ignores it never emits `close`, so the promise would never
373
+ * settle and the deadline this runner advertises would be a deadline in
374
+ * name only (`spawnSync`'s `timeout` had no such hole — it kills from the
375
+ * runtime). So the SIGTERM is followed by an unignorable SIGKILL after a
376
+ * short grace period. The timer is `unref`d so a settled call never holds
377
+ * the event loop open.
378
+ */
379
+ const killForBound = () => {
380
+ child.kill();
381
+ if (killTimer)
382
+ return;
383
+ killTimer = setTimeout(() => {
384
+ if (!settled)
385
+ child.kill("SIGKILL");
386
+ }, KILL_ESCALATION_GRACE_MS);
387
+ killTimer.unref?.();
388
+ };
389
+ const timer = options.timeout !== undefined && options.timeout > 0
390
+ ? setTimeout(() => {
391
+ killedBy = "timeout";
392
+ killForBound();
393
+ }, options.timeout)
394
+ : null;
395
+ const finish = (result) => {
396
+ if (settled)
397
+ return;
398
+ settled = true;
399
+ if (timer)
400
+ clearTimeout(timer);
401
+ if (killTimer)
402
+ clearTimeout(killTimer);
403
+ resolve(result);
404
+ };
405
+ /**
406
+ * Accumulate one chunk and enforce the overflow bound.
407
+ *
408
+ * The bound is checked PER STREAM and against bytes SEEN, not against what
409
+ * was kept — both deliberate:
410
+ *
411
+ * - per stream, because `spawnSync`'s `maxBuffer`, which the sync twin
412
+ * {@link runTracked} still enforces, is per stream. A combined bound
413
+ * would classify a child emitting 5MiB on each pipe under an 8MiB limit
414
+ * as an overflow that the sync twin admits verbatim, and this module's
415
+ * claim that one classification serves both twins would be false.
416
+ * - against bytes seen, because the MAX_CAPTURE backstop stops APPENDING
417
+ * at 10MiB. Counting kept characters instead would make ENOBUFS
418
+ * unreachable for any caller whose `maxBuffer` exceeds MAX_CAPTURE — the
419
+ * output would silently truncate where the contract says it refuses.
420
+ */
421
+ const capture = (chunk, append, seen, kept) => {
422
+ if (kept() < MAX_CAPTURE) {
423
+ append(chunk.toString(options.encoding ?? "utf8"));
424
+ }
425
+ if (overflowLimit !== undefined &&
426
+ seen() > overflowLimit &&
427
+ killedBy === null) {
428
+ killedBy = "overflow";
429
+ killForBound();
430
+ }
431
+ };
432
+ child.stdout?.on("data", (chunk) => {
433
+ stdoutBytes += chunk.length;
434
+ capture(chunk, (text) => {
435
+ stdout += text;
436
+ }, () => stdoutBytes, () => stdout.length);
437
+ });
438
+ child.stderr?.on("data", (chunk) => {
439
+ stderrBytes += chunk.length;
440
+ capture(chunk, (text) => {
441
+ stderr += text;
442
+ }, () => stderrBytes, () => stderr.length);
443
+ });
444
+ // stdin is CLOSED (optionally after `input`), never left open: a command
445
+ // that reads stdin would otherwise block forever on a pipe nothing writes,
446
+ // turning an ordinary test invocation into a hang.
447
+ if (options.input !== undefined)
448
+ child.stdin?.write(options.input);
449
+ child.stdin?.end();
450
+ child.on("error", (error) => {
451
+ finish({
452
+ status: null,
453
+ stdout,
454
+ stderr,
455
+ argv: resolved,
456
+ cwd: options.cwd,
457
+ duration_ms: Date.now() - start,
458
+ error,
459
+ signal: null,
460
+ });
461
+ });
462
+ child.on("close", (code, signal) => {
463
+ let error;
464
+ if (killedBy !== null) {
465
+ const bound = new Error(killedBy === "timeout"
466
+ ? `child exceeded the ${String(options.timeout)}ms deadline`
467
+ : `child exceeded the ${String(overflowLimit)}-byte output bound`);
468
+ bound.code = killedBy === "timeout" ? "ETIMEDOUT" : "ENOBUFS";
469
+ error = bound;
470
+ }
471
+ else if (signal !== null && signal !== undefined) {
472
+ error = new Error(`child terminated by signal ${signal}`);
473
+ }
474
+ finish({
475
+ status: code,
476
+ stdout,
477
+ stderr,
478
+ argv: resolved,
479
+ cwd: options.cwd,
480
+ duration_ms: Date.now() - start,
481
+ ...(error ? { error } : {}),
482
+ signal: signal ?? null,
483
+ });
484
+ });
485
+ });
486
+ }
298
487
  /**
299
488
  * `child_process.spawnSync` with `windowsHide` forced on. A windowless parent
300
489
  * (node launched by an IDE/agent) spawning a console child (git, sqlite3, …) pops
@@ -1 +1 @@
1
- {"version":3,"file":"exec.js","sourceRoot":"","sources":["../../../src/shared/tooling/exec.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"exec.js","sourceRoot":"","sources":["../../../src/shared/tooling/exec.ts"],"names":[],"mappings":"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"}