@socketsecurity/lib 6.0.5 → 6.0.7

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 (534) hide show
  1. package/CHANGELOG.md +43 -0
  2. package/dist/ai/discover.d.mts +2 -2
  3. package/dist/ai/discover.js +6 -4
  4. package/dist/ai/spawn.js +10 -6
  5. package/dist/ai/types.d.mts +18 -6
  6. package/dist/ai/worktree.d.mts +6 -6
  7. package/dist/ai/worktree.js +12 -7
  8. package/dist/ansi/strip.d.ts +1 -1
  9. package/dist/ansi/strip.js +0 -2
  10. package/dist/archives/_internal.js +7 -9
  11. package/dist/archives/extract.js +1 -1
  12. package/dist/archives/tar.js +6 -6
  13. package/dist/archives/zip.js +4 -6
  14. package/dist/argv/flag-predicates.d.ts +12 -12
  15. package/dist/argv/flag-predicates.js +17 -17
  16. package/dist/argv/flag-types.d.ts +18 -18
  17. package/dist/argv/flag-types.js +4 -4
  18. package/dist/argv/parse.d.ts +1 -1
  19. package/dist/arrays/_internal.js +11 -12
  20. package/dist/arrays/chunk.js +0 -1
  21. package/dist/arrays/join.d.ts +37 -3
  22. package/dist/arrays/join.js +43 -7
  23. package/dist/arrays/unique.js +0 -1
  24. package/dist/bin/_internal.d.ts +1 -1
  25. package/dist/bin/_internal.js +1 -1
  26. package/dist/bin/acorn-bindgen.cjs +769 -0
  27. package/dist/bin/acorn.wasm +0 -0
  28. package/dist/bin/exec.js +2 -3
  29. package/dist/bin/find.js +13 -13
  30. package/dist/bin/prim.cjs +39244 -0
  31. package/dist/bin/resolve.js +12 -13
  32. package/dist/bin/which.js +8 -8
  33. package/dist/cache/ttl/store.js +5 -5
  34. package/dist/checks/primordials-defaults.d.ts +3 -3
  35. package/dist/checks/primordials-defaults.js +3 -3
  36. package/dist/checks/primordials.js +4 -3
  37. package/dist/{bin → cli}/check-primordials.d.ts +11 -11
  38. package/dist/{bin → cli}/check-primordials.js +56 -52
  39. package/dist/{bin → cli}/check.js +6 -5
  40. package/dist/{bin → cli}/socket-lib.d.ts +1 -1
  41. package/dist/{bin → cli}/socket-lib.js +4 -4
  42. package/dist/colors/socket-palette.js +7 -9
  43. package/dist/compression/_internal.d.ts +12 -12
  44. package/dist/compression/_internal.js +20 -19
  45. package/dist/compression/brotli.d.ts +25 -25
  46. package/dist/compression/brotli.js +37 -44
  47. package/dist/compression/gzip.d.ts +23 -23
  48. package/dist/compression/gzip.js +44 -52
  49. package/dist/constants/agents.d.ts +3 -1
  50. package/dist/constants/agents.js +15 -11
  51. package/dist/constants/licenses.js +3 -3
  52. package/dist/constants/node.d.ts +23 -0
  53. package/dist/constants/node.js +47 -15
  54. package/dist/constants/packages.js +22 -28
  55. package/dist/constants/platform.d.ts +30 -3
  56. package/dist/constants/platform.js +72 -12
  57. package/dist/constants/runtime.d.ts +22 -0
  58. package/dist/constants/runtime.js +32 -0
  59. package/dist/constants/socket.js +1 -1
  60. package/dist/cover/code.js +8 -8
  61. package/dist/cover/formatters.js +5 -5
  62. package/dist/crypto/hash.d.ts +26 -1
  63. package/dist/crypto/hash.js +43 -12
  64. package/dist/debug/_internal.js +4 -6
  65. package/dist/debug/caller-info.js +2 -3
  66. package/dist/debug/namespace.d.ts +7 -0
  67. package/dist/debug/namespace.js +21 -12
  68. package/dist/debug/output.js +21 -24
  69. package/dist/debug/types.d.ts +4 -4
  70. package/dist/dlx/arborist.js +6 -6
  71. package/dist/dlx/binary-cache.js +14 -14
  72. package/dist/dlx/binary-download.d.ts +1 -1
  73. package/dist/dlx/binary-download.js +14 -13
  74. package/dist/dlx/binary-resolution.js +16 -14
  75. package/dist/dlx/binary-types.d.ts +5 -5
  76. package/dist/dlx/binary.js +5 -5
  77. package/dist/dlx/cache.js +1 -1
  78. package/dist/dlx/detect.d.ts +34 -25
  79. package/dist/dlx/detect.js +86 -77
  80. package/dist/dlx/dir.js +2 -2
  81. package/dist/dlx/firewall.d.ts +1 -1
  82. package/dist/dlx/lockfile.d.ts +19 -18
  83. package/dist/dlx/lockfile.js +16 -16
  84. package/dist/dlx/manifest.d.ts +6 -6
  85. package/dist/dlx/manifest.js +5 -5
  86. package/dist/dlx/package.d.ts +10 -10
  87. package/dist/dlx/package.js +16 -16
  88. package/dist/dlx/packages.js +4 -4
  89. package/dist/dlx/paths.js +7 -7
  90. package/dist/dlx/spec.js +1 -1
  91. package/dist/dlx/types.d.ts +28 -27
  92. package/dist/eco/cargo/parse-lockfile.d.ts +1 -1
  93. package/dist/eco/cargo/parse-lockfile.js +2 -2
  94. package/dist/eco/manifest/analyze-lockfile.js +2 -2
  95. package/dist/eco/manifest/detect-format.js +4 -4
  96. package/dist/eco/manifest/find-packages.js +2 -2
  97. package/dist/eco/manifest/get-package-versions.js +2 -2
  98. package/dist/eco/manifest/get-package.js +2 -2
  99. package/dist/eco/manifest/parse-lockfile.js +2 -2
  100. package/dist/eco/manifest/parse-manifest.js +2 -2
  101. package/dist/eco/manifest/parse.js +2 -2
  102. package/dist/eco/npm/npm/exec.js +2 -2
  103. package/dist/eco/npm/npm/flags.js +7 -12
  104. package/dist/eco/npm/npm/parse-lockfile.d.ts +14 -14
  105. package/dist/eco/npm/npm/parse-lockfile.js +3 -3
  106. package/dist/eco/npm/parse-package-json.js +3 -3
  107. package/dist/eco/npm/pnpm/exec.d.ts +1 -1
  108. package/dist/eco/npm/pnpm/exec.js +5 -5
  109. package/dist/eco/npm/pnpm/flags.js +0 -3
  110. package/dist/eco/npm/pnpm/parse-lockfile.d.ts +1 -1
  111. package/dist/eco/npm/pnpm/parse-lockfile.js +4 -4
  112. package/dist/eco/npm/script.js +9 -6
  113. package/dist/eco/npm/yarnpkg/yarn/exec.js +3 -3
  114. package/dist/eco/npm/yarnpkg/yarn/parse-lockfile.d.ts +2 -2
  115. package/dist/eco/npm/yarnpkg/yarn/parse-lockfile.js +8 -8
  116. package/dist/effects/pulse-frames.d.ts +3 -1
  117. package/dist/effects/shimmer-keyframes.d.ts +1 -1
  118. package/dist/effects/shimmer-terminal.d.ts +1 -1
  119. package/dist/env/boolean.js +0 -1
  120. package/dist/env/ci.js +0 -1
  121. package/dist/env/debug.js +0 -1
  122. package/dist/env/github-status.d.ts +51 -0
  123. package/dist/env/github-status.js +90 -0
  124. package/dist/env/github.js +0 -8
  125. package/dist/env/home.js +0 -1
  126. package/dist/env/locale.js +0 -3
  127. package/dist/env/node-auth-token.js +0 -1
  128. package/dist/env/node-env.js +0 -1
  129. package/dist/env/node-version-managers.d.ts +53 -0
  130. package/dist/env/node-version-managers.js +90 -0
  131. package/dist/env/npm.js +0 -5
  132. package/dist/env/number.js +0 -1
  133. package/dist/env/package-manager.js +3 -6
  134. package/dist/env/path.js +0 -1
  135. package/dist/env/pre-commit.js +1 -2
  136. package/dist/env/rewire.d.ts +7 -6
  137. package/dist/env/rewire.js +15 -16
  138. package/dist/env/shell.js +0 -1
  139. package/dist/env/socket-cli.js +5 -18
  140. package/dist/env/socket-mcp.d.ts +114 -0
  141. package/dist/env/socket-mcp.js +146 -0
  142. package/dist/env/socket.d.ts +1 -109
  143. package/dist/env/socket.js +12 -166
  144. package/dist/env/string.js +0 -1
  145. package/dist/env/temp-dir.js +0 -3
  146. package/dist/env/term.js +0 -1
  147. package/dist/env/test.js +3 -6
  148. package/dist/env/windows.js +0 -4
  149. package/dist/env/xdg.js +0 -3
  150. package/dist/events/exit/_internal.d.ts +11 -9
  151. package/dist/events/exit/_internal.js +31 -35
  152. package/dist/events/exit/handler.js +3 -4
  153. package/dist/events/exit/intercept.js +4 -6
  154. package/dist/events/exit/lifecycle.js +16 -18
  155. package/dist/events/exit/signals.js +1 -2
  156. package/dist/events/exit/types.d.ts +6 -5
  157. package/dist/external/@npmcli/package-json.js +2 -2
  158. package/dist/external/@sinclair/typebox/value.js +5 -1
  159. package/dist/external/@sinclair/typebox.js +5 -1
  160. package/dist/external/@socketregistry/packageurl-js.js +27 -0
  161. package/dist/external/npm-pack.js +2 -2
  162. package/dist/external-tools/bazel/read-bazel-version-file.js +1 -1
  163. package/dist/external-tools/bazel/resolve.js +2 -1
  164. package/dist/external-tools/bazel/types.d.ts +1 -1
  165. package/dist/external-tools/cdxgen/from-vfs.js +1 -1
  166. package/dist/external-tools/cdxgen/resolve.js +2 -1
  167. package/dist/external-tools/cdxgen/types.d.ts +1 -1
  168. package/dist/external-tools/from-download.d.ts +1 -1
  169. package/dist/external-tools/from-download.js +1 -1
  170. package/dist/external-tools/from-pip-venv.d.ts +73 -0
  171. package/dist/external-tools/from-pip-venv.js +98 -0
  172. package/dist/external-tools/janus/asset-names.js +1 -1
  173. package/dist/external-tools/janus/from-download.js +3 -5
  174. package/dist/external-tools/janus/from-vfs.js +1 -1
  175. package/dist/external-tools/janus/resolve.js +2 -1
  176. package/dist/external-tools/janus/types.d.ts +1 -1
  177. package/dist/external-tools/jre/detect-platform-arch.d.ts +10 -6
  178. package/dist/external-tools/jre/detect-platform-arch.js +29 -14
  179. package/dist/external-tools/jre/from-download.js +2 -1
  180. package/dist/external-tools/jre/from-vfs.js +1 -1
  181. package/dist/external-tools/jre/resolve.js +2 -1
  182. package/dist/external-tools/jre/types.d.ts +1 -1
  183. package/dist/external-tools/manifest.d.ts +7 -7
  184. package/dist/external-tools/manifest.js +18 -16
  185. package/dist/external-tools/opengrep/from-vfs.js +1 -1
  186. package/dist/external-tools/opengrep/resolve.js +2 -1
  187. package/dist/external-tools/opengrep/types.d.ts +1 -1
  188. package/dist/external-tools/python/asset-names.d.ts +76 -0
  189. package/dist/external-tools/python/asset-names.js +104 -0
  190. package/dist/external-tools/python/dlx.d.ts +80 -0
  191. package/dist/external-tools/python/dlx.js +87 -0
  192. package/dist/external-tools/python/from-download.d.ts +53 -0
  193. package/dist/external-tools/python/from-download.js +68 -0
  194. package/dist/external-tools/python/from-path.d.ts +7 -0
  195. package/dist/external-tools/python/from-path.js +23 -0
  196. package/dist/external-tools/python/pin.d.ts +121 -0
  197. package/dist/external-tools/python/pin.js +173 -0
  198. package/dist/external-tools/python/pip-install.d.ts +75 -0
  199. package/dist/external-tools/python/pip-install.js +139 -0
  200. package/dist/external-tools/python/resolve.d.ts +42 -0
  201. package/dist/external-tools/python/resolve.js +58 -0
  202. package/dist/external-tools/python/types.d.ts +49 -0
  203. package/dist/external-tools/sbt/from-vfs.js +1 -1
  204. package/dist/external-tools/sbt/resolve.js +2 -1
  205. package/dist/external-tools/sbt/types.d.ts +1 -1
  206. package/dist/external-tools/skillspector/from-dlx.d.ts +24 -0
  207. package/dist/external-tools/skillspector/from-dlx.js +41 -0
  208. package/dist/external-tools/skillspector/from-path.d.ts +8 -0
  209. package/dist/external-tools/skillspector/from-path.js +30 -0
  210. package/dist/external-tools/skillspector/from-vfs.d.ts +8 -0
  211. package/dist/external-tools/skillspector/from-vfs.js +27 -0
  212. package/dist/external-tools/skillspector/resolve.d.ts +34 -0
  213. package/dist/external-tools/skillspector/resolve.js +53 -0
  214. package/dist/external-tools/skillspector/types.d.ts +24 -0
  215. package/dist/external-tools/skillspector/types.js +2 -0
  216. package/dist/external-tools/synp/from-download.js +2 -2
  217. package/dist/external-tools/synp/from-vfs.js +1 -1
  218. package/dist/external-tools/synp/resolve.js +2 -1
  219. package/dist/external-tools/trivy/from-vfs.js +1 -1
  220. package/dist/external-tools/trivy/resolve.js +2 -1
  221. package/dist/external-tools/trivy/types.d.ts +1 -1
  222. package/dist/external-tools/trufflehog/from-vfs.js +1 -1
  223. package/dist/external-tools/trufflehog/resolve.js +2 -1
  224. package/dist/external-tools/trufflehog/types.d.ts +1 -1
  225. package/dist/fs/_internal.d.ts +1 -1
  226. package/dist/fs/_internal.js +7 -7
  227. package/dist/fs/access.js +5 -9
  228. package/dist/fs/{path-cache.js → allowed-dirs-cache.js} +1 -1
  229. package/dist/fs/encoding.js +5 -7
  230. package/dist/fs/{find-up.js → find.js} +11 -13
  231. package/dist/fs/inspect.js +7 -13
  232. package/dist/fs/read-dir.js +7 -10
  233. package/dist/fs/read-file.js +8 -14
  234. package/dist/fs/read-json-cache.d.ts +6 -4
  235. package/dist/fs/read-json-cache.js +9 -6
  236. package/dist/fs/read-json.js +4 -6
  237. package/dist/fs/resolve-module.js +1 -1
  238. package/dist/fs/safe.d.ts +1 -1
  239. package/dist/fs/safe.js +12 -13
  240. package/dist/fs/unique.js +4 -5
  241. package/dist/fs/validate.js +1 -2
  242. package/dist/fs/write-json.js +4 -5
  243. package/dist/git/_internal.js +12 -11
  244. package/dist/git/changed.js +4 -4
  245. package/dist/git/repo.js +3 -3
  246. package/dist/git/staged.js +4 -4
  247. package/dist/git/unstaged.js +4 -4
  248. package/dist/github/ghsa.js +2 -2
  249. package/dist/github/refs-cache.d.ts +1 -1
  250. package/dist/github/refs-cache.js +5 -5
  251. package/dist/github/refs-rest.js +5 -5
  252. package/dist/github/{fetch.js → request.js} +13 -2
  253. package/dist/github/token.js +1 -1
  254. package/dist/github/types.d.ts +1 -1
  255. package/dist/globs/_internal.js +7 -9
  256. package/dist/globs/match.js +6 -7
  257. package/dist/globs/matcher.d.ts +3 -3
  258. package/dist/globs/matcher.js +12 -14
  259. package/dist/globs/stream.js +1 -2
  260. package/dist/globs/types.d.ts +24 -24
  261. package/dist/http-request/_internal.d.ts +1 -1
  262. package/dist/http-request/browser.js +21 -13
  263. package/dist/http-request/checksum-file.d.ts +55 -0
  264. package/dist/http-request/checksum-file.js +95 -0
  265. package/dist/http-request/download-types.d.ts +15 -23
  266. package/dist/http-request/download.js +4 -4
  267. package/dist/http-request/headers.d.ts +32 -3
  268. package/dist/http-request/headers.js +41 -13
  269. package/dist/http-request/request-attempt.js +38 -33
  270. package/dist/http-request/request-types.d.ts +7 -2
  271. package/dist/http-request/request.js +33 -16
  272. package/dist/http-request/response-reader.d.ts +12 -1
  273. package/dist/http-request/response-reader.js +22 -2
  274. package/dist/http-request/user-agent.js +3 -4
  275. package/dist/integrity.d.ts +86 -18
  276. package/dist/integrity.js +119 -30
  277. package/dist/ipc/directory.js +2 -2
  278. package/dist/ipc/paths.js +1 -1
  279. package/dist/ipc/write.js +1 -1
  280. package/dist/ipc-cli/get.js +12 -12
  281. package/dist/json/edit.js +13 -14
  282. package/dist/json/format.js +2 -2
  283. package/dist/json/parse.d.ts +1 -1
  284. package/dist/json/parse.js +3 -7
  285. package/dist/logger/_internal.d.ts +4 -4
  286. package/dist/logger/_internal.js +3 -3
  287. package/dist/logger/colors.js +4 -3
  288. package/dist/logger/console-methods.d.ts +132 -0
  289. package/dist/logger/console-methods.js +169 -0
  290. package/dist/logger/console.d.ts +12 -0
  291. package/dist/logger/console.js +42 -11
  292. package/dist/logger/indentation-methods.d.ts +81 -0
  293. package/dist/logger/indentation-methods.js +121 -0
  294. package/dist/logger/node.d.ts +16 -338
  295. package/dist/logger/node.js +75 -608
  296. package/dist/logger/options.d.ts +39 -0
  297. package/dist/logger/options.js +47 -0
  298. package/dist/logger/semantic-methods.d.ts +63 -0
  299. package/dist/logger/semantic-methods.js +108 -0
  300. package/dist/logger/stream-methods.d.ts +63 -0
  301. package/dist/logger/stream-methods.js +101 -0
  302. package/dist/logger/stream.d.ts +37 -0
  303. package/dist/logger/stream.js +42 -0
  304. package/dist/logger/symbols-builder.js +9 -9
  305. package/dist/logger/symbols.d.ts +2 -25
  306. package/dist/logger/symbols.js +53 -74
  307. package/dist/logger/types.d.ts +1 -1
  308. package/dist/memo/types.d.ts +6 -6
  309. package/dist/native-messaging/host.d.ts +20 -0
  310. package/dist/native-messaging/host.js +120 -0
  311. package/dist/native-messaging/index.d.ts +5 -0
  312. package/dist/native-messaging/index.js +22 -0
  313. package/dist/native-messaging/install.d.ts +60 -0
  314. package/dist/native-messaging/install.js +141 -0
  315. package/dist/native-messaging/rate-limit.d.ts +62 -0
  316. package/dist/native-messaging/rate-limit.js +115 -0
  317. package/dist/native-messaging/run.d.ts +10 -0
  318. package/dist/native-messaging/run.js +17 -0
  319. package/dist/node/async-hooks.js +4 -3
  320. package/dist/node/child-process.js +4 -3
  321. package/dist/node/crypto.js +4 -3
  322. package/dist/node/events.js +4 -3
  323. package/dist/node/fs-promises.js +4 -3
  324. package/dist/node/fs.js +4 -3
  325. package/dist/node/http.js +4 -3
  326. package/dist/node/https.js +4 -3
  327. package/dist/node/module.js +10 -6
  328. package/dist/node/os.js +4 -3
  329. package/dist/node/path.js +4 -3
  330. package/dist/node/timers-promises.js +4 -3
  331. package/dist/node/url.js +4 -3
  332. package/dist/node/util.js +4 -3
  333. package/dist/objects/getters.js +5 -7
  334. package/dist/objects/inspect.js +1 -4
  335. package/dist/objects/mutate.js +2 -3
  336. package/dist/objects/predicates.js +0 -4
  337. package/dist/objects/sort.js +3 -7
  338. package/dist/packages/edit-class.js +15 -16
  339. package/dist/packages/edit.js +12 -14
  340. package/dist/packages/exports.js +11 -17
  341. package/dist/packages/fetch.d.ts +16 -0
  342. package/dist/packages/fetch.js +81 -0
  343. package/dist/packages/find.d.ts +55 -0
  344. package/dist/packages/find.js +65 -0
  345. package/dist/packages/isolation.js +14 -14
  346. package/dist/packages/licenses.js +16 -16
  347. package/dist/packages/manifest.js +12 -15
  348. package/dist/packages/metadata-extensions.d.ts +14 -0
  349. package/dist/packages/metadata-extensions.js +43 -0
  350. package/dist/packages/normalize.js +5 -9
  351. package/dist/packages/provenance.d.ts +6 -0
  352. package/dist/packages/provenance.js +25 -18
  353. package/dist/packages/read.d.ts +29 -0
  354. package/dist/packages/read.js +66 -0
  355. package/dist/packages/specs.d.ts +48 -1
  356. package/dist/packages/specs.js +74 -11
  357. package/dist/packages/tarball.d.ts +24 -0
  358. package/dist/packages/tarball.js +79 -0
  359. package/dist/packages/types.d.ts +21 -20
  360. package/dist/packages/validation.js +0 -3
  361. package/dist/paths/_internal.d.ts +2 -1
  362. package/dist/paths/_internal.js +7 -19
  363. package/dist/paths/conversion.js +5 -9
  364. package/dist/paths/filenames.d.ts +0 -1
  365. package/dist/paths/filenames.js +0 -2
  366. package/dist/paths/normalize.js +6 -5
  367. package/dist/paths/packages.js +4 -7
  368. package/dist/paths/predicates.js +9 -16
  369. package/dist/paths/resolve.js +11 -14
  370. package/dist/paths/rewire.js +3 -3
  371. package/dist/paths/socket.js +16 -16
  372. package/dist/paths/walk.d.ts +1 -1
  373. package/dist/paths/walk.js +4 -4
  374. package/dist/perf/report.js +2 -2
  375. package/dist/perf/types.d.ts +1 -1
  376. package/dist/pkg-ext/data.js +1 -1
  377. package/dist/primordials/array.js +9 -9
  378. package/dist/primordials/date.js +2 -2
  379. package/dist/primordials/error.js +3 -3
  380. package/dist/primordials/headers.d.ts +10 -0
  381. package/dist/primordials/headers.js +23 -0
  382. package/dist/primordials/intl.d.ts +13 -0
  383. package/dist/primordials/intl.js +26 -0
  384. package/dist/primordials/math.js +33 -33
  385. package/dist/primordials/number.js +9 -9
  386. package/dist/primordials/object.js +5 -5
  387. package/dist/primordials/string.d.ts +2 -2
  388. package/dist/primordials/string.js +6 -6
  389. package/dist/primordials/symbol.js +3 -3
  390. package/dist/primordials/uncurry.js +9 -9
  391. package/dist/process/abort.js +3 -3
  392. package/dist/process/lock-manager.js +8 -8
  393. package/dist/process/spawn/_internal.js +6 -8
  394. package/dist/process/spawn/child.js +14 -14
  395. package/dist/process/spawn/errors.js +2 -4
  396. package/dist/process/spawn/kill-tree.d.ts +53 -0
  397. package/dist/process/spawn/kill-tree.js +85 -0
  398. package/dist/process/spawn/stdio.js +0 -1
  399. package/dist/process/spawn/types.d.ts +5 -5
  400. package/dist/process/transient.js +2 -2
  401. package/dist/promises/_internal.d.ts +2 -1
  402. package/dist/promises/_internal.js +2 -6
  403. package/dist/promises/iterate.js +12 -16
  404. package/dist/promises/options.js +3 -6
  405. package/dist/promises/retry.js +4 -5
  406. package/dist/promises/timers.d.ts +30 -0
  407. package/dist/promises/timers.js +48 -0
  408. package/dist/releases/github-archives.d.ts +6 -6
  409. package/dist/releases/github-archives.js +2 -2
  410. package/dist/releases/github-asset-url.d.ts +1 -1
  411. package/dist/releases/github-asset-url.js +5 -5
  412. package/dist/releases/github-downloads.d.ts +1 -1
  413. package/dist/releases/github-downloads.js +3 -3
  414. package/dist/releases/github-listing.d.ts +11 -2
  415. package/dist/releases/github-listing.js +20 -7
  416. package/dist/releases/github-retry-config.js +1 -1
  417. package/dist/releases/github-types.d.ts +6 -6
  418. package/dist/releases/socket-btm-binary-naming.d.ts +107 -0
  419. package/dist/releases/socket-btm-binary-naming.js +155 -0
  420. package/dist/releases/socket-btm.d.ts +8 -115
  421. package/dist/releases/socket-btm.js +16 -159
  422. package/dist/schema/types.d.ts +1 -1
  423. package/dist/sea/detect.js +6 -6
  424. package/dist/secrets/_internal.d.ts +2 -2
  425. package/dist/secrets/_internal.js +5 -4
  426. package/dist/secrets/compare.d.ts +45 -0
  427. package/dist/secrets/compare.js +61 -0
  428. package/dist/secrets/keychain.js +9 -6
  429. package/dist/secrets/linux.js +25 -23
  430. package/dist/secrets/macos.d.ts +1 -1
  431. package/dist/secrets/macos.js +18 -16
  432. package/dist/secrets/rc.d.ts +2 -2
  433. package/dist/secrets/rc.js +15 -10
  434. package/dist/secrets/socket-api-token.d.ts +4 -4
  435. package/dist/secrets/socket-api-token.js +18 -9
  436. package/dist/secrets/windows.js +21 -17
  437. package/dist/shadow/skip.js +2 -2
  438. package/dist/shell/parse.d.ts +108 -1
  439. package/dist/shell/parse.js +168 -2
  440. package/dist/smol/detect.js +9 -10
  441. package/dist/smol/http.js +6 -7
  442. package/dist/smol/https.js +6 -7
  443. package/dist/smol/manifest.d.ts +1 -1
  444. package/dist/smol/manifest.js +6 -7
  445. package/dist/smol/path.d.ts +1 -1
  446. package/dist/smol/path.js +7 -8
  447. package/dist/smol/primordial.d.ts +4 -0
  448. package/dist/smol/primordial.js +6 -7
  449. package/dist/smol/purl.d.ts +1 -1
  450. package/dist/smol/purl.js +7 -8
  451. package/dist/smol/versions.js +6 -7
  452. package/dist/smol/vfs.js +6 -7
  453. package/dist/sorts/_internal.js +6 -8
  454. package/dist/sorts/natural.js +10 -12
  455. package/dist/sorts/semver.js +1 -2
  456. package/dist/sorts/strings.js +0 -1
  457. package/dist/sorts/types.d.ts +1 -1
  458. package/dist/spinner/create-spinner-class.d.ts +38 -0
  459. package/dist/spinner/create-spinner-class.js +302 -0
  460. package/dist/spinner/default.js +8 -9
  461. package/dist/spinner/spinner-internals.d.ts +36 -0
  462. package/dist/spinner/spinner-internals.js +101 -0
  463. package/dist/spinner/spinner-shimmer-methods.d.ts +54 -0
  464. package/dist/spinner/spinner-shimmer-methods.js +143 -0
  465. package/dist/spinner/spinner-status-methods.d.ts +40 -0
  466. package/dist/spinner/spinner-status-methods.js +133 -0
  467. package/dist/spinner/spinner.d.ts +4 -5
  468. package/dist/spinner/spinner.js +18 -705
  469. package/dist/spinner/types.d.ts +3 -1
  470. package/dist/spinner/with.d.ts +10 -0
  471. package/dist/spinner/with.js +16 -2
  472. package/dist/stdio/divider.js +1 -1
  473. package/dist/stdio/footer.js +3 -3
  474. package/dist/stdio/header.js +4 -4
  475. package/dist/stdio/progress.js +5 -5
  476. package/dist/stdio/prompts.d.ts +5 -3
  477. package/dist/stdio/prompts.js +6 -7
  478. package/dist/stdio/stdout.js +3 -3
  479. package/dist/streams/parallel.js +3 -5
  480. package/dist/streams/transform.js +2 -3
  481. package/dist/strings/format.js +2 -6
  482. package/dist/strings/predicates.js +0 -2
  483. package/dist/strings/search.js +1 -2
  484. package/dist/strings/transform.js +0 -3
  485. package/dist/strings/width.js +9 -10
  486. package/dist/tables/bordered.js +4 -3
  487. package/dist/tables/padding.js +1 -1
  488. package/dist/tables/simple.js +8 -5
  489. package/dist/temporal/instant.js +4 -2
  490. package/dist/temporal/slots.js +7 -6
  491. package/dist/temporal/system.js +9 -9
  492. package/dist/themes/context.d.ts +3 -2
  493. package/dist/themes/context.js +4 -5
  494. package/dist/themes/themes.js +15 -15
  495. package/dist/themes/types.d.ts +3 -3
  496. package/dist/url/parse.js +0 -2
  497. package/dist/url/predicates.js +1 -2
  498. package/dist/url/search-params.js +3 -9
  499. package/dist/url/types.d.ts +5 -5
  500. package/dist/versions/_internal.js +3 -3
  501. package/dist/words/article.js +0 -1
  502. package/dist/words/capitalize.js +0 -1
  503. package/dist/words/pluralize.d.ts +24 -2
  504. package/dist/words/pluralize.js +47 -2
  505. package/dist/words/types.d.ts +25 -2
  506. package/package.json +289 -108
  507. package/dist/external-tools/uv/asset-names.d.ts +0 -36
  508. package/dist/external-tools/uv/asset-names.js +0 -70
  509. package/dist/external-tools/uv/from-download.d.ts +0 -17
  510. package/dist/external-tools/uv/from-download.js +0 -47
  511. package/dist/external-tools/uv/from-path.d.ts +0 -5
  512. package/dist/external-tools/uv/from-path.js +0 -22
  513. package/dist/external-tools/uv/from-vfs.d.ts +0 -7
  514. package/dist/external-tools/uv/from-vfs.js +0 -26
  515. package/dist/external-tools/uv/resolve.d.ts +0 -25
  516. package/dist/external-tools/uv/resolve.js +0 -52
  517. package/dist/external-tools/uv/types.d.ts +0 -24
  518. package/dist/http-request/checksums.d.ts +0 -69
  519. package/dist/http-request/checksums.js +0 -108
  520. package/dist/http-request/http-request.d.ts +0 -12
  521. package/dist/http-request/http-request.js +0 -11
  522. package/dist/packages/operations.d.ts +0 -113
  523. package/dist/packages/operations.js +0 -304
  524. package/dist/ssri/convert.d.ts +0 -48
  525. package/dist/ssri/convert.js +0 -69
  526. package/dist/ssri/parse.d.ts +0 -27
  527. package/dist/ssri/parse.js +0 -41
  528. package/dist/ssri/validate.d.ts +0 -41
  529. package/dist/ssri/validate.js +0 -56
  530. /package/dist/{bin → cli}/check.d.ts +0 -0
  531. /package/dist/external-tools/{uv → python}/types.js +0 -0
  532. /package/dist/fs/{path-cache.d.ts → allowed-dirs-cache.d.ts} +0 -0
  533. /package/dist/fs/{find-up.d.ts → find.d.ts} +0 -0
  534. /package/dist/github/{fetch.d.ts → request.d.ts} +0 -0
@@ -0,0 +1,173 @@
1
+ "use strict";
2
+ /* Socket Lib - Built with rolldown */
3
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4
+ const require_runtime = require('../../_virtual/_rolldown/runtime.js');
5
+ const require_integrity = require('../../integrity.js');
6
+ const require_constants_platform = require('../../constants/platform.js');
7
+ const require_process_spawn_child = require('../../process/spawn/child.js');
8
+ const require_fs_safe = require('../../fs/safe.js');
9
+ let node_fs = require("node:fs");
10
+ let node_path = require("node:path");
11
+ node_path = require_runtime.__toESM(node_path);
12
+ let node_os = require("node:os");
13
+ node_os = require_runtime.__toESM(node_os);
14
+ let node_process = require("node:process");
15
+ node_process = require_runtime.__toESM(node_process);
16
+
17
+ //#region src/external-tools/python/pin.ts
18
+ /**
19
+ * @file `resolvePipPackagePin()` — the Python mirror of
20
+ * `resolveNpmPackagePin()` (dlx/lockfile). Resolves a pip spec and its full
21
+ * dependency closure WITHOUT installing into the interpreter, then returns
22
+ * everything needed to pin a reproducible, hash-verified install:
23
+ *
24
+ * - the resolved top-level name + version,
25
+ * - the top-level artifact's hashes (sha512 SRI + sha256 hex), and
26
+ * - a fully-hashed `requirements.txt` body (`name==version --hash=sha256:<hex>`
27
+ * for every artifact in the closure) ready to feed back to
28
+ * `downloadPipPackage` / `pip install --require-hashes`. Engine: `pip
29
+ * download --dest <scratch> <spec>` downloads the spec + its resolved
30
+ * closure as wheels/sdists into a scratch dir (no install, no venv), each
31
+ * file is hashed, then the scratch dir is torn down. This is pip's own
32
+ * recipe for producing hashed requirements — `pip-tools` is NOT required.
33
+ * Contrast `resolveNpmPackagePin` (dlx/lockfile): same contract, npm engine
34
+ * (Arborist lockfile-only + pacote), emits a `package-lock.json`. The pip
35
+ * side emits a hashed `requirements.txt` because that — not a lockfile — is
36
+ * what `pip install --require-hashes` consumes. NOTE on the soak window:
37
+ * `resolveNpmPackagePin` applies a min-release-age cutoff via Arborist's
38
+ * `before` date. pip has no native release-age gate, so this generator does
39
+ * NOT enforce one — callers that need a soak must vet the resolved versions
40
+ * out of band. The spec itself remains the primary pin: `==<version>` (PyPI
41
+ * is immutable per version) or `@<full-sha>` (git is content-addressed).
42
+ */
43
+ /**
44
+ * Thrown when `pip download` produces no artifacts or a filename can't be
45
+ * parsed into a name + version.
46
+ */
47
+ var PipPackagePinError = class extends Error {
48
+ constructor(message, options) {
49
+ super(message, options);
50
+ this.name = "PipPackagePinError";
51
+ }
52
+ };
53
+ /**
54
+ * Normalize a PEP 503 distribution name: lowercase, runs of `_ . -` collapse to
55
+ * a single `-`. Wheel filenames use `_`; requirements/PyPI use `-`.
56
+ */
57
+ function normalizeDistName(name) {
58
+ return name.toLowerCase().replace(/[-_.]+/g, "-");
59
+ }
60
+ /**
61
+ * Parse `<name>-<version>` out of a wheel (`name-ver-...whl`) or sdist
62
+ * (`name-ver.tar.gz` / `name-ver.zip`) filename. Returns undefined when the
63
+ * shape isn't recognized.
64
+ */
65
+ function parseArtifactFilename(file) {
66
+ if (file.endsWith(".whl")) {
67
+ const parts = file.slice(0, -4).split("-");
68
+ if (parts.length < 2) return;
69
+ return {
70
+ name: normalizeDistName(parts[0]),
71
+ version: parts[1]
72
+ };
73
+ }
74
+ const ext = [
75
+ ".tar.gz",
76
+ ".tar.bz2",
77
+ ".zip",
78
+ ".tgz"
79
+ ].find((e) => file.endsWith(e));
80
+ if (!ext) return;
81
+ const stem = file.slice(0, -ext.length);
82
+ const dashIdx = stem.lastIndexOf("-");
83
+ if (dashIdx <= 0) return;
84
+ return {
85
+ name: normalizeDistName(stem.slice(0, dashIdx)),
86
+ version: stem.slice(dashIdx + 1)
87
+ };
88
+ }
89
+ /**
90
+ * Generate a vendorable, hash-pinned closure for a pip spec without installing
91
+ * it. Mirrors `resolveNpmPackagePin`. Throws `PipPackagePinError` on an empty
92
+ * download or an unparseable artifact filename.
93
+ */
94
+ async function resolvePipPackagePin(options) {
95
+ const { pythonBin, spec } = options;
96
+ if (typeof spec !== "string" || spec.length === 0) throw new PipPackagePinError("resolvePipPackagePin requires a package spec");
97
+ const scratch = options.scratchDir ?? node_path.default.join(node_os.default.tmpdir(), `socket-lib-pip-pin-${node_process.default.pid}-${Date.now()}`);
98
+ await require_fs_safe.safeMkdir(scratch, { recursive: true });
99
+ try {
100
+ await require_process_spawn_child.spawn(pythonBin, [
101
+ "-m",
102
+ "pip",
103
+ "download",
104
+ "--no-input",
105
+ "--quiet",
106
+ "--dest",
107
+ scratch,
108
+ spec
109
+ ], {
110
+ shell: require_constants_platform.WIN32,
111
+ stdio: "inherit"
112
+ });
113
+ const files = (await node_fs.promises.readdir(scratch)).filter((f) => f.endsWith(".whl") || f.endsWith(".tar.gz") || f.endsWith(".tar.bz2") || f.endsWith(".zip") || f.endsWith(".tgz"));
114
+ if (!files.length) throw new PipPackagePinError(`resolvePipPackagePin: pip download ${spec} produced no artifacts in ${scratch}`);
115
+ const artifacts = [];
116
+ const targetName = normalizeDistName(specDistName(spec));
117
+ let top;
118
+ for (const file of files.toSorted()) {
119
+ const hash = require_integrity.computeHashes(await node_fs.promises.readFile(node_path.default.join(scratch, file)));
120
+ const parsed = parseArtifactFilename(file);
121
+ if (!parsed) throw new PipPackagePinError(`resolvePipPackagePin: could not parse name/version from artifact ${file}`);
122
+ artifacts.push({
123
+ checksum: hash.checksum,
124
+ file,
125
+ name: parsed.name,
126
+ version: parsed.version
127
+ });
128
+ if (!top && parsed.name === targetName) top = {
129
+ hash,
130
+ name: parsed.name,
131
+ version: parsed.version
132
+ };
133
+ }
134
+ if (!top) {
135
+ const first = artifacts[0];
136
+ top = {
137
+ hash: require_integrity.computeHashes(await node_fs.promises.readFile(node_path.default.join(scratch, first.file))),
138
+ name: first.name,
139
+ version: first.version
140
+ };
141
+ }
142
+ const requirements = artifacts.map((a) => `${a.name}==${a.version} --hash=sha256:${a.checksum}`).join("\n") + "\n";
143
+ return {
144
+ artifacts,
145
+ hash: top.hash,
146
+ name: top.name,
147
+ requirements,
148
+ version: top.version
149
+ };
150
+ } finally {
151
+ try {
152
+ await require_fs_safe.safeDelete(scratch, { force: true });
153
+ } catch {}
154
+ }
155
+ }
156
+ /**
157
+ * Best-effort distribution name from a pip spec for matching the top-level
158
+ * artifact: strips a `==`/`>=`/etc. version and a `git+...#egg=<name>`
159
+ * fragment. Falls back to the raw spec when neither is present.
160
+ */
161
+ function specDistName(spec) {
162
+ const eggIdx = spec.indexOf("#egg=");
163
+ if (eggIdx !== -1) return spec.slice(eggIdx + 5);
164
+ const match = /^([A-Za-z0-9._-]+)\s*(?:@|[=<>!~]=?)/.exec(spec);
165
+ return match ? match[1] : spec;
166
+ }
167
+
168
+ //#endregion
169
+ exports.PipPackagePinError = PipPackagePinError;
170
+ exports.normalizeDistName = normalizeDistName;
171
+ exports.parseArtifactFilename = parseArtifactFilename;
172
+ exports.resolvePipPackagePin = resolvePipPackagePin;
173
+ exports.specDistName = specDistName;
@@ -0,0 +1,75 @@
1
+ /**
2
+ * @file `downloadPipPackage()` — the Python mirror of `dlx/package.ts`'s
3
+ * `downloadNpmPackage()`. Installs a pip spec into a content-addressed dlx
4
+ * directory (`pip install --target <dir>`), leaving the interpreter pristine:
5
+ * the package + its deps land in
6
+ * `~/.socket/_dlx/<cacheKey(spec)>/site-packages`, the exact analog of how
7
+ * `downloadNpmPackage` installs npm deps into
8
+ * `<dlxDir>/<hash>/node_modules/`. This is the bundle-safe / SEA-VFS-safe
9
+ * model:
10
+ *
11
+ * - No venv → no symlinks, no `pyvenv.cfg` with an absolute `home=`.
12
+ * - The target dir is plain files → embeddable in a SEA's VFS, relocatable at
13
+ * runtime.
14
+ * - One shared Python serves N isolated package dirs (true per-tool isolation
15
+ * without a venv) — exactly the `node_modules`-per-cacheKey shape. Run the
16
+ * installed tool with the package dir on `PYTHONPATH`: spawn(pythonBin,
17
+ * ['-m', '<module>', ...args], { env: { ...process.env, PYTHONPATH:
18
+ * packageDir } }) `spec` is a PyPI pin (`<pkg>==<version>`) or a git-SHA
19
+ * pin (`git+https://…@<sha>`). A TOCTOU lock guards concurrent installs; an
20
+ * existing non-empty package dir makes the call idempotent. Contrast
21
+ * `createPipVenv` (external-tools/from-pip-venv): venv with a
22
+ * `bin/<entryPoint>` — convenient but symlink + absolute-`home`-dependent,
23
+ * so DLX-only and NOT bundleable.
24
+ */
25
+ /**
26
+ * Install `spec` into a content-addressed dlx dir via `pip install --target`.
27
+ * Lock-guarded + idempotent. Throws on a failed pip install or if the lock
28
+ * can't be acquired after MAX_RETRIES. Mirrors `downloadNpmPackage`.
29
+ */
30
+ export declare function downloadPipPackage(options: DownloadPipPackageOptions, retryCount?: number): Promise<DownloadPipPackageResult>;
31
+ export declare function isAlreadyInstalled(packageDir: string): Promise<boolean>;
32
+ export declare function isStaleLock(pid: number): boolean;
33
+ export interface DownloadPipPackageOptions {
34
+ /**
35
+ * Optional sha256 hash (`sha256:<hex>` or bare `<hex>`) of the top-level
36
+ * artifact, the Python analog of `downloadNpmPackage`'s `hash`. When set, pip
37
+ * runs with `--require-hashes` and `--hash=sha256:<hex>`, which fails closed
38
+ * unless EVERY resolved artifact (the spec and its full dependency closure)
39
+ * carries a matching hash — so it only fits specs pip can hash-verify (a
40
+ * pinned `==<version>` or a direct wheel/sdist URL) with a hash-pinned
41
+ * closure. Omit it and rely on the immutable spec as the pin: `==<version>`
42
+ * (PyPI is immutable per version) or `@<full-sha>` (git is
43
+ * content-addressed).
44
+ */
45
+ readonly hash?: string | undefined;
46
+ /**
47
+ * Absolute path to the Python interpreter used to run pip (and later the
48
+ * tool). The interpreter is NOT modified — packages go to the dlx package
49
+ * dir. Typically from `resolvePython()`.
50
+ */
51
+ readonly pythonBin: string;
52
+ /**
53
+ * Pip install spec: `<pkg>==<version>` (PyPI exact pin) or
54
+ * `git+https://<url>@<sha>` (git-SHA pin).
55
+ */
56
+ readonly spec: string;
57
+ }
58
+ export interface DownloadPipPackageResult {
59
+ /**
60
+ * `true` when this call ran pip; `false` when an existing install was reused.
61
+ */
62
+ readonly installed: boolean;
63
+ /**
64
+ * Directory the package was installed into. Put this on `PYTHONPATH` to run
65
+ * the tool: `python -m <module>`. The Python analog of
66
+ * `DownloadNpmPackageResult.packageDir`.
67
+ */
68
+ readonly packageDir: string;
69
+ }
70
+ /**
71
+ * Content-addressed install dir for a spec:
72
+ * `~/.socket/_dlx/<cacheKey>/site-packages`. The Python analog of
73
+ * `downloadNpmPackage`'s `<hash>/node_modules`.
74
+ */
75
+ export declare function pipPackageDir(spec: string): string;
@@ -0,0 +1,139 @@
1
+ "use strict";
2
+ /* Socket Lib - Built with rolldown */
3
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4
+ const require_runtime = require('../../_virtual/_rolldown/runtime.js');
5
+ const require_constants_platform = require('../../constants/platform.js');
6
+ const require_process_spawn_child = require('../../process/spawn/child.js');
7
+ const require_paths_socket = require('../../paths/socket.js');
8
+ const require_fs_safe = require('../../fs/safe.js');
9
+ const require_dlx_cache = require('../../dlx/cache.js');
10
+ let node_fs = require("node:fs");
11
+ let node_path = require("node:path");
12
+ node_path = require_runtime.__toESM(node_path);
13
+ let node_process = require("node:process");
14
+ node_process = require_runtime.__toESM(node_process);
15
+
16
+ //#region src/external-tools/python/pip-install.ts
17
+ /**
18
+ * @file `downloadPipPackage()` — the Python mirror of `dlx/package.ts`'s
19
+ * `downloadNpmPackage()`. Installs a pip spec into a content-addressed dlx
20
+ * directory (`pip install --target <dir>`), leaving the interpreter pristine:
21
+ * the package + its deps land in
22
+ * `~/.socket/_dlx/<cacheKey(spec)>/site-packages`, the exact analog of how
23
+ * `downloadNpmPackage` installs npm deps into
24
+ * `<dlxDir>/<hash>/node_modules/`. This is the bundle-safe / SEA-VFS-safe
25
+ * model:
26
+ *
27
+ * - No venv → no symlinks, no `pyvenv.cfg` with an absolute `home=`.
28
+ * - The target dir is plain files → embeddable in a SEA's VFS, relocatable at
29
+ * runtime.
30
+ * - One shared Python serves N isolated package dirs (true per-tool isolation
31
+ * without a venv) — exactly the `node_modules`-per-cacheKey shape. Run the
32
+ * installed tool with the package dir on `PYTHONPATH`: spawn(pythonBin,
33
+ * ['-m', '<module>', ...args], { env: { ...process.env, PYTHONPATH:
34
+ * packageDir } }) `spec` is a PyPI pin (`<pkg>==<version>`) or a git-SHA
35
+ * pin (`git+https://…@<sha>`). A TOCTOU lock guards concurrent installs; an
36
+ * existing non-empty package dir makes the call idempotent. Contrast
37
+ * `createPipVenv` (external-tools/from-pip-venv): venv with a
38
+ * `bin/<entryPoint>` — convenient but symlink + absolute-`home`-dependent,
39
+ * so DLX-only and NOT bundleable.
40
+ */
41
+ const MAX_RETRIES = 3;
42
+ const WAIT_TICKS = 30;
43
+ /**
44
+ * Install `spec` into a content-addressed dlx dir via `pip install --target`.
45
+ * Lock-guarded + idempotent. Throws on a failed pip install or if the lock
46
+ * can't be acquired after MAX_RETRIES. Mirrors `downloadNpmPackage`.
47
+ */
48
+ async function downloadPipPackage(options, retryCount = 0) {
49
+ const { hash, pythonBin, spec } = options;
50
+ const packageDir = pipPackageDir(spec);
51
+ if (retryCount >= MAX_RETRIES) throw new Error(`downloadPipPackage: could not acquire install lock after ${MAX_RETRIES} retries for ${packageDir}; a peer may be stuck or the lock is stale — remove it and retry`);
52
+ if (await isAlreadyInstalled(packageDir)) return {
53
+ installed: false,
54
+ packageDir
55
+ };
56
+ const lockDir = node_path.default.dirname(packageDir);
57
+ await require_fs_safe.safeMkdir(lockDir, { recursive: true });
58
+ const lockFile = node_path.default.join(lockDir, ".installing");
59
+ try {
60
+ await node_fs.promises.writeFile(lockFile, node_process.default.pid.toString(), { flag: "wx" });
61
+ } catch (e) {
62
+ if (e.code !== "EEXIST") throw e;
63
+ let stale = false;
64
+ try {
65
+ stale = isStaleLock(Number.parseInt((await node_fs.promises.readFile(lockFile, "utf8")).trim(), 10));
66
+ } catch {
67
+ stale = true;
68
+ }
69
+ if (stale) {
70
+ await require_fs_safe.safeDelete(lockFile, { force: true });
71
+ return downloadPipPackage(options, retryCount + 1);
72
+ }
73
+ for (let i = 0; i < WAIT_TICKS; i += 1) {
74
+ await new Promise((resolve) => {
75
+ setTimeout(resolve, 1e3);
76
+ });
77
+ if (await isAlreadyInstalled(packageDir)) return {
78
+ installed: false,
79
+ packageDir
80
+ };
81
+ }
82
+ return downloadPipPackage(options, retryCount + 1);
83
+ }
84
+ try {
85
+ await require_fs_safe.safeMkdir(packageDir, { recursive: true });
86
+ const normalizedHash = hash ? hash.startsWith("sha256:") ? hash : `sha256:${hash}` : void 0;
87
+ await require_process_spawn_child.spawn(pythonBin, [
88
+ "-m",
89
+ "pip",
90
+ "install",
91
+ "--no-input",
92
+ "--quiet",
93
+ "--target",
94
+ packageDir,
95
+ ...normalizedHash ? ["--require-hashes", `--hash=${normalizedHash}`] : [],
96
+ spec
97
+ ], {
98
+ shell: require_constants_platform.WIN32,
99
+ stdio: "inherit"
100
+ });
101
+ if (!await isAlreadyInstalled(packageDir)) throw new Error(`downloadPipPackage: pip install --target ${packageDir} ${spec} reported success but the target is still empty`);
102
+ return {
103
+ installed: true,
104
+ packageDir
105
+ };
106
+ } finally {
107
+ await require_fs_safe.safeDelete(lockFile, { force: true });
108
+ }
109
+ }
110
+ async function isAlreadyInstalled(packageDir) {
111
+ try {
112
+ return (await node_fs.promises.readdir(packageDir)).length > 0;
113
+ } catch {
114
+ return false;
115
+ }
116
+ }
117
+ function isStaleLock(pid) {
118
+ if (Number.isNaN(pid) || pid <= 0) return true;
119
+ try {
120
+ node_process.default.kill(pid, 0);
121
+ return false;
122
+ } catch (e) {
123
+ return e.code !== "EPERM";
124
+ }
125
+ }
126
+ /**
127
+ * Content-addressed install dir for a spec:
128
+ * `~/.socket/_dlx/<cacheKey>/site-packages`. The Python analog of
129
+ * `downloadNpmPackage`'s `<hash>/node_modules`.
130
+ */
131
+ function pipPackageDir(spec) {
132
+ return node_path.default.join(require_paths_socket.getSocketDlxDir(), require_dlx_cache.generateCacheKey(spec), "site-packages");
133
+ }
134
+
135
+ //#endregion
136
+ exports.downloadPipPackage = downloadPipPackage;
137
+ exports.isAlreadyInstalled = isAlreadyInstalled;
138
+ exports.isStaleLock = isStaleLock;
139
+ exports.pipPackageDir = pipPackageDir;
@@ -0,0 +1,42 @@
1
+ /**
2
+ * @file `resolvePython()` — CPython resolution entry point. Tries each source
3
+ * in order:
4
+ *
5
+ * 1. PATH — `python3` / `python` on the system PATH.
6
+ * 2. download — python-build-standalone CPython into the DLX cache (only when
7
+ * `downloadIfMissing` is passed). Returns `undefined` if all enabled
8
+ * sources miss. Memoized per option-shape so repeated calls in one process
9
+ * don't re-probe / re-download. NOTE: unlike the JRE / removed-uv
10
+ * resolvers there is no VFS tier here — a CPython runtime is not embedded
11
+ * in the smol Node binary. Add a `from-vfs` tier here if that changes.
12
+ */
13
+ import type { BinaryDownloader } from '../from-download';
14
+ import type { HashSpec } from '../../integrity';
15
+ import type { ResolvedPython } from './types';
16
+ export interface ResolvePythonOptions {
17
+ /**
18
+ * Prefer a downloaded python-build-standalone over a PATH interpreter. Use
19
+ * when you need an exact, reproducible CPython (the host `python3` may be the
20
+ * wrong version). Default false: PATH wins when present.
21
+ */
22
+ preferDownload?: boolean | undefined;
23
+ /**
24
+ * When set, fall back to downloading python-build-standalone if no PATH
25
+ * interpreter is found (or always, with `preferDownload`).
26
+ */
27
+ downloadIfMissing?: {
28
+ version: string;
29
+ tag: string;
30
+ /**
31
+ * Omit to auto-detect the current host via {@link getPythonArch}.
32
+ */
33
+ arch?: string | undefined;
34
+ integrity?: HashSpec | undefined;
35
+ cacheDir?: string | undefined;
36
+ downloader?: BinaryDownloader | undefined;
37
+ } | undefined;
38
+ }
39
+ export declare function cacheKey(opts: ResolvePythonOptions | undefined): string;
40
+ export declare function doResolvePython(opts?: ResolvePythonOptions | undefined): Promise<ResolvedPython | undefined>;
41
+ export declare function resetPythonResolution(): void;
42
+ export declare function resolvePython(opts?: ResolvePythonOptions | undefined): Promise<ResolvedPython | undefined>;
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ /* Socket Lib - Built with rolldown */
3
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4
+ const require_primordials_map_set = require('../../primordials/map-set.js');
5
+ const require_external_tools_python_asset_names = require('./asset-names.js');
6
+ const require_external_tools_python_from_download = require('./from-download.js');
7
+ const require_external_tools_python_from_path = require('./from-path.js');
8
+
9
+ //#region src/external-tools/python/resolve.ts
10
+ /**
11
+ * @file `resolvePython()` — CPython resolution entry point. Tries each source
12
+ * in order:
13
+ *
14
+ * 1. PATH — `python3` / `python` on the system PATH.
15
+ * 2. download — python-build-standalone CPython into the DLX cache (only when
16
+ * `downloadIfMissing` is passed). Returns `undefined` if all enabled
17
+ * sources miss. Memoized per option-shape so repeated calls in one process
18
+ * don't re-probe / re-download. NOTE: unlike the JRE / removed-uv
19
+ * resolvers there is no VFS tier here — a CPython runtime is not embedded
20
+ * in the smol Node binary. Add a `from-vfs` tier here if that changes.
21
+ */
22
+ const resolutionCache = new require_primordials_map_set.MapCtor();
23
+ function cacheKey(opts) {
24
+ const prefer = opts?.preferDownload ? "prefer:" : "";
25
+ if (!opts?.downloadIfMissing) return `${prefer}local-only`;
26
+ const { cacheDir, integrity, tag, version } = opts.downloadIfMissing;
27
+ return `${prefer}dl:${version}:${tag}:${opts.downloadIfMissing.arch ?? require_external_tools_python_asset_names.getPythonArch() ?? "unknown"}:${typeof integrity === "string" ? integrity : integrity ? `${integrity.type}:${integrity.value}` : ""}:${cacheDir ?? ""}`;
28
+ }
29
+ async function doResolvePython(opts) {
30
+ const dl = opts?.downloadIfMissing;
31
+ if (opts?.preferDownload && dl) {
32
+ const fromDownload = await require_external_tools_python_from_download.pythonFromDownload(dl);
33
+ if (fromDownload) return fromDownload;
34
+ }
35
+ const fromPath = await require_external_tools_python_from_path.pythonFromPath();
36
+ if (fromPath) return fromPath;
37
+ if (dl) return require_external_tools_python_from_download.pythonFromDownload(dl);
38
+ }
39
+ /* c8 ignore start - test-only escape hatch. */
40
+ function resetPythonResolution() {
41
+ resolutionCache.clear();
42
+ }
43
+ /* c8 ignore stop */
44
+ function resolvePython(opts) {
45
+ const key = cacheKey(opts);
46
+ let cached = resolutionCache.get(key);
47
+ if (!cached) {
48
+ cached = doResolvePython(opts);
49
+ resolutionCache.set(key, cached);
50
+ }
51
+ return cached;
52
+ }
53
+
54
+ //#endregion
55
+ exports.cacheKey = cacheKey;
56
+ exports.doResolvePython = doResolvePython;
57
+ exports.resetPythonResolution = resetPythonResolution;
58
+ exports.resolvePython = resolvePython;
@@ -0,0 +1,49 @@
1
+ /**
2
+ * @file Types for the python-build-standalone DLX resolver. A "resolved python"
3
+ * is an absolute path to a CPython interpreter plus the tier that found it.
4
+ */
5
+ import type { ResolvedToolIntegrity } from '../from-download';
6
+ /**
7
+ * Which resolver tier produced the interpreter.
8
+ *
9
+ * - `path` — an interpreter already on PATH (system / pyenv / etc.).
10
+ * - `download` — a python-build-standalone CPython fetched into the DLX cache.
11
+ */
12
+ export type PythonSource = 'download' | 'path';
13
+ export interface ResolvedPython {
14
+ /**
15
+ * Absolute path to the `python3` (or `python.exe`) executable.
16
+ */
17
+ readonly path: string;
18
+ /**
19
+ * Which resolver tier found this interpreter.
20
+ */
21
+ readonly source: PythonSource;
22
+ /**
23
+ * SRI integrity of the downloaded archive. Set only when `source ===
24
+ * 'download'`; the PATH tier references an interpreter already on disk and
25
+ * computes no hash. See {@link ResolvedToolIntegrity}.
26
+ */
27
+ readonly integrity?: ResolvedToolIntegrity | undefined;
28
+ }
29
+ /**
30
+ * Pin describing which python-build-standalone build to fetch. The caller
31
+ * supplies these from its own `external-tools.json` (or `bundle-tools.json`) —
32
+ * the library does not embed a default version, so each consumer controls its
33
+ * own pin + soak.
34
+ */
35
+ export interface PythonBuildPin {
36
+ /**
37
+ * CPython version, e.g. `3.11.14`.
38
+ */
39
+ readonly version: string;
40
+ /**
41
+ * Python-build-standalone release tag, e.g. `20260203`.
42
+ */
43
+ readonly tag: string;
44
+ /**
45
+ * Optional per-platform integrity (hex SHA-256 or SRI). Keyed by the asset
46
+ * filename so the resolver can verify the exact tarball it downloads.
47
+ */
48
+ readonly integrity?: string | undefined;
49
+ }
@@ -17,7 +17,7 @@ const require_smol_vfs = require('../../smol/vfs.js');
17
17
  */
18
18
  const SBT_VFS_KEY = "sbt-launch.jar";
19
19
  async function sbtFromVfs() {
20
- const vfs = /* @__PURE__ */ require_smol_vfs.getSmolVfs();
20
+ const vfs = require_smol_vfs.getSmolVfs();
21
21
  if (!vfs) return;
22
22
  /* c8 ignore start - smol Node binary only. */
23
23
  if (!vfs.has("sbt-launch.jar")) return;
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  /* Socket Lib - Built with rolldown */
3
3
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4
+ const require_primordials_map_set = require('../../primordials/map-set.js');
4
5
  const require_external_tools_sbt_from_download = require('./from-download.js');
5
6
  const require_external_tools_sbt_from_path = require('./from-path.js');
6
7
  const require_external_tools_sbt_from_vfs = require('./from-vfs.js');
@@ -18,7 +19,7 @@ const require_external_tools_sbt_from_vfs = require('./from-vfs.js');
18
19
  * download-sourced SBT is the `sbt` script, which finds its own JRE.
19
20
  * Memoized per option-shape.
20
21
  */
21
- const resolutionCache = /* @__PURE__ */ new Map();
22
+ const resolutionCache = new require_primordials_map_set.MapCtor();
22
23
  function cacheKey(opts) {
23
24
  if (!opts?.downloadIfMissing) return "local-only";
24
25
  const { cacheDir, integrity, version } = opts.downloadIfMissing;
@@ -28,5 +28,5 @@ export interface ResolvedSbt {
28
28
  /**
29
29
  * See {@link ResolvedToolIntegrity}.
30
30
  */
31
- readonly integrity?: ResolvedToolIntegrity;
31
+ readonly integrity?: ResolvedToolIntegrity | undefined;
32
32
  }
@@ -0,0 +1,24 @@
1
+ /**
2
+ * @file `skillspectorFromDlx()` — DLX-venv tier of SkillSpector resolution.
3
+ * Creates a single-purpose venv under `~/.socket/_dlx/skillspector/<sha>/`
4
+ * and pip-installs the pinned git SHA. Returns `undefined` when:
5
+ *
6
+ * - No Python interpreter is on PATH (host lacks Python 3.12+).
7
+ * - The venv-create or pip-install command fails. Idempotent: hits the cached
8
+ * venv when its `skillspector` entry-point already exists.
9
+ */
10
+ import type { ResolvedSkillSpector } from './types';
11
+ export interface SkillSpectorFromDlxOptions {
12
+ /**
13
+ * Pinned upstream SHA. Combined with the canonical NVIDIA/skillspector repo
14
+ * URL to form the pip-install spec
15
+ * `git+https://github.com/NVIDIA/skillspector.git@<sha>`.
16
+ */
17
+ readonly sha: string;
18
+ /**
19
+ * Cache directory override. Defaults to `getSocketDlxDir() +
20
+ * 'skillspector/<sha>'`. Tests pass a tmpdir.
21
+ */
22
+ readonly cacheDir?: string | undefined;
23
+ }
24
+ export declare function skillspectorFromDlx(opts: SkillSpectorFromDlxOptions): Promise<ResolvedSkillSpector | undefined>;
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ /* Socket Lib - Built with rolldown */
3
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4
+ const require_runtime = require('../../_virtual/_rolldown/runtime.js');
5
+ const require_paths_socket = require('../../paths/socket.js');
6
+ const require_external_tools_from_pip_venv = require('../from-pip-venv.js');
7
+ let node_path = require("node:path");
8
+ node_path = require_runtime.__toESM(node_path);
9
+
10
+ //#region src/external-tools/skillspector/from-dlx.ts
11
+ /**
12
+ * @file `skillspectorFromDlx()` — DLX-venv tier of SkillSpector resolution.
13
+ * Creates a single-purpose venv under `~/.socket/_dlx/skillspector/<sha>/`
14
+ * and pip-installs the pinned git SHA. Returns `undefined` when:
15
+ *
16
+ * - No Python interpreter is on PATH (host lacks Python 3.12+).
17
+ * - The venv-create or pip-install command fails. Idempotent: hits the cached
18
+ * venv when its `skillspector` entry-point already exists.
19
+ */
20
+ const UPSTREAM_REPO = "https://github.com/NVIDIA/skillspector.git";
21
+ async function skillspectorFromDlx(opts) {
22
+ const { sha } = opts;
23
+ if (!sha) return;
24
+ const cacheDir = opts.cacheDir ?? node_path.default.join(require_paths_socket.getSocketDlxDir(), "skillspector", sha);
25
+ const installSpec = `git+${UPSTREAM_REPO}@${sha}`;
26
+ try {
27
+ return {
28
+ path: (await require_external_tools_from_pip_venv.createPipVenv({
29
+ cacheDir,
30
+ entryPoint: "skillspector",
31
+ installSpec
32
+ })).entryPointPath,
33
+ source: "dlx"
34
+ };
35
+ } catch {
36
+ return;
37
+ }
38
+ }
39
+
40
+ //#endregion
41
+ exports.skillspectorFromDlx = skillspectorFromDlx;
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @file `skillspectorFromPath()` — `which skillspector` lookup. Reports
3
+ * `source: 'pipx'` when the resolved path lives under a `pipx/venvs/`
4
+ * directory (the dev's `pipx install skillspector` path); reports `source:
5
+ * 'path'` otherwise (a one-off binary on PATH).
6
+ */
7
+ import type { ResolvedSkillSpector } from './types';
8
+ export declare function skillspectorFromPath(): Promise<ResolvedSkillSpector | undefined>;