audit-tools 0.30.48 → 0.30.51

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 (263) hide show
  1. package/dist/audit/cli/advanceAuditCommand.d.ts.map +1 -1
  2. package/dist/audit/cli/advanceAuditCommand.js +8 -4
  3. package/dist/audit/cli/advanceAuditCommand.js.map +1 -1
  4. package/dist/audit/cli/args.d.ts +0 -10
  5. package/dist/audit/cli/args.d.ts.map +1 -1
  6. package/dist/audit/cli/args.js +9 -20
  7. package/dist/audit/cli/args.js.map +1 -1
  8. package/dist/audit/cli/envelope.d.ts +0 -1
  9. package/dist/audit/cli/envelope.d.ts.map +1 -1
  10. package/dist/audit/cli/envelope.js +0 -3
  11. package/dist/audit/cli/envelope.js.map +1 -1
  12. package/dist/audit/cli/mergeAndIngestCommand.d.ts.map +1 -1
  13. package/dist/audit/cli/mergeAndIngestCommand.js +6 -22
  14. package/dist/audit/cli/mergeAndIngestCommand.js.map +1 -1
  15. package/dist/audit/cli/nextStepCommand.d.ts +18 -14
  16. package/dist/audit/cli/nextStepCommand.d.ts.map +1 -1
  17. package/dist/audit/cli/nextStepCommand.js +23 -25
  18. package/dist/audit/cli/nextStepCommand.js.map +1 -1
  19. package/dist/audit/cli/validateResultCommand.d.ts.map +1 -1
  20. package/dist/audit/cli/validateResultCommand.js +19 -6
  21. package/dist/audit/cli/validateResultCommand.js.map +1 -1
  22. package/dist/audit/cli/workerResult.d.ts +0 -4
  23. package/dist/audit/cli/workerResult.d.ts.map +1 -1
  24. package/dist/audit/cli/workerResult.js +0 -22
  25. package/dist/audit/cli/workerResult.js.map +1 -1
  26. package/dist/audit/cli/workerRunCommand.d.ts.map +1 -1
  27. package/dist/audit/cli/workerRunCommand.js +6 -21
  28. package/dist/audit/cli/workerRunCommand.js.map +1 -1
  29. package/dist/audit/contracts/workerSchemas.d.ts +27 -3
  30. package/dist/audit/contracts/workerSchemas.d.ts.map +1 -1
  31. package/dist/audit/contracts/workerSchemas.js +5 -1
  32. package/dist/audit/contracts/workerSchemas.js.map +1 -1
  33. package/dist/audit/contracts/wrapperResponse.d.ts +0 -1
  34. package/dist/audit/contracts/wrapperResponse.d.ts.map +1 -1
  35. package/dist/audit/coverage.d.ts +1 -2
  36. package/dist/audit/coverage.d.ts.map +1 -1
  37. package/dist/audit/coverage.js +0 -7
  38. package/dist/audit/coverage.js.map +1 -1
  39. package/dist/audit/extractors/analyzers/acquisitionEngine.d.ts +0 -2
  40. package/dist/audit/extractors/analyzers/acquisitionEngine.d.ts.map +1 -1
  41. package/dist/audit/extractors/analyzers/acquisitionEngine.js +0 -6
  42. package/dist/audit/extractors/analyzers/acquisitionEngine.js.map +1 -1
  43. package/dist/audit/extractors/analyzers/html.d.ts +1 -0
  44. package/dist/audit/extractors/analyzers/html.d.ts.map +1 -1
  45. package/dist/audit/extractors/analyzers/html.js +5 -3
  46. package/dist/audit/extractors/analyzers/html.js.map +1 -1
  47. package/dist/audit/extractors/analyzers/registry.d.ts +1 -2
  48. package/dist/audit/extractors/analyzers/registry.d.ts.map +1 -1
  49. package/dist/audit/extractors/analyzers/registry.js +1 -4
  50. package/dist/audit/extractors/analyzers/registry.js.map +1 -1
  51. package/dist/audit/extractors/browserExtension.d.ts +0 -1
  52. package/dist/audit/extractors/browserExtension.d.ts.map +1 -1
  53. package/dist/audit/extractors/browserExtension.js +1 -20
  54. package/dist/audit/extractors/browserExtension.js.map +1 -1
  55. package/dist/audit/extractors/gitHistory.d.ts +1 -3
  56. package/dist/audit/extractors/gitHistory.d.ts.map +1 -1
  57. package/dist/audit/extractors/graphRoutes.d.ts.map +1 -1
  58. package/dist/audit/extractors/graphRoutes.js +4 -1
  59. package/dist/audit/extractors/graphRoutes.js.map +1 -1
  60. package/dist/audit/io/artifacts.d.ts +0 -1
  61. package/dist/audit/io/artifacts.d.ts.map +1 -1
  62. package/dist/audit/io/artifacts.js +0 -17
  63. package/dist/audit/io/artifacts.js.map +1 -1
  64. package/dist/audit/io/runArtifacts.d.ts +1 -4
  65. package/dist/audit/io/runArtifacts.d.ts.map +1 -1
  66. package/dist/audit/io/runArtifacts.js +0 -46
  67. package/dist/audit/io/runArtifacts.js.map +1 -1
  68. package/dist/audit/orchestrator/autoFixExecutor.d.ts +8 -0
  69. package/dist/audit/orchestrator/autoFixExecutor.d.ts.map +1 -1
  70. package/dist/audit/orchestrator/autoFixExecutor.js +68 -35
  71. package/dist/audit/orchestrator/autoFixExecutor.js.map +1 -1
  72. package/dist/audit/orchestrator/designReviewSnapshot.d.ts +0 -1
  73. package/dist/audit/orchestrator/designReviewSnapshot.d.ts.map +1 -1
  74. package/dist/audit/orchestrator/designReviewSnapshot.js +0 -25
  75. package/dist/audit/orchestrator/designReviewSnapshot.js.map +1 -1
  76. package/dist/audit/orchestrator/intentInterpreter.d.ts +0 -7
  77. package/dist/audit/orchestrator/intentInterpreter.d.ts.map +1 -1
  78. package/dist/audit/orchestrator/intentInterpreter.js +0 -9
  79. package/dist/audit/orchestrator/intentInterpreter.js.map +1 -1
  80. package/dist/audit/orchestrator/ledger.d.ts +0 -10
  81. package/dist/audit/orchestrator/ledger.d.ts.map +1 -1
  82. package/dist/audit/orchestrator/ledger.js +0 -19
  83. package/dist/audit/orchestrator/ledger.js.map +1 -1
  84. package/dist/audit/orchestrator/lensSelection.d.ts +0 -9
  85. package/dist/audit/orchestrator/lensSelection.d.ts.map +1 -1
  86. package/dist/audit/orchestrator/lensSelection.js +0 -29
  87. package/dist/audit/orchestrator/lensSelection.js.map +1 -1
  88. package/dist/audit/orchestrator/resultBaseline.d.ts +0 -44
  89. package/dist/audit/orchestrator/resultBaseline.d.ts.map +1 -1
  90. package/dist/audit/orchestrator/resultBaseline.js +0 -44
  91. package/dist/audit/orchestrator/resultBaseline.js.map +1 -1
  92. package/dist/audit/orchestrator/runtimeCommand.d.ts.map +1 -1
  93. package/dist/audit/orchestrator/runtimeCommand.js +7 -1
  94. package/dist/audit/orchestrator/runtimeCommand.js.map +1 -1
  95. package/dist/audit/orchestrator/selectiveDeepening/index.d.ts +0 -5
  96. package/dist/audit/orchestrator/selectiveDeepening/index.d.ts.map +1 -1
  97. package/dist/audit/orchestrator/selectiveDeepening/index.js +13 -14
  98. package/dist/audit/orchestrator/selectiveDeepening/index.js.map +1 -1
  99. package/dist/audit/orchestrator/selectiveDeepening.d.ts +1 -1
  100. package/dist/audit/orchestrator/selectiveDeepening.d.ts.map +1 -1
  101. package/dist/audit/orchestrator/selectiveDeepening.js +1 -1
  102. package/dist/audit/orchestrator/selectiveDeepening.js.map +1 -1
  103. package/dist/audit/orchestrator/taskBuilder.d.ts +0 -1
  104. package/dist/audit/orchestrator/taskBuilder.d.ts.map +1 -1
  105. package/dist/audit/orchestrator/taskBuilder.js +0 -73
  106. package/dist/audit/orchestrator/taskBuilder.js.map +1 -1
  107. package/dist/audit/quota/discoveredLimits.d.ts +12 -0
  108. package/dist/audit/quota/discoveredLimits.d.ts.map +1 -1
  109. package/dist/audit/quota/discoveredLimits.js +30 -25
  110. package/dist/audit/quota/discoveredLimits.js.map +1 -1
  111. package/dist/audit/supervisor/operatorHandoff.d.ts +0 -1
  112. package/dist/audit/supervisor/operatorHandoff.d.ts.map +1 -1
  113. package/dist/audit/supervisor/operatorHandoff.js +0 -1
  114. package/dist/audit/supervisor/operatorHandoff.js.map +1 -1
  115. package/dist/audit/supervisor/runLedger.d.ts +1 -2
  116. package/dist/audit/supervisor/runLedger.d.ts.map +1 -1
  117. package/dist/audit/supervisor/runLedger.js +1 -46
  118. package/dist/audit/supervisor/runLedger.js.map +1 -1
  119. package/dist/audit/types/analyzerCapability.d.ts +0 -1
  120. package/dist/audit/types/analyzerCapability.d.ts.map +1 -1
  121. package/dist/audit/types/analyzerCapability.js.map +1 -1
  122. package/dist/audit/types/designAssessment.d.ts +0 -4
  123. package/dist/audit/types/designAssessment.d.ts.map +1 -1
  124. package/dist/audit/types/designAssessment.js +1 -7
  125. package/dist/audit/types/designAssessment.js.map +1 -1
  126. package/dist/audit/types/externalAnalyzer.d.ts +0 -1
  127. package/dist/audit/types/externalAnalyzer.d.ts.map +1 -1
  128. package/dist/audit/types/externalAnalyzer.js.map +1 -1
  129. package/dist/audit/types/flowCoverage.d.ts +0 -1
  130. package/dist/audit/types/flowCoverage.d.ts.map +1 -1
  131. package/dist/audit/types/flowCoverage.js.map +1 -1
  132. package/dist/audit/types/reviewPlanning.d.ts +0 -1
  133. package/dist/audit/types/reviewPlanning.d.ts.map +1 -1
  134. package/dist/audit/types/reviewPlanning.js.map +1 -1
  135. package/dist/audit/types/runtimeValidation.d.ts +0 -5
  136. package/dist/audit/types/runtimeValidation.d.ts.map +1 -1
  137. package/dist/audit/types/runtimeValidation.js +0 -3
  138. package/dist/audit/types/runtimeValidation.js.map +1 -1
  139. package/dist/audit/types.d.ts +0 -6
  140. package/dist/audit/types.d.ts.map +1 -1
  141. package/dist/audit/types.js +0 -5
  142. package/dist/audit/types.js.map +1 -1
  143. package/dist/audit/validation/anchorGrounding.d.ts +1 -3
  144. package/dist/audit/validation/anchorGrounding.d.ts.map +1 -1
  145. package/dist/audit/validation/anchorGrounding.js.map +1 -1
  146. package/dist/audit/validation/auditResults.d.ts +16 -0
  147. package/dist/audit/validation/auditResults.d.ts.map +1 -1
  148. package/dist/audit/validation/auditResults.js +35 -1
  149. package/dist/audit/validation/auditResults.js.map +1 -1
  150. package/dist/remediate/contractPipeline/changeClassification.d.ts +0 -15
  151. package/dist/remediate/contractPipeline/changeClassification.d.ts.map +1 -1
  152. package/dist/remediate/contractPipeline/changeClassification.js +0 -24
  153. package/dist/remediate/contractPipeline/changeClassification.js.map +1 -1
  154. package/dist/remediate/contractPipeline/phaseCutArtifact.d.ts +0 -2
  155. package/dist/remediate/contractPipeline/phaseCutArtifact.d.ts.map +1 -1
  156. package/dist/remediate/contractPipeline/phaseCutArtifact.js +0 -4
  157. package/dist/remediate/contractPipeline/phaseCutArtifact.js.map +1 -1
  158. package/dist/remediate/dispatch/ownershipScheduler.d.ts +0 -20
  159. package/dist/remediate/dispatch/ownershipScheduler.d.ts.map +1 -1
  160. package/dist/remediate/dispatch/ownershipScheduler.js +0 -24
  161. package/dist/remediate/dispatch/ownershipScheduler.js.map +1 -1
  162. package/dist/remediate/intake.d.ts +0 -37
  163. package/dist/remediate/intake.d.ts.map +1 -1
  164. package/dist/remediate/intake.js +1 -89
  165. package/dist/remediate/intake.js.map +1 -1
  166. package/dist/remediate/phases/close.d.ts.map +1 -1
  167. package/dist/remediate/phases/close.js +16 -6
  168. package/dist/remediate/phases/close.js.map +1 -1
  169. package/dist/remediate/providers/index.d.ts +0 -32
  170. package/dist/remediate/providers/index.d.ts.map +1 -1
  171. package/dist/remediate/providers/index.js +1 -28
  172. package/dist/remediate/providers/index.js.map +1 -1
  173. package/dist/remediate/review/reviewGate.d.ts +0 -1
  174. package/dist/remediate/review/reviewGate.d.ts.map +1 -1
  175. package/dist/remediate/review/reviewGate.js +0 -1
  176. package/dist/remediate/review/reviewGate.js.map +1 -1
  177. package/dist/remediate/riskSignal.d.ts +0 -2
  178. package/dist/remediate/riskSignal.d.ts.map +1 -1
  179. package/dist/remediate/riskSignal.js +0 -4
  180. package/dist/remediate/riskSignal.js.map +1 -1
  181. package/dist/remediate/state/types.d.ts +0 -2
  182. package/dist/remediate/state/types.d.ts.map +1 -1
  183. package/dist/remediate/state/types.js.map +1 -1
  184. package/dist/remediate/steps/contractPipeline.d.ts +4 -1
  185. package/dist/remediate/steps/contractPipeline.d.ts.map +1 -1
  186. package/dist/remediate/steps/contractPipeline.js +63 -47
  187. package/dist/remediate/steps/contractPipeline.js.map +1 -1
  188. package/dist/remediate/steps/contractPipelinePrompts.d.ts +12 -3
  189. package/dist/remediate/steps/contractPipelinePrompts.d.ts.map +1 -1
  190. package/dist/remediate/steps/contractPipelinePrompts.js +29 -22
  191. package/dist/remediate/steps/contractPipelinePrompts.js.map +1 -1
  192. package/dist/remediate/steps/dispatch.d.ts +29 -16
  193. package/dist/remediate/steps/dispatch.d.ts.map +1 -1
  194. package/dist/remediate/steps/dispatch.js +193 -152
  195. package/dist/remediate/steps/dispatch.js.map +1 -1
  196. package/dist/remediate/steps/finalGate.d.ts +88 -0
  197. package/dist/remediate/steps/finalGate.d.ts.map +1 -0
  198. package/dist/remediate/steps/finalGate.js +171 -0
  199. package/dist/remediate/steps/finalGate.js.map +1 -0
  200. package/dist/remediate/steps/leanFastPath.d.ts +0 -8
  201. package/dist/remediate/steps/leanFastPath.d.ts.map +1 -1
  202. package/dist/remediate/steps/leanFastPath.js +12 -0
  203. package/dist/remediate/steps/leanFastPath.js.map +1 -1
  204. package/dist/remediate/steps/nextStep.d.ts +12 -82
  205. package/dist/remediate/steps/nextStep.d.ts.map +1 -1
  206. package/dist/remediate/steps/nextStep.js +71 -167
  207. package/dist/remediate/steps/nextStep.js.map +1 -1
  208. package/dist/remediate/steps/providerNodeDispatch.js +2 -2
  209. package/dist/remediate/steps/providerNodeDispatch.js.map +1 -1
  210. package/dist/remediate/steps/stepWriter.d.ts +0 -4
  211. package/dist/remediate/steps/stepWriter.d.ts.map +1 -1
  212. package/dist/remediate/steps/stepWriter.js +1 -11
  213. package/dist/remediate/steps/stepWriter.js.map +1 -1
  214. package/dist/remediate/types/workerSession.d.ts +0 -1
  215. package/dist/remediate/types/workerSession.d.ts.map +1 -1
  216. package/dist/remediate/types/workerSession.js +0 -8
  217. package/dist/remediate/types/workerSession.js.map +1 -1
  218. package/dist/remediate/validation/contractPipeline.d.ts +0 -1
  219. package/dist/remediate/validation/contractPipeline.d.ts.map +1 -1
  220. package/dist/remediate/validation/contractPipeline.js +18 -27
  221. package/dist/remediate/validation/contractPipeline.js.map +1 -1
  222. package/dist/shared/dispatch/rollingDispatch.d.ts +25 -0
  223. package/dist/shared/dispatch/rollingDispatch.d.ts.map +1 -1
  224. package/dist/shared/dispatch/rollingDispatch.js +6 -1
  225. package/dist/shared/dispatch/rollingDispatch.js.map +1 -1
  226. package/dist/shared/index.d.ts +1 -0
  227. package/dist/shared/index.d.ts.map +1 -1
  228. package/dist/shared/index.js +1 -0
  229. package/dist/shared/index.js.map +1 -1
  230. package/dist/shared/io/frictionCapture.d.ts +14 -1
  231. package/dist/shared/io/frictionCapture.d.ts.map +1 -1
  232. package/dist/shared/io/frictionCapture.js +28 -3
  233. package/dist/shared/io/frictionCapture.js.map +1 -1
  234. package/dist/shared/observability/runLog.d.ts +1 -1
  235. package/dist/shared/observability/runLog.d.ts.map +1 -1
  236. package/dist/shared/observability/runLog.js.map +1 -1
  237. package/dist/shared/providers/providerConfirmation.d.ts +16 -1
  238. package/dist/shared/providers/providerConfirmation.d.ts.map +1 -1
  239. package/dist/shared/providers/providerConfirmation.js +13 -13
  240. package/dist/shared/providers/providerConfirmation.js.map +1 -1
  241. package/dist/shared/providers/providerFactory.d.ts.map +1 -1
  242. package/dist/shared/providers/providerFactory.js +10 -14
  243. package/dist/shared/providers/providerFactory.js.map +1 -1
  244. package/dist/shared/providers/providerPathGuard.d.ts +21 -0
  245. package/dist/shared/providers/providerPathGuard.d.ts.map +1 -0
  246. package/dist/shared/providers/providerPathGuard.js +69 -0
  247. package/dist/shared/providers/providerPathGuard.js.map +1 -0
  248. package/dist/shared/providers/sharedProviderConfirmation.d.ts +14 -2
  249. package/dist/shared/providers/sharedProviderConfirmation.d.ts.map +1 -1
  250. package/dist/shared/providers/sharedProviderConfirmation.js +26 -5
  251. package/dist/shared/providers/sharedProviderConfirmation.js.map +1 -1
  252. package/dist/shared/quota/apiPool.d.ts +6 -1
  253. package/dist/shared/quota/apiPool.d.ts.map +1 -1
  254. package/dist/shared/quota/apiPool.js +13 -2
  255. package/dist/shared/quota/apiPool.js.map +1 -1
  256. package/dist/shared/quota/fileLock.d.ts +17 -2
  257. package/dist/shared/quota/fileLock.d.ts.map +1 -1
  258. package/dist/shared/quota/fileLock.js +21 -19
  259. package/dist/shared/quota/fileLock.js.map +1 -1
  260. package/dist/shared/types/providerConfirmation.d.ts +9 -0
  261. package/dist/shared/types/providerConfirmation.d.ts.map +1 -1
  262. package/package.json +4 -2
  263. package/scripts/audit/postinstall.mjs +22 -14
@@ -1 +1 @@
1
- {"version":3,"file":"fileLock.d.ts","sourceRoot":"","sources":["../../../src/shared/quota/fileLock.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAE5D,eAAO,MAAM,aAAa,QAAS,CAAC;AASpC,qBAAa,oBAAqB,SAAQ,KAAK;gBACjC,QAAQ,EAAE,MAAM;CAI7B;AAkGD,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,EAChB,SAAS,GAAE,MAA2B,EACtC,MAAM,CAAC,EAAE,SAAS,GACjB,OAAO,CAAC,MAAM,CAAC,CAyDjB;AAED,wBAAsB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAYrF;AAED,wBAAsB,YAAY,CAAC,CAAC,EAClC,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,SAAS,CAAC,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,SAAS,GACjB,OAAO,CAAC,CAAC,CAAC,CAkBZ"}
1
+ {"version":3,"file":"fileLock.d.ts","sourceRoot":"","sources":["../../../src/shared/quota/fileLock.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAE5D,eAAO,MAAM,aAAa,QAAS,CAAC;AAEpC;;;;;;;;GAQG;AACH,MAAM,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC;AAUjC,qBAAa,oBAAqB,SAAQ,KAAK;gBACjC,QAAQ,EAAE,MAAM;CAI7B;AAkGD,iFAAiF;AACjF,MAAM,WAAW,WAAW;IAC1B,uFAAuF;IACvF,GAAG,CAAC,EAAE,KAAK,CAAC;CACb;AAED,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,EAChB,SAAS,GAAE,MAA2B,EACtC,MAAM,CAAC,EAAE,SAAS,EAClB,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,MAAM,CAAC,CA0DjB;AAED,wBAAsB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAYrF;AAED,wBAAsB,YAAY,CAAC,CAAC,EAClC,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,SAAS,CAAC,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,SAAS,EAClB,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,CAAC,CAAC,CAkBZ"}
@@ -1,6 +1,7 @@
1
1
  import { writeFile, unlink, stat, readFile, mkdir } from "node:fs/promises";
2
2
  import { dirname } from "node:path";
3
3
  export const STALE_LOCK_MS = 30_000;
4
+ const defaultClock = Date.now;
4
5
  // Lock-acquire retry uses exponential backoff (initial → doubling → max) rather
5
6
  // than a fixed poll, so a long contention window costs far fewer wakeups. The
6
7
  // sleep is always clamped to the time left so backoff never overshoots timeoutMs.
@@ -14,17 +15,17 @@ export class FileLockTimeoutError extends Error {
14
15
  this.name = "FileLockTimeoutError";
15
16
  }
16
17
  }
17
- function generateOwnerToken() {
18
- return `${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2)}`;
18
+ function generateOwnerToken(now = defaultClock) {
19
+ return `${process.pid}-${now()}-${Math.random().toString(36).slice(2)}`;
19
20
  }
20
21
  // Returns the owner token of a stale lock (older than STALE_LOCK_MS), or null
21
22
  // when the lock is fresh or already gone. Returning the token lets stale removal
22
23
  // reuse a token-checked delete, so a lock concurrently re-created with a
23
24
  // different token is never clobbered.
24
- async function readStaleLockToken(lockPath) {
25
+ async function readStaleLockToken(lockPath, now) {
25
26
  try {
26
27
  const info = await stat(lockPath);
27
- if (Date.now() - info.mtimeMs <= STALE_LOCK_MS)
28
+ if (now() - info.mtimeMs <= STALE_LOCK_MS)
28
29
  return null;
29
30
  return await readFile(lockPath, "utf8");
30
31
  }
@@ -69,10 +70,10 @@ async function bestEffortUnlink(path) {
69
70
  // reclaimed, mirroring the main lock's staleness recovery. The claim is always
70
71
  // removed in a finally on the happy path so it lives only for the brief
71
72
  // token-check + unlink window.
72
- async function stealStaleLock(lockPath, staleToken) {
73
+ async function stealStaleLock(lockPath, staleToken, now) {
73
74
  const claimPath = `${lockPath}${STEAL_CLAIM_SUFFIX}`;
74
75
  try {
75
- await writeFile(claimPath, generateOwnerToken(), { flag: "wx" });
76
+ await writeFile(claimPath, generateOwnerToken(now), { flag: "wx" });
76
77
  }
77
78
  catch (err) {
78
79
  const code = err.code;
@@ -83,7 +84,7 @@ async function stealStaleLock(lockPath, staleToken) {
83
84
  // loop retry the ordinary acquire path.
84
85
  try {
85
86
  const claimInfo = await stat(claimPath);
86
- if (Date.now() - claimInfo.mtimeMs > STALE_LOCK_MS) {
87
+ if (now() - claimInfo.mtimeMs > STALE_LOCK_MS) {
87
88
  await bestEffortUnlink(claimPath);
88
89
  }
89
90
  }
@@ -112,9 +113,10 @@ async function stealStaleLock(lockPath, staleToken) {
112
113
  await bestEffortUnlink(claimPath);
113
114
  }
114
115
  }
115
- export async function acquireLock(lockPath, timeoutMs = DEFAULT_TIMEOUT_MS, logger) {
116
- const token = generateOwnerToken();
117
- const deadline = Date.now() + timeoutMs;
116
+ export async function acquireLock(lockPath, timeoutMs = DEFAULT_TIMEOUT_MS, logger, options = {}) {
117
+ const now = options.now ?? defaultClock;
118
+ const token = generateOwnerToken(now);
119
+ const deadline = now() + timeoutMs;
118
120
  let lastStaleCheckAt = 0;
119
121
  let retryInterval = RETRY_INTERVAL_INITIAL_MS;
120
122
  // A lock cannot be created in a directory that does not exist — the `wx` create
@@ -138,21 +140,21 @@ export async function acquireLock(lockPath, timeoutMs = DEFAULT_TIMEOUT_MS, logg
138
140
  }
139
141
  // Check the deadline BEFORE any stale-check IO (stat/readFile) or sleep, so a
140
142
  // slow filesystem cannot push the actual return time past timeoutMs.
141
- if (Date.now() >= deadline) {
143
+ if (now() >= deadline) {
142
144
  logger?.event({ kind: "error", note: "lock_timeout", lock_path: lockPath, timeout_ms: timeoutMs });
143
145
  throw new FileLockTimeoutError(lockPath);
144
146
  }
145
- const now = Date.now();
146
- if (now - lastStaleCheckAt >= STALE_CHECK_INTERVAL_MS) {
147
- lastStaleCheckAt = now;
148
- const staleToken = await readStaleLockToken(lockPath);
147
+ const checkAt = now();
148
+ if (checkAt - lastStaleCheckAt >= STALE_CHECK_INTERVAL_MS) {
149
+ lastStaleCheckAt = checkAt;
150
+ const staleToken = await readStaleLockToken(lockPath, now);
149
151
  if (staleToken !== null) {
150
152
  // Steal the exact stale lock we observed via a lease-style, mutually
151
153
  // exclusive claim (see stealStaleLock). Only the single claim winner ever
152
154
  // unlinks, and only while the lock still carries this stale token — so a
153
155
  // fresh lock another holder created in the gap is never clobbered, and two
154
156
  // concurrent stealers can never both end up holding the lock.
155
- await stealStaleLock(lockPath, staleToken);
157
+ await stealStaleLock(lockPath, staleToken, now);
156
158
  logger?.event({ kind: "step", note: "stale_lock_removed", lock_path: lockPath });
157
159
  // Progress was made (a slot may have opened); retry promptly and reset
158
160
  // the backoff window.
@@ -162,7 +164,7 @@ export async function acquireLock(lockPath, timeoutMs = DEFAULT_TIMEOUT_MS, logg
162
164
  }
163
165
  // Exponential backoff, clamped to the time left so we never sleep past the
164
166
  // deadline. Doubles each idle cycle up to RETRY_INTERVAL_MAX_MS.
165
- const sleepMs = Math.min(retryInterval, Math.max(0, deadline - Date.now()));
167
+ const sleepMs = Math.min(retryInterval, Math.max(0, deadline - now()));
166
168
  await new Promise((r) => setTimeout(r, sleepMs));
167
169
  retryInterval = Math.min(retryInterval * 2, RETRY_INTERVAL_MAX_MS);
168
170
  }
@@ -182,8 +184,8 @@ export async function releaseLock(lockPath, ownerToken) {
182
184
  // ENOENT: lock already gone — swallow silently
183
185
  }
184
186
  }
185
- export async function withFileLock(lockPath, fn, timeoutMs, logger) {
186
- const token = await acquireLock(lockPath, timeoutMs, logger);
187
+ export async function withFileLock(lockPath, fn, timeoutMs, logger, options = {}) {
188
+ const token = await acquireLock(lockPath, timeoutMs, logger, options);
187
189
  let hasFnError = false;
188
190
  try {
189
191
  return await fn();
@@ -1 +1 @@
1
- {"version":3,"file":"fileLock.js","sourceRoot":"","sources":["../../../src/shared/quota/fileLock.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fileLock.js","sourceRoot":"","sources":["../../../src/shared/quota/fileLock.ts"],"names":[],"mappings":"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"}
@@ -26,6 +26,15 @@ export interface ConfirmedPoolEntry {
26
26
  * (or by self-spawn guard). Excluded entries are recorded but not dispatched.
27
27
  */
28
28
  excluded: boolean;
29
+ /**
30
+ * Machine-readable self-spawn-blocked flag. True when this provider was
31
+ * detected on PATH but cannot be launched as a fresh subprocess from inside an
32
+ * active session of that same agent (claude-code under `CLAUDECODE`, codex
33
+ * under `CODEX`). Such an entry is `excluded: true` by default — and so out of
34
+ * the dispatchable pool — unless the operator explicitly re-includes it. This
35
+ * flag is the security signal; `reason` is advisory text only.
36
+ */
37
+ self_spawn_blocked?: boolean;
29
38
  /** Optional reason for exclusion or detection restriction. */
30
39
  reason?: string;
31
40
  }
@@ -1 +1 @@
1
- {"version":3,"file":"providerConfirmation.d.ts","sourceRoot":"","sources":["../../../src/shared/types/providerConfirmation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAM3E;;;GAGG;AACH,eAAO,MAAM,oCAAoC,EAAG,OAAgB,CAAC;AAMrE,gDAAgD;AAChD,MAAM,WAAW,kBAAkB;IACjC,+BAA+B;IAC/B,IAAI,EAAE,oBAAoB,CAAC;IAC3B,kDAAkD;IAClD,eAAe,EAAE,cAAc,CAAC;IAChC;;;OAGG;IACH,QAAQ,EAAE,OAAO,CAAC;IAClB,8DAA8D;IAC9D,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;GAKG;AACH,MAAM,WAAW,0BAA0B;IACzC,wEAAwE;IACxE,cAAc,EAAE,OAAO,oCAAoC,CAAC;IAC5D,yDAAyD;IACzD,YAAY,EAAE,MAAM,CAAC;IACrB,8EAA8E;IAC9E,aAAa,EAAE,kBAAkB,EAAE,CAAC;IACpC;;;OAGG;IACH,aAAa,EAAE,OAAO,CAAC;CACxB"}
1
+ {"version":3,"file":"providerConfirmation.d.ts","sourceRoot":"","sources":["../../../src/shared/types/providerConfirmation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAM3E;;;GAGG;AACH,eAAO,MAAM,oCAAoC,EAAG,OAAgB,CAAC;AAMrE,gDAAgD;AAChD,MAAM,WAAW,kBAAkB;IACjC,+BAA+B;IAC/B,IAAI,EAAE,oBAAoB,CAAC;IAC3B,kDAAkD;IAClD,eAAe,EAAE,cAAc,CAAC;IAChC;;;OAGG;IACH,QAAQ,EAAE,OAAO,CAAC;IAClB;;;;;;;OAOG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,8DAA8D;IAC9D,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;GAKG;AACH,MAAM,WAAW,0BAA0B;IACzC,wEAAwE;IACxE,cAAc,EAAE,OAAO,oCAAoC,CAAC;IAC5D,yDAAyD;IACzD,YAAY,EAAE,MAAM,CAAC;IACrB,8EAA8E;IAC9E,aAAa,EAAE,kBAAkB,EAAE,CAAC;IACpC;;;OAGG;IACH,aAAa,EAAE,OAAO,CAAC;CACxB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "audit-tools",
3
- "version": "0.30.48",
3
+ "version": "0.30.51",
4
4
  "private": false,
5
5
  "description": "Portable hybrid code auditing + remediation orchestrators for arbitrary repositories.",
6
6
  "type": "module",
@@ -45,7 +45,8 @@
45
45
  "test:shared": "npm run build && node --import tsx/esm --test tests/shared/*.test.mjs",
46
46
  "test:remediate": "vitest run",
47
47
  "test:single": "npm run build && node --import tsx/esm --test",
48
- "verify:release": "npm run check && npm run check:doc-manifest && npm test && npm run verify:hosts && npm run smoke:packaged-audit-code && npm run smoke:packaged-remediate-code",
48
+ "verify:release": "npm run check && npm run check:deadcode && npm run check:doc-manifest && npm test && npm run verify:hosts && npm run smoke:packaged-audit-code && npm run smoke:packaged-remediate-code",
49
+ "check:deadcode": "knip --no-config-hints",
49
50
  "check:doc-manifest": "node scripts/check-doc-manifest.mjs",
50
51
  "verify:hosts": "node scripts/audit/verify-hosts.mjs",
51
52
  "smoke:linked-audit-code": "node scripts/audit/smoke-linked-audit-code.mjs",
@@ -75,6 +76,7 @@
75
76
  },
76
77
  "devDependencies": {
77
78
  "@types/node": "^24.3.0",
79
+ "knip": "^6.23.0",
78
80
  "linguist-languages": "^9.3.2",
79
81
  "tree-sitter-wasms": "^0.1.13",
80
82
  "tsx": "^4.19.0",
@@ -304,22 +304,27 @@ for (const install of installs) {
304
304
 
305
305
  // Install OpenCode global command and MCP via merged config
306
306
  const opencodeGlobalConfig = join(homedir(), '.config', 'opencode', 'opencode.json');
307
- try {
308
- if (!sharedOpenCodePermissions) {
309
- throw new Error(
310
- 'audit-tools/shared is unavailable (build the shared workspace first); skipping OpenCode config deployment',
307
+ if (!sharedOpenCodePermissions) {
308
+ // Expected when audit-tools/shared isn't built yet — notably during `npm ci`
309
+ // in CI, where postinstall runs before the shared build step. This is a SKIP,
310
+ // not a failure: counting it would trip the `failed > 0` exit-1 guard below and
311
+ // break `npm ci`. Genuine OpenCode write errors are still counted as failures.
312
+ console.warn(
313
+ 'audit-code: audit-tools/shared is unavailable (build the shared workspace first); skipping OpenCode config deployment',
314
+ );
315
+ } else {
316
+ try {
317
+ const action = installMergedJson(opencodeGlobalConfig, (existing) =>
318
+ mergeOpenCodeGlobalConfig(existing),
311
319
  );
320
+ console.log(`audit-code: ${action} global OpenCode config in ${opencodeGlobalConfig}`);
321
+ succeeded++;
322
+ } catch (err) {
323
+ console.warn(`audit-code: could not install global OpenCode config (${err.message})`);
324
+ console.warn(` To install manually, add the mcp.auditor and command["audit-code"] entries to:`);
325
+ console.warn(` ${opencodeGlobalConfig}`);
326
+ failed++;
312
327
  }
313
- const action = installMergedJson(opencodeGlobalConfig, (existing) =>
314
- mergeOpenCodeGlobalConfig(existing),
315
- );
316
- console.log(`audit-code: ${action} global OpenCode config in ${opencodeGlobalConfig}`);
317
- succeeded++;
318
- } catch (err) {
319
- console.warn(`audit-code: could not install global OpenCode config (${err.message})`);
320
- console.warn(` To install manually, add the mcp.auditor and command["audit-code"] entries to:`);
321
- console.warn(` ${opencodeGlobalConfig}`);
322
- failed++;
323
328
  }
324
329
 
325
330
  // Install Antigravity plugin (global skill for Gemini IDE / Antigravity Hub)
@@ -383,3 +388,6 @@ try {
383
388
  }
384
389
 
385
390
  console.log(`audit-code: postinstall complete — ${succeeded} succeeded, ${failed} failed (${Date.now() - postinstallStart}ms)`);
391
+ if (failed > 0) {
392
+ process.exitCode = 1;
393
+ }