gitnexus 1.6.10-rc.150 → 1.6.10-rc.152

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 (43) hide show
  1. package/dist/_shared/index.d.ts +1 -1
  2. package/dist/_shared/index.d.ts.map +1 -1
  3. package/dist/_shared/index.js +1 -1
  4. package/dist/_shared/index.js.map +1 -1
  5. package/dist/_shared/integrations/resilient-fetch.d.ts +16 -0
  6. package/dist/_shared/integrations/resilient-fetch.d.ts.map +1 -1
  7. package/dist/_shared/integrations/resilient-fetch.js +19 -7
  8. package/dist/_shared/integrations/resilient-fetch.js.map +1 -1
  9. package/dist/core/analyzer-identity.d.ts +18 -0
  10. package/dist/core/analyzer-identity.js +280 -20
  11. package/dist/core/embedding-checkpoint.d.ts +143 -0
  12. package/dist/core/embedding-checkpoint.js +221 -0
  13. package/dist/core/embedding-count.d.ts +61 -0
  14. package/dist/core/embedding-count.js +69 -0
  15. package/dist/core/embeddings/embedding-pipeline.d.ts +8 -0
  16. package/dist/core/embeddings/embedding-pipeline.js +253 -14
  17. package/dist/core/embeddings/http-client.js +126 -18
  18. package/dist/core/index-freshness.d.ts +1 -1
  19. package/dist/core/index-freshness.js +13 -2
  20. package/dist/core/lbug/schema.d.ts +108 -0
  21. package/dist/core/lbug/schema.js +114 -0
  22. package/dist/core/run-analyze.js +335 -103
  23. package/dist/mcp/local/local-backend.d.ts +26 -0
  24. package/dist/mcp/local/local-backend.js +99 -3
  25. package/dist/mcp/local/pdg-impact.d.ts +1 -1
  26. package/dist/mcp/local/pdg-impact.js +1 -1
  27. package/dist/server/analyze-job.d.ts +37 -2
  28. package/dist/server/analyze-job.js +13 -2
  29. package/dist/server/analyze-launch.d.ts +1 -1
  30. package/dist/server/analyze-launch.js +4 -3
  31. package/dist/server/api.d.ts +0 -11
  32. package/dist/server/api.js +114 -115
  33. package/dist/server/embed-run-outcome.d.ts +89 -0
  34. package/dist/server/embed-run-outcome.js +88 -0
  35. package/dist/server/sse-progress.d.ts +41 -0
  36. package/dist/server/sse-progress.js +125 -0
  37. package/dist/storage/parse-cache.js +3 -1
  38. package/dist/storage/repo-manager.d.ts +98 -303
  39. package/dist/storage/repo-manager.js +0 -283
  40. package/package.json +1 -1
  41. package/skills/gitnexus-review/SKILL.md +11 -4
  42. package/web/assets/{index-BsB9kQ9C.js → index-N45yA6IV.js} +49 -49
  43. package/web/index.html +1 -1
@@ -55,7 +55,7 @@ export { withRetry, computeBackoffMs } from './integrations/retry.js';
55
55
  export type { RetryOptions, RetryDecision } from './integrations/retry.js';
56
56
  export { CircuitBreaker, CircuitOpenError, getBreaker } from './integrations/circuit-breaker.js';
57
57
  export type { CircuitBreakerOptions } from './integrations/circuit-breaker.js';
58
- export { resilientFetch, ResilientFetchExhaustedError, RETRY_AFTER_CAP_MS, parseRetryAfter, } from './integrations/resilient-fetch.js';
58
+ export { resilientFetch, ResilientFetchExhaustedError, RETRY_AFTER_CAP_MS, parseRetryAfter, isTerminalNetworkError, } from './integrations/resilient-fetch.js';
59
59
  export type { ResilientFetchOptions } from './integrations/resilient-fetch.js';
60
60
  export { UNDERSTAND_QUICKLY_DISPATCH_URL, UNDERSTAND_QUICKLY_EVENT_TYPE, UNDERSTAND_QUICKLY_TOKEN_ENV, buildUqDispatchPayload, isValidOwnerRepo, parseOwnerRepoFromRemote, stripGitSuffix, } from './integrations/understand-quickly.js';
61
61
  export type { UqDispatchPayload } from './integrations/understand-quickly.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,YAAY,EACV,SAAS,EACT,cAAc,EACd,gBAAgB,EAChB,SAAS,EACT,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,WAAW,EACX,cAAc,EACd,SAAS,EACT,oBAAoB,GACrB,MAAM,4BAA4B,CAAC;AACpC,YAAY,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAGzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EACL,uBAAuB,EACvB,6BAA6B,EAC7B,uBAAuB,GACxB,MAAM,yBAAyB,CAAC;AACjC,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGrD,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAIrE,YAAY,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AACpG,YAAY,EACV,OAAO,EACP,KAAK,EACL,SAAS,EACT,KAAK,EACL,OAAO,EACP,YAAY,EACZ,UAAU,EACV,UAAU,EACV,OAAO,EACP,KAAK,EACL,kBAAkB,EAClB,UAAU,EACV,SAAS,EACT,cAAc,EACd,YAAY,EACZ,mBAAmB,EACnB,YAAY,EACZ,iBAAiB,EACjB,cAAc,EACd,QAAQ,EACR,WAAW,GACZ,MAAM,6BAA6B,CAAC;AAGrC,OAAO,EAAE,eAAe,EAAE,wBAAwB,EAAE,MAAM,wCAAwC,CAAC;AACnG,OAAO,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AACxE,YAAY,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAG/E,OAAO,EACL,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,+CAA+C,CAAC;AACvD,YAAY,EAAE,sBAAsB,EAAE,MAAM,+CAA+C,CAAC;AAG5F,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,YAAY,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,0CAA0C,CAAC;AACjF,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,0CAA0C,CAAC;AACnG,OAAO,EAAE,uBAAuB,EAAE,MAAM,4CAA4C,CAAC;AACrF,YAAY,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAC;AAKrF,OAAO,EAAE,cAAc,EAAE,MAAM,wCAAwC,CAAC;AACxE,YAAY,EAAE,qBAAqB,EAAE,MAAM,wCAAwC,CAAC;AAGpF,YAAY,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAC;AACpE,YAAY,EACV,aAAa,EACb,aAAa,EACb,QAAQ,EACR,cAAc,GACf,MAAM,sCAAsC,CAAC;AAC9C,YAAY,EACV,mBAAmB,EACnB,6BAA6B,EAC7B,uBAAuB,EACvB,0BAA0B,EAC1B,oBAAoB,EACpB,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,EACvB,qBAAqB,EACrB,oBAAoB,EACpB,sBAAsB,EACtB,wBAAwB,EACxB,sBAAsB,EACtB,gBAAgB,GACjB,MAAM,0CAA0C,CAAC;AAGlD,OAAO,EAAE,wBAAwB,EAAE,MAAM,6CAA6C,CAAC;AACvF,YAAY,EACV,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,6CAA6C,CAAC;AAGrD,OAAO,EAAE,QAAQ,EAAE,MAAM,0CAA0C,CAAC;AACpE,YAAY,EACV,aAAa,EACb,YAAY,EACZ,aAAa,EACb,cAAc,EACd,YAAY,EACZ,aAAa,GACd,MAAM,0CAA0C,CAAC;AAGlD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iDAAiD,CAAC;AACrF,YAAY,EAAE,aAAa,EAAE,MAAM,iDAAiD,CAAC;AACrF,OAAO,EAAE,mBAAmB,EAAE,MAAM,kDAAkD,CAAC;AACvF,YAAY,EACV,cAAc,EACd,mBAAmB,GACpB,MAAM,kDAAkD,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,iDAAiD,CAAC;AACrF,YAAY,EACV,aAAa,EACb,kBAAkB,GACnB,MAAM,iDAAiD,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iDAAiD,CAAC;AACrF,YAAY,EAAE,aAAa,EAAE,MAAM,iDAAiD,CAAC;AACrF,OAAO,EAAE,UAAU,EAAE,MAAM,8CAA8C,CAAC;AAC1E,YAAY,EAAE,gBAAgB,EAAE,MAAM,8CAA8C,CAAC;AACrF,OAAO,EAAE,eAAe,EAAE,MAAM,mDAAmD,CAAC;AACpF,YAAY,EAAE,qBAAqB,EAAE,MAAM,mDAAmD,CAAC;AAC/F,OAAO,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,2CAA2C,CAAC;AACpG,YAAY,EAAE,UAAU,EAAE,MAAM,2CAA2C,CAAC;AAC5E,OAAO,EACL,gCAAgC,EAChC,kBAAkB,GACnB,MAAM,6CAA6C,CAAC;AACrD,YAAY,EAAE,WAAW,EAAE,MAAM,6CAA6C,CAAC;AAC/E,OAAO,EACL,WAAW,EACX,YAAY,EACZ,WAAW,EACX,WAAW,GACZ,MAAM,0CAA0C,CAAC;AAClD,YAAY,EACV,eAAe,EACf,iBAAiB,EACjB,yBAAyB,EACzB,sBAAsB,EACtB,YAAY,EACZ,iBAAiB,GAClB,MAAM,0CAA0C,CAAC;AAGlD,OAAO,EAAE,WAAW,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACrF,YAAY,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EACL,cAAc,EACd,cAAc,EACd,uBAAuB,GACxB,MAAM,kCAAkC,CAAC;AAC1C,YAAY,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAC;AAC1E,YAAY,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AAM1E,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AACtE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAC;AACjG,YAAY,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAC/E,OAAO,EACL,cAAc,EACd,4BAA4B,EAC5B,kBAAkB,EAClB,eAAe,EACf,sBAAsB,GACvB,MAAM,mCAAmC,CAAC;AAC3C,YAAY,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAG/E,OAAO,EACL,+BAA+B,EAC/B,6BAA6B,EAC7B,4BAA4B,EAC5B,sBAAsB,EACtB,gBAAgB,EAChB,wBAAwB,EACxB,cAAc,GACf,MAAM,sCAAsC,CAAC;AAC9C,YAAY,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC"}
@@ -40,7 +40,7 @@ export { buildPositionIndex } from './scope-resolution/position-index.js';
40
40
  // NOT add them here. Production consumers must not call them.
41
41
  export { withRetry, computeBackoffMs } from './integrations/retry.js';
42
42
  export { CircuitBreaker, CircuitOpenError, getBreaker } from './integrations/circuit-breaker.js';
43
- export { resilientFetch, ResilientFetchExhaustedError, RETRY_AFTER_CAP_MS, parseRetryAfter, } from './integrations/resilient-fetch.js';
43
+ export { resilientFetch, ResilientFetchExhaustedError, RETRY_AFTER_CAP_MS, parseRetryAfter, isTerminalNetworkError, } from './integrations/resilient-fetch.js';
44
44
  // Understand-Quickly registry integration (opt-in)
45
45
  export { UNDERSTAND_QUICKLY_DISPATCH_URL, UNDERSTAND_QUICKLY_EVENT_TYPE, UNDERSTAND_QUICKLY_TOKEN_ENV, buildUqDispatchPayload, isValidOwnerRepo, parseOwnerRepoFromRemote, stripGitSuffix, } from './integrations/understand-quickly.js';
46
46
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AASA,mBAAmB;AACnB,OAAO,EACL,WAAW,EACX,cAAc,EACd,SAAS,EACT,oBAAoB,GACrB,MAAM,4BAA4B,CAAC;AAGpC,mBAAmB;AACnB,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EACL,uBAAuB,EACvB,6BAA6B,EAC7B,uBAAuB,GACxB,MAAM,yBAAyB,CAAC;AAiCjC,8DAA8D;AAC9D,OAAO,EAAE,eAAe,EAAE,wBAAwB,EAAE,MAAM,wCAAwC,CAAC;AACnG,OAAO,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AAGxE,yDAAyD;AACzD,OAAO,EACL,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,+CAA+C,CAAC;AAGvD,sEAAsE;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAEhE,OAAO,EAAE,qBAAqB,EAAE,MAAM,0CAA0C,CAAC;AAEjF,OAAO,EAAE,uBAAuB,EAAE,MAAM,4CAA4C,CAAC;AAGrF,gEAAgE;AAChE,yEAAyE;AACzE,2DAA2D;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,wCAAwC,CAAC;AA4BxE,oFAAoF;AACpF,OAAO,EAAE,wBAAwB,EAAE,MAAM,6CAA6C,CAAC;AAMvF,uEAAuE;AACvE,OAAO,EAAE,QAAQ,EAAE,MAAM,0CAA0C,CAAC;AAUpE,sEAAsE;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iDAAiD,CAAC;AAErF,OAAO,EAAE,mBAAmB,EAAE,MAAM,kDAAkD,CAAC;AAKvF,OAAO,EAAE,kBAAkB,EAAE,MAAM,iDAAiD,CAAC;AAKrF,OAAO,EAAE,kBAAkB,EAAE,MAAM,iDAAiD,CAAC;AAErF,OAAO,EAAE,UAAU,EAAE,MAAM,8CAA8C,CAAC;AAE1E,OAAO,EAAE,eAAe,EAAE,MAAM,mDAAmD,CAAC;AAEpF,OAAO,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,2CAA2C,CAAC;AAEpG,OAAO,EACL,gCAAgC,EAChC,kBAAkB,GACnB,MAAM,6CAA6C,CAAC;AAErD,OAAO,EACL,WAAW,EACX,YAAY,EACZ,WAAW,EACX,WAAW,GACZ,MAAM,0CAA0C,CAAC;AAUlD,2EAA2E;AAC3E,OAAO,EAAE,WAAW,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAErF,OAAO,EACL,cAAc,EACd,cAAc,EACd,uBAAuB,GACxB,MAAM,kCAAkC,CAAC;AAE1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAC;AAG1E,8EAA8E;AAC9E,wEAAwE;AACxE,wEAAwE;AACxE,8DAA8D;AAC9D,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEtE,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAC;AAEjG,OAAO,EACL,cAAc,EACd,4BAA4B,EAC5B,kBAAkB,EAClB,eAAe,GAChB,MAAM,mCAAmC,CAAC;AAG3C,mDAAmD;AACnD,OAAO,EACL,+BAA+B,EAC/B,6BAA6B,EAC7B,4BAA4B,EAC5B,sBAAsB,EACtB,gBAAgB,EAChB,wBAAwB,EACxB,cAAc,GACf,MAAM,sCAAsC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AASA,mBAAmB;AACnB,OAAO,EACL,WAAW,EACX,cAAc,EACd,SAAS,EACT,oBAAoB,GACrB,MAAM,4BAA4B,CAAC;AAGpC,mBAAmB;AACnB,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EACL,uBAAuB,EACvB,6BAA6B,EAC7B,uBAAuB,GACxB,MAAM,yBAAyB,CAAC;AAiCjC,8DAA8D;AAC9D,OAAO,EAAE,eAAe,EAAE,wBAAwB,EAAE,MAAM,wCAAwC,CAAC;AACnG,OAAO,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AAGxE,yDAAyD;AACzD,OAAO,EACL,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,+CAA+C,CAAC;AAGvD,sEAAsE;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAEhE,OAAO,EAAE,qBAAqB,EAAE,MAAM,0CAA0C,CAAC;AAEjF,OAAO,EAAE,uBAAuB,EAAE,MAAM,4CAA4C,CAAC;AAGrF,gEAAgE;AAChE,yEAAyE;AACzE,2DAA2D;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,wCAAwC,CAAC;AA4BxE,oFAAoF;AACpF,OAAO,EAAE,wBAAwB,EAAE,MAAM,6CAA6C,CAAC;AAMvF,uEAAuE;AACvE,OAAO,EAAE,QAAQ,EAAE,MAAM,0CAA0C,CAAC;AAUpE,sEAAsE;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iDAAiD,CAAC;AAErF,OAAO,EAAE,mBAAmB,EAAE,MAAM,kDAAkD,CAAC;AAKvF,OAAO,EAAE,kBAAkB,EAAE,MAAM,iDAAiD,CAAC;AAKrF,OAAO,EAAE,kBAAkB,EAAE,MAAM,iDAAiD,CAAC;AAErF,OAAO,EAAE,UAAU,EAAE,MAAM,8CAA8C,CAAC;AAE1E,OAAO,EAAE,eAAe,EAAE,MAAM,mDAAmD,CAAC;AAEpF,OAAO,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,2CAA2C,CAAC;AAEpG,OAAO,EACL,gCAAgC,EAChC,kBAAkB,GACnB,MAAM,6CAA6C,CAAC;AAErD,OAAO,EACL,WAAW,EACX,YAAY,EACZ,WAAW,EACX,WAAW,GACZ,MAAM,0CAA0C,CAAC;AAUlD,2EAA2E;AAC3E,OAAO,EAAE,WAAW,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAErF,OAAO,EACL,cAAc,EACd,cAAc,EACd,uBAAuB,GACxB,MAAM,kCAAkC,CAAC;AAE1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAC;AAG1E,8EAA8E;AAC9E,wEAAwE;AACxE,wEAAwE;AACxE,8DAA8D;AAC9D,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEtE,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAC;AAEjG,OAAO,EACL,cAAc,EACd,4BAA4B,EAC5B,kBAAkB,EAClB,eAAe,EACf,sBAAsB,GACvB,MAAM,mCAAmC,CAAC;AAG3C,mDAAmD;AACnD,OAAO,EACL,+BAA+B,EAC/B,6BAA6B,EAC7B,4BAA4B,EAC5B,sBAAsB,EACtB,gBAAgB,EAChB,wBAAwB,EACxB,cAAc,GACf,MAAM,sCAAsC,CAAC"}
@@ -59,6 +59,22 @@ type Outcome = {
59
59
  kind: 'retryable-network';
60
60
  err: unknown;
61
61
  };
62
+ /**
63
+ * The network errors `resilientFetch` treats as terminal — never retried, and
64
+ * routed through the breaker's neutral path.
65
+ *
66
+ * Both timer-fired aborts (`AbortSignal.timeout()` → `TimeoutError`) and
67
+ * caller-driven aborts (`AbortController.abort()` → `AbortError`) qualify:
68
+ * retrying against an already-aborted signal would fail again immediately, and
69
+ * neither outcome reflects backend health.
70
+ *
71
+ * Exported because callers that hook into the retry loop (a `fetchImpl` that
72
+ * inspects or re-wraps its own throws) have to agree with {@link
73
+ * classifyOutcome} about which errors are terminal. Sharing this predicate is
74
+ * what makes that agreement structural instead of a hand-copied condition that
75
+ * can drift.
76
+ */
77
+ export declare function isTerminalNetworkError(err: unknown): err is DOMException;
62
78
  /** Exported for unit tests. */
63
79
  export declare function classifyOutcome(result: {
64
80
  kind: 'error';
@@ -1 +1 @@
1
- {"version":3,"file":"resilient-fetch.d.ts","sourceRoot":"","sources":["../../src/integrations/resilient-fetch.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EACL,cAAc,EACd,gBAAgB,EAEhB,KAAK,qBAAqB,EAC3B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAoB,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAEjE,OAAO,EAAE,gBAAgB,EAAE,CAAC;AAE5B,MAAM,WAAW,qBAAqB;IACpC,8EAA8E;IAC9E,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2EAA2E;IAC3E,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,kEAAkE;IAClE,cAAc,CAAC,EAAE,qBAAqB,CAAC;IACvC,yCAAyC;IACzC,KAAK,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,aAAa,GAAG,aAAa,GAAG,YAAY,CAAC,CAAC,GAAG;QAClF,gFAAgF;QAChF,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,KAAK,CAAC,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC;QAC9B,MAAM,CAAC,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC;KACjC,CAAC;IACF,6EAA6E;IAC7E,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,+EAA+E;AAC/E,eAAO,MAAM,kBAAkB,QAAS,CAAC;AAQzC;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,GAAE,MAAM,MAAiB,GAAG,MAAM,GAAG,IAAI,CAejG;AAED,wEAAwE;AACxE,KAAK,OAAO,GACR;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GAC3C;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GACzE;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,GAAG,EAAE,OAAO,CAAA;CAAE,GAC1C;IAAE,IAAI,EAAE,mBAAmB,CAAC;IAAC,GAAG,EAAE,OAAO,CAAA;CAAE,CAAC;AAEhD,+BAA+B;AAC/B,wBAAgB,eAAe,CAC7B,MAAM,EAAE;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,OAAO,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,EAC9E,GAAG,EAAE,MAAM,MAAM,EACjB,eAAe,SAAqB,GACnC,OAAO,CAiCT;AAcD,oEAAoE;AACpE,qBAAa,4BAA6B,SAAQ,KAAK;aAEzB,QAAQ,EAAE,QAAQ;IAD9C,SAAkB,IAAI,kCAAkC;gBAC5B,QAAQ,EAAE,QAAQ;CAG/C;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAsB,cAAc,CAClC,KAAK,EAAE,MAAM,GAAG,GAAG,EACnB,IAAI,EAAE,WAAW,GAAG,SAAS,EAC7B,IAAI,GAAE,qBAA0B,GAC/B,OAAO,CAAC,QAAQ,CAAC,CA+GnB"}
1
+ {"version":3,"file":"resilient-fetch.d.ts","sourceRoot":"","sources":["../../src/integrations/resilient-fetch.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EACL,cAAc,EACd,gBAAgB,EAEhB,KAAK,qBAAqB,EAC3B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAoB,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAEjE,OAAO,EAAE,gBAAgB,EAAE,CAAC;AAE5B,MAAM,WAAW,qBAAqB;IACpC,8EAA8E;IAC9E,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2EAA2E;IAC3E,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,kEAAkE;IAClE,cAAc,CAAC,EAAE,qBAAqB,CAAC;IACvC,yCAAyC;IACzC,KAAK,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,aAAa,GAAG,aAAa,GAAG,YAAY,CAAC,CAAC,GAAG;QAClF,gFAAgF;QAChF,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,KAAK,CAAC,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC;QAC9B,MAAM,CAAC,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC;KACjC,CAAC;IACF,6EAA6E;IAC7E,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,+EAA+E;AAC/E,eAAO,MAAM,kBAAkB,QAAS,CAAC;AAQzC;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,GAAE,MAAM,MAAiB,GAAG,MAAM,GAAG,IAAI,CAejG;AAED,wEAAwE;AACxE,KAAK,OAAO,GACR;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GAC3C;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GACzE;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,GAAG,EAAE,OAAO,CAAA;CAAE,GAC1C;IAAE,IAAI,EAAE,mBAAmB,CAAC;IAAC,GAAG,EAAE,OAAO,CAAA;CAAE,CAAC;AAEhD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,YAAY,CAExE;AAED,+BAA+B;AAC/B,wBAAgB,eAAe,CAC7B,MAAM,EAAE;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,OAAO,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,EAC9E,GAAG,EAAE,MAAM,MAAM,EACjB,eAAe,SAAqB,GACnC,OAAO,CAyBT;AAcD,oEAAoE;AACpE,qBAAa,4BAA6B,SAAQ,KAAK;aAEzB,QAAQ,EAAE,QAAQ;IAD9C,SAAkB,IAAI,kCAAkC;gBAC5B,QAAQ,EAAE,QAAQ;CAG/C;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAsB,cAAc,CAClC,KAAK,EAAE,MAAM,GAAG,GAAG,EACnB,IAAI,EAAE,WAAW,GAAG,SAAS,EAC7B,IAAI,GAAE,qBAA0B,GAC/B,OAAO,CAAC,QAAQ,CAAC,CA+GnB"}
@@ -40,16 +40,28 @@ export function parseRetryAfter(value, now = Date.now) {
40
40
  const delta = target - now();
41
41
  return delta >= 0 ? delta : 0;
42
42
  }
43
+ /**
44
+ * The network errors `resilientFetch` treats as terminal — never retried, and
45
+ * routed through the breaker's neutral path.
46
+ *
47
+ * Both timer-fired aborts (`AbortSignal.timeout()` → `TimeoutError`) and
48
+ * caller-driven aborts (`AbortController.abort()` → `AbortError`) qualify:
49
+ * retrying against an already-aborted signal would fail again immediately, and
50
+ * neither outcome reflects backend health.
51
+ *
52
+ * Exported because callers that hook into the retry loop (a `fetchImpl` that
53
+ * inspects or re-wraps its own throws) have to agree with {@link
54
+ * classifyOutcome} about which errors are terminal. Sharing this predicate is
55
+ * what makes that agreement structural instead of a hand-copied condition that
56
+ * can drift.
57
+ */
58
+ export function isTerminalNetworkError(err) {
59
+ return err instanceof DOMException && (err.name === 'TimeoutError' || err.name === 'AbortError');
60
+ }
43
61
  /** Exported for unit tests. */
44
62
  export function classifyOutcome(result, now, retryAfterCapMs = RETRY_AFTER_CAP_MS) {
45
63
  if (result.kind === 'error') {
46
- // Both timer-fired aborts (`AbortSignal.timeout()` → `TimeoutError`)
47
- // and caller-driven aborts (`AbortController.abort()` → `AbortError`)
48
- // are terminal: retrying against an already-aborted signal would
49
- // fail again immediately, and neither outcome reflects backend
50
- // health. They route through the breaker's neutral path.
51
- if (result.err instanceof DOMException &&
52
- (result.err.name === 'TimeoutError' || result.err.name === 'AbortError')) {
64
+ if (isTerminalNetworkError(result.err)) {
53
65
  return { kind: 'terminal-network', err: result.err };
54
66
  }
55
67
  return { kind: 'retryable-network', err: result.err };
@@ -1 +1 @@
1
- {"version":3,"file":"resilient-fetch.js","sourceRoot":"","sources":["../../src/integrations/resilient-fetch.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"resilient-fetch.js","sourceRoot":"","sources":["../../src/integrations/resilient-fetch.ts"],"names":[],"mappings":"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"}
@@ -109,6 +109,24 @@ export declare function normalizeAnalyzerRootPath(p: string, platform: NodeJS.Pl
109
109
  declare function isInside(parent: string, candidate: string, pathApi?: typeof path): boolean;
110
110
  /** Test seam for {@link isInside} (see `_hashAnalyzerIdentityFramesForTests`). */
111
111
  export declare const _isInsideForTests: typeof isInside;
112
+ /**
113
+ * Whether a REALPATH'd package root lives inside some installed dependency
114
+ * tree. Used as the resolved-location half of "is this dependency a checkout
115
+ * this repository owns?" (see {@link undeclaredLocalDevDependencyNames}).
116
+ *
117
+ * The input must already be realpath'd: `resolveDependencyPackageRoot` returns
118
+ * `realpathSync.native`, so a package reached through a link out of
119
+ * `node_modules` reports its checkout location and a package that merely lives
120
+ * in `node_modules` reports a path that still carries the segment.
121
+ *
122
+ * `pathApi` is injectable so the Windows separator handling is unit-testable
123
+ * from a POSIX runner, exactly as {@link isInside} does. The separator sets
124
+ * differ deliberately: `\` is a legal filename character on POSIX, so only
125
+ * win32 may treat it as a boundary.
126
+ */
127
+ declare function hasNodeModulesSegment(candidate: string, pathApi?: typeof path): boolean;
128
+ /** Test seam for {@link hasNodeModulesSegment} (see {@link _isInsideForTests}). */
129
+ export declare const _hasNodeModulesSegmentForTests: typeof hasNodeModulesSegment;
112
130
  export type AnalyzerRunnerSemanticIdentity = Omit<AnalyzerRunnerIdentity, 'invokedArtifact'>;
113
131
  /**
114
132
  * Normalize a raw diagnostic receipt for freshness comparison. The entrypoint
@@ -154,6 +154,24 @@ function snapshotReadableFile(candidate) {
154
154
  ...(link.isSymbolicLink() ? { symlinkTarget: readlinkSync(candidate) } : {}),
155
155
  };
156
156
  }
157
+ /**
158
+ * Snapshot a symbolic link without resolving it. Unlike
159
+ * {@link snapshotReadableFile} this never stats the target, so it is total over
160
+ * linked directories, dangling links, and links to device nodes — the inputs
161
+ * that make the readable-file snapshot throw.
162
+ */
163
+ function snapshotSymlinkArtifact(candidate) {
164
+ const link = lstatSync(candidate, { bigint: true });
165
+ if (!link.isSymbolicLink()) {
166
+ throw new Error(`Analyzer identity input is not a symbolic link: ${candidate}`);
167
+ }
168
+ return { link: statState(link), symlinkTarget: readlinkSync(candidate) };
169
+ }
170
+ function snapshotRuntimeArtifact(artifact) {
171
+ return artifact.kind === 'unfollowed-symlink'
172
+ ? snapshotSymlinkArtifact(artifact.absolutePath)
173
+ : snapshotReadableFile(artifact.absolutePath);
174
+ }
157
175
  function snapshotDirectory(candidate) {
158
176
  const stat = lstatSync(candidate, { bigint: true });
159
177
  if (!stat.isDirectory() || stat.isSymbolicLink()) {
@@ -597,6 +615,96 @@ function runtimePackageLocator(packageRoot, runtimeRoot) {
597
615
  const relative = path.relative(packageRoot, runtimeRoot).split(path.sep).join('/');
598
616
  return `relative:${relative}`;
599
617
  }
618
+ /** Protocols that name a checkout-local package instead of a registry tarball. */
619
+ const LOCAL_LINK_PROTOCOL_PATTERN = /^(?:file|link|workspace|portal):/;
620
+ /** npm's bare local-path shorthands: `./x`, `../x`, `/x`, `~/x`, `C:\x`. */
621
+ const LOCAL_LINK_PATH_PATTERN = /^(?:\.\.?[/\\]|~[/\\]|[/\\]|[A-Za-z]:)/;
622
+ function isLocallyLinkedSpecifier(specifier) {
623
+ if (typeof specifier !== 'string')
624
+ return false;
625
+ const value = specifier.trim();
626
+ return LOCAL_LINK_PROTOCOL_PATTERN.test(value) || LOCAL_LINK_PATH_PATTERN.test(value);
627
+ }
628
+ /**
629
+ * Whether a REALPATH'd package root lives inside some installed dependency
630
+ * tree. Used as the resolved-location half of "is this dependency a checkout
631
+ * this repository owns?" (see {@link undeclaredLocalDevDependencyNames}).
632
+ *
633
+ * The input must already be realpath'd: `resolveDependencyPackageRoot` returns
634
+ * `realpathSync.native`, so a package reached through a link out of
635
+ * `node_modules` reports its checkout location and a package that merely lives
636
+ * in `node_modules` reports a path that still carries the segment.
637
+ *
638
+ * `pathApi` is injectable so the Windows separator handling is unit-testable
639
+ * from a POSIX runner, exactly as {@link isInside} does. The separator sets
640
+ * differ deliberately: `\` is a legal filename character on POSIX, so only
641
+ * win32 may treat it as a boundary.
642
+ */
643
+ function hasNodeModulesSegment(candidate, pathApi = path) {
644
+ const segments = pathApi.sep === '\\' ? candidate.split(/[\\/]+/) : candidate.split('/');
645
+ return segments.includes('node_modules');
646
+ }
647
+ /** Test seam for {@link hasNodeModulesSegment} (see {@link _isInsideForTests}). */
648
+ export const _hasNodeModulesSegmentForTests = hasNodeModulesSegment;
649
+ /**
650
+ * How many dev dependencies may be admitted by RESOLVED LOCATION alone before
651
+ * the whole resolved-location channel is treated as untrustworthy and disabled.
652
+ *
653
+ * "Realpath carries no `node_modules` segment" is a proxy for "checkout-local",
654
+ * and a layout that materializes packages outside `node_modules` — pnpm with a
655
+ * relocated `virtual-store-dir`, a custom linker — makes every dev dependency
656
+ * pass it. Folding an entire dev tree into the receipt is not a graceful
657
+ * degradation: `runtimePackages`/`runtimeEntries`/`runtimeBytes` THROW, so a
658
+ * mis-fired proxy on a legitimate install would abort analyze outright.
659
+ *
660
+ * The bound is therefore on ADMISSIONS, and overflow admits NONE of them rather
661
+ * than an arbitrary prefix. A prefix would not bound the failure — the abort
662
+ * comes from the transitive payload of whichever trees get folded in — and it
663
+ * would make the receipt depend on an arbitrary slice of a sorted name list.
664
+ * Dropping the channel wholesale falls back to the specifier-only receipt,
665
+ * which is the behaviour that ships today and is known not to abort, and leaves
666
+ * the declared-intent half in {@link dependencyNames} untouched.
667
+ *
668
+ * Four is measured, not guessed. Monorepo and workspace links are declared
669
+ * (`file:`/`link:`/`workspace:`) and travel the uncapped declared half, so this
670
+ * channel only ever carries UNDECLARED `npm link <pkg>` — a manual, per-package
671
+ * developer action, in practice one or two packages. A mis-fire admits the
672
+ * entire dev-only set instead: 13 names in this repository's own install, tens
673
+ * in a typical application. The cap sits an order of magnitude below the
674
+ * mis-fire population and comfortably above realistic link counts.
675
+ */
676
+ const MAX_UNDECLARED_LOCAL_DEV_DEPENDENCIES = 4;
677
+ /**
678
+ * Dependency names whose resolved packages can contribute analyzer semantics.
679
+ *
680
+ * The three runtime sections are enumerated wholesale. `devDependencies` are
681
+ * deliberately not: a registry dev tool (vitest, eslint, typescript) is never
682
+ * loaded by the analyzer, and folding the dev tree into the receipt would churn
683
+ * `dependencyRuntime.digest` — and force a full re-analysis — on every unrelated
684
+ * devDependency bump.
685
+ *
686
+ * Locally linked dev dependencies are the exception. A `file:`/`link:`/
687
+ * `workspace:` sibling is part of this checkout and ships code the analyzer
688
+ * imports at runtime: GitNexus links `gitnexus-shared`, whose schema constants
689
+ * feed `RELATION_SCHEMA`/`NODE_SCHEMA_QUERIES`. In `kind: 'source'` runs that
690
+ * sibling sits outside `buildRoot`, so leaving it out let a semantic change
691
+ * there alter analyzer behaviour while moving neither `build.digest` nor
692
+ * `dependencyRuntime.digest` — DDL-affecting edits were still caught by the
693
+ * schema fingerprint, semantics-only edits by nothing.
694
+ *
695
+ * An unresolvable link (a published install, where the sibling checkout does not
696
+ * exist) still contributes its `<missing>` edge, so the linked package appearing
697
+ * or disappearing remains a receipt change rather than a silent one. That is why
698
+ * the specifier check cannot be replaced by resolution: resolution returns
699
+ * `null` for an absent linked checkout exactly as it does for an uninstalled
700
+ * registry dev tool, and the two must not be conflated.
701
+ *
702
+ * This function is the DECLARED-INTENT half and is enumerated for every package
703
+ * in the dependency BFS, so it must stay a pure function of the manifest. The
704
+ * RESOLVED-LOCATION half — `npm link <pkg>`, which leaves the specifier a
705
+ * registry range — lives in {@link undeclaredLocalDevDependencyNames} and is
706
+ * applied to the root package only.
707
+ */
600
708
  function dependencyNames(manifest) {
601
709
  const names = new Set();
602
710
  for (const section of [
@@ -609,6 +717,13 @@ function dependencyNames(manifest) {
609
717
  for (const name of Object.keys(section))
610
718
  names.add(name);
611
719
  }
720
+ const development = manifest.devDependencies;
721
+ if (development && typeof development === 'object') {
722
+ for (const [name, specifier] of Object.entries(development)) {
723
+ if (isLocallyLinkedSpecifier(specifier))
724
+ names.add(name);
725
+ }
726
+ }
612
727
  return [...names].sort(compareBytes);
613
728
  }
614
729
  function resolveDependencyPackageRoot(fromRoot, packageName, pathGuards, limits) {
@@ -641,6 +756,51 @@ function resolveDependencyPackageRoot(fromRoot, packageName, pathGuards, limits)
641
756
  cursor = parent;
642
757
  }
643
758
  }
759
+ /**
760
+ * Dev dependencies that are locally linked by INSTALLED LOCATION rather than by
761
+ * declared specifier — the `npm link <pkg>` shape, where the manifest still
762
+ * carries a registry range while `node_modules/<pkg>` is a symlink into a
763
+ * working checkout. {@link isLocallyLinkedSpecifier} is blind to those, yet the
764
+ * linked code is exactly as load-bearing for analyzer semantics as a declared
765
+ * `file:` sibling, so a semantic-only edit there would move neither digest.
766
+ *
767
+ * The resolver already knows: {@link resolveDependencyPackageRoot} returns a
768
+ * realpath, so a linked package reports a root outside every `node_modules`
769
+ * tree while an ordinary installed package cannot.
770
+ *
771
+ * Two properties are load-bearing and must not be relaxed:
772
+ *
773
+ * 1. ROOT ONLY. {@link dependencyNames} runs for every package in the BFS, and
774
+ * published tarballs keep their `devDependencies`, so probing dev-only names
775
+ * everywhere costs 1998 resolutions rather than the ~13 this manifest
776
+ * declares — measured on this install, with 0 true positives. Persisted
777
+ * `dependencyPathGuards` grow 2220 → 11049, and every guard is re-probed on
778
+ * each warm validation, so the cost is recurring and on the `status` path.
779
+ * Root-only costs 13 resolutions and ~29 guards.
780
+ * 2. An unresolvable name is NEVER admitted. `null` here means "uninstalled
781
+ * registry dev tool" far more often than "broken link", and admitting it
782
+ * would emit a `<missing>` edge for every dev tool absent from a published
783
+ * install. Declared links keep that edge through {@link dependencyNames};
784
+ * undeclared ones have no declaration to honour.
785
+ *
786
+ * The admission count is bounded by {@link MAX_UNDECLARED_LOCAL_DEV_DEPENDENCIES}.
787
+ */
788
+ function undeclaredLocalDevDependencyNames(rootPackage, pathGuards, limits) {
789
+ const development = rootPackage.manifest.devDependencies;
790
+ if (!development || typeof development !== 'object')
791
+ return [];
792
+ const admitted = [];
793
+ for (const [name, specifier] of Object.entries(development)) {
794
+ // Already carried by the declared half; resolving again would only add
795
+ // guards. Its `<missing>` edge is that half's responsibility.
796
+ if (isLocallyLinkedSpecifier(specifier))
797
+ continue;
798
+ const resolved = resolveDependencyPackageRoot(rootPackage.root, name, pathGuards, limits);
799
+ if (resolved !== null && !hasNodeModulesSegment(resolved))
800
+ admitted.push(name);
801
+ }
802
+ return admitted.length <= MAX_UNDECLARED_LOCAL_DEV_DEPENDENCIES ? admitted : [];
803
+ }
644
804
  function collectRuntimePackages(packageRoot, directoryGuards, pathGuards, options, budget, limits) {
645
805
  const rootManifestPath = path.join(packageRoot, 'package.json');
646
806
  recordDirectoryGuard(directoryGuards, packageRoot);
@@ -660,7 +820,20 @@ function collectRuntimePackages(packageRoot, directoryGuards, pathGuards, option
660
820
  budget.packages = 1;
661
821
  for (let index = 0; index < queue.length; index += 1) {
662
822
  const parent = queue[index];
663
- for (const dependencyName of dependencyNames(parent.manifest)) {
823
+ // The declared half is enumerated for every package; the resolved-location
824
+ // half is scoped to the root package, where the 1998-resolution /
825
+ // 8829-extra-guard blow-up documented on
826
+ // `undeclaredLocalDevDependencyNames` cannot occur. Dropping this scope is
827
+ // the expensive regression, so it is pinned by a guard-count test.
828
+ const dependencies = parent.root === packageRoot
829
+ ? [
830
+ ...new Set([
831
+ ...dependencyNames(parent.manifest),
832
+ ...undeclaredLocalDevDependencyNames(parent, pathGuards, limits),
833
+ ]),
834
+ ].sort(compareBytes)
835
+ : dependencyNames(parent.manifest);
836
+ for (const dependencyName of dependencies) {
664
837
  budget.edges += 1;
665
838
  if (budget.edges > limits.runtimeEdges) {
666
839
  throw new Error(`Analyzer dependency graph exceeded ${limits.runtimeEdges} edges: ${packageRoot}`);
@@ -736,22 +909,63 @@ function collectArtifacts(root, canonicalPrefix, directoryGuards, options, budge
736
909
  throw new Error(`Analyzer runtime payload scan exceeded ${limits.runtimeEntries} entries: ${root}`);
737
910
  }
738
911
  for (const entry of entries) {
912
+ const absolutePath = path.join(absoluteDir, entry.name);
913
+ const relativePath = path.relative(root, absolutePath).split(path.sep).join('/');
914
+ const stat = lstatSync(absolutePath);
739
915
  // Nested dependencies are collected from their manifests as separate
740
916
  // packages. Only prune those separately traversed trees and VCS
741
917
  // metadata; generic cache/model directories can contain loadable code,
742
918
  // native addons, Wasm modules, or data consumed by the runtime.
743
- if (entry.isDirectory() && PRUNED_RUNTIME_DIRECTORIES.has(entry.name)) {
919
+ //
920
+ // Pruning is decided by NAME alone. These four names never carry analyzer
921
+ // payload in any form: `node_modules` is traversed separately through
922
+ // `resolveDependencyPackageRoot` (which follows links and guards each
923
+ // hop), and a `.git`/`.hg`/`.svn` entry is VCS metadata whether it is a
924
+ // directory, a symbolic link into a shared store, or — inside a submodule
925
+ // or linked worktree checkout — a regular file holding a gitdir pointer.
926
+ // Hashing that pointer would make analyzer identity depend on where the
927
+ // checkout happens to live, which is a false-stale source, not a
928
+ // semantic input.
929
+ if (PRUNED_RUNTIME_DIRECTORIES.has(entry.name))
744
930
  continue;
745
- }
746
- const absolutePath = path.join(absoluteDir, entry.name);
747
- const relativePath = path.relative(root, absolutePath).split(path.sep).join('/');
748
- const stat = lstatSync(absolutePath);
749
931
  if (stat.isDirectory()) {
750
932
  if (depth >= limits.runtimeDepth) {
751
933
  throw new Error(`Analyzer runtime payload scan exceeded depth ${limits.runtimeDepth}: ${absolutePath}`);
752
934
  }
753
935
  pending.push({ absoluteDir: absolutePath, depth: depth + 1 });
754
936
  }
937
+ else if (stat.isSymbolicLink() && !isFile(absolutePath)) {
938
+ // A symbolic link that does not resolve to a regular file must never
939
+ // reach the payload branch below: `snapshotReadableFile` stats the
940
+ // target, and a directory (or a dangling link) makes it throw, aborting
941
+ // the entire analyze. Workspace-linked checkouts made this reachable
942
+ // for every name, not just the pruned four — `dist -> build`, a
943
+ // vendored-grammar link, anything a sibling checkout ships.
944
+ //
945
+ // Such links are RECORDED by their link text rather than followed.
946
+ // Following them would (a) recurse without cycle protection — this
947
+ // traversal has none, so `self -> .` would ride the depth limit, which
948
+ // THROWS, trading one hard abort for another; (b) re-scan trees already
949
+ // reached by their real path, inflating the entry/byte budgets that
950
+ // also throw; and (c) need a whole containment/TOCTOU trust boundary
951
+ // for targets outside the package. Recording the text is cycle-free,
952
+ // costs one `readlink`, and still moves the receipt when the link is
953
+ // retargeted. The trade-off is that a link's target contributes no
954
+ // content of its own: when it points outside the package, only the
955
+ // link text is covered. Links that DO resolve to a regular file keep
956
+ // their content digest below, unchanged.
957
+ if (shouldHashRuntimePayload(relativePath)) {
958
+ budget.artifacts += 1;
959
+ if (budget.artifacts > limits.runtimePayloads) {
960
+ throw new Error(`Analyzer runtime payload scan exceeded ${limits.runtimePayloads} payloads: ${root}`);
961
+ }
962
+ artifacts.push({
963
+ absolutePath,
964
+ canonicalPath: `${canonicalPrefix}/${relativePath}`,
965
+ kind: 'unfollowed-symlink',
966
+ });
967
+ }
968
+ }
755
969
  else if ((stat.isFile() || stat.isSymbolicLink()) &&
756
970
  shouldHashRuntimePayload(relativePath)) {
757
971
  const readableState = snapshotReadableFile(absolutePath);
@@ -889,7 +1103,7 @@ function dependencySnapshot(inputs) {
889
1103
  absolutePath: artifact.absolutePath,
890
1104
  canonicalPath: artifact.canonicalPath,
891
1105
  kind: artifact.kind,
892
- state: snapshotReadableFile(artifact.absolutePath),
1106
+ state: snapshotRuntimeArtifact(artifact),
893
1107
  })),
894
1108
  directories: [...inputs.directoryGuards.entries()]
895
1109
  .map(([absolutePath, guard]) => ({ absolutePath, ...guard }))
@@ -903,9 +1117,26 @@ function artifactCacheKey(artifact) {
903
1117
  return JSON.stringify([artifact.kind, artifact.canonicalPath, artifact.absolutePath]);
904
1118
  }
905
1119
  function hashRuntimeArtifact(artifact, cache, options) {
1120
+ if (artifact.kind === 'unfollowed-symlink') {
1121
+ // The link text is the entire payload, so there is no file read for a
1122
+ // cached digest to amortize: recompute it and stay independent of the
1123
+ // cache's freshness. The distinct frame label keeps a link recording from
1124
+ // ever colliding with a content digest.
1125
+ const state = snapshotSymlinkArtifact(artifact.absolutePath);
1126
+ return {
1127
+ ...artifact,
1128
+ state,
1129
+ digest: hashCanonicalFrames([
1130
+ ['runtime-payload-link-v1', artifact.kind, state.symlinkTarget],
1131
+ ]),
1132
+ };
1133
+ }
906
1134
  const before = snapshotReadableFile(artifact.absolutePath);
907
- if (cache && SHA256_PATTERN.test(cache.digest) && isDeepStrictEqual(cache.state, before)) {
908
- return { digest: cache.digest, state: before };
1135
+ if (cache &&
1136
+ cache.kind !== 'unfollowed-symlink' &&
1137
+ SHA256_PATTERN.test(cache.digest) &&
1138
+ isDeepStrictEqual(cache.state, before)) {
1139
+ return { ...artifact, state: before, digest: cache.digest };
909
1140
  }
910
1141
  const stable = hashStableFile(artifact.absolutePath);
911
1142
  const digest = hashCanonicalFrames([
@@ -921,7 +1152,7 @@ function hashRuntimeArtifact(artifact, cache, options) {
921
1152
  path: artifact.absolutePath,
922
1153
  bytes: stable.bytes,
923
1154
  });
924
- return { digest, state: stable.state };
1155
+ return { ...artifact, state: stable.state, digest };
925
1156
  }
926
1157
  function compareEdges(a, b) {
927
1158
  return compareBytes(JSON.stringify([
@@ -986,7 +1217,7 @@ function hashDependencyRuntime(inputs, cache, options, runtimeVariant) {
986
1217
  artifact.kind,
987
1218
  digestBytes(hashed.digest),
988
1219
  ]);
989
- nextArtifacts.push({ ...artifact, state: hashed.state, digest: hashed.digest });
1220
+ nextArtifacts.push(hashed);
990
1221
  }
991
1222
  return {
992
1223
  identity: {
@@ -1014,6 +1245,17 @@ function isReadableFileState(value) {
1014
1245
  isStatState(record.target) &&
1015
1246
  (record.symlinkTarget === undefined || typeof record.symlinkTarget === 'string'));
1016
1247
  }
1248
+ function isSymlinkArtifactState(value) {
1249
+ if (typeof value !== 'object' || value === null)
1250
+ return false;
1251
+ const record = value;
1252
+ // `target === undefined` keeps a readable-file state from masquerading as an
1253
+ // unresolved link recording, which would otherwise be validated against the
1254
+ // wrong guard mode on the warm path.
1255
+ return (isStatState(record.link) &&
1256
+ typeof record.symlinkTarget === 'string' &&
1257
+ record.target === undefined);
1258
+ }
1017
1259
  function isDependencyPathGuardResult(value) {
1018
1260
  if (value === null)
1019
1261
  return true;
@@ -1159,13 +1401,16 @@ function isIdentityCachePayload(value, packageRoot, buildRoot, runtimeVariant, t
1159
1401
  if (typeof entry !== 'object' || entry === null)
1160
1402
  return false;
1161
1403
  const item = entry;
1162
- return (typeof item.absolutePath === 'string' &&
1163
- path.isAbsolute(item.absolutePath) &&
1164
- typeof item.canonicalPath === 'string' &&
1165
- (item.kind === 'file' || item.kind === 'symlink') &&
1166
- isReadableFileState(item.state) &&
1167
- typeof item.digest === 'string' &&
1168
- SHA256_PATTERN.test(item.digest));
1404
+ if (typeof item.absolutePath !== 'string' ||
1405
+ !path.isAbsolute(item.absolutePath) ||
1406
+ typeof item.canonicalPath !== 'string' ||
1407
+ typeof item.digest !== 'string' ||
1408
+ !SHA256_PATTERN.test(item.digest)) {
1409
+ return false;
1410
+ }
1411
+ return item.kind === 'unfollowed-symlink'
1412
+ ? isSymlinkArtifactState(item.state)
1413
+ : (item.kind === 'file' || item.kind === 'symlink') && isReadableFileState(item.state);
1169
1414
  });
1170
1415
  const hasBuildRootGuard = record.buildDirectoryGuards.some((entry) => typeof entry === 'object' &&
1171
1416
  entry !== null &&
@@ -1587,9 +1832,24 @@ function validateIdentityCache(cache, options) {
1587
1832
  }
1588
1833
  }
1589
1834
  for (const artifact of cache.artifactEntries) {
1590
- if (!add({ absolutePath: artifact.absolutePath, mode: 'readable-file' }, { type: 'readable-file', state: artifact.state })) {
1835
+ // A recorded link is re-probed as a link, never as a readable file: the
1836
+ // readable-file probe resolves the target and would report `null` for the
1837
+ // very inputs this kind exists to describe, failing every warm validation.
1838
+ const probe = artifact.kind === 'unfollowed-symlink'
1839
+ ? {
1840
+ request: { absolutePath: artifact.absolutePath, mode: 'link' },
1841
+ expected: {
1842
+ type: 'symlink',
1843
+ state: artifact.state.link,
1844
+ symlinkTarget: artifact.state.symlinkTarget,
1845
+ },
1846
+ }
1847
+ : {
1848
+ request: { absolutePath: artifact.absolutePath, mode: 'readable-file' },
1849
+ expected: { type: 'readable-file', state: artifact.state },
1850
+ };
1851
+ if (!add(probe.request, probe.expected))
1591
1852
  return false;
1592
- }
1593
1853
  }
1594
1854
  const entries = [...expected.entries()];
1595
1855
  const requests = entries.map(([key]) => {