doc-detective 4.41.6 → 4.42.1

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 +130 -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 +284 -90
  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 +689 -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":"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"}
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
@@ -1152,7 +1184,9 @@ function redactUrlForOutput(value) {
1152
1184
  // Private/loopback/link-local IP ranges that binary URL fetches refuse to
1153
1185
  // reach by default. Covers IPv4 RFC1918, loopback, link-local (169.254/16),
1154
1186
  // carrier-grade NAT (100.64/10), and the cloud-metadata special cases
1155
- // (169.254.169.254 is inside link-local and thus covered).
1187
+ // (169.254.169.254 is inside link-local and thus covered). Teredo
1188
+ // (2001:0::/32) isn't covered: routing HTTP through it needs Teredo relay
1189
+ // infrastructure, so it isn't a realistic SSRF path.
1156
1190
  function isPrivateOrLoopbackAddress(ip) {
1157
1191
  if (!ip)
1158
1192
  return false;
@@ -1175,61 +1209,84 @@ function isPrivateOrLoopbackAddress(ip) {
1175
1209
  return false;
1176
1210
  }
1177
1211
  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;
1212
+ const g = ipv6Groups(ip);
1213
+ const zero = (from, to) => g.slice(from, to).every((x) => x === 0);
1214
+ // The IPv4 address in the low 32 bits, for forms that embed one.
1215
+ const v4 = `${g[6] >> 8}.${g[6] & 0xff}.${g[7] >> 8}.${g[7] & 0xff}`;
1216
+ if ((g[0] & 0xfe00) === 0xfc00)
1217
+ return true; // unique local fc00::/7
1218
+ if ((g[0] & 0xffc0) === 0xfe80)
1219
+ return true; // link-local fe80::/10
1220
+ if ((g[0] & 0xffc0) === 0xfec0)
1221
+ return true; // site-local fec0::/10 (deprecated)
1222
+ // 6to4 2002::/16 carries an IPv4 address in its second and third groups.
1223
+ if (g[0] === 0x2002) {
1224
+ return isPrivateOrLoopbackAddress(`${g[1] >> 8}.${g[1] & 0xff}.${g[2] >> 8}.${g[2] & 0xff}`);
1225
+ }
1226
+ // IPv4-translated ::ffff:0:a.b.c.d.
1227
+ if (zero(0, 4) && g[4] === 0xffff && g[5] === 0)
1228
+ return isPrivateOrLoopbackAddress(v4);
1229
+ // IPv4-compatible ::a.b.c.d (also covers :: and ::1, which embed 0.0.0.x).
1230
+ if (zero(0, 6))
1231
+ return isPrivateOrLoopbackAddress(v4);
1232
+ // IPv4-mapped ::ffff:a.b.c.d. ADR 01010: the URL parser emits these as hex.
1233
+ if (zero(0, 5) && g[5] === 0xffff)
1234
+ return isPrivateOrLoopbackAddress(v4);
1235
+ // NAT64 64:ff9b::/96.
1236
+ if (g[0] === 0x64 && g[1] === 0xff9b && zero(2, 6)) {
1237
+ return isPrivateOrLoopbackAddress(v4);
1215
1238
  }
1216
1239
  return false;
1217
1240
  }
1218
1241
  return false;
1219
1242
  }
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;
1243
+ // The eight 16-bit groups of a valid IPv6 address. Expands `::`, reads a
1244
+ // dotted IPv4 tail (DNS answers aren't URL-normalized), and drops a zone id.
1245
+ // It doesn't validate: callers check net.isIPv6 first, or get NaN groups.
1246
+ function ipv6Groups(ip) {
1247
+ let text = ip.toLowerCase().split("%")[0];
1248
+ const dotted = text.match(/(\d+)\.(\d+)\.(\d+)\.(\d+)$/);
1249
+ if (dotted) {
1250
+ const [a, b, c, d] = dotted.slice(1).map(Number);
1251
+ text =
1252
+ text.slice(0, dotted.index) +
1253
+ `${((a << 8) | b).toString(16)}:${((c << 8) | d).toString(16)}`;
1254
+ }
1255
+ const [head, tail] = text.split("::");
1256
+ const left = head ? head.split(":") : [];
1257
+ const right = tail ? tail.split(":") : [];
1258
+ const groups = tail === undefined
1259
+ ? left
1260
+ : [...left, ...Array(8 - left.length - right.length).fill("0"), ...right];
1261
+ return groups.map((group) => parseInt(group, 16));
1262
+ }
1263
+ // On/off switches in the environment: 1, true, yes or on, in any case.
1264
+ function envFlag(name) {
1265
+ return /^(1|true|yes|on)$/i.test((process.env[name] ?? "").trim());
1266
+ }
1267
+ // A guarded fetch's own error: a refusal, or conflicting switches. Its
1268
+ // message is complete, so callers report it as is.
1269
+ class UrlGuardError extends Error {
1270
+ }
1271
+ // What the guarded fetches (screenshot reference images, OpenAPI `$ref`s) may
1272
+ // reach (ADR 01162). Env only, so a repository's config can't loosen it.
1273
+ // "hops" (default) local URLs are fine; a public-to-private redirect or
1274
+ // `$ref` is refused.
1275
+ // "allow" DOC_DETECTIVE_ALLOW_LOCAL_URLS: no checks.
1276
+ // "block" DOC_DETECTIVE_BLOCK_LOCAL_URLS: every private address is refused.
1277
+ function localUrlPolicy() {
1278
+ const allow = envFlag("DOC_DETECTIVE_ALLOW_LOCAL_URLS");
1279
+ const block = envFlag("DOC_DETECTIVE_BLOCK_LOCAL_URLS");
1280
+ if (allow && block) {
1281
+ throw new UrlGuardError("DOC_DETECTIVE_ALLOW_LOCAL_URLS and DOC_DETECTIVE_BLOCK_LOCAL_URLS can't both be set.");
1282
+ }
1283
+ return allow ? "allow" : block ? "block" : "hops";
1284
+ }
1285
+ // The private, loopback or link-local address a URL points at, or undefined
1286
+ // when it's public. A hostname counts as private when any of its addresses is,
1287
+ // or with `every`, only when all of them are. Names can resolve differently
1288
+ // at connect time; getGuarded checks again there.
1289
+ async function privateAddressOf(fileURL, { every = false } = {}) {
1233
1290
  let parsed;
1234
1291
  try {
1235
1292
  parsed = new URL(fileURL);
@@ -1243,38 +1300,175 @@ async function assertUrlHostIsPublic(fileURL) {
1243
1300
  const host = parsed.hostname.replace(/^\[|\]$/g, "");
1244
1301
  // Direct IP literals: check immediately.
1245
1302
  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;
1303
+ return isPrivateOrLoopbackAddress(host) ? host : undefined;
1250
1304
  }
1251
1305
  // Hostnames: resolve and check every answer (A + AAAA).
1252
1306
  const lower = host.toLowerCase();
1253
1307
  if (lower === "localhost" || lower.endsWith(".localhost")) {
1254
- throw new Error(`Refusing to fetch localhost (${host}). Set DOC_DETECTIVE_ALLOW_LOCAL_URLS=true to allow.`);
1308
+ return host;
1255
1309
  }
1256
1310
  let addresses;
1257
1311
  try {
1258
1312
  addresses = await dns.lookup(host, { all: true });
1259
1313
  }
1260
1314
  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.`);
1315
+ // `host` and `code` let callers word their own message.
1316
+ throw Object.assign(new Error(`Couldn't resolve host ${host}: ${error.message}`), { host, code: error.code ?? error.message });
1317
+ }
1318
+ const privates = addresses.filter(({ address }) => isPrivateOrLoopbackAddress(address));
1319
+ const isPrivate = every ? privates.length === addresses.length : privates.length > 0;
1320
+ return isPrivate ? privates[0]?.address : undefined;
1321
+ }
1322
+ function strictModeError(url) {
1323
+ return new UrlGuardError(`Couldn't fetch ${redactUrlForOutput(url)}: DOC_DETECTIVE_BLOCK_LOCAL_URLS refuses private and loopback addresses.\n` +
1324
+ "Hint: Unset DOC_DETECTIVE_BLOCK_LOCAL_URLS to allow local URLs.");
1325
+ }
1326
+ function redirectError(from, address) {
1327
+ return new UrlGuardError(`Couldn't follow the redirect from ${redactUrlForOutput(from)}: it leads to ${address}, a private address, from a public one.\n` +
1328
+ "Hint: If you trust this redirect, set DOC_DETECTIVE_ALLOW_LOCAL_URLS=1.");
1329
+ }
1330
+ const REDIRECT_STATUSES = [301, 302, 303, 307, 308];
1331
+ // A hostname as a lookup sees it: no IPv6 brackets, no trailing dot, any case.
1332
+ function hostKey(hostname) {
1333
+ return hostname.replace(/^\[|\]$/g, "").replace(/\.$/, "").toLowerCase();
1334
+ }
1335
+ // Whether an HTTP(S) proxy is configured in the environment, the variables
1336
+ // axios and Node read. Only then can a lookup be for a name other than the
1337
+ // request's own host. It doesn't read NO_PROXY, and needn't. A proxy-exempt
1338
+ // host connects directly, so the only lookup is its own, and that one counts.
1339
+ function proxyConfigured() {
1340
+ return ["http_proxy", "https_proxy", "all_proxy"].some((key) => process.env[key] || process.env[key.toUpperCase()]);
1341
+ }
1342
+ // GET for the guarded fetches. Follows up to 5 redirects by hand so each hop
1343
+ // is checked against localUrlPolicy(), both before it's requested and again
1344
+ // when it connects: a name can answer public to privateAddressOf() and private
1345
+ // to the connection (DNS rebinding). `refuseFirst`, from a caller whose
1346
+ // referrer is public, makes the first request refuse a private address too.
1347
+ // `refuseRedirect` builds the refusal of a public-to-private redirect, so a
1348
+ // caller can word it its own way.
1349
+ // Returns the body, the final URL, and whether any hop reached a public
1350
+ // address.
1351
+ async function getGuarded(url,
1352
+ // Binary by default (reference images); text callers pass FETCH_TEXT_DEFAULTS.
1353
+ opts = FETCH_BINARY_DEFAULTS, refuseFirst, refuseRedirect = redirectError) {
1354
+ const policy = localUrlPolicy();
1355
+ const axios = await loadAxios();
1356
+ const [{ default: http }, { default: https }] = await Promise.all([
1357
+ import("node:http"),
1358
+ import("node:https"),
1359
+ ]);
1360
+ let current = url;
1361
+ let refuse = policy === "hops" ? refuseFirst : undefined;
1362
+ let reachedPublic = false;
1363
+ for (let hops = 0;; hops++) {
1364
+ if (policy === "block") {
1365
+ // The pre-connect check. A second lookup fires at connect time through
1366
+ // the agent's `lookup` below (ADR 01162).
1367
+ if (await privateAddressOf(current))
1368
+ throw strictModeError(current);
1369
+ const hopUrl = current;
1370
+ refuse = () => strictModeError(hopUrl);
1266
1371
  }
1372
+ // Fresh agents per request, so no pooled socket skips the lookup. It
1373
+ // notes whether the connection resolved to a private address, and
1374
+ // refuses one when `refuse` is set.
1375
+ const seen = {};
1376
+ const refuseAtConnect = refuse;
1377
+ const target = hostKey(new URL(current).hostname);
1378
+ const lookup = (hostname, options, callback) => {
1379
+ // With a proxy configured, a lookup of another name is the proxy's. It
1380
+ // says nothing about the target, so it's neither refused nor counted;
1381
+ // the pre-connect checks still apply (ADR 01162).
1382
+ if (proxyConfigured() && hostKey(hostname) !== target) {
1383
+ return dnsCallback.lookup(hostname, options, callback);
1384
+ }
1385
+ return dnsCallback.lookup(hostname, options, (error, address, family) => {
1386
+ if (error)
1387
+ return callback(error, address, family);
1388
+ const answers = Array.isArray(address) ? address : [{ address }];
1389
+ seen.resolved = true;
1390
+ seen.private = answers.find((a) => isPrivateOrLoopbackAddress(a.address))?.address;
1391
+ seen.public = answers.some((a) => !isPrivateOrLoopbackAddress(a.address));
1392
+ if (seen.private && refuseAtConnect)
1393
+ return callback(refuseAtConnect(seen.private));
1394
+ callback(null, address, family);
1395
+ });
1396
+ };
1397
+ const response = await axios.get(current, {
1398
+ ...opts,
1399
+ maxRedirects: 0,
1400
+ httpAgent: new http.Agent({ lookup }),
1401
+ httpsAgent: new https.Agent({ lookup }),
1402
+ validateStatus: (status) => (status >= 200 && status < 300) || REDIRECT_STATUSES.includes(status),
1403
+ }).catch((error) => {
1404
+ // axios wraps a refusal at connect time; hand back the refusal itself.
1405
+ throw error?.cause instanceof UrlGuardError ? error.cause : error;
1406
+ });
1407
+ // An IP literal skips the lookup, so classify it directly. A name the
1408
+ // lookup never saw (a proxy) is public unless every address is private.
1409
+ let hopPublic = seen.resolved
1410
+ ? seen.public
1411
+ : net.isIP(target)
1412
+ ? !isPrivateOrLoopbackAddress(target)
1413
+ : undefined;
1414
+ // A fresh lookup of this hop's host, made at most once: a flapping
1415
+ // resolver can't give the two checks below different answers. A failed
1416
+ // lookup counts as public. `every: true` is deliberate: the host is
1417
+ // private only when every address is, so in the `fromPublic` check a hop
1418
+ // the connection saw as private still counts as public when the fresh
1419
+ // lookup finds any public address. That's the guard failing closed.
1420
+ // `fresh` resets every iteration, and `current` stays this hop's URL until
1421
+ // `current = next` at the end of the loop.
1422
+ let fresh;
1423
+ const freshPublic = () => (fresh ??= privateAddressOf(current, { every: true }).then((a) => !a, () => true));
1424
+ if (hopPublic === undefined && policy !== "allow")
1425
+ hopPublic = await freshPublic();
1426
+ if (hopPublic)
1427
+ reachedPublic = true;
1428
+ if (!REDIRECT_STATUSES.includes(response.status)) {
1429
+ return { data: response.data, url: current, reachedPublic };
1430
+ }
1431
+ const location = response.headers?.location;
1432
+ // `hops` counts redirects followed, so at 5 a sixth redirect arrived and
1433
+ // "more than 5" is accurate.
1434
+ if (!location || hops >= 5) {
1435
+ // Names the original URL on purpose: it's the one the spec named. When
1436
+ // the limit and a missing Location both apply, the limit wins on purpose.
1437
+ throw new UrlGuardError(`Couldn't fetch ${redactUrlForOutput(url)}: ${hops >= 5 ? "it needs more than 5 redirects" : `the ${response.status} redirect has no Location header`}.`);
1438
+ }
1439
+ const next = new URL(location, current).toString();
1440
+ const scheme = new URL(next).protocol;
1441
+ if (scheme !== "http:" && scheme !== "https:") {
1442
+ throw new UrlGuardError(`Couldn't fetch ${redactUrlForOutput(current)}: the redirect leads to an unsupported scheme (\`${scheme.slice(0, -1)}\`).`);
1443
+ }
1444
+ if (policy === "hops") {
1445
+ // Fail closed: the hop comes from a public origin unless both the
1446
+ // connection and a fresh lookup say every address is private. Through a
1447
+ // proxy the connection looked up the proxy, not this host, so the fresh
1448
+ // lookup is the only signal.
1449
+ // The two `every` values differ on purpose, and both fail closed. This
1450
+ // hop is public when any address is; the target is refused when any is
1451
+ // private.
1452
+ const fromPublic = hopPublic || (await freshPublic());
1453
+ refuse = undefined;
1454
+ if (fromPublic) {
1455
+ const address = await privateAddressOf(next);
1456
+ if (address)
1457
+ throw refuseRedirect(current, address);
1458
+ const from = current;
1459
+ refuse = (connectAddress) => refuseRedirect(from, connectAddress);
1460
+ }
1461
+ }
1462
+ current = next;
1267
1463
  }
1268
1464
  }
1269
1465
  async function fetchFile(fileURL, opts = {}) {
1270
1466
  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);
1467
+ // Binary fetches (screenshot reference images) are guarded. The text
1468
+ // path loads operator-chosen input; not gated by design (ADR 01162).
1469
+ const response = opts.binary
1470
+ ? await getGuarded(fileURL)
1471
+ : await (await loadAxios()).get(fileURL);
1278
1472
  let data;
1279
1473
  if (opts.binary) {
1280
1474
  data = Buffer.from(response.data);
@@ -1898,7 +2092,7 @@ function applyVerifiedMarkers({ config, results, files: detectedFiles = [], init
1898
2092
  }
1899
2093
  }
1900
2094
  const today = verifiedDate();
1901
- const version = createRequire(import.meta.url)("../../package.json").version;
2095
+ const version = ownVersion() ?? "unknown";
1902
2096
  for (const file of files) {
1903
2097
  try {
1904
2098
  if (!fs.existsSync(file))