claude-use 5.1.0 → 5.2.0
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/README.md +2 -0
- package/dist/cli.cjs +2813 -19202
- package/dist/index.cjs +288 -58
- package/dist/index.mjs +286 -56
- package/dist/types/frontdoor/connect.d.ts +3 -3
- package/dist/types/frontdoor/x509.d.ts +11 -0
- package/dist/types/launcher/ports.d.ts +2 -0
- package/dist/types/paths.d.ts +6 -0
- package/package.json +1 -3
package/dist/index.cjs
CHANGED
|
@@ -1828,12 +1828,283 @@ function recoveryDiagnostics(recovery, identity) {
|
|
|
1828
1828
|
}
|
|
1829
1829
|
|
|
1830
1830
|
// src/frontdoor/connect.ts
|
|
1831
|
+
var import_node_crypto3 = require("node:crypto");
|
|
1831
1832
|
var fs = __toESM(require("node:fs"), 1);
|
|
1832
1833
|
var http = __toESM(require("node:http"), 1);
|
|
1833
1834
|
var https = __toESM(require("node:https"), 1);
|
|
1834
|
-
var
|
|
1835
|
+
var net2 = __toESM(require("node:net"), 1);
|
|
1835
1836
|
var tls = __toESM(require("node:tls"), 1);
|
|
1836
|
-
|
|
1837
|
+
|
|
1838
|
+
// src/frontdoor/x509.ts
|
|
1839
|
+
var import_node_crypto2 = require("node:crypto");
|
|
1840
|
+
var import_node_net = __toESM(require("node:net"), 1);
|
|
1841
|
+
var TAG_BOOLEAN = 1;
|
|
1842
|
+
var TAG_INTEGER = 2;
|
|
1843
|
+
var TAG_BIT_STRING = 3;
|
|
1844
|
+
var TAG_OCTET_STRING = 4;
|
|
1845
|
+
var TAG_NULL = 5;
|
|
1846
|
+
var TAG_OID = 6;
|
|
1847
|
+
var TAG_UTF8_STRING = 12;
|
|
1848
|
+
var TAG_UTC_TIME = 23;
|
|
1849
|
+
var TAG_GENERALIZED_TIME = 24;
|
|
1850
|
+
var TAG_SEQUENCE = 48;
|
|
1851
|
+
var TAG_SET = 49;
|
|
1852
|
+
var TAG_VERSION = 160;
|
|
1853
|
+
var TAG_EXTENSIONS = 163;
|
|
1854
|
+
var TAG_GENERAL_NAME_DNS = 130;
|
|
1855
|
+
var TAG_GENERAL_NAME_IP = 135;
|
|
1856
|
+
var TAG_KEY_IDENTIFIER = 128;
|
|
1857
|
+
var OID_COMMON_NAME = "2.5.4.3";
|
|
1858
|
+
var OID_SHA256_WITH_RSA = "1.2.840.113549.1.1.11";
|
|
1859
|
+
var OID_SUBJECT_KEY_IDENTIFIER = "2.5.29.14";
|
|
1860
|
+
var OID_KEY_USAGE = "2.5.29.15";
|
|
1861
|
+
var OID_SUBJECT_ALT_NAME = "2.5.29.17";
|
|
1862
|
+
var OID_BASIC_CONSTRAINTS = "2.5.29.19";
|
|
1863
|
+
var OID_AUTHORITY_KEY_IDENTIFIER = "2.5.29.35";
|
|
1864
|
+
var OID_EXT_KEY_USAGE = "2.5.29.37";
|
|
1865
|
+
var OID_SERVER_AUTH = "1.3.6.1.5.5.7.3.1";
|
|
1866
|
+
var VERSION_3 = 2;
|
|
1867
|
+
var SERIAL_NUMBER_BYTES = 16;
|
|
1868
|
+
var RSA_MODULUS_BITS = 2048;
|
|
1869
|
+
var BITS_PER_BYTE = 8;
|
|
1870
|
+
var BYTE_MASK = 255;
|
|
1871
|
+
var HIGH_BIT = 128;
|
|
1872
|
+
var BASE_128_PAYLOAD_MASK = 127;
|
|
1873
|
+
var FIRST_ARC_WEIGHT = 40;
|
|
1874
|
+
var SHORT_FORM_MAX_LENGTH = 127;
|
|
1875
|
+
var MS_PER_SECOND = 1e3;
|
|
1876
|
+
var UTC_TIME_LAST_YEAR = 2049;
|
|
1877
|
+
var YEAR_DIGITS = 4;
|
|
1878
|
+
var TWO_DIGIT_YEAR_DIGITS = 2;
|
|
1879
|
+
var COMPACT_TIME_DIGITS = 14;
|
|
1880
|
+
var KEY_USAGE = { digitalSignature: 0, keyEncipherment: 2, keyCertSign: 5, cRLSign: 6 };
|
|
1881
|
+
function tlv(tag, content) {
|
|
1882
|
+
const length = content.length;
|
|
1883
|
+
if (length <= SHORT_FORM_MAX_LENGTH) {
|
|
1884
|
+
return Buffer.concat([Buffer.from([tag, length]), content]);
|
|
1885
|
+
}
|
|
1886
|
+
const lengthBytes = [];
|
|
1887
|
+
for (let remaining = length; remaining > 0; remaining = Math.floor(remaining / (BYTE_MASK + 1))) {
|
|
1888
|
+
lengthBytes.unshift(remaining & BYTE_MASK);
|
|
1889
|
+
}
|
|
1890
|
+
return Buffer.concat([Buffer.from([tag, HIGH_BIT | lengthBytes.length, ...lengthBytes]), content]);
|
|
1891
|
+
}
|
|
1892
|
+
function sequence(...parts) {
|
|
1893
|
+
return tlv(TAG_SEQUENCE, Buffer.concat(parts));
|
|
1894
|
+
}
|
|
1895
|
+
function unsignedInteger(magnitude) {
|
|
1896
|
+
let start = 0;
|
|
1897
|
+
while (start < magnitude.length - 1 && magnitude[start] === 0) {
|
|
1898
|
+
start += 1;
|
|
1899
|
+
}
|
|
1900
|
+
const trimmed = magnitude.subarray(start);
|
|
1901
|
+
const first = trimmed[0];
|
|
1902
|
+
const padded = first !== void 0 && (first & HIGH_BIT) !== 0 ? Buffer.concat([Buffer.from([0]), trimmed]) : Buffer.from(trimmed);
|
|
1903
|
+
return tlv(TAG_INTEGER, padded);
|
|
1904
|
+
}
|
|
1905
|
+
function smallInteger(value) {
|
|
1906
|
+
return unsignedInteger(Buffer.from([value]));
|
|
1907
|
+
}
|
|
1908
|
+
function oid(dotted) {
|
|
1909
|
+
const arcs = dotted.split(".").map(Number);
|
|
1910
|
+
const [first, second, ...rest] = arcs;
|
|
1911
|
+
if (first === void 0 || second === void 0 || arcs.some((arc) => !Number.isInteger(arc) || arc < 0)) {
|
|
1912
|
+
throw new Error(`invalid object identifier ${dotted}`);
|
|
1913
|
+
}
|
|
1914
|
+
const encoded = [];
|
|
1915
|
+
for (const arc of [first * FIRST_ARC_WEIGHT + second, ...rest]) {
|
|
1916
|
+
const groups = [arc & BASE_128_PAYLOAD_MASK];
|
|
1917
|
+
for (let remaining = Math.floor(arc / HIGH_BIT); remaining > 0; remaining = Math.floor(remaining / HIGH_BIT)) {
|
|
1918
|
+
groups.unshift(remaining & BASE_128_PAYLOAD_MASK | HIGH_BIT);
|
|
1919
|
+
}
|
|
1920
|
+
encoded.push(...groups);
|
|
1921
|
+
}
|
|
1922
|
+
return tlv(TAG_OID, Buffer.from(encoded));
|
|
1923
|
+
}
|
|
1924
|
+
function boolean(value) {
|
|
1925
|
+
return tlv(TAG_BOOLEAN, Buffer.from([value ? BYTE_MASK : 0]));
|
|
1926
|
+
}
|
|
1927
|
+
function octetString(content) {
|
|
1928
|
+
return tlv(TAG_OCTET_STRING, content);
|
|
1929
|
+
}
|
|
1930
|
+
function wholeBitString(content) {
|
|
1931
|
+
return tlv(TAG_BIT_STRING, Buffer.concat([Buffer.from([0]), content]));
|
|
1932
|
+
}
|
|
1933
|
+
function time(instant) {
|
|
1934
|
+
const iso = new Date(Math.floor(instant.getTime() / MS_PER_SECOND) * MS_PER_SECOND).toISOString();
|
|
1935
|
+
const compact = `${iso.replace(/[-:T]/g, "").slice(0, COMPACT_TIME_DIGITS)}Z`;
|
|
1936
|
+
if (instant.getUTCFullYear() > UTC_TIME_LAST_YEAR) {
|
|
1937
|
+
return tlv(TAG_GENERALIZED_TIME, Buffer.from(compact, "ascii"));
|
|
1938
|
+
}
|
|
1939
|
+
return tlv(TAG_UTC_TIME, Buffer.from(compact.slice(YEAR_DIGITS - TWO_DIGIT_YEAR_DIGITS), "ascii"));
|
|
1940
|
+
}
|
|
1941
|
+
function commonNameOnly(commonName) {
|
|
1942
|
+
return sequence(tlv(TAG_SET, sequence(oid(OID_COMMON_NAME), tlv(TAG_UTF8_STRING, Buffer.from(commonName, "utf8")))));
|
|
1943
|
+
}
|
|
1944
|
+
var SIGNATURE_ALGORITHM = sequence(oid(OID_SHA256_WITH_RSA), tlv(TAG_NULL, Buffer.alloc(0)));
|
|
1945
|
+
function extension(extensionOid, critical, value) {
|
|
1946
|
+
return sequence(oid(extensionOid), ...critical ? [boolean(true)] : [], octetString(value));
|
|
1947
|
+
}
|
|
1948
|
+
function keyUsageExtension(bits) {
|
|
1949
|
+
const highest = Math.max(...bits);
|
|
1950
|
+
const byteCount = Math.floor(highest / BITS_PER_BYTE) + 1;
|
|
1951
|
+
const bytes = Buffer.alloc(byteCount);
|
|
1952
|
+
for (const bit of bits) {
|
|
1953
|
+
const index = Math.floor(bit / BITS_PER_BYTE);
|
|
1954
|
+
bytes[index] = (bytes[index] ?? 0) | HIGH_BIT >> bit % BITS_PER_BYTE;
|
|
1955
|
+
}
|
|
1956
|
+
const unusedBits = BITS_PER_BYTE - 1 - highest % BITS_PER_BYTE;
|
|
1957
|
+
return extension(OID_KEY_USAGE, true, tlv(TAG_BIT_STRING, Buffer.concat([Buffer.from([unusedBits]), bytes])));
|
|
1958
|
+
}
|
|
1959
|
+
var IPV6_GROUPS = 8;
|
|
1960
|
+
var HEX_RADIX = 16;
|
|
1961
|
+
var BYTES_PER_IPV6_GROUP = 2;
|
|
1962
|
+
function ipv6Groups(address) {
|
|
1963
|
+
const [head = "", tail] = address.split("::");
|
|
1964
|
+
const split = (text) => text === "" ? [] : text.split(":");
|
|
1965
|
+
const expand = (groups) => groups.flatMap((group) => {
|
|
1966
|
+
if (!import_node_net.default.isIPv4(group)) {
|
|
1967
|
+
return [Number.parseInt(group, HEX_RADIX)];
|
|
1968
|
+
}
|
|
1969
|
+
const [a = 0, b = 0, c = 0, d = 0] = group.split(".").map(Number);
|
|
1970
|
+
return [a * (BYTE_MASK + 1) + b, c * (BYTE_MASK + 1) + d];
|
|
1971
|
+
});
|
|
1972
|
+
const before = expand(split(head));
|
|
1973
|
+
const after = tail === void 0 ? [] : expand(split(tail));
|
|
1974
|
+
const filler = tail === void 0 ? [] : Array.from({ length: IPV6_GROUPS - before.length - after.length }, () => 0);
|
|
1975
|
+
return [...before, ...filler, ...after];
|
|
1976
|
+
}
|
|
1977
|
+
function ipBytes(address) {
|
|
1978
|
+
if (import_node_net.default.isIPv4(address)) {
|
|
1979
|
+
return Buffer.from(address.split(".").map(Number));
|
|
1980
|
+
}
|
|
1981
|
+
if (!import_node_net.default.isIPv6(address)) {
|
|
1982
|
+
throw new Error(`${address} is not an IP address`);
|
|
1983
|
+
}
|
|
1984
|
+
const bytes = Buffer.alloc(IPV6_GROUPS * BYTES_PER_IPV6_GROUP);
|
|
1985
|
+
ipv6Groups(address).forEach((group, index) => {
|
|
1986
|
+
bytes.writeUInt16BE(group, index * BYTES_PER_IPV6_GROUP);
|
|
1987
|
+
});
|
|
1988
|
+
return bytes;
|
|
1989
|
+
}
|
|
1990
|
+
function keyIdentifier(publicKey) {
|
|
1991
|
+
return (0, import_node_crypto2.createHash)("sha1").update(publicKey.export({ type: "pkcs1", format: "der" })).digest();
|
|
1992
|
+
}
|
|
1993
|
+
function readElement(buffer, offset) {
|
|
1994
|
+
const tag = buffer[offset];
|
|
1995
|
+
const first = buffer[offset + 1];
|
|
1996
|
+
if (tag === void 0 || first === void 0) {
|
|
1997
|
+
throw new Error("truncated DER");
|
|
1998
|
+
}
|
|
1999
|
+
let length = first;
|
|
2000
|
+
let contentStart = offset + 2;
|
|
2001
|
+
if ((first & HIGH_BIT) !== 0) {
|
|
2002
|
+
const count = first & BASE_128_PAYLOAD_MASK;
|
|
2003
|
+
length = 0;
|
|
2004
|
+
for (let index = 0; index < count; index += 1) {
|
|
2005
|
+
length = length * (BYTE_MASK + 1) + (buffer[offset + 2 + index] ?? 0);
|
|
2006
|
+
}
|
|
2007
|
+
contentStart = offset + 2 + count;
|
|
2008
|
+
}
|
|
2009
|
+
return { tag, start: offset, contentStart, end: contentStart + length };
|
|
2010
|
+
}
|
|
2011
|
+
function subjectNameOf(certificateDer) {
|
|
2012
|
+
const certificate = readElement(certificateDer, 0);
|
|
2013
|
+
let cursor = readElement(certificateDer, certificate.contentStart);
|
|
2014
|
+
const tbsEnd = cursor.end;
|
|
2015
|
+
cursor = readElement(certificateDer, cursor.contentStart);
|
|
2016
|
+
if (cursor.tag === TAG_VERSION) {
|
|
2017
|
+
cursor = readElement(certificateDer, cursor.end);
|
|
2018
|
+
}
|
|
2019
|
+
const fieldsBeforeSubject = 4;
|
|
2020
|
+
for (let skipped = 1; skipped < fieldsBeforeSubject; skipped += 1) {
|
|
2021
|
+
cursor = readElement(certificateDer, cursor.end);
|
|
2022
|
+
}
|
|
2023
|
+
const subject = readElement(certificateDer, cursor.end);
|
|
2024
|
+
if (subject.end > tbsEnd) {
|
|
2025
|
+
throw new Error("certificate has no subject");
|
|
2026
|
+
}
|
|
2027
|
+
return Buffer.from(certificateDer.subarray(subject.start, subject.end));
|
|
2028
|
+
}
|
|
2029
|
+
function toPem(label, der) {
|
|
2030
|
+
const body = Buffer.from(der).toString("base64").match(/.{1,64}/g) ?? [];
|
|
2031
|
+
return `-----BEGIN ${label}-----
|
|
2032
|
+
${body.join("\n")}
|
|
2033
|
+
-----END ${label}-----
|
|
2034
|
+
`;
|
|
2035
|
+
}
|
|
2036
|
+
function randomSerial() {
|
|
2037
|
+
const bytes = (0, import_node_crypto2.randomBytes)(SERIAL_NUMBER_BYTES);
|
|
2038
|
+
bytes[0] = (bytes[0] ?? 0) & BASE_128_PAYLOAD_MASK | HIGH_BIT >> 1;
|
|
2039
|
+
return bytes;
|
|
2040
|
+
}
|
|
2041
|
+
function assemble(spec) {
|
|
2042
|
+
const tbs = sequence(
|
|
2043
|
+
tlv(TAG_VERSION, smallInteger(VERSION_3)),
|
|
2044
|
+
unsignedInteger(randomSerial()),
|
|
2045
|
+
SIGNATURE_ALGORITHM,
|
|
2046
|
+
spec.issuerName,
|
|
2047
|
+
sequence(time(spec.notBefore), time(spec.notAfter)),
|
|
2048
|
+
spec.subjectName,
|
|
2049
|
+
spec.subjectPublicKey.export({ type: "spki", format: "der" }),
|
|
2050
|
+
tlv(TAG_EXTENSIONS, sequence(...spec.extensions))
|
|
2051
|
+
);
|
|
2052
|
+
const signature = (0, import_node_crypto2.sign)("sha256", tbs, spec.signingKey);
|
|
2053
|
+
return sequence(tbs, SIGNATURE_ALGORITHM, wholeBitString(signature));
|
|
2054
|
+
}
|
|
2055
|
+
function subjectKeyIdentifierExtension(publicKey) {
|
|
2056
|
+
return extension(OID_SUBJECT_KEY_IDENTIFIER, false, octetString(keyIdentifier(publicKey)));
|
|
2057
|
+
}
|
|
2058
|
+
function basicConstraintsExtension(isCa) {
|
|
2059
|
+
return extension(OID_BASIC_CONSTRAINTS, true, sequence(...isCa ? [boolean(true)] : []));
|
|
2060
|
+
}
|
|
2061
|
+
function rsaKeyPair() {
|
|
2062
|
+
return (0, import_node_crypto2.generateKeyPairSync)("rsa", { modulusLength: RSA_MODULUS_BITS });
|
|
2063
|
+
}
|
|
2064
|
+
function keyPem(privateKey) {
|
|
2065
|
+
return privateKey.export({ type: "pkcs8", format: "pem" });
|
|
2066
|
+
}
|
|
2067
|
+
function issueCaCertificate(commonName, notBefore, notAfter) {
|
|
2068
|
+
const { publicKey, privateKey } = rsaKeyPair();
|
|
2069
|
+
const name = commonNameOnly(commonName);
|
|
2070
|
+
const der = assemble({
|
|
2071
|
+
subjectPublicKey: publicKey,
|
|
2072
|
+
subjectName: name,
|
|
2073
|
+
issuerName: name,
|
|
2074
|
+
signingKey: privateKey,
|
|
2075
|
+
notBefore,
|
|
2076
|
+
notAfter,
|
|
2077
|
+
extensions: [basicConstraintsExtension(true), keyUsageExtension([KEY_USAGE.keyCertSign, KEY_USAGE.cRLSign]), subjectKeyIdentifierExtension(publicKey)]
|
|
2078
|
+
});
|
|
2079
|
+
return { certPem: toPem("CERTIFICATE", der), keyPem: keyPem(privateKey) };
|
|
2080
|
+
}
|
|
2081
|
+
function issueLeafCertificate(ca, names, notBefore, notAfter) {
|
|
2082
|
+
const [commonName] = names;
|
|
2083
|
+
if (commonName === void 0) {
|
|
2084
|
+
throw new Error("a leaf certificate needs at least one name");
|
|
2085
|
+
}
|
|
2086
|
+
const caCertificate = new import_node_crypto2.X509Certificate(ca.certPem);
|
|
2087
|
+
const caPrivateKey = (0, import_node_crypto2.createPrivateKey)(ca.keyPem);
|
|
2088
|
+
const { publicKey, privateKey } = rsaKeyPair();
|
|
2089
|
+
const generalNames = names.map((name) => import_node_net.default.isIP(name) === 0 ? tlv(TAG_GENERAL_NAME_DNS, Buffer.from(name, "ascii")) : tlv(TAG_GENERAL_NAME_IP, ipBytes(name)));
|
|
2090
|
+
const der = assemble({
|
|
2091
|
+
subjectPublicKey: publicKey,
|
|
2092
|
+
subjectName: commonNameOnly(commonName),
|
|
2093
|
+
issuerName: subjectNameOf(caCertificate.raw),
|
|
2094
|
+
signingKey: caPrivateKey,
|
|
2095
|
+
notBefore,
|
|
2096
|
+
notAfter,
|
|
2097
|
+
extensions: [
|
|
2098
|
+
basicConstraintsExtension(false),
|
|
2099
|
+
keyUsageExtension([KEY_USAGE.digitalSignature, KEY_USAGE.keyEncipherment]),
|
|
2100
|
+
extension(OID_EXT_KEY_USAGE, false, sequence(oid(OID_SERVER_AUTH))),
|
|
2101
|
+
extension(OID_SUBJECT_ALT_NAME, false, sequence(...generalNames)),
|
|
2102
|
+
subjectKeyIdentifierExtension(publicKey),
|
|
2103
|
+
extension(OID_AUTHORITY_KEY_IDENTIFIER, false, sequence(tlv(TAG_KEY_IDENTIFIER, keyIdentifier(caCertificate.publicKey))))
|
|
2104
|
+
]
|
|
2105
|
+
});
|
|
2106
|
+
return { certPem: toPem("CERTIFICATE", der), keyPem: keyPem(privateKey) };
|
|
2107
|
+
}
|
|
1837
2108
|
|
|
1838
2109
|
// src/frontdoor/capability.ts
|
|
1839
2110
|
var CONNECT_PROXY_REALM = "claude-use front door";
|
|
@@ -2036,7 +2307,6 @@ var CONNECT_INTERCEPT_HOST = "api.anthropic.com";
|
|
|
2036
2307
|
var ROUTED_PATH_PREFIX = "/v1/";
|
|
2037
2308
|
var HTTPS_PORT = 443;
|
|
2038
2309
|
var MAX_PORT = 65535;
|
|
2039
|
-
var SERIAL_NUMBER_BYTES = 16;
|
|
2040
2310
|
var HTTP_BAD_GATEWAY = 502;
|
|
2041
2311
|
var CA_KEY_FILE_MODE = 384;
|
|
2042
2312
|
var CONNECT_LINE_TOKENS = 3;
|
|
@@ -2108,50 +2378,10 @@ function forwardableHeaders(headers) {
|
|
|
2108
2378
|
return result;
|
|
2109
2379
|
}
|
|
2110
2380
|
function generateCa(now) {
|
|
2111
|
-
|
|
2112
|
-
|
|
2113
|
-
cert.publicKey = keys.publicKey;
|
|
2114
|
-
cert.serialNumber = import_node_forge.default.util.bytesToHex(import_node_forge.default.random.getBytesSync(SERIAL_NUMBER_BYTES));
|
|
2115
|
-
cert.validity.notBefore = new Date(now.getTime() - MS_PER_DAY);
|
|
2116
|
-
cert.validity.notAfter = new Date(now.getTime() + CA_VALIDITY_DAYS * MS_PER_DAY);
|
|
2117
|
-
const subject = [{ name: "commonName", value: CA_SUBJECT_COMMON_NAME }];
|
|
2118
|
-
cert.setSubject(subject);
|
|
2119
|
-
cert.setIssuer(subject);
|
|
2120
|
-
cert.setExtensions([
|
|
2121
|
-
{ name: "basicConstraints", cA: true, critical: true },
|
|
2122
|
-
{ name: "keyUsage", keyCertSign: true, cRLSign: true, critical: true },
|
|
2123
|
-
{ name: "subjectKeyIdentifier" }
|
|
2124
|
-
]);
|
|
2125
|
-
cert.sign(keys.privateKey, import_node_forge.default.md.sha256.create());
|
|
2126
|
-
return { certPem: import_node_forge.default.pki.certificateToPem(cert), keyPem: import_node_forge.default.pki.privateKeyToPem(keys.privateKey) };
|
|
2127
|
-
}
|
|
2128
|
-
var SAN_TYPE_DNS = 2;
|
|
2129
|
-
var SAN_TYPE_IP = 7;
|
|
2381
|
+
return issueCaCertificate(CA_SUBJECT_COMMON_NAME, new Date(now.getTime() - MS_PER_DAY), new Date(now.getTime() + CA_VALIDITY_DAYS * MS_PER_DAY));
|
|
2382
|
+
}
|
|
2130
2383
|
function mintLeaf(ca, names, now) {
|
|
2131
|
-
|
|
2132
|
-
if (commonName === void 0) {
|
|
2133
|
-
throw new Error("a leaf certificate needs at least one name");
|
|
2134
|
-
}
|
|
2135
|
-
const caCert = import_node_forge.default.pki.certificateFromPem(ca.certPem);
|
|
2136
|
-
const caKey = import_node_forge.default.pki.privateKeyFromPem(ca.keyPem);
|
|
2137
|
-
const keys = import_node_forge.default.pki.rsa.generateKeyPair({ bits: 2048 });
|
|
2138
|
-
const cert = import_node_forge.default.pki.createCertificate();
|
|
2139
|
-
cert.publicKey = keys.publicKey;
|
|
2140
|
-
cert.serialNumber = import_node_forge.default.util.bytesToHex(import_node_forge.default.random.getBytesSync(SERIAL_NUMBER_BYTES));
|
|
2141
|
-
cert.validity.notBefore = new Date(now.getTime() - MS_PER_DAY);
|
|
2142
|
-
cert.validity.notAfter = new Date(now.getTime() + LEAF_VALIDITY_DAYS * MS_PER_DAY);
|
|
2143
|
-
cert.setSubject([{ name: "commonName", value: commonName }]);
|
|
2144
|
-
cert.setIssuer(caCert.subject.attributes);
|
|
2145
|
-
cert.setExtensions([
|
|
2146
|
-
{ name: "basicConstraints", cA: false, critical: true },
|
|
2147
|
-
{ name: "keyUsage", digitalSignature: true, keyEncipherment: true, critical: true },
|
|
2148
|
-
{ name: "extKeyUsage", serverAuth: true },
|
|
2149
|
-
{ name: "subjectAltName", altNames: names.map((name) => net.isIP(name) === 0 ? { type: SAN_TYPE_DNS, value: name } : { type: SAN_TYPE_IP, ip: name }) },
|
|
2150
|
-
{ name: "subjectKeyIdentifier" },
|
|
2151
|
-
{ name: "authorityKeyIdentifier", keyLocatorFields: [] }
|
|
2152
|
-
]);
|
|
2153
|
-
cert.sign(caKey, import_node_forge.default.md.sha256.create());
|
|
2154
|
-
return { certPem: import_node_forge.default.pki.certificateToPem(cert), keyPem: import_node_forge.default.pki.privateKeyToPem(keys.privateKey) };
|
|
2384
|
+
return issueLeafCertificate(ca, names, new Date(now.getTime() - MS_PER_DAY), new Date(now.getTime() + LEAF_VALIDITY_DAYS * MS_PER_DAY));
|
|
2155
2385
|
}
|
|
2156
2386
|
function createLeafCache(ca, now) {
|
|
2157
2387
|
const cache = /* @__PURE__ */ new Map();
|
|
@@ -2176,8 +2406,8 @@ function ensureCa(store, generate) {
|
|
|
2176
2406
|
}
|
|
2177
2407
|
function caParses(ca) {
|
|
2178
2408
|
try {
|
|
2179
|
-
|
|
2180
|
-
|
|
2409
|
+
new import_node_crypto3.X509Certificate(ca.certPem);
|
|
2410
|
+
(0, import_node_crypto3.createPrivateKey)(ca.keyPem);
|
|
2181
2411
|
return true;
|
|
2182
2412
|
} catch {
|
|
2183
2413
|
return false;
|
|
@@ -2383,7 +2613,7 @@ function realConnectEffects() {
|
|
|
2383
2613
|
const tlsAgent = new https.Agent({ keepAlive: true });
|
|
2384
2614
|
const listenOnce = async (port, onSocket) => await new Promise((resolve, reject) => {
|
|
2385
2615
|
const accepted = /* @__PURE__ */ new Set();
|
|
2386
|
-
const server =
|
|
2616
|
+
const server = net2.createServer((socket) => {
|
|
2387
2617
|
accepted.add(socket);
|
|
2388
2618
|
socket.on("close", () => {
|
|
2389
2619
|
accepted.delete(socket);
|
|
@@ -2456,7 +2686,7 @@ function realConnectEffects() {
|
|
|
2456
2686
|
};
|
|
2457
2687
|
},
|
|
2458
2688
|
connectTcp: async (host, port) => await new Promise((resolve, reject) => {
|
|
2459
|
-
const socket =
|
|
2689
|
+
const socket = net2.connect({ host, port });
|
|
2460
2690
|
socket.once("connect", () => {
|
|
2461
2691
|
resolve(socket);
|
|
2462
2692
|
});
|
|
@@ -2521,8 +2751,8 @@ function realConnectCertStore(paths) {
|
|
|
2521
2751
|
return {
|
|
2522
2752
|
loadCa: () => {
|
|
2523
2753
|
const certPem = read(paths.frontdoorCaCertFile);
|
|
2524
|
-
const
|
|
2525
|
-
return certPem === void 0 ||
|
|
2754
|
+
const keyPem2 = read(paths.frontdoorCaKeyFile);
|
|
2755
|
+
return certPem === void 0 || keyPem2 === void 0 ? void 0 : { certPem, keyPem: keyPem2 };
|
|
2526
2756
|
},
|
|
2527
2757
|
writeCa: (ca) => {
|
|
2528
2758
|
fs.mkdirSync(paths.frontdoorCaDir, { recursive: true });
|
|
@@ -2534,10 +2764,10 @@ function realConnectCertStore(paths) {
|
|
|
2534
2764
|
}
|
|
2535
2765
|
|
|
2536
2766
|
// src/frontdoor/ensure.ts
|
|
2537
|
-
var
|
|
2767
|
+
var import_node_crypto5 = require("node:crypto");
|
|
2538
2768
|
|
|
2539
2769
|
// src/headroom/state.ts
|
|
2540
|
-
var
|
|
2770
|
+
var import_node_crypto4 = require("node:crypto");
|
|
2541
2771
|
var import_node_path6 = __toESM(require("node:path"), 1);
|
|
2542
2772
|
var import_zod4 = require("zod");
|
|
2543
2773
|
var HEADROOM_ANTHROPIC_UPSTREAM = "https://api.anthropic.com";
|
|
@@ -2599,7 +2829,7 @@ function headroomUpstreams(providers, frontDoorOrigin2) {
|
|
|
2599
2829
|
return upstreams;
|
|
2600
2830
|
}
|
|
2601
2831
|
function hashAllowlist(allowlist) {
|
|
2602
|
-
return (0,
|
|
2832
|
+
return (0, import_node_crypto4.createHash)("sha256").update(allowlist.join("\n")).digest("hex");
|
|
2603
2833
|
}
|
|
2604
2834
|
function readAllProviders(fs2, providersDir) {
|
|
2605
2835
|
const result = [];
|
|
@@ -2683,7 +2913,7 @@ function ensureFrontDoor(params) {
|
|
|
2683
2913
|
if (state?.port !== void 0 && state.connectPort !== void 0) {
|
|
2684
2914
|
const verdict = ports.verifyListener(state.port);
|
|
2685
2915
|
if (verdict.ok) {
|
|
2686
|
-
const token = (0,
|
|
2916
|
+
const token = (0, import_node_crypto5.randomUUID)();
|
|
2687
2917
|
writeFrontDoorSession(ports.fs, paths.frontdoorSessionsDir, { pid: params.launcherPid, startedAt: ports.now(), token });
|
|
2688
2918
|
return { port: state.port, connectPort: state.connectPort, token };
|
|
2689
2919
|
}
|
|
@@ -2777,7 +3007,7 @@ function ensureHeadroom(params) {
|
|
|
2777
3007
|
}
|
|
2778
3008
|
|
|
2779
3009
|
// src/headroom/settings.ts
|
|
2780
|
-
var
|
|
3010
|
+
var import_node_crypto6 = require("node:crypto");
|
|
2781
3011
|
function settingsOf(config) {
|
|
2782
3012
|
return {
|
|
2783
3013
|
...config.mode === void 0 ? {} : { mode: config.mode },
|
|
@@ -2802,7 +3032,7 @@ function settingsEnv(settings) {
|
|
|
2802
3032
|
return settings.rolloutChannel === void 0 ? {} : { HEADROOM_ROLLOUT_CHANNEL: settings.rolloutChannel };
|
|
2803
3033
|
}
|
|
2804
3034
|
function hashSettings(settings) {
|
|
2805
|
-
return (0,
|
|
3035
|
+
return (0, import_node_crypto6.createHash)("sha256").update(JSON.stringify([...settingsArgs(settings), JSON.stringify(settingsEnv(settings))])).digest("hex");
|
|
2806
3036
|
}
|
|
2807
3037
|
|
|
2808
3038
|
// src/headroom/supervisor.ts
|