@bman654/clodex 2.18.8 → 2.18.10

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.
package/dist/cli.js CHANGED
@@ -346,7 +346,7 @@ import { join } from "path";
346
346
  // package.json
347
347
  var package_default = {
348
348
  name: "@bman654/clodex",
349
- version: "2.18.8",
349
+ version: "2.18.10",
350
350
  publishConfig: {
351
351
  access: "public"
352
352
  },
@@ -3439,7 +3439,7 @@ function savedStopsAfter(current, assignments) {
3439
3439
  }
3440
3440
 
3441
3441
  // src/patch-transforms.ts
3442
- var PATCH_TRANSFORMS_VERSION = 14;
3442
+ var PATCH_TRANSFORMS_VERSION = 15;
3443
3443
  var NATIVE_EFFORT_LEVELS = ["low", "medium", "high", "xhigh", "max"];
3444
3444
  var BASE_EFFORT_LEVELS = ["low", "medium", "high"];
3445
3445
  function projectNativeEffort(effort) {
@@ -3842,14 +3842,14 @@ function applyClodexPatches(source, config) {
3842
3842
  }
3843
3843
  return -1;
3844
3844
  };
3845
- const passthroughSites = source.includes(marker) ? 1 : (source.match(/\)return process\.env;let [\w$]+=\{/g) ?? []).length;
3845
+ const passthroughSites = source.includes(marker) ? 1 : (source.match(/\)return process\.env;let (?:(?:[^;{}]|\{[^;{}]*\})*?,)??[\w$]+=\{/g) ?? []).length;
3846
3846
  if (passthroughSites !== 1) {
3847
3847
  log13("FAIL", patchName, "child env passthrough appears " + passthroughSites + " times (expected 1)");
3848
3848
  fail("clodex patch: required patch failed: " + patchName);
3849
3849
  }
3850
3850
  applyOnce(
3851
3851
  patchName,
3852
- /(function [\w$]+\(\)\{)(let[ {[](?:[^;{}]|\{[^;{}]*\})*?(?:\{[^;{}]*)?(?:getAgentProxyEnv|[\w$]+\(process\.env\.CLAUDE_CODE_REMOTE\)\?)(?:(?!\}\s*function )[\s\S])*?\)return process\.env;let ([\w$]+)=\{(?:(?!\}\s*function )[\s\S])*?return \3)(\})/,
3852
+ /(function [\w$]+\(\)\{)(let[ {[](?:[^;{}]|\{[^;{}]*\})*?(?:\{[^;{}]*)?(?:getAgentProxyEnv|[\w$]+\(process\.env\.CLAUDE_CODE_REMOTE\)\?)(?:(?!\}\s*function )[\s\S])*?\)return process\.env;let (?:(?:[^;{}]|\{[^;{}]*\})*?,)??([\w$]+)=\{(?:(?!\}\s*function )[\s\S])*?return \3)(\})/,
3853
3853
  (match, head, body, _copyVar, tail) => {
3854
3854
  const at = js.indexOf(match);
3855
3855
  const closingBrace = at < 0 ? -1 : blockEndIndex(js, at + head.length - 1);
@@ -19906,7 +19906,7 @@ var CA_KEY_FILE = "clodex-ca-key.pem";
19906
19906
  var SERVER_CERT_FILE = "api.anthropic.com.pem";
19907
19907
  var SERVER_KEY_FILE = "api.anthropic.com-key.pem";
19908
19908
  var CERT_VERSION_FILE = "version";
19909
- var CERT_VERSION = "1\n";
19909
+ var CERT_VERSION = "2\n";
19910
19910
  function serialNumber() {
19911
19911
  const bytes = randomBytes2(16);
19912
19912
  bytes[0] &= 127;
@@ -19931,6 +19931,31 @@ function writePublic(path, value) {
19931
19931
  writeFileSync7(path, value, { encoding: "utf8", mode: 420 });
19932
19932
  chmodSync5(path, 420);
19933
19933
  }
19934
+ function generateServerCertificate(paths, caCert, caKey) {
19935
+ const caKeyId = caCert.getExtension("subjectKeyIdentifier")?.subjectKeyIdentifier;
19936
+ const serverKeys = forge.pki.rsa.generateKeyPair(2048);
19937
+ const serverCert = forge.pki.createCertificate();
19938
+ serverCert.publicKey = serverKeys.publicKey;
19939
+ serverCert.serialNumber = serialNumber();
19940
+ serverCert.validity.notBefore = new Date(Date.now() - 24 * 60 * 60 * 1e3);
19941
+ serverCert.validity.notAfter = new Date(Date.now() + 825 * 24 * 60 * 60 * 1e3);
19942
+ serverCert.setSubject([{ name: "commonName", value: "api.anthropic.com" }]);
19943
+ serverCert.setIssuer(caCert.subject.attributes);
19944
+ serverCert.setExtensions([
19945
+ { name: "basicConstraints", cA: false, critical: true },
19946
+ { name: "keyUsage", digitalSignature: true, keyEncipherment: true, critical: true },
19947
+ { name: "extKeyUsage", serverAuth: true },
19948
+ { name: "subjectAltName", altNames: [{ type: 2, value: "api.anthropic.com" }] },
19949
+ { name: "subjectKeyIdentifier" },
19950
+ {
19951
+ name: "authorityKeyIdentifier",
19952
+ keyIdentifier: caKeyId ? forge.util.hexToBytes(caKeyId) : caCert.generateSubjectKeyIdentifier().getBytes()
19953
+ }
19954
+ ]);
19955
+ serverCert.sign(caKey, forge.md.sha256.create());
19956
+ writePrivate(paths.serverKey, forge.pki.privateKeyToPem(serverKeys.privateKey));
19957
+ writePublic(paths.serverCert, forge.pki.certificateToPem(serverCert));
19958
+ }
19934
19959
  function generateCertificates(paths) {
19935
19960
  mkdirSync7(paths.dir, { recursive: true, mode: 448 });
19936
19961
  chmodSync5(paths.dir, 448);
@@ -19949,35 +19974,37 @@ function generateCertificates(paths) {
19949
19974
  { name: "subjectKeyIdentifier" }
19950
19975
  ]);
19951
19976
  caCert.sign(caKeys.privateKey, forge.md.sha256.create());
19952
- const serverKeys = forge.pki.rsa.generateKeyPair(2048);
19953
- const serverCert = forge.pki.createCertificate();
19954
- serverCert.publicKey = serverKeys.publicKey;
19955
- serverCert.serialNumber = serialNumber();
19956
- serverCert.validity.notBefore = new Date(Date.now() - 24 * 60 * 60 * 1e3);
19957
- serverCert.validity.notAfter = new Date(Date.now() + 825 * 24 * 60 * 60 * 1e3);
19958
- serverCert.setSubject([{ name: "commonName", value: "api.anthropic.com" }]);
19959
- serverCert.setIssuer(caCert.subject.attributes);
19960
- serverCert.setExtensions([
19961
- { name: "basicConstraints", cA: false, critical: true },
19962
- { name: "keyUsage", digitalSignature: true, keyEncipherment: true, critical: true },
19963
- { name: "extKeyUsage", serverAuth: true },
19964
- { name: "subjectAltName", altNames: [{ type: 2, value: "api.anthropic.com" }] },
19965
- { name: "subjectKeyIdentifier" }
19966
- ]);
19967
- serverCert.sign(caKeys.privateKey, forge.md.sha256.create());
19968
19977
  writePrivate(paths.caKey, forge.pki.privateKeyToPem(caKeys.privateKey));
19969
19978
  writePublic(paths.caCert, forge.pki.certificateToPem(caCert));
19970
- writePrivate(paths.serverKey, forge.pki.privateKeyToPem(serverKeys.privateKey));
19971
- writePublic(paths.serverCert, forge.pki.certificateToPem(serverCert));
19979
+ generateServerCertificate(paths, caCert, caKeys.privateKey);
19972
19980
  writePublic(paths.version, CERT_VERSION);
19973
19981
  }
19982
+ var RENEWAL_BUFFER_MS = 7 * 24 * 60 * 60 * 1e3;
19983
+ function staysValid(cert, now) {
19984
+ return cert.validity.notBefore.getTime() <= now && cert.validity.notAfter.getTime() > now + RENEWAL_BUFFER_MS;
19985
+ }
19986
+ function keyMatchesCertificate(cert, key) {
19987
+ return cert.publicKey.n.compareTo(key.n) === 0;
19988
+ }
19989
+ function loadCurrentCa(paths) {
19990
+ try {
19991
+ const caCert = forge.pki.certificateFromPem(readFileSync12(paths.caCert, "utf8"));
19992
+ const caKey = forge.pki.privateKeyFromPem(readFileSync12(paths.caKey, "utf8"));
19993
+ if (!staysValid(caCert, Date.now())) return null;
19994
+ if (!caCert.verify(caCert)) return null;
19995
+ if (!keyMatchesCertificate(caCert, caKey)) return null;
19996
+ return { caCert, caKey };
19997
+ } catch {
19998
+ return null;
19999
+ }
20000
+ }
19974
20001
  function storedCertificatesAreCurrent(paths) {
19975
20002
  try {
19976
20003
  const ca = forge.pki.certificateFromPem(readFileSync12(paths.caCert, "utf8"));
19977
20004
  const server = forge.pki.certificateFromPem(readFileSync12(paths.serverCert, "utf8"));
20005
+ const serverKey = forge.pki.privateKeyFromPem(readFileSync12(paths.serverKey, "utf8"));
19978
20006
  const now = Date.now();
19979
- const renewalBuffer = 7 * 24 * 60 * 60 * 1e3;
19980
- return ca.validity.notBefore.getTime() <= now && ca.validity.notAfter.getTime() > now + renewalBuffer && server.validity.notBefore.getTime() <= now && server.validity.notAfter.getTime() > now + renewalBuffer && ca.verify(ca) && ca.verify(server);
20007
+ return staysValid(ca, now) && staysValid(server, now) && ca.verify(ca) && ca.verify(server) && keyMatchesCertificate(server, serverKey);
19981
20008
  } catch {
19982
20009
  return false;
19983
20010
  }
@@ -19986,7 +20013,15 @@ function ensureHttpProxyCertificates() {
19986
20013
  const paths = certPaths();
19987
20014
  const required = [paths.caCert, paths.caKey, paths.serverCert, paths.serverKey, paths.version];
19988
20015
  const current = required.every(existsSync6) && readFileSync12(paths.version, "utf8") === CERT_VERSION && storedCertificatesAreCurrent(paths);
19989
- if (!current) generateCertificates(paths);
20016
+ if (!current) {
20017
+ const ca = loadCurrentCa(paths);
20018
+ if (ca) {
20019
+ generateServerCertificate(paths, ca.caCert, ca.caKey);
20020
+ writePublic(paths.version, CERT_VERSION);
20021
+ } else {
20022
+ generateCertificates(paths);
20023
+ }
20024
+ }
19990
20025
  return {
19991
20026
  caCertPath: paths.caCert,
19992
20027
  caCert: readFileSync12(paths.caCert, "utf8"),