doc-detective 4.41.6 → 4.42.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 (155) hide show
  1. package/README.md +3 -4
  2. package/bin/doc-detective-lsp.js +2 -0
  3. package/dist/agents/adapters/claude-code.js +1 -1
  4. package/dist/agents/adapters/claude-code.js.map +1 -1
  5. package/dist/agents/adapters/copilot-cli.js +2 -2
  6. package/dist/agents/adapters/copilot-cli.js.map +1 -1
  7. package/dist/agents/adapters/gemini-cli.js +1 -1
  8. package/dist/agents/adapters/gemini-cli.js.map +1 -1
  9. package/dist/agents/adapters/qwen-code.js +1 -1
  10. package/dist/agents/adapters/qwen-code.js.map +1 -1
  11. package/dist/cli.js +27 -6
  12. package/dist/cli.js.map +1 -1
  13. package/dist/common/src/schemas/schemas.json +2 -2
  14. package/dist/common/src/schemas/schemasReferenced.json +448 -294
  15. package/dist/common/src/schemas/validators.cjs +140 -124
  16. package/dist/common/src/schemas/validatorsCheck.cjs +1 -1
  17. package/dist/common/src/types/generated/annotate_v3.d.ts +12 -12
  18. package/dist/common/src/types/generated/annotate_v3.d.ts.map +1 -1
  19. package/dist/common/src/types/generated/annotation_v3.d.ts +6 -6
  20. package/dist/common/src/types/generated/annotation_v3.d.ts.map +1 -1
  21. package/dist/common/src/types/generated/checkLink_v3.d.ts +4 -0
  22. package/dist/common/src/types/generated/checkLink_v3.d.ts.map +1 -1
  23. package/dist/common/src/types/generated/click_v3.d.ts +2 -2
  24. package/dist/common/src/types/generated/click_v3.d.ts.map +1 -1
  25. package/dist/common/src/types/generated/config_v3.d.ts +260 -108
  26. package/dist/common/src/types/generated/config_v3.d.ts.map +1 -1
  27. package/dist/common/src/types/generated/context_v3.d.ts +10 -2
  28. package/dist/common/src/types/generated/context_v3.d.ts.map +1 -1
  29. package/dist/common/src/types/generated/dragAndDrop_v3.d.ts +2 -2
  30. package/dist/common/src/types/generated/dragAndDrop_v3.d.ts.map +1 -1
  31. package/dist/common/src/types/generated/find_v3.d.ts +6 -6
  32. package/dist/common/src/types/generated/find_v3.d.ts.map +1 -1
  33. package/dist/common/src/types/generated/goTo_v3.d.ts +1 -1
  34. package/dist/common/src/types/generated/goTo_v3.d.ts.map +1 -1
  35. package/dist/common/src/types/generated/httpRequest_v3.d.ts +2 -2
  36. package/dist/common/src/types/generated/httpRequest_v3.d.ts.map +1 -1
  37. package/dist/common/src/types/generated/record_v3.d.ts +5 -5
  38. package/dist/common/src/types/generated/record_v3.d.ts.map +1 -1
  39. package/dist/common/src/types/generated/report_v3.d.ts +529 -207
  40. package/dist/common/src/types/generated/report_v3.d.ts.map +1 -1
  41. package/dist/common/src/types/generated/resolvedTests_v3.d.ts +754 -314
  42. package/dist/common/src/types/generated/resolvedTests_v3.d.ts.map +1 -1
  43. package/dist/common/src/types/generated/runCode_v3.d.ts +11 -2
  44. package/dist/common/src/types/generated/runCode_v3.d.ts.map +1 -1
  45. package/dist/common/src/types/generated/runShell_v3.d.ts +11 -2
  46. package/dist/common/src/types/generated/runShell_v3.d.ts.map +1 -1
  47. package/dist/common/src/types/generated/screenshot_v3.d.ts +12 -12
  48. package/dist/common/src/types/generated/screenshot_v3.d.ts.map +1 -1
  49. package/dist/common/src/types/generated/spec_v3.d.ts +494 -206
  50. package/dist/common/src/types/generated/spec_v3.d.ts.map +1 -1
  51. package/dist/common/src/types/generated/startSurface_v3.d.ts +24 -6
  52. package/dist/common/src/types/generated/startSurface_v3.d.ts.map +1 -1
  53. package/dist/common/src/types/generated/step_v3.d.ts +223 -100
  54. package/dist/common/src/types/generated/step_v3.d.ts.map +1 -1
  55. package/dist/common/src/types/generated/test_v3.d.ts +482 -202
  56. package/dist/common/src/types/generated/test_v3.d.ts.map +1 -1
  57. package/dist/common/src/types/generated/type_v3.d.ts +3 -3
  58. package/dist/common/src/types/generated/type_v3.d.ts.map +1 -1
  59. package/dist/common/src/types/generated/waitUntil_v3.d.ts +2 -2
  60. package/dist/common/src/types/generated/waitUntil_v3.d.ts.map +1 -1
  61. package/dist/common/src/types/generated/wait_v3.d.ts +2 -3
  62. package/dist/common/src/types/generated/wait_v3.d.ts.map +1 -1
  63. package/dist/core/config.d.ts.map +1 -1
  64. package/dist/core/config.js +6 -4
  65. package/dist/core/config.js.map +1 -1
  66. package/dist/core/files.d.ts +18 -3
  67. package/dist/core/files.d.ts.map +1 -1
  68. package/dist/core/files.js +58 -18
  69. package/dist/core/files.js.map +1 -1
  70. package/dist/core/index.d.ts.map +1 -1
  71. package/dist/core/index.js +16 -0
  72. package/dist/core/index.js.map +1 -1
  73. package/dist/core/integrations/index.d.ts +2 -1
  74. package/dist/core/integrations/index.d.ts.map +1 -1
  75. package/dist/core/integrations/index.js +15 -5
  76. package/dist/core/integrations/index.js.map +1 -1
  77. package/dist/core/openapi.d.ts.map +1 -1
  78. package/dist/core/openapi.js +122 -6
  79. package/dist/core/openapi.js.map +1 -1
  80. package/dist/core/ptyWatchdog.d.ts.map +1 -1
  81. package/dist/core/ptyWatchdog.js +6 -3
  82. package/dist/core/ptyWatchdog.js.map +1 -1
  83. package/dist/core/resolveTests.d.ts.map +1 -1
  84. package/dist/core/resolveTests.js +5 -3
  85. package/dist/core/resolveTests.js.map +1 -1
  86. package/dist/core/telem.d.ts.map +1 -1
  87. package/dist/core/telem.js +5 -7
  88. package/dist/core/telem.js.map +1 -1
  89. package/dist/core/tests/checkLink.d.ts.map +1 -1
  90. package/dist/core/tests/checkLink.js +12 -7
  91. package/dist/core/tests/checkLink.js.map +1 -1
  92. package/dist/core/tests/click.d.ts.map +1 -1
  93. package/dist/core/tests/click.js +7 -0
  94. package/dist/core/tests/click.js.map +1 -1
  95. package/dist/core/tests/findElement.d.ts.map +1 -1
  96. package/dist/core/tests/findElement.js +3 -2
  97. package/dist/core/tests/findElement.js.map +1 -1
  98. package/dist/core/tests/goTo.d.ts.map +1 -1
  99. package/dist/core/tests/goTo.js +2 -1
  100. package/dist/core/tests/goTo.js.map +1 -1
  101. package/dist/core/tests/httpRequest.d.ts.map +1 -1
  102. package/dist/core/tests/httpRequest.js +4 -5
  103. package/dist/core/tests/httpRequest.js.map +1 -1
  104. package/dist/core/tests/processSurface.d.ts +4 -1
  105. package/dist/core/tests/processSurface.d.ts.map +1 -1
  106. package/dist/core/tests/processSurface.js +3 -0
  107. package/dist/core/tests/processSurface.js.map +1 -1
  108. package/dist/core/tests/saveScreenshot.d.ts.map +1 -1
  109. package/dist/core/tests/saveScreenshot.js +8 -3
  110. package/dist/core/tests/saveScreenshot.js.map +1 -1
  111. package/dist/core/tests/startRecording.d.ts.map +1 -1
  112. package/dist/core/tests/startRecording.js +2 -1
  113. package/dist/core/tests/startRecording.js.map +1 -1
  114. package/dist/core/tests/stopRecording.d.ts.map +1 -1
  115. package/dist/core/tests/stopRecording.js +2 -1
  116. package/dist/core/tests/stopRecording.js.map +1 -1
  117. package/dist/core/tests/timing.d.ts +4 -0
  118. package/dist/core/tests/timing.d.ts.map +1 -0
  119. package/dist/core/tests/timing.js +8 -0
  120. package/dist/core/tests/timing.js.map +1 -0
  121. package/dist/core/tests.d.ts +15 -0
  122. package/dist/core/tests.d.ts.map +1 -1
  123. package/dist/core/tests.js +77 -30
  124. package/dist/core/tests.js.map +1 -1
  125. package/dist/core/utils.d.ts +42 -2
  126. package/dist/core/utils.d.ts.map +1 -1
  127. package/dist/core/utils.js +281 -89
  128. package/dist/core/utils.js.map +1 -1
  129. package/dist/debug/index.d.ts.map +1 -1
  130. package/dist/debug/index.js +8 -36
  131. package/dist/debug/index.js.map +1 -1
  132. package/dist/hints/hints.js +2 -2
  133. package/dist/hints/hints.js.map +1 -1
  134. package/dist/index.cjs +684 -235
  135. package/dist/reporters/htmlReporter.js +1 -1
  136. package/dist/runtime/cacheDir.d.ts.map +1 -1
  137. package/dist/runtime/cacheDir.js +6 -11
  138. package/dist/runtime/cacheDir.js.map +1 -1
  139. package/dist/runtime/heavyDeps.d.ts +12 -0
  140. package/dist/runtime/heavyDeps.d.ts.map +1 -1
  141. package/dist/runtime/heavyDeps.js +31 -7
  142. package/dist/runtime/heavyDeps.js.map +1 -1
  143. package/dist/runtime/selfUpdate.d.ts +3 -3
  144. package/dist/runtime/selfUpdate.d.ts.map +1 -1
  145. package/dist/runtime/selfUpdate.js +34 -5
  146. package/dist/runtime/selfUpdate.js.map +1 -1
  147. package/dist/upgradeNotice.d.ts +41 -0
  148. package/dist/upgradeNotice.d.ts.map +1 -0
  149. package/dist/upgradeNotice.js +356 -0
  150. package/dist/upgradeNotice.js.map +1 -0
  151. package/dist/utils.d.ts.map +1 -1
  152. package/dist/utils.js +17 -8
  153. package/dist/utils.js.map +1 -1
  154. package/package.json +2 -2
  155. package/scripts/postinstall.js +1 -1
@@ -1,6 +1,36 @@
1
1
  import { type ChildProcess } from "node:child_process";
2
+ import type { AxiosRequestConfig } from "axios";
2
3
  export declare function loadAxios(): Promise<typeof import("axios").default>;
3
- export { outputResults, loadEnvs, log, logLevelEnabled, timestamp, getOrInitRunTimestamp, getRunOutputDir, runArchivesArtifacts, replaceEnvs, spawnCommand, spawnBackgroundCommand, spawnPtyBackgroundCommand, resolveShellName, resolveShellExecutable, shellSpawnEnv, waitForReady, waitForPort, waitForHttp, waitForStdio, waitForOutputMatch, inContainer, cleanTemp, calculateFractionalDifference, serializeBrowserResult, matchesExpectedOutput, fetchFile, isRelativeUrl, appendQueryParams, isDeviceWebContext, computeSettleCeiling, redactUrlForOutput, assertUrlHostIsPublic, sanitizeFilesystemName, compileFilter, isRetryableSessionError, isSessionAlive, isPageBroken, isPageUnnavigated, isInitialBlankDocument, issueNavigation, probeStuckOnBlankDocument, guardBlankDocumentNavigation, classifyContextRetry, isTransientProcessInitError, matchesFilter, selectSpecsForRun, shouldFailRun, findFreePort, runConcurrent, createResourceRegistry, runResourceAware, rollUpResults, rollUpAssertions, createAppiumPool, evaluateContextRequirements, verifiedDate, shieldsBadge, resolveVerifiedId, applyVerifiedMarkers, applyBadgeAnchoredTests, };
4
+ /**
5
+ * Browser and driver versions for a context's report (ADR 01163), read from
6
+ * the WebdriverIO session's capabilities, falling back to the detected app
7
+ * (`availableApps` entry) where the session is silent. appium-geckodriver
8
+ * echoes the requested capabilities rather than geckodriver's, so Firefox's
9
+ * versions come from the detected build ID (`nightly_161.0a1`) and the
10
+ * managed `geckodriver-<version>` binary name. Safari reports no driver
11
+ * version.
12
+ */
13
+ export declare function sessionVersions({ capabilities, app, }: {
14
+ capabilities?: any;
15
+ app?: {
16
+ name?: string;
17
+ version?: string;
18
+ driver?: string;
19
+ };
20
+ }): {
21
+ browserVersion?: string;
22
+ driver?: {
23
+ name: string;
24
+ version?: string;
25
+ };
26
+ };
27
+ declare const FETCH_TEXT_DEFAULTS: {
28
+ timeout: number;
29
+ maxContentLength: number;
30
+ maxBodyLength: number;
31
+ responseType: "text";
32
+ };
33
+ export { outputResults, loadEnvs, log, logLevelEnabled, timestamp, getOrInitRunTimestamp, getRunOutputDir, runArchivesArtifacts, replaceEnvs, spawnCommand, spawnBackgroundCommand, spawnPtyBackgroundCommand, resolveShellName, resolveShellExecutable, shellSpawnEnv, waitForReady, waitForPort, waitForHttp, waitForStdio, waitForOutputMatch, inContainer, cleanTemp, calculateFractionalDifference, serializeBrowserResult, matchesExpectedOutput, fetchFile, isRelativeUrl, appendQueryParams, isDeviceWebContext, computeSettleCeiling, redactUrlForOutput, privateAddressOf, localUrlPolicy, getGuarded, UrlGuardError, FETCH_TEXT_DEFAULTS, sanitizeFilesystemName, compileFilter, isRetryableSessionError, isSessionAlive, isPageBroken, isPageUnnavigated, isInitialBlankDocument, issueNavigation, probeStuckOnBlankDocument, guardBlankDocumentNavigation, classifyContextRetry, isTransientProcessInitError, matchesFilter, selectSpecsForRun, shouldFailRun, findFreePort, runConcurrent, createResourceRegistry, runResourceAware, rollUpResults, rollUpAssertions, createAppiumPool, evaluateContextRequirements, verifiedDate, shieldsBadge, resolveVerifiedId, applyVerifiedMarkers, applyBadgeAnchoredTests, };
4
34
  export type { BackgroundProcess, ResourceRegistry };
5
35
  declare function createAppiumPool(ports: number[]): {
6
36
  acquire(): Promise<number>;
@@ -78,7 +108,17 @@ declare function appendQueryParams(url: string, params: Record<string, unknown>
78
108
  declare function cleanTemp(): void;
79
109
  declare function sanitizeFilesystemName(name: string, fallback: string): string;
80
110
  declare function redactUrlForOutput(value: string): string;
81
- declare function assertUrlHostIsPublic(fileURL: string): Promise<void>;
111
+ declare class UrlGuardError extends Error {
112
+ }
113
+ declare function localUrlPolicy(): "hops" | "allow" | "block";
114
+ declare function privateAddressOf(fileURL: string, { every }?: {
115
+ every?: boolean;
116
+ }): Promise<string | undefined>;
117
+ declare function getGuarded(url: string, opts?: AxiosRequestConfig, refuseFirst?: (address: string) => Error, refuseRedirect?: (from: string, address: string) => Error): Promise<{
118
+ data: any;
119
+ url: string;
120
+ reachedPublic: boolean;
121
+ }>;
82
122
  declare function fetchFile(fileURL: string, opts?: {
83
123
  binary?: boolean;
84
124
  }): Promise<{
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/core/utils.ts"],"names":[],"mappings":"AAMA,OAAO,EAAS,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAkB9D,wBAAgB,SAAS,IAAI,OAAO,CAAC,cAAc,OAAO,EAAE,OAAO,CAAC,CAEnE;AAED,OAAO,EACL,aAAa,EACb,QAAQ,EACR,GAAG,EACH,eAAe,EACf,SAAS,EACT,qBAAqB,EACrB,eAAe,EACf,oBAAoB,EACpB,WAAW,EACX,YAAY,EACZ,sBAAsB,EACtB,yBAAyB,EACzB,gBAAgB,EAChB,sBAAsB,EACtB,aAAa,EACb,YAAY,EACZ,WAAW,EACX,WAAW,EACX,YAAY,EACZ,kBAAkB,EAClB,WAAW,EACX,SAAS,EACT,6BAA6B,EAC7B,sBAAsB,EACtB,qBAAqB,EACrB,SAAS,EACT,aAAa,EACb,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,EACpB,kBAAkB,EAClB,qBAAqB,EACrB,sBAAsB,EACtB,aAAa,EACb,uBAAuB,EACvB,cAAc,EACd,YAAY,EACZ,iBAAiB,EACjB,sBAAsB,EACtB,eAAe,EACf,yBAAyB,EACzB,4BAA4B,EAC5B,oBAAoB,EACpB,2BAA2B,EAC3B,aAAa,EACb,iBAAiB,EACjB,aAAa,EACb,YAAY,EACZ,aAAa,EACb,sBAAsB,EACtB,gBAAgB,EAChB,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,2BAA2B,EAC3B,YAAY,EACZ,YAAY,EACZ,iBAAiB,EACjB,oBAAoB,EACpB,uBAAuB,GACxB,CAAC;AAEF,YAAY,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,CAAC;AAQpD,iBAAS,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG;IAC1C,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAC3B,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B,CAeA;AAYD,iBAAe,aAAa,CAAC,CAAC,EAC5B,KAAK,EAAE,CAAC,EAAE,EACV,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,GAC7B,OAAO,CAAC,IAAI,CAAC,CASf;AAOD,KAAK,gBAAgB,GAAG;IACtB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IACrC,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAC/B,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B,CAAC;AACF,iBAAS,sBAAsB,IAAI,gBAAgB,CAmBlD;AAkBD,iBAAe,gBAAgB,CAAC,CAAC,EAC/B,KAAK,EAAE,CAAC,EAAE,EACV,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,gBAAgB,EAC1B,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,EAC9B,WAAW,GAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,EACA,GAC/B,OAAO,CAAC,IAAI,CAAC,CAqCf;AAID,iBAAS,aAAa,CAAC,QAAQ,EAAE,KAAK,CAAC;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,MAAM,CAKnE;AASD,iBAAS,gBAAgB,CACvB,UAAU,CAAC,EAAE,KAAK,CAAC;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,IAAI,GAC7C,MAAM,CAGR;AAMD,iBAAe,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,CAc7C;AAKD,UAAU,iBAAiB;IAIzB,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB,SAAS,IAAI,MAAM,CAAC;IACpB,SAAS,IAAI,MAAM,CAAC;IACpB,WAAW,IAAI,MAAM,CAAC;IAGtB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAE7B,OAAO,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,QAAQ,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IAG9E,MAAM,EAAE,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAI/B,IAAI,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAG9B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAeD,iBAAS,sBAAsB,CAC7B,GAAG,EAAE,MAAM,EACX,IAAI,GAAE,MAAM,EAAO,EACnB,OAAO,GAAE,GAAQ,GAChB,iBAAiB,CAqEnB;AA8DD,iBAAe,yBAAyB,CACtC,GAAG,EAAE,MAAM,EACX,IAAI,GAAE,MAAM,EAAO,EACnB,OAAO,GAAE,GAAQ,GAChB,OAAO,CAAC,iBAAiB,CAAC,CA0J5B;AAyBD,iBAAe,WAAW,CACxB,IAAI,EAAE,MAAM,EACZ,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,GACjC,OAAO,CAAC,IAAI,CAAC,CAaf;AAID,iBAAe,WAAW,CACxB,GAAG,EAAE,MAAM,EACX,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,GACjC,OAAO,CAAC,IAAI,CAAC,CAmBf;AASD,iBAAS,YAAY,CACnB,EAAE,EAAE,iBAAiB,EACrB,QAAQ,EAAE,MAAM,EAChB,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,GACjC,OAAO,CAAC,IAAI,CAAC,CAmCf;AASD,iBAAS,kBAAkB,CACzB,EAAE,EAAE,iBAAiB,EACrB,QAAQ,EAAE,MAAM,EAChB,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,GACjC,OAAO,CAAC,OAAO,CAAC,CAgBlB;AAMD,iBAAe,YAAY,CACzB,EAAE,EAAE,iBAAiB,EACrB,SAAS,EAAE,GAAG,EACd,EAAE,SAAS,EAAE,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,GACnC,OAAO,CAAC,IAAI,CAAC,CAwCf;AA8BD,iBAAS,uBAAuB,CAC9B,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,cAAc,GAAE,MAAM,GAAG,SAAa,GACrC,OAAO,CAIT;AAmBD,iBAAe,cAAc,CAC3B,MAAM,EAAE,GAAG,EACX,cAAc,GAAE,MAAc,GAC7B,OAAO,CAAC,OAAO,CAAC,CA0BlB;AAeD,iBAAe,YAAY,CAAC,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,CAQzD;AAsBD,iBAAe,iBAAiB,CAAC,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,CAO9D;AAOD,iBAAS,sBAAsB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAErD;AASD,iBAAe,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAKzE;AAQD,iBAAe,yBAAyB,CACtC,MAAM,EAAE,GAAG,EACX,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CASxB;AAYD,iBAAS,4BAA4B,CAAC,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,GAAG,IAAI,CA2CpE;AAED,MAAM,MAAM,kBAAkB,GAAG,cAAc,GAAG,aAAa,GAAG,aAAa,CAAC;AAyBhF,iBAAe,oBAAoB,CACjC,YAAY,EAAE,GAAG,EAAE,EACnB,EAAE,SAAgB,EAAE,GAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAA;CAAO,GACjD,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAOpC;AAsBD,iBAAS,2BAA2B,CAClC,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,QAAQ,GAAE,MAAyB,GAClC,OAAO,CAYT;AAED,iBAAS,aAAa,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,GAAG,MAAM,EAAE,CAY9D;AAED,iBAAS,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAIzE;AAOD,iBAAS,iBAAiB,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,GAAG,GAAG,GAAG,EAAE,CAc3D;AAOD,iBAAS,aAAa,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,CAG5C;AAED,iBAAS,aAAa,CAAC,GAAG,EAAE,MAAM,WASjC;AAeD,iBAAS,kBAAkB,CAAC,MAAM,EAAE,GAAG,GAAG,OAAO,CAKhD;AAQD;;;GAGG;AACH,iBAAS,oBAAoB,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAE5E;AAED,iBAAS,iBAAiB,CACxB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAAG,IAAI,GACjD,MAAM,CA6CR;AAsBD,iBAAS,SAAS,SAkBjB;AAqBD,iBAAS,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAOtE;AAwBD,iBAAS,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAsBjD;AAqED,iBAAe,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA+CnE;AAED,iBAAe,SAAS,CACtB,OAAO,EAAE,MAAM,EACf,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO;;;;;;;;GA8ChC;AAED,iBAAe,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,iBAOnE;AAED;;;;;;;;GAQG;AACH,iBAAe,QAAQ,CAAC,QAAQ,EAAE,MAAM;;;GASvC;AAQD,iBAAS,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CA8B5D;AAED;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,KAAK,CAAC;AAKxC;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,uBAAuB,CACrC,SAAS,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,EAC1D,MAAM,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,EACvD,SAAS,SAAI,GACZ,MAAM,GAAG,IAAI,CAgBf;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,EAC1D,MAAM,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,EACvD,SAAS,SAAwB,GAChC,OAAO,CAQT;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,EAC1D,OAAO,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,GACvD;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAOnC;AAYD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,GAAG,EACX,SAAS,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,EAC9C,MAAM,GAAE,GAAQ,EAChB,KAAK,CAAC,EAAE,MAAM,EACd,KAAK,SAAY,GAChB,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAmD5C;AAED;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB;IAAK,KAAK;IAAQ,MAAM;CAAO,CAAC;AAE7D;;;GAGG;AACH,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,UAAU,GAAG,QAAQ,GAAG,SAAS,CAAC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAgBF;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,GAAG,EACX,QAAQ,EACJ;IACE,QAAQ,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/C,MAAM,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC9C,GACD,SAAS,EACb,MAAM,GAAE,GAAQ,EAChB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC,CA0C/E;AAED,iBAAe,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,iBAkB3D;AASD,KAAK,eAAe,GAAG;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACzC,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC;IAC5C,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;CAC5B,CAAC;AA6EF,iBAAS,2BAA2B,CAAC,EACnC,QAAQ,EACR,IAAS,GACV,EAAE;IACD,QAAQ,EAAE,GAAG,CAAC;IACd,IAAI,CAAC,EAAE,eAAe,CAAC;CACxB,GAAG;IAAE,GAAG,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAgCtC;AAcD,iBAAS,WAAW,CAAC,cAAc,EAAE,GAAG,GAAG,GAAG,CAyC7C;AAwCD,iBAAS,YAAY,CAAC,CAAC,GAAE,IAAiB,GAAG,MAAM,CAKlD;AAWD,iBAAS,YAAY,CACnB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,EAAE,KAAuB,EAAE,KAAqB,EAAE,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GAC1F,MAAM,CAeR;AAgDD,iBAAS,iBAAiB,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CASlE;AAcD,iBAAS,oBAAoB,CAAC,EAC5B,MAAM,EACN,OAAO,EACP,KAAK,EAAE,aAAkB,EACzB,IAAY,GACb,EAAE;IACD,MAAM,EAAE,GAAG,CAAC;IACZ,OAAO,EAAE,GAAG,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,GAAG,IAAI,CAqDP;AA6CD,iBAAS,uBAAuB,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,IAAY,EAAE,EAAE;IAAE,MAAM,EAAE,GAAG,CAAC;IAAC,OAAO,EAAE,GAAG,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CA2IvH;AAOD,iBAAS,SAAS,WAEjB;AAID,iBAAS,qBAAqB,CAAC,MAAM,EAAE,GAAG,GAAG,MAAM,CAMlD;AAmBD,iBAAS,eAAe,CACtB,MAAM,EAAE,GAAG,EACX,EAAE,MAAa,EAAE,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO,GAC3C,MAAM,CA+CR;AAyBD,iBAAS,oBAAoB,CAAC,MAAM,GAAE,GAAQ,EAAE,KAAK,GAAE,GAAG,EAAO,GAAG,OAAO,CAgC1E;AAKD,KAAK,SAAS,GAAG,MAAM,GAAG,KAAK,GAAG,YAAY,CAAC;AAO/C,iBAAS,gBAAgB,CAAC,EACxB,MAAM,EACN,IAAI,GACL,GAAE;IAAE,MAAM,CAAC,EAAE,GAAG,CAAC;IAAC,IAAI,CAAC,EAAE,GAAG,CAAA;CAAO,GAAG,SAAS,CAE/C;AAID,UAAU,gBAAgB;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kBAAkB,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1E,cAAc,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;CACzC;AA6BD,iBAAe,sBAAsB,CACnC,SAAS,EAAE,MAAM,EACjB,IAAI,GAAE,gBAAqB,GAC1B,OAAO,CAAC,MAAM,CAAC,CA4CjB;AASD,iBAAS,aAAa,CACpB,eAAe,EAAE,MAAM,GAAG,SAAS,EACnC,IAAI,GAAE;IACJ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;CACrC,GACL,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,SAAS,CAyBhD;AAGD;;;;;;;;GAQG;AACH,iBAAe,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,EAAO,EAAE,OAAO,GAAE,GAAQ;;;;GA0D9E;AAED,iBAAe,WAAW,qBASzB;AAED;;;;;;;GAOG;AACH,iBAAS,6BAA6B,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,UAMlE;AAED;;;;;;;;;;;GAWG;AACH,iBAAS,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CActD;AAED;;;;;;;;;GASG;AACH,iBAAS,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAY5E"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/core/utils.ts"],"names":[],"mappings":"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"}
@@ -3,12 +3,13 @@ import os from "node:os";
3
3
  import path from "node:path";
4
4
  import crypto from "node:crypto";
5
5
  import dns from "node:dns/promises";
6
+ import dnsCallback from "node:dns";
6
7
  import net from "node:net";
7
8
  import { spawn } from "node:child_process";
8
9
  import { loadHeavyDep, resolveHeavyDepPath, ensureRuntimeInstalled, } from "../runtime/loader.js";
9
10
  import { resolveWindowsBash as defaultResolveWindowsBash } from "../runtime/windowsBash.js";
11
+ import { ownVersion } from "../runtime/heavyDeps.js";
10
12
  import { assertConptyAllocatable, ensurePtyBackendOnDisk, } from "./ptyWatchdog.js";
11
- import { createRequire } from "node:module";
12
13
  import { applyVerification, declarePage, VERIFIED_TOOL } from "./verification.js";
13
14
  // axios (~70 modules with its deps) loads on first use rather than at CLI
14
15
  // startup (see test/startup-modules.test.js). Cached, so hot paths pay the
@@ -17,7 +18,54 @@ let axiosModule;
17
18
  export function loadAxios() {
18
19
  return (axiosModule ??= import("axios").then((m) => m.default));
19
20
  }
20
- export { outputResults, loadEnvs, log, logLevelEnabled, timestamp, getOrInitRunTimestamp, getRunOutputDir, runArchivesArtifacts, replaceEnvs, spawnCommand, spawnBackgroundCommand, spawnPtyBackgroundCommand, resolveShellName, resolveShellExecutable, shellSpawnEnv, waitForReady, waitForPort, waitForHttp, waitForStdio, waitForOutputMatch, inContainer, cleanTemp, calculateFractionalDifference, serializeBrowserResult, matchesExpectedOutput, fetchFile, isRelativeUrl, appendQueryParams, isDeviceWebContext, computeSettleCeiling, redactUrlForOutput, assertUrlHostIsPublic, sanitizeFilesystemName, compileFilter, isRetryableSessionError, isSessionAlive, isPageBroken, isPageUnnavigated, isInitialBlankDocument, issueNavigation, probeStuckOnBlankDocument, guardBlankDocumentNavigation, classifyContextRetry, isTransientProcessInitError, matchesFilter, selectSpecsForRun, shouldFailRun, findFreePort, runConcurrent, createResourceRegistry, runResourceAware, rollUpResults, rollUpAssertions, createAppiumPool, evaluateContextRequirements, verifiedDate, shieldsBadge, resolveVerifiedId, applyVerifiedMarkers, applyBadgeAnchoredTests, };
21
+ /**
22
+ * Browser and driver versions for a context's report (ADR 01163), read from
23
+ * the WebdriverIO session's capabilities, falling back to the detected app
24
+ * (`availableApps` entry) where the session is silent. appium-geckodriver
25
+ * echoes the requested capabilities rather than geckodriver's, so Firefox's
26
+ * versions come from the detected build ID (`nightly_161.0a1`) and the
27
+ * managed `geckodriver-<version>` binary name. Safari reports no driver
28
+ * version.
29
+ */
30
+ export function sessionVersions({ capabilities, app, }) {
31
+ const result = {};
32
+ // Runs after the driver started, so odd values are ignored, never thrown on.
33
+ const str = (value) => typeof value === "string" && value ? value : undefined;
34
+ const caps = capabilities ?? {};
35
+ const browserVersion = str(caps.browserVersion) ?? str(app?.version)?.replace(/^[a-z]+_/, "");
36
+ if (browserVersion)
37
+ result.browserVersion = browserVersion;
38
+ const chromedriver = str(caps.chrome?.chromedriverVersion);
39
+ if (chromedriver) {
40
+ result.driver = { name: "chromedriver", version: chromedriver.split(" ")[0] };
41
+ }
42
+ else if (app?.name === "firefox") {
43
+ const version = str(caps["moz:geckodriverVersion"]) ??
44
+ /geckodriver-(\d+(?:\.\d+)*)/i.exec(path.basename(str(app.driver) ?? ""))?.[1];
45
+ result.driver = { name: "geckodriver", ...(version && { version }) };
46
+ }
47
+ else if (app?.name === "safari") {
48
+ result.driver = { name: "safaridriver" };
49
+ }
50
+ return result;
51
+ }
52
+ // Fetch a file from a URL and save to a temp directory.
53
+ // With `{ binary: true }`, fetches as arraybuffer and preserves raw bytes —
54
+ // required for images and other non-text payloads. Binary fetches also apply
55
+ // hard limits (timeout, max body size; getGuarded caps redirects) so a
56
+ // misbehaving server can't stall or OOM the run.
57
+ // Otherwise, non-JSON responses are stringified (text pass-through).
58
+ // Returns `{ result: "error", message }` on failure.
59
+ const FETCH_BINARY_DEFAULTS = {
60
+ responseType: "arraybuffer",
61
+ timeout: 30_000,
62
+ maxContentLength: 50 * 1024 * 1024,
63
+ maxBodyLength: 50 * 1024 * 1024,
64
+ };
65
+ // The same limits for text bodies, such as OpenAPI descriptions and their
66
+ // $refs. "text" also stops axios from parsing JSON on its own.
67
+ const FETCH_TEXT_DEFAULTS = { ...FETCH_BINARY_DEFAULTS, responseType: "text" };
68
+ export { outputResults, loadEnvs, log, logLevelEnabled, timestamp, getOrInitRunTimestamp, getRunOutputDir, runArchivesArtifacts, replaceEnvs, spawnCommand, spawnBackgroundCommand, spawnPtyBackgroundCommand, resolveShellName, resolveShellExecutable, shellSpawnEnv, waitForReady, waitForPort, waitForHttp, waitForStdio, waitForOutputMatch, inContainer, cleanTemp, calculateFractionalDifference, serializeBrowserResult, matchesExpectedOutput, fetchFile, isRelativeUrl, appendQueryParams, isDeviceWebContext, computeSettleCeiling, redactUrlForOutput, privateAddressOf, localUrlPolicy, getGuarded, UrlGuardError, FETCH_TEXT_DEFAULTS, sanitizeFilesystemName, compileFilter, isRetryableSessionError, isSessionAlive, isPageBroken, isPageUnnavigated, isInitialBlankDocument, issueNavigation, probeStuckOnBlankDocument, guardBlankDocumentNavigation, classifyContextRetry, isTransientProcessInitError, matchesFilter, selectSpecsForRun, shouldFailRun, findFreePort, runConcurrent, createResourceRegistry, runResourceAware, rollUpResults, rollUpAssertions, createAppiumPool, evaluateContextRequirements, verifiedDate, shieldsBadge, resolveVerifiedId, applyVerifiedMarkers, applyBadgeAnchoredTests, };
21
69
  // A fixed set of Appium server ports shared by concurrent runners. `acquire()`
22
70
  // hands out a free port, waiting if every port is checked out; `release()`
23
71
  // returns one, handing it straight to the next waiter. Single-threaded JS
@@ -385,11 +433,9 @@ async function spawnPtyBackgroundCommand(cmd, args = [], options = {}) {
385
433
  try {
386
434
  ptyProcess = pty.spawn(shell, shellArgs, {
387
435
  name: "xterm-color",
388
- // TODO(phase): expose as `background.tty.cols` / `background.tty.rows` so
389
- // layout-sensitive TUIs (Ink reads process.stdout.columns) can match an
390
- // expected width when authoring `waitUntil.stdio` patterns.
391
- cols: 120,
392
- rows: 30,
436
+ // `tty: {cols, rows}`; Ajv skips defaults inside the schema's anyOf.
437
+ cols: options.cols ?? 120,
438
+ rows: options.rows ?? 30,
393
439
  cwd: options.cwd || process.cwd(),
394
440
  env: shellSpawnEnv(options.shell) ?? process.env,
395
441
  });
@@ -1078,20 +1124,6 @@ function cleanTemp() {
1078
1124
  }
1079
1125
  }
1080
1126
  }
1081
- // Fetch a file from a URL and save to a temp directory.
1082
- // With `{ binary: true }`, fetches as arraybuffer and preserves raw bytes —
1083
- // required for images and other non-text payloads. Binary fetches also apply
1084
- // hard limits (timeout, max body size, max redirects) so a misbehaving server
1085
- // can't stall or OOM the run.
1086
- // Otherwise, non-JSON responses are stringified (text pass-through).
1087
- // Returns `{ result: "error", message }` on failure.
1088
- const FETCH_BINARY_DEFAULTS = {
1089
- responseType: "arraybuffer",
1090
- timeout: 30_000,
1091
- maxContentLength: 50 * 1024 * 1024,
1092
- maxBodyLength: 50 * 1024 * 1024,
1093
- maxRedirects: 5,
1094
- };
1095
1127
  // Replace characters that are invalid in filenames on Windows (and often
1096
1128
  // problematic on other platforms) with `_`. Keeps dots, hyphens, and
1097
1129
  // alphanumerics untouched so names stay recognizable. Also rejects leading
@@ -1175,61 +1207,84 @@ function isPrivateOrLoopbackAddress(ip) {
1175
1207
  return false;
1176
1208
  }
1177
1209
  if (net.isIPv6(ip)) {
1178
- const normalized = ip.toLowerCase();
1179
- if (normalized === "::1")
1180
- return true;
1181
- if (normalized === "::")
1182
- return true;
1183
- if (normalized.startsWith("fc") || normalized.startsWith("fd"))
1184
- return true; // unique local
1185
- if (normalized.startsWith("fe80:"))
1186
- return true; // link-local
1187
- if (normalized.startsWith("::ffff:")) {
1188
- // IPv4-mapped IPv6. The WHATWG URL parser normalizes the embedded v4 to
1189
- // hex (::ffff:10.0.0.1 → ::ffff:a00:1, and ::ffff:0.0.0.1 → ::ffff:0:1),
1190
- // so reconstruct the dotted v4 from the two hex groups and apply the v4
1191
- // ranges above; otherwise a mapped private address (e.g.
1192
- // http://[::ffff:a00:1]/x = 10.0.0.1) silently bypasses the guard.
1193
- const tail = normalized.slice("::ffff:".length);
1194
- // Defensive: a dotted-decimal tail (::ffff:10.0.0.1) is a valid IPv6
1195
- // literal but current callers pass URL-normalized hosts (always hex), so
1196
- // this path is unreachable in practice. Handle it anyway — fail CLOSED by
1197
- // classifying the embedded v4 rather than slipping past as "public".
1198
- /* c8 ignore start - URL normalization always yields the hex form below */
1199
- if (net.isIPv4(tail)) {
1200
- return isPrivateOrLoopbackAddress(tail);
1201
- }
1202
- /* c8 ignore stop */
1203
- // The genuine IPv4-mapped form the URL parser emits is two hex groups
1204
- // (::ffff:HHHH:LLLL = the embedded 32-bit v4); reconstruct and re-check.
1205
- const hexMatch = tail.match(/^([0-9a-f]{1,4}):([0-9a-f]{1,4})$/);
1206
- if (hexMatch) {
1207
- const hi = parseInt(hexMatch[1], 16);
1208
- const lo = parseInt(hexMatch[2], 16);
1209
- const dotted = `${(hi >> 8) & 0xff}.${hi & 0xff}.${(lo >> 8) & 0xff}.${lo & 0xff}`;
1210
- return isPrivateOrLoopbackAddress(dotted);
1211
- }
1212
- // Any other ::ffff: form (e.g. ::ffff:1) is a normal IPv6 address, not an
1213
- // IPv4-mapped one, and matches none of the private prefixes above → public.
1214
- return false;
1210
+ const g = ipv6Groups(ip);
1211
+ const zero = (from, to) => g.slice(from, to).every((x) => x === 0);
1212
+ // The IPv4 address in the low 32 bits, for forms that embed one.
1213
+ const v4 = `${g[6] >> 8}.${g[6] & 0xff}.${g[7] >> 8}.${g[7] & 0xff}`;
1214
+ if ((g[0] & 0xfe00) === 0xfc00)
1215
+ return true; // unique local fc00::/7
1216
+ if ((g[0] & 0xffc0) === 0xfe80)
1217
+ return true; // link-local fe80::/10
1218
+ if ((g[0] & 0xffc0) === 0xfec0)
1219
+ return true; // site-local fec0::/10 (deprecated)
1220
+ // 6to4 2002::/16 carries an IPv4 address in its second and third groups.
1221
+ if (g[0] === 0x2002) {
1222
+ return isPrivateOrLoopbackAddress(`${g[1] >> 8}.${g[1] & 0xff}.${g[2] >> 8}.${g[2] & 0xff}`);
1223
+ }
1224
+ // IPv4-translated ::ffff:0:a.b.c.d.
1225
+ if (zero(0, 4) && g[4] === 0xffff && g[5] === 0)
1226
+ return isPrivateOrLoopbackAddress(v4);
1227
+ // IPv4-compatible ::a.b.c.d (also covers :: and ::1, which embed 0.0.0.x).
1228
+ if (zero(0, 6))
1229
+ return isPrivateOrLoopbackAddress(v4);
1230
+ // IPv4-mapped ::ffff:a.b.c.d. ADR 01010: the URL parser emits these as hex.
1231
+ if (zero(0, 5) && g[5] === 0xffff)
1232
+ return isPrivateOrLoopbackAddress(v4);
1233
+ // NAT64 64:ff9b::/96.
1234
+ if (g[0] === 0x64 && g[1] === 0xff9b && zero(2, 6)) {
1235
+ return isPrivateOrLoopbackAddress(v4);
1215
1236
  }
1216
1237
  return false;
1217
1238
  }
1218
1239
  return false;
1219
1240
  }
1220
- // Reject URLs whose host resolves to a loopback/private IP, unless the
1221
- // caller explicitly opts in (DOC_DETECTIVE_ALLOW_LOCAL_URLS=true). Tests
1222
- // and trusted internal integrations set the env var; normal doc-spec input
1223
- // does not, so an untrusted spec can't pivot through doc-detective to hit
1224
- // cloud metadata or intranet services.
1225
- //
1226
- // Note: this is a best-effort check. DNS rebinding and TOCTOU races are
1227
- // possible between resolution and connect; for true SSRF-grade isolation,
1228
- // wire in an agent that validates the actual remote address at connect
1229
- // time. This guard covers the common misuse cases.
1230
- async function assertUrlHostIsPublic(fileURL) {
1231
- if (process.env.DOC_DETECTIVE_ALLOW_LOCAL_URLS === "true")
1232
- return;
1241
+ // The eight 16-bit groups of a valid IPv6 address. Expands `::`, reads a
1242
+ // dotted IPv4 tail (DNS answers aren't URL-normalized), and drops a zone id.
1243
+ // It doesn't validate: callers check net.isIPv6 first, or get NaN groups.
1244
+ function ipv6Groups(ip) {
1245
+ let text = ip.toLowerCase().split("%")[0];
1246
+ const dotted = text.match(/(\d+)\.(\d+)\.(\d+)\.(\d+)$/);
1247
+ if (dotted) {
1248
+ const [a, b, c, d] = dotted.slice(1).map(Number);
1249
+ text =
1250
+ text.slice(0, dotted.index) +
1251
+ `${((a << 8) | b).toString(16)}:${((c << 8) | d).toString(16)}`;
1252
+ }
1253
+ const [head, tail] = text.split("::");
1254
+ const left = head ? head.split(":") : [];
1255
+ const right = tail ? tail.split(":") : [];
1256
+ const groups = tail === undefined
1257
+ ? left
1258
+ : [...left, ...Array(8 - left.length - right.length).fill("0"), ...right];
1259
+ return groups.map((group) => parseInt(group, 16));
1260
+ }
1261
+ // On/off switches in the environment: 1, true, yes or on, in any case.
1262
+ function envFlag(name) {
1263
+ return /^(1|true|yes|on)$/i.test((process.env[name] ?? "").trim());
1264
+ }
1265
+ // A guarded fetch's own error: a refusal, or conflicting switches. Its
1266
+ // message is complete, so callers report it as is.
1267
+ class UrlGuardError extends Error {
1268
+ }
1269
+ // What the guarded fetches (screenshot reference images, OpenAPI `$ref`s) may
1270
+ // reach (ADR 01162). Env only, so a repository's config can't loosen it.
1271
+ // "hops" (default) local URLs are fine; a public-to-private redirect or
1272
+ // `$ref` is refused.
1273
+ // "allow" DOC_DETECTIVE_ALLOW_LOCAL_URLS: no checks.
1274
+ // "block" DOC_DETECTIVE_BLOCK_LOCAL_URLS: every private address is refused.
1275
+ function localUrlPolicy() {
1276
+ const allow = envFlag("DOC_DETECTIVE_ALLOW_LOCAL_URLS");
1277
+ const block = envFlag("DOC_DETECTIVE_BLOCK_LOCAL_URLS");
1278
+ if (allow && block) {
1279
+ throw new UrlGuardError("DOC_DETECTIVE_ALLOW_LOCAL_URLS and DOC_DETECTIVE_BLOCK_LOCAL_URLS can't both be set.");
1280
+ }
1281
+ return allow ? "allow" : block ? "block" : "hops";
1282
+ }
1283
+ // The private, loopback or link-local address a URL points at, or undefined
1284
+ // when it's public. A hostname counts as private when any of its addresses is,
1285
+ // or with `every`, only when all of them are. Names can resolve differently
1286
+ // at connect time; getGuarded checks again there.
1287
+ async function privateAddressOf(fileURL, { every = false } = {}) {
1233
1288
  let parsed;
1234
1289
  try {
1235
1290
  parsed = new URL(fileURL);
@@ -1243,38 +1298,175 @@ async function assertUrlHostIsPublic(fileURL) {
1243
1298
  const host = parsed.hostname.replace(/^\[|\]$/g, "");
1244
1299
  // Direct IP literals: check immediately.
1245
1300
  if (net.isIP(host)) {
1246
- if (isPrivateOrLoopbackAddress(host)) {
1247
- throw new Error(`Refusing to fetch private/loopback address (${host}). Set DOC_DETECTIVE_ALLOW_LOCAL_URLS=true to allow.`);
1248
- }
1249
- return;
1301
+ return isPrivateOrLoopbackAddress(host) ? host : undefined;
1250
1302
  }
1251
1303
  // Hostnames: resolve and check every answer (A + AAAA).
1252
1304
  const lower = host.toLowerCase();
1253
1305
  if (lower === "localhost" || lower.endsWith(".localhost")) {
1254
- throw new Error(`Refusing to fetch localhost (${host}). Set DOC_DETECTIVE_ALLOW_LOCAL_URLS=true to allow.`);
1306
+ return host;
1255
1307
  }
1256
1308
  let addresses;
1257
1309
  try {
1258
1310
  addresses = await dns.lookup(host, { all: true });
1259
1311
  }
1260
1312
  catch (error) {
1261
- throw new Error(`Couldn't resolve host ${host} for SSRF check: ${error.message}`);
1262
- }
1263
- for (const { address } of addresses) {
1264
- if (isPrivateOrLoopbackAddress(address)) {
1265
- throw new Error(`Host ${host} resolves to a private/loopback address (${address}); refusing to fetch. Set DOC_DETECTIVE_ALLOW_LOCAL_URLS=true to allow.`);
1313
+ // `host` and `code` let callers word their own message.
1314
+ throw Object.assign(new Error(`Couldn't resolve host ${host}: ${error.message}`), { host, code: error.code ?? error.message });
1315
+ }
1316
+ const privates = addresses.filter(({ address }) => isPrivateOrLoopbackAddress(address));
1317
+ const isPrivate = every ? privates.length === addresses.length : privates.length > 0;
1318
+ return isPrivate ? privates[0]?.address : undefined;
1319
+ }
1320
+ function strictModeError(url) {
1321
+ return new UrlGuardError(`Couldn't fetch ${redactUrlForOutput(url)}: DOC_DETECTIVE_BLOCK_LOCAL_URLS refuses private and loopback addresses.\n` +
1322
+ "Hint: Unset DOC_DETECTIVE_BLOCK_LOCAL_URLS to allow local URLs.");
1323
+ }
1324
+ function redirectError(from, address) {
1325
+ return new UrlGuardError(`Couldn't follow the redirect from ${redactUrlForOutput(from)}: it leads to ${address}, a private address, from a public one.\n` +
1326
+ "Hint: If you trust this redirect, set DOC_DETECTIVE_ALLOW_LOCAL_URLS=1.");
1327
+ }
1328
+ const REDIRECT_STATUSES = [301, 302, 303, 307, 308];
1329
+ // A hostname as a lookup sees it: no IPv6 brackets, no trailing dot, any case.
1330
+ function hostKey(hostname) {
1331
+ return hostname.replace(/^\[|\]$/g, "").replace(/\.$/, "").toLowerCase();
1332
+ }
1333
+ // Whether an HTTP(S) proxy is configured in the environment, the variables
1334
+ // axios and Node read. Only then can a lookup be for a name other than the
1335
+ // request's own host. It doesn't read NO_PROXY, and needn't. A proxy-exempt
1336
+ // host connects directly, so the only lookup is its own, and that one counts.
1337
+ function proxyConfigured() {
1338
+ return ["http_proxy", "https_proxy", "all_proxy"].some((key) => process.env[key] || process.env[key.toUpperCase()]);
1339
+ }
1340
+ // GET for the guarded fetches. Follows up to 5 redirects by hand so each hop
1341
+ // is checked against localUrlPolicy(), both before it's requested and again
1342
+ // when it connects: a name can answer public to privateAddressOf() and private
1343
+ // to the connection (DNS rebinding). `refuseFirst`, from a caller whose
1344
+ // referrer is public, makes the first request refuse a private address too.
1345
+ // `refuseRedirect` builds the refusal of a public-to-private redirect, so a
1346
+ // caller can word it its own way.
1347
+ // Returns the body, the final URL, and whether any hop reached a public
1348
+ // address.
1349
+ async function getGuarded(url,
1350
+ // Binary by default (reference images); text callers pass FETCH_TEXT_DEFAULTS.
1351
+ opts = FETCH_BINARY_DEFAULTS, refuseFirst, refuseRedirect = redirectError) {
1352
+ const policy = localUrlPolicy();
1353
+ const axios = await loadAxios();
1354
+ const [{ default: http }, { default: https }] = await Promise.all([
1355
+ import("node:http"),
1356
+ import("node:https"),
1357
+ ]);
1358
+ let current = url;
1359
+ let refuse = policy === "hops" ? refuseFirst : undefined;
1360
+ let reachedPublic = false;
1361
+ for (let hops = 0;; hops++) {
1362
+ if (policy === "block") {
1363
+ // The pre-connect check. A second lookup fires at connect time through
1364
+ // the agent's `lookup` below (ADR 01162).
1365
+ if (await privateAddressOf(current))
1366
+ throw strictModeError(current);
1367
+ const hopUrl = current;
1368
+ refuse = () => strictModeError(hopUrl);
1266
1369
  }
1370
+ // Fresh agents per request, so no pooled socket skips the lookup. It
1371
+ // notes whether the connection resolved to a private address, and
1372
+ // refuses one when `refuse` is set.
1373
+ const seen = {};
1374
+ const refuseAtConnect = refuse;
1375
+ const target = hostKey(new URL(current).hostname);
1376
+ const lookup = (hostname, options, callback) => {
1377
+ // With a proxy configured, a lookup of another name is the proxy's. It
1378
+ // says nothing about the target, so it's neither refused nor counted;
1379
+ // the pre-connect checks still apply (ADR 01162).
1380
+ if (proxyConfigured() && hostKey(hostname) !== target) {
1381
+ return dnsCallback.lookup(hostname, options, callback);
1382
+ }
1383
+ return dnsCallback.lookup(hostname, options, (error, address, family) => {
1384
+ if (error)
1385
+ return callback(error, address, family);
1386
+ const answers = Array.isArray(address) ? address : [{ address }];
1387
+ seen.resolved = true;
1388
+ seen.private = answers.find((a) => isPrivateOrLoopbackAddress(a.address))?.address;
1389
+ seen.public = answers.some((a) => !isPrivateOrLoopbackAddress(a.address));
1390
+ if (seen.private && refuseAtConnect)
1391
+ return callback(refuseAtConnect(seen.private));
1392
+ callback(null, address, family);
1393
+ });
1394
+ };
1395
+ const response = await axios.get(current, {
1396
+ ...opts,
1397
+ maxRedirects: 0,
1398
+ httpAgent: new http.Agent({ lookup }),
1399
+ httpsAgent: new https.Agent({ lookup }),
1400
+ validateStatus: (status) => (status >= 200 && status < 300) || REDIRECT_STATUSES.includes(status),
1401
+ }).catch((error) => {
1402
+ // axios wraps a refusal at connect time; hand back the refusal itself.
1403
+ throw error?.cause instanceof UrlGuardError ? error.cause : error;
1404
+ });
1405
+ // An IP literal skips the lookup, so classify it directly. A name the
1406
+ // lookup never saw (a proxy) is public unless every address is private.
1407
+ let hopPublic = seen.resolved
1408
+ ? seen.public
1409
+ : net.isIP(target)
1410
+ ? !isPrivateOrLoopbackAddress(target)
1411
+ : undefined;
1412
+ // A fresh lookup of this hop's host, made at most once: a flapping
1413
+ // resolver can't give the two checks below different answers. A failed
1414
+ // lookup counts as public. `every: true` is deliberate: the host is
1415
+ // private only when every address is, so in the `fromPublic` check a hop
1416
+ // the connection saw as private still counts as public when the fresh
1417
+ // lookup finds any public address. That's the guard failing closed.
1418
+ // `fresh` resets every iteration, and `current` stays this hop's URL until
1419
+ // `current = next` at the end of the loop.
1420
+ let fresh;
1421
+ const freshPublic = () => (fresh ??= privateAddressOf(current, { every: true }).then((a) => !a, () => true));
1422
+ if (hopPublic === undefined && policy !== "allow")
1423
+ hopPublic = await freshPublic();
1424
+ if (hopPublic)
1425
+ reachedPublic = true;
1426
+ if (!REDIRECT_STATUSES.includes(response.status)) {
1427
+ return { data: response.data, url: current, reachedPublic };
1428
+ }
1429
+ const location = response.headers?.location;
1430
+ // `hops` counts redirects followed, so at 5 a sixth redirect arrived and
1431
+ // "more than 5" is accurate.
1432
+ if (!location || hops >= 5) {
1433
+ // Names the original URL on purpose: it's the one the spec named. When
1434
+ // the limit and a missing Location both apply, the limit wins on purpose.
1435
+ throw new UrlGuardError(`Couldn't fetch ${redactUrlForOutput(url)}: ${hops >= 5 ? "it needs more than 5 redirects" : `the ${response.status} redirect has no Location header`}.`);
1436
+ }
1437
+ const next = new URL(location, current).toString();
1438
+ const scheme = new URL(next).protocol;
1439
+ if (scheme !== "http:" && scheme !== "https:") {
1440
+ throw new UrlGuardError(`Couldn't fetch ${redactUrlForOutput(current)}: the redirect leads to an unsupported scheme (\`${scheme.slice(0, -1)}\`).`);
1441
+ }
1442
+ if (policy === "hops") {
1443
+ // Fail closed: the hop comes from a public origin unless both the
1444
+ // connection and a fresh lookup say every address is private. Through a
1445
+ // proxy the connection looked up the proxy, not this host, so the fresh
1446
+ // lookup is the only signal.
1447
+ // The two `every` values differ on purpose, and both fail closed. This
1448
+ // hop is public when any address is; the target is refused when any is
1449
+ // private.
1450
+ const fromPublic = hopPublic || (await freshPublic());
1451
+ refuse = undefined;
1452
+ if (fromPublic) {
1453
+ const address = await privateAddressOf(next);
1454
+ if (address)
1455
+ throw refuseRedirect(current, address);
1456
+ const from = current;
1457
+ refuse = (connectAddress) => refuseRedirect(from, connectAddress);
1458
+ }
1459
+ }
1460
+ current = next;
1267
1461
  }
1268
1462
  }
1269
1463
  async function fetchFile(fileURL, opts = {}) {
1270
1464
  try {
1271
- if (opts.binary) {
1272
- // Only gate binary fetches for now — the text path is an internal
1273
- // loader used by the test-detection pipeline and pre-dates this
1274
- // change; expanding SSRF coverage there belongs in its own PR.
1275
- await assertUrlHostIsPublic(fileURL);
1276
- }
1277
- const response = await (await loadAxios()).get(fileURL, opts.binary ? FETCH_BINARY_DEFAULTS : undefined);
1465
+ // Binary fetches (screenshot reference images) are guarded. The text
1466
+ // path loads operator-chosen input; not gated by design (ADR 01162).
1467
+ const response = opts.binary
1468
+ ? await getGuarded(fileURL)
1469
+ : await (await loadAxios()).get(fileURL);
1278
1470
  let data;
1279
1471
  if (opts.binary) {
1280
1472
  data = Buffer.from(response.data);
@@ -1898,7 +2090,7 @@ function applyVerifiedMarkers({ config, results, files: detectedFiles = [], init
1898
2090
  }
1899
2091
  }
1900
2092
  const today = verifiedDate();
1901
- const version = createRequire(import.meta.url)("../../package.json").version;
2093
+ const version = ownVersion() ?? "unknown";
1902
2094
  for (const file of files) {
1903
2095
  try {
1904
2096
  if (!fs.existsSync(file))