Enhance configuration and model capabilities
This commit is contained in:
@@ -13,11 +13,18 @@ function generateBillingHeader(payload) {
|
||||
return `x-anthropic-billing-header: cc_version=${CLAUDE_VERSION}.${buildHash}; cc_entrypoint=${CC_ENTRYPOINT}; cch=${cch};`;
|
||||
}
|
||||
|
||||
// Derive a deterministic UUID-v4-shaped string from a seed (stable per account)
|
||||
function deriveUuid(seed) {
|
||||
const h = createHash("sha256").update(seed).digest("hex");
|
||||
return `${h.slice(0, 8)}-${h.slice(8, 12)}-4${h.slice(13, 16)}-${((parseInt(h[16], 16) & 0x3) | 0x8).toString(16)}${h.slice(17, 20)}-${h.slice(20, 32)}`;
|
||||
}
|
||||
|
||||
// Generate fake user ID in Claude Code 2.1.92+ JSON format:
|
||||
// {"device_id":"<64hex>","account_uuid":"<uuid>","session_id":"<uuid>"}
|
||||
function generateFakeUserID(sessionId) {
|
||||
const deviceId = randomBytes(32).toString("hex");
|
||||
const accountUuid = randomUUID();
|
||||
// device_id/account_uuid derive from apiKey (stable per account), session_id per-conversation
|
||||
function generateFakeUserID(sessionId, apiKey) {
|
||||
const deviceId = apiKey ? createHash("sha256").update(`device:${apiKey}`).digest("hex") : randomBytes(32).toString("hex");
|
||||
const accountUuid = apiKey ? deriveUuid(`account:${apiKey}`) : randomUUID();
|
||||
const sessionUuid = sessionId || randomUUID();
|
||||
return `{"device_id":"${deviceId}","account_uuid":"${accountUuid}","session_id":"${sessionUuid}"}`;
|
||||
}
|
||||
@@ -151,7 +158,7 @@ export function applyCloaking(body, apiKey, sessionId) {
|
||||
// Inject fake user ID into metadata (session_id must match X-Claude-Code-Session-Id)
|
||||
const existingUserId = result.metadata?.user_id;
|
||||
if (!existingUserId) {
|
||||
result.metadata = { ...result.metadata, user_id: generateFakeUserID(sessionId) };
|
||||
result.metadata = { ...result.metadata, user_id: generateFakeUserID(sessionId, apiKey) };
|
||||
}
|
||||
|
||||
return result;
|
||||
|
||||
@@ -89,7 +89,7 @@ const ASSISTANT_CAP_LEN = 200;
|
||||
const MAX_ASSISTANT_SESSIONS = 5000;
|
||||
|
||||
// Client headers/body fields that carry an upstream session id (priority order)
|
||||
const SESSION_HEADER_KEYS = ["x-session-id", "session_id", "x-amp-thread-id", "x-client-request-id"];
|
||||
const SESSION_HEADER_KEYS = ["x-session-id", "session-id", "session_id", "x-amp-thread-id", "x-client-request-id"];
|
||||
const CLAUDE_CODE_SESSION_RE = /_session_([a-f0-9-]+)$/;
|
||||
|
||||
function sha16(text) {
|
||||
@@ -122,9 +122,20 @@ function headerValue(headers, key) {
|
||||
}
|
||||
|
||||
// Read client-provided session id from headers/body (no generation)
|
||||
// Antigravity envelope carries session in request.sessionId; requestId embeds conversation uuid
|
||||
const ANTIGRAVITY_CONV_RE = /^[a-z]+\/([0-9a-f-]{36})\//i;
|
||||
function extractAntigravitySession(body) {
|
||||
const sid = body?.request?.sessionId;
|
||||
if (sid != null && sid !== "") return normalizeSessionId(String(sid));
|
||||
const m = typeof body?.requestId === "string" ? body.requestId.match(ANTIGRAVITY_CONV_RE) : null;
|
||||
return m ? normalizeSessionId(m[1]) : null;
|
||||
}
|
||||
|
||||
function extractClientSessionId(headers, body) {
|
||||
const claude = extractClaudeCodeSession(body?.metadata?.user_id);
|
||||
if (claude) return `claude:${claude}`;
|
||||
const antigravity = extractAntigravitySession(body);
|
||||
if (antigravity) return `antigravity:${antigravity}`;
|
||||
for (const key of SESSION_HEADER_KEYS) {
|
||||
const v = headerValue(headers, key);
|
||||
if (v) return v;
|
||||
@@ -194,6 +205,22 @@ export function resolveSessionId({ headers, body, connectionId, workspaceId, sco
|
||||
return deriveSessionId(connectionId);
|
||||
}
|
||||
|
||||
// Capture session id from request body + credentials (envelope still intact here)
|
||||
export function captureSessionId(body, credentials, connectionId, scope = "") {
|
||||
return resolveSessionId({ headers: credentials?.rawHeaders, body, connectionId, scope });
|
||||
}
|
||||
|
||||
// Convert any session id to Antigravity numeric format "-<int64>" (matches real AG / CLIProxyAPI).
|
||||
// Already-numeric ids (native AG sessionId) pass through unchanged.
|
||||
export function toNumericSessionId(sessionId) {
|
||||
const v = normalizeSessionId(sessionId);
|
||||
if (!v) return null;
|
||||
if (/^-?\d+$/.test(v)) return v;
|
||||
const h = crypto.createHash("sha256").update(v).digest();
|
||||
const n = h.readBigUInt64BE(0) & 0x7fffffffffffffffn;
|
||||
return `-${n.toString()}`;
|
||||
}
|
||||
|
||||
// Cleanup expired assistant-session entries
|
||||
const assistantCleanup = setInterval(() => {
|
||||
const now = Date.now();
|
||||
|
||||
Reference in New Issue
Block a user