claude-code-infinite 1.0.35 → 1.0.37
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 +114 -10
- package/dist/body-shape.d.ts +49 -0
- package/dist/body-shape.d.ts.map +1 -0
- package/dist/body-shape.js +232 -0
- package/dist/body-shape.js.map +1 -0
- package/dist/cc-request.d.ts +15 -0
- package/dist/cc-request.d.ts.map +1 -1
- package/dist/cc-request.js +30 -0
- package/dist/cc-request.js.map +1 -1
- package/dist/claude-env.d.ts +24 -1
- package/dist/claude-env.d.ts.map +1 -1
- package/dist/claude-env.js +48 -7
- package/dist/claude-env.js.map +1 -1
- package/dist/cli-args.d.ts +1 -1
- package/dist/cli-args.d.ts.map +1 -1
- package/dist/cli-args.js +1 -1
- package/dist/cli-args.js.map +1 -1
- package/dist/cli-main.js +113 -11
- package/dist/cli-main.js.map +1 -1
- package/dist/config.d.ts +5 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js.map +1 -1
- package/dist/count-tokens.d.ts +15 -2
- package/dist/count-tokens.d.ts.map +1 -1
- package/dist/count-tokens.js +13 -4
- package/dist/count-tokens.js.map +1 -1
- package/dist/desktop-command.d.ts +38 -0
- package/dist/desktop-command.d.ts.map +1 -0
- package/dist/desktop-command.js +324 -0
- package/dist/desktop-command.js.map +1 -0
- package/dist/desktop-service.d.ts +41 -0
- package/dist/desktop-service.d.ts.map +1 -0
- package/dist/desktop-service.js +449 -0
- package/dist/desktop-service.js.map +1 -0
- package/dist/desktop-setup.d.ts +94 -0
- package/dist/desktop-setup.d.ts.map +1 -0
- package/dist/desktop-setup.js +288 -0
- package/dist/desktop-setup.js.map +1 -0
- package/dist/financial-redaction.d.ts +12 -0
- package/dist/financial-redaction.d.ts.map +1 -0
- package/dist/financial-redaction.js +509 -0
- package/dist/financial-redaction.js.map +1 -0
- package/dist/hooks.d.ts +2 -0
- package/dist/hooks.d.ts.map +1 -1
- package/dist/hooks.js +4 -0
- package/dist/hooks.js.map +1 -1
- package/dist/https-proxy-eligibility.d.ts +31 -0
- package/dist/https-proxy-eligibility.d.ts.map +1 -0
- package/dist/https-proxy-eligibility.js +204 -0
- package/dist/https-proxy-eligibility.js.map +1 -0
- package/dist/https-proxy-mode.d.ts +59 -0
- package/dist/https-proxy-mode.d.ts.map +1 -0
- package/dist/https-proxy-mode.js +255 -0
- package/dist/https-proxy-mode.js.map +1 -0
- package/dist/https-proxy-session.d.ts +64 -0
- package/dist/https-proxy-session.d.ts.map +1 -0
- package/dist/https-proxy-session.js +165 -0
- package/dist/https-proxy-session.js.map +1 -0
- package/dist/image-tokens.d.ts +6 -1
- package/dist/image-tokens.d.ts.map +1 -1
- package/dist/image-tokens.js +75 -14
- package/dist/image-tokens.js.map +1 -1
- package/dist/lane-activity.d.ts +42 -0
- package/dist/lane-activity.d.ts.map +1 -0
- package/dist/lane-activity.js +79 -0
- package/dist/lane-activity.js.map +1 -0
- package/dist/memtree-mcp.d.ts +32 -1
- package/dist/memtree-mcp.d.ts.map +1 -1
- package/dist/memtree-mcp.js +73 -7
- package/dist/memtree-mcp.js.map +1 -1
- package/dist/memtree.d.ts +10 -0
- package/dist/memtree.d.ts.map +1 -1
- package/dist/memtree.js +59 -12
- package/dist/memtree.js.map +1 -1
- package/dist/message-refs.d.ts +81 -0
- package/dist/message-refs.d.ts.map +1 -0
- package/dist/message-refs.js +378 -0
- package/dist/message-refs.js.map +1 -0
- package/dist/mitm-ca.d.ts +31 -0
- package/dist/mitm-ca.d.ts.map +1 -0
- package/dist/mitm-ca.js +236 -0
- package/dist/mitm-ca.js.map +1 -0
- package/dist/paused-session.d.ts.map +1 -1
- package/dist/paused-session.js +9 -2
- package/dist/paused-session.js.map +1 -1
- package/dist/proxy.d.ts +25 -0
- package/dist/proxy.d.ts.map +1 -1
- package/dist/proxy.js +168 -22
- package/dist/proxy.js.map +1 -1
- package/dist/refusal-reason.d.ts +3 -2
- package/dist/refusal-reason.d.ts.map +1 -1
- package/dist/refusal-reason.js +4 -3
- package/dist/refusal-reason.js.map +1 -1
- package/dist/reqlog.d.ts +13 -3
- package/dist/reqlog.d.ts.map +1 -1
- package/dist/reqlog.js +1 -1
- package/dist/reqlog.js.map +1 -1
- package/dist/request-sizing.d.ts +38 -2
- package/dist/request-sizing.d.ts.map +1 -1
- package/dist/request-sizing.js +72 -6
- package/dist/request-sizing.js.map +1 -1
- package/dist/secret-redaction.d.ts +25 -0
- package/dist/secret-redaction.d.ts.map +1 -0
- package/dist/secret-redaction.js +492 -0
- package/dist/secret-redaction.js.map +1 -0
- package/dist/statusline-auto.d.ts +15 -0
- package/dist/statusline-auto.d.ts.map +1 -0
- package/dist/statusline-auto.js +125 -0
- package/dist/statusline-auto.js.map +1 -0
- package/dist/statusline.d.ts.map +1 -1
- package/dist/statusline.js +3 -2
- package/dist/statusline.js.map +1 -1
- package/dist/utf8-bytes.d.ts +10 -0
- package/dist/utf8-bytes.d.ts.map +1 -0
- package/dist/utf8-bytes.js +107 -0
- package/dist/utf8-bytes.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-refs.d.ts","sourceRoot":"","sources":["../src/message-refs.ts"],"names":[],"mappings":"AAmBA,OAAO,EAA0B,KAAK,OAAO,EAAE,MAAM,YAAY,CAAC;AAElE,6FAA6F;AAC7F,eAAO,MAAM,oBAAoB,iBAAiB,CAAC;AACnD,8EAA8E;AAC9E,eAAO,MAAM,qBAAqB,yBAAyB,CAAC;AAC5D,6DAA6D;AAC7D,eAAO,MAAM,sBAAsB,2BAA2B,CAAC;AAC/D,eAAO,MAAM,uBAAuB,MAAM,CAAC;AAC3C,eAAO,MAAM,OAAO,gBAAgB,CAAC;AAmBrC,iFAAiF;AACjF,MAAM,WAAW,GAAG;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,4EAA4E;IAC5E,KAAK,EAAE,MAAM,CAAC;CACf;AAED,sEAAsE;AACtE,MAAM,WAAW,KAAK;IACpB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,qBAAa,WAAW;IAWV,QAAQ,CAAC,OAAO,EAAE,OAAO;IAVrC,oFAAoF;IACpF,OAAO,CAAC,KAAK,CAAkC;IAC/C;0FACsF;IACtF,OAAO,CAAC,KAAK,CAAkC;IAC/C,iEAAiE;IACjE,OAAO,CAAC,UAAU,CAA6B;IAC/C,OAAO,CAAC,GAAG,CAAqB;IAChC,OAAO,CAAC,QAAQ,CAAS;gBAEJ,OAAO,EAAE,OAAO;IAErC,uFAAuF;IACvF,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED,4FAA4F;IAC5F,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,KAAK;IAOhE;;;OAGG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EACjE,IAAI,GAAE;QAAE,UAAU,CAAC,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,IAAI;IAexE;;;;;OAKG;IACH,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,EAC3E,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO;IAiBtD,6EAA6E;IAC7E,OAAO,CAAC,OAAO;IAQf;;;;OAIG;IACH,OAAO,CAAC,WAAW;IAsBnB,OAAO,CAAC,MAAM;IAYd,OAAO,CAAC,QAAQ;CAUjB;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,KAAK,CAsBjF;AAED;;;;GAIG;AACH,wBAAgB,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,UAAO,GAAG,GAAG,GAAG,SAAS,CAS5E;AAED,wFAAwF;AACxF,wBAAgB,YAAY,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClD,KAAK,GAAE,WAAW,CAAC,MAAM,CAAa,GAAG,MAAM,EAAE,CAe7E;AAED,+DAA+D;AAC/D,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAQ3E"}
|
|
@@ -0,0 +1,378 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Delta uploads (message refs): messages MemTree already stores are named by hash instead
|
|
3
|
+
* of being uploaded again.
|
|
4
|
+
*
|
|
5
|
+
* Every MemTree call sends the whole conversation (~11.7 GB/week in 2026-10; one
|
|
6
|
+
* image-heavy agent lane alone uploaded 6.7 GB). A server with delta uploads on answers
|
|
7
|
+
* each call that declares `message-refs` with `memtree_message_refs`: once the request is
|
|
8
|
+
* in its conversation store, every item the call sent may be named next time by the hash
|
|
9
|
+
* of its hashing form, except the `unservable` ones (rows holding a redacted secret) and
|
|
10
|
+
* messages holding an image in `unserved_images`. The server puts the named messages back
|
|
11
|
+
* before reading the request, so billing, hashing and indexing are those of a full upload.
|
|
12
|
+
* Anything it cannot serve answers 409 `missing_message_hashes`; the call is then sent
|
|
13
|
+
* again in full. Contract and golden vectors: polychat docs/memtree_delta_upload.md and
|
|
14
|
+
* polychat/conversation_store_delta_vectors.json (test/fixtures/delta_vectors.json).
|
|
15
|
+
*
|
|
16
|
+
* Off unless CCC_MEMTREE_DELTA=1 (the client half of polychat's CONVERSATION_STORE_DELTA).
|
|
17
|
+
*/
|
|
18
|
+
import { createHash } from "node:crypto";
|
|
19
|
+
import { isCanonicalBase64 } from "./image-refs.js";
|
|
20
|
+
import { stripCcSystemReminders } from "./turns.js";
|
|
21
|
+
/** Declared in x-client-features: this client sends refs and reads STORED_MESSAGES_FIELD. */
|
|
22
|
+
export const MESSAGE_REFS_FEATURE = "message-refs";
|
|
23
|
+
/** Answer field: whether the request is stored, and what may not be named. */
|
|
24
|
+
export const STORED_MESSAGES_FIELD = "memtree_message_refs";
|
|
25
|
+
/** 409 detail field: the refs the server could not serve. */
|
|
26
|
+
export const MISSING_MESSAGES_FIELD = "missing_message_hashes";
|
|
27
|
+
export const MISSING_MESSAGES_STATUS = 409;
|
|
28
|
+
export const REF_KEY = "memtree_ref";
|
|
29
|
+
const MARKS_KEY = "cache_marks";
|
|
30
|
+
const HEADER_KEY = "billing_header";
|
|
31
|
+
const BILLING_HEADER_PREFIX = "x-anthropic-billing-header";
|
|
32
|
+
/** Conversations whose acks are remembered, and hashes per conversation (memory bound). */
|
|
33
|
+
const SESSIONS_MAX = 32;
|
|
34
|
+
const ACKED_PER_SESSION_MAX = 200_000;
|
|
35
|
+
/** 409s in a row naming every ref before a conversation goes back to full uploads. */
|
|
36
|
+
const ALL_MISSING_MAX = 2;
|
|
37
|
+
const HEX_RE = /^[0-9a-f]{64}$/;
|
|
38
|
+
/** The server's limits per request: ref entries, and cache marks on refs (past them, inline). */
|
|
39
|
+
const MAX_REFS = 50_000;
|
|
40
|
+
const MAX_MARKS = 64;
|
|
41
|
+
/** What the named messages may expand to (their JSON, images as bytes: an overestimate of
|
|
42
|
+
* what the server reads, which keeps images as refs), under its 32 MiB rebuild cap. */
|
|
43
|
+
const MAX_NAMED_CHARS = 30 * 1024 * 1024;
|
|
44
|
+
/** A character both JS trim and Python strip keep (Python also strips \x1c-\x1f, \x85). */
|
|
45
|
+
const SUBSTANCE_RE = /[^\s\x1c-\x1f\x85]/;
|
|
46
|
+
export class MessageRefs {
|
|
47
|
+
enabled;
|
|
48
|
+
/** Per conversation (session and opening, as the server's scope): acked digests. */
|
|
49
|
+
acked = new Map();
|
|
50
|
+
/** Per conversation: digests a 409 named (a hash the server never had, or computes
|
|
51
|
+
* differently): never acked again, so a mismatch costs one 409, not one per turn. */
|
|
52
|
+
never = new Map();
|
|
53
|
+
/** Per conversation: 409s in a row that named every ref sent. */
|
|
54
|
+
allMissing = new Map();
|
|
55
|
+
off = new Set();
|
|
56
|
+
disabled = false;
|
|
57
|
+
constructor(enabled) {
|
|
58
|
+
this.enabled = enabled;
|
|
59
|
+
}
|
|
60
|
+
/** Whether calls declare message-refs (on, and not refused by the server for good). */
|
|
61
|
+
get active() {
|
|
62
|
+
return this.enabled && !this.disabled;
|
|
63
|
+
}
|
|
64
|
+
/** `messages` with every acked message after the opening as a ref (none: the same list). */
|
|
65
|
+
delta(sessionId, messages) {
|
|
66
|
+
const lane = this.laneFor(sessionId, messages);
|
|
67
|
+
const acked = lane ? this.acked.get(lane) : undefined;
|
|
68
|
+
if (!acked || acked.size === 0)
|
|
69
|
+
return { messages, refs: [] };
|
|
70
|
+
return buildDelta(messages, acked);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Learn what an answer to a call that sent `messages` (in full) lets the next one name.
|
|
74
|
+
* `finalIndex`: the early answer to an exit index, which never carries the field.
|
|
75
|
+
*/
|
|
76
|
+
noteAnswer(sessionId, messages, json, opts = {}) {
|
|
77
|
+
const lane = this.laneFor(sessionId, messages);
|
|
78
|
+
if (!lane)
|
|
79
|
+
return;
|
|
80
|
+
const field = json?.[STORED_MESSAGES_FIELD];
|
|
81
|
+
if (field === undefined) {
|
|
82
|
+
// A server that takes no refs (off, or never had them): name nothing until it does.
|
|
83
|
+
if (!opts.finalIndex)
|
|
84
|
+
this.acked.delete(lane);
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
if (opts.sentRefs)
|
|
88
|
+
this.allMissing.delete(lane);
|
|
89
|
+
const acks = field;
|
|
90
|
+
if (!acks || acks.stored !== true || acks.messages !== messages.length)
|
|
91
|
+
return;
|
|
92
|
+
this.remember(lane, ackedDigests(messages, acks, this.acked.get(lane)));
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* A refusal of a call that sent `messages` naming `refs` (hex): true when the call should
|
|
96
|
+
* go again in full. A 409 names what is never named again in this conversation; two in a
|
|
97
|
+
* row naming every ref end refs for it; a 400 about refs ends them all; a 400 about the
|
|
98
|
+
* images the refs brought back only resends.
|
|
99
|
+
*/
|
|
100
|
+
noteRefusal(sessionId, messages, refs, status, bodyText) {
|
|
101
|
+
if (refs.length === 0)
|
|
102
|
+
return false;
|
|
103
|
+
// Over a size cap (stored text or the images the refs bring back): this call only.
|
|
104
|
+
if (status === 400 && /expand past/i.test(bodyText))
|
|
105
|
+
return true;
|
|
106
|
+
if (status === 400 && /message refs/i.test(bodyText)) {
|
|
107
|
+
this.disabled = true;
|
|
108
|
+
this.acked.clear();
|
|
109
|
+
return true;
|
|
110
|
+
}
|
|
111
|
+
const missing = status === MISSING_MESSAGES_STATUS ? missingMessageHashes(bodyText) : undefined;
|
|
112
|
+
if (missing === undefined)
|
|
113
|
+
return false;
|
|
114
|
+
// Resent whatever the lane's state (a call in flight when it went off still resends).
|
|
115
|
+
const lane = this.laneFor(sessionId, messages);
|
|
116
|
+
if (lane)
|
|
117
|
+
this.noteMissing(lane, refs, missing);
|
|
118
|
+
return true;
|
|
119
|
+
}
|
|
120
|
+
/** The conversation `messages` belong to, while refs may be named for it. */
|
|
121
|
+
laneFor(sessionId, messages) {
|
|
122
|
+
if (!this.enabled || this.disabled || !sessionId)
|
|
123
|
+
return undefined;
|
|
124
|
+
const opening = messages.find(isOpening);
|
|
125
|
+
if (!opening)
|
|
126
|
+
return undefined;
|
|
127
|
+
const lane = `${sessionId}\n${laneDigest(opening)}`;
|
|
128
|
+
return this.off.has(lane) ? undefined : lane;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* A partial 409 names hashes the server lacks or computes differently: never named
|
|
132
|
+
* again. One naming every ref (a lookup that failed, the kill switch) only drops them
|
|
133
|
+
* from the acks; two in a row end refs for the conversation.
|
|
134
|
+
*/
|
|
135
|
+
noteMissing(lane, refs, missing) {
|
|
136
|
+
const named = new Set(missing);
|
|
137
|
+
if (!refs.every((ref) => named.has(ref))) {
|
|
138
|
+
this.forget(lane, missing);
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
const acked = this.acked.get(lane);
|
|
142
|
+
for (const hash of missing)
|
|
143
|
+
acked?.delete(hash);
|
|
144
|
+
const inRow = (this.allMissing.get(lane) ?? 0) + 1;
|
|
145
|
+
this.allMissing.delete(lane);
|
|
146
|
+
this.allMissing.set(lane, inRow);
|
|
147
|
+
boundMap(this.allMissing, SESSIONS_MAX);
|
|
148
|
+
if (inRow >= ALL_MISSING_MAX) {
|
|
149
|
+
this.off.add(lane);
|
|
150
|
+
while (this.off.size > SESSIONS_MAX) {
|
|
151
|
+
const first = this.off.values().next().value;
|
|
152
|
+
if (first === undefined)
|
|
153
|
+
break;
|
|
154
|
+
this.off.delete(first);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
forget(lane, hashes) {
|
|
159
|
+
const never = this.never.get(lane) ?? new Set();
|
|
160
|
+
this.never.delete(lane);
|
|
161
|
+
this.never.set(lane, never);
|
|
162
|
+
for (const hash of hashes) {
|
|
163
|
+
never.add(hash);
|
|
164
|
+
this.acked.get(lane)?.delete(hash);
|
|
165
|
+
}
|
|
166
|
+
bound(never, ACKED_PER_SESSION_MAX);
|
|
167
|
+
boundMap(this.never, SESSIONS_MAX);
|
|
168
|
+
}
|
|
169
|
+
remember(lane, digests) {
|
|
170
|
+
let set = this.acked.get(lane);
|
|
171
|
+
if (set)
|
|
172
|
+
this.acked.delete(lane);
|
|
173
|
+
else
|
|
174
|
+
set = new Set();
|
|
175
|
+
this.acked.set(lane, set);
|
|
176
|
+
const never = this.never.get(lane);
|
|
177
|
+
for (const digest of digests)
|
|
178
|
+
if (!never?.has(digest))
|
|
179
|
+
set.add(digest);
|
|
180
|
+
bound(set, ACKED_PER_SESSION_MAX);
|
|
181
|
+
boundMap(this.acked, SESSIONS_MAX);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* The reference client of the contract: acked messages as refs, except the opening (the
|
|
186
|
+
* first message that is not system/developer and not only <system-reminder> blocks) and
|
|
187
|
+
* everything before it that is not a system/developer message.
|
|
188
|
+
*/
|
|
189
|
+
export function buildDelta(messages, acked) {
|
|
190
|
+
const opening = messages.findIndex(isOpening);
|
|
191
|
+
if (opening < 0)
|
|
192
|
+
return { messages, refs: [] };
|
|
193
|
+
let headerSeen = false;
|
|
194
|
+
let marks = 0;
|
|
195
|
+
let chars = 0;
|
|
196
|
+
const refs = [];
|
|
197
|
+
const out = messages.map((message, index) => {
|
|
198
|
+
const eligible = (index > opening || isSkipped(message)) && refs.length < MAX_REFS;
|
|
199
|
+
const ref = eligible ? refFor(message, !headerSeen) : undefined;
|
|
200
|
+
headerSeen = headerSeen || billingHeaderOf(message) !== undefined;
|
|
201
|
+
if (!ref || !acked.has(ref.digest) || marks + ref.marks.length > MAX_MARKS ||
|
|
202
|
+
chars + ref.chars > MAX_NAMED_CHARS)
|
|
203
|
+
return message;
|
|
204
|
+
const named = refJson(ref);
|
|
205
|
+
// A short message is smaller than its ref: sent as it is.
|
|
206
|
+
if (JSON.stringify(named).length >= ref.chars)
|
|
207
|
+
return message;
|
|
208
|
+
marks += ref.marks.length;
|
|
209
|
+
chars += ref.chars;
|
|
210
|
+
refs.push(ref.digest);
|
|
211
|
+
return named;
|
|
212
|
+
});
|
|
213
|
+
return refs.length ? { messages: out, refs } : { messages, refs: [] };
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* A message's ref as the server's store hashes it: sha256 of the compact JSON of the
|
|
217
|
+
* message without its `cache_control` keys and, when `stripHeader` (no earlier message of
|
|
218
|
+
* the request had one), without a system message's leading billing-header block.
|
|
219
|
+
*/
|
|
220
|
+
export function refFor(message, stripHeader = true) {
|
|
221
|
+
if (!message || typeof message !== "object" || Array.isArray(message))
|
|
222
|
+
return undefined;
|
|
223
|
+
const header = stripHeader ? billingHeaderOf(message) : undefined;
|
|
224
|
+
const form = header === undefined ? message
|
|
225
|
+
: { ...message, content: message.content.slice(1) };
|
|
226
|
+
const marks = [];
|
|
227
|
+
const text = JSON.stringify(withoutCacheControl(form, [], marks));
|
|
228
|
+
return { digest: hashText(text), marks, chars: text.length,
|
|
229
|
+
...(header !== undefined ? { header } : {}) };
|
|
230
|
+
}
|
|
231
|
+
/** The digests an answer's acks allow for `messages`, in the request's header order. */
|
|
232
|
+
export function ackedDigests(messages, acks, known = new Set()) {
|
|
233
|
+
const unservable = new Set(stringsOf(acks.unservable));
|
|
234
|
+
const images = new Set(stringsOf(acks.unserved_images));
|
|
235
|
+
const out = [];
|
|
236
|
+
let headerSeen = false;
|
|
237
|
+
for (const message of messages) {
|
|
238
|
+
const ref = refFor(message, !headerSeen);
|
|
239
|
+
headerSeen = headerSeen || billingHeaderOf(message) !== undefined;
|
|
240
|
+
if (!ref || unservable.has(ref.digest))
|
|
241
|
+
continue;
|
|
242
|
+
// Images are checked once, when a message is first acked (a served image stays served).
|
|
243
|
+
if (images.size && !known.has(ref.digest) &&
|
|
244
|
+
imageShas(message).some((sha) => images.has(sha)))
|
|
245
|
+
continue;
|
|
246
|
+
out.push(ref.digest);
|
|
247
|
+
}
|
|
248
|
+
return out;
|
|
249
|
+
}
|
|
250
|
+
/** The hashes a 409 names, or undefined when it names none. */
|
|
251
|
+
export function missingMessageHashes(bodyText) {
|
|
252
|
+
try {
|
|
253
|
+
const listed = JSON.parse(bodyText)?.detail?.[MISSING_MESSAGES_FIELD];
|
|
254
|
+
if (!Array.isArray(listed))
|
|
255
|
+
return undefined;
|
|
256
|
+
return listed.filter((hash) => typeof hash === "string" && HEX_RE.test(hash));
|
|
257
|
+
}
|
|
258
|
+
catch {
|
|
259
|
+
return undefined;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
// --------------------------------------------------------------------------- leaves
|
|
263
|
+
function refJson(ref) {
|
|
264
|
+
return {
|
|
265
|
+
[REF_KEY]: ref.digest,
|
|
266
|
+
...(ref.marks.length ? { [MARKS_KEY]: ref.marks } : {}),
|
|
267
|
+
...(ref.header !== undefined ? { [HEADER_KEY]: ref.header } : {}),
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
function hashOf(value) {
|
|
271
|
+
return hashText(JSON.stringify(value));
|
|
272
|
+
}
|
|
273
|
+
function hashText(text) {
|
|
274
|
+
return createHash("sha256").update(text, "utf8").digest("hex");
|
|
275
|
+
}
|
|
276
|
+
function billingHeaderOf(message) {
|
|
277
|
+
if (message?.role !== "system" || !Array.isArray(message.content))
|
|
278
|
+
return undefined;
|
|
279
|
+
const first = message.content[0];
|
|
280
|
+
return first?.type === "text" && typeof first.text === "string" &&
|
|
281
|
+
first.text.startsWith(BILLING_HEADER_PREFIX) ? first : undefined;
|
|
282
|
+
}
|
|
283
|
+
/** A copy without `cache_control` keys; each removal as [path, key position, value]. */
|
|
284
|
+
function withoutCacheControl(value, path, marks) {
|
|
285
|
+
if (Array.isArray(value)) {
|
|
286
|
+
const out = value.map((item, i) => withoutCacheControl(item, [...path, i], marks));
|
|
287
|
+
return out.every((item, i) => item === value[i]) ? value : out;
|
|
288
|
+
}
|
|
289
|
+
if (!value || typeof value !== "object")
|
|
290
|
+
return value;
|
|
291
|
+
const entries = Object.entries(value);
|
|
292
|
+
const out = {};
|
|
293
|
+
let changed = false;
|
|
294
|
+
let position = 0; // among the keys JSON keeps (it drops undefined and functions)
|
|
295
|
+
entries.forEach(([key, item]) => {
|
|
296
|
+
const kept = item !== undefined && typeof item !== "function" && typeof item !== "symbol";
|
|
297
|
+
if (key === "cache_control" && kept) {
|
|
298
|
+
marks.push([path, position, item]);
|
|
299
|
+
changed = true;
|
|
300
|
+
position += 1;
|
|
301
|
+
return;
|
|
302
|
+
}
|
|
303
|
+
if (kept)
|
|
304
|
+
position += 1;
|
|
305
|
+
const next = withoutCacheControl(item, [...path, key], marks);
|
|
306
|
+
if (next !== item)
|
|
307
|
+
changed = true;
|
|
308
|
+
out[key] = next;
|
|
309
|
+
});
|
|
310
|
+
return changed ? out : value;
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* The server's opening rule (the first message not system/developer that is not only
|
|
314
|
+
* <system-reminder> blocks), erring toward "not yet": a message left with only
|
|
315
|
+
* whitespace either side may count as such (JS trim and Python strip differ on a few
|
|
316
|
+
* characters) is not the opening, so it and the real one both stay inline.
|
|
317
|
+
*/
|
|
318
|
+
function isOpening(message) {
|
|
319
|
+
if (isSkipped(message))
|
|
320
|
+
return false;
|
|
321
|
+
const stripped = stripCcSystemReminders([message])[0];
|
|
322
|
+
return stripped !== undefined && substantive(stripped.content);
|
|
323
|
+
}
|
|
324
|
+
function substantive(content) {
|
|
325
|
+
if (typeof content === "string")
|
|
326
|
+
return SUBSTANCE_RE.test(content);
|
|
327
|
+
if (!Array.isArray(content))
|
|
328
|
+
return content !== undefined;
|
|
329
|
+
return content.some((part) => typeof part === "string" ? SUBSTANCE_RE.test(part)
|
|
330
|
+
: part?.type === "text" ? typeof part.text === "string" && SUBSTANCE_RE.test(part.text)
|
|
331
|
+
: true);
|
|
332
|
+
}
|
|
333
|
+
/** A conversation's key: its opening without reminders and cache marks (both call kinds). */
|
|
334
|
+
function laneDigest(opening) {
|
|
335
|
+
const stripped = stripCcSystemReminders([opening])[0] ?? opening;
|
|
336
|
+
return hashOf(withoutCacheControl(stripped, [], []));
|
|
337
|
+
}
|
|
338
|
+
function bound(set, max) {
|
|
339
|
+
while (set.size > max) {
|
|
340
|
+
const first = set.values().next().value;
|
|
341
|
+
if (first === undefined)
|
|
342
|
+
break;
|
|
343
|
+
set.delete(first);
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
function boundMap(map, max) {
|
|
347
|
+
while (map.size > max) {
|
|
348
|
+
const first = map.keys().next().value;
|
|
349
|
+
if (first === undefined)
|
|
350
|
+
break;
|
|
351
|
+
map.delete(first);
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
function isSkipped(message) {
|
|
355
|
+
return message?.role === "system" || message?.role === "developer";
|
|
356
|
+
}
|
|
357
|
+
/** Shas of the message's canonical base64 images (the ones the server stores). */
|
|
358
|
+
function imageShas(value, out = []) {
|
|
359
|
+
if (Array.isArray(value)) {
|
|
360
|
+
for (const item of value)
|
|
361
|
+
imageShas(item, out);
|
|
362
|
+
}
|
|
363
|
+
else if (value && typeof value === "object") {
|
|
364
|
+
const block = value;
|
|
365
|
+
const data = block.type === "image" ? block.source?.data : undefined;
|
|
366
|
+
if (block.source?.type === "base64" && typeof data === "string" && isCanonicalBase64(data)) {
|
|
367
|
+
out.push(createHash("sha256").update(Buffer.from(data, "base64")).digest("hex"));
|
|
368
|
+
return out;
|
|
369
|
+
}
|
|
370
|
+
for (const item of Object.values(block))
|
|
371
|
+
imageShas(item, out);
|
|
372
|
+
}
|
|
373
|
+
return out;
|
|
374
|
+
}
|
|
375
|
+
function stringsOf(value) {
|
|
376
|
+
return Array.isArray(value) ? value.filter((v) => typeof v === "string") : [];
|
|
377
|
+
}
|
|
378
|
+
//# sourceMappingURL=message-refs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-refs.js","sourceRoot":"","sources":["../src/message-refs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export declare const INTERCEPT_HOST = "api.anthropic.com";
|
|
2
|
+
export type KeyAlg = "ec" | "rsa";
|
|
3
|
+
export interface SessionCa {
|
|
4
|
+
caCertPem: string;
|
|
5
|
+
leafCertPem: string;
|
|
6
|
+
leafKeyPem: string;
|
|
7
|
+
}
|
|
8
|
+
export interface SessionCaFiles {
|
|
9
|
+
dir: string;
|
|
10
|
+
/** NODE_EXTRA_CA_CERTS for the child: the user's own extra CAs, then ours. */
|
|
11
|
+
bundlePath: string;
|
|
12
|
+
cleanup: () => void;
|
|
13
|
+
}
|
|
14
|
+
/** Make a CA (name-constrained to `host`) and a leaf for `host`, all in memory. */
|
|
15
|
+
export declare function createSessionCa(host?: string, alg?: KeyAlg, leafHost?: string): SessionCa;
|
|
16
|
+
/** Prefix of each session's temp dir (the bundle and the Bash env file). */
|
|
17
|
+
export declare const SESSION_DIR_PREFIX = "ccc-ca-";
|
|
18
|
+
/**
|
|
19
|
+
* Write the CA cert (public) bundle for NODE_EXTRA_CA_CERTS into a private temp
|
|
20
|
+
* dir: the user's own extra CAs first (corporate roots keep working), then ours.
|
|
21
|
+
*/
|
|
22
|
+
export declare function writeCaBundle(ca: SessionCa, userExtraCaPem?: string, root?: string): SessionCaFiles;
|
|
23
|
+
/**
|
|
24
|
+
* Remove session dirs that a crashed or killed ccc left behind: older than a
|
|
25
|
+
* day, owned by this user, and whose owner process is gone. A live session
|
|
26
|
+
* can run for weeks, and its Claude Code reads the bundle and the Bash env
|
|
27
|
+
* file throughout, so a dir whose owner is alive is never touched. Best
|
|
28
|
+
* effort: returns how many were removed.
|
|
29
|
+
*/
|
|
30
|
+
export declare function sweepStaleSessionDirs(root?: string, now?: number, alive?: (pid: number) => boolean): number;
|
|
31
|
+
//# sourceMappingURL=mitm-ca.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mitm-ca.d.ts","sourceRoot":"","sources":["../src/mitm-ca.ts"],"names":[],"mappings":"AAqBA,eAAO,MAAM,cAAc,sBAAsB,CAAC;AAElD,MAAM,MAAM,MAAM,GAAG,IAAI,GAAG,KAAK,CAAC;AAElC,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,8EAA8E;IAC9E,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,mFAAmF;AACnF,wBAAgB,eAAe,CAC7B,IAAI,SAAiB,EAAE,GAAG,GAAE,MAAa,EAAE,QAAQ,SAAO,GACzD,SAAS,CAyBX;AAED,4EAA4E;AAC5E,eAAO,MAAM,kBAAkB,YAAY,CAAC;AAM5C;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,EAAE,EAAE,SAAS,EAAE,cAAc,SAAK,EAAE,IAAI,SAAW,GAClD,cAAc,CAQhB;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,SAAW,EAAE,GAAG,SAAa,EAAE,KAAK,GAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAsB,GAChF,MAAM,CAcR"}
|