@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 +61 -26
- package/dist/cli.js.map +1 -1
- package/package.json +1 -1
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.
|
|
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 =
|
|
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 = "
|
|
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
|
-
|
|
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
|
-
|
|
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)
|
|
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"),
|