claude-code-infinite 1.0.28 → 1.0.30
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 +96 -19
- package/dist/auto-update.d.ts +2 -0
- package/dist/auto-update.d.ts.map +1 -1
- package/dist/auto-update.js +4 -0
- package/dist/auto-update.js.map +1 -1
- package/dist/claude-auth.d.ts +27 -2
- package/dist/claude-auth.d.ts.map +1 -1
- package/dist/claude-auth.js +76 -4
- package/dist/claude-auth.js.map +1 -1
- package/dist/claude-install.d.ts +73 -0
- package/dist/claude-install.d.ts.map +1 -0
- package/dist/claude-install.js +142 -0
- package/dist/claude-install.js.map +1 -0
- package/dist/claude-plan-warning.d.ts +70 -7
- package/dist/claude-plan-warning.d.ts.map +1 -1
- package/dist/claude-plan-warning.js +152 -8
- package/dist/claude-plan-warning.js.map +1 -1
- package/dist/cli-lifecycle.d.ts +45 -1
- package/dist/cli-lifecycle.d.ts.map +1 -1
- package/dist/cli-lifecycle.js +59 -0
- package/dist/cli-lifecycle.js.map +1 -1
- package/dist/cli-main.js +136 -29
- package/dist/cli-main.js.map +1 -1
- package/dist/count-tokens.d.ts +15 -0
- package/dist/count-tokens.d.ts.map +1 -1
- package/dist/count-tokens.js +23 -1
- package/dist/count-tokens.js.map +1 -1
- package/dist/diagnostics-schema.d.ts +4 -0
- package/dist/diagnostics-schema.d.ts.map +1 -1
- package/dist/diagnostics-schema.js +25 -0
- package/dist/diagnostics-schema.js.map +1 -1
- package/dist/diagnostics.d.ts +24 -1
- package/dist/diagnostics.d.ts.map +1 -1
- package/dist/diagnostics.js +86 -5
- package/dist/diagnostics.js.map +1 -1
- package/dist/final-index.d.ts +7 -1
- package/dist/final-index.d.ts.map +1 -1
- package/dist/final-index.js +10 -3
- package/dist/final-index.js.map +1 -1
- package/dist/image-refs.d.ts +51 -0
- package/dist/image-refs.d.ts.map +1 -0
- package/dist/image-refs.js +169 -0
- package/dist/image-refs.js.map +1 -0
- package/dist/image-tokens.d.ts +37 -0
- package/dist/image-tokens.d.ts.map +1 -0
- package/dist/image-tokens.js +158 -0
- package/dist/image-tokens.js.map +1 -0
- package/dist/install-ping.d.ts +54 -0
- package/dist/install-ping.d.ts.map +1 -0
- package/dist/install-ping.js +177 -0
- package/dist/install-ping.js.map +1 -0
- package/dist/memtree-body.d.ts +52 -0
- package/dist/memtree-body.d.ts.map +1 -0
- package/dist/memtree-body.js +99 -0
- package/dist/memtree-body.js.map +1 -0
- package/dist/memtree-finder.d.ts +2 -1
- package/dist/memtree-finder.d.ts.map +1 -1
- package/dist/memtree-finder.js +4 -5
- package/dist/memtree-finder.js.map +1 -1
- package/dist/memtree-mcp.d.ts.map +1 -1
- package/dist/memtree-mcp.js +17 -7
- package/dist/memtree-mcp.js.map +1 -1
- package/dist/memtree-times.d.ts +35 -0
- package/dist/memtree-times.d.ts.map +1 -0
- package/dist/memtree-times.js +166 -0
- package/dist/memtree-times.js.map +1 -0
- package/dist/memtree-tools.d.ts +12 -0
- package/dist/memtree-tools.d.ts.map +1 -1
- package/dist/memtree-tools.js +63 -7
- package/dist/memtree-tools.js.map +1 -1
- package/dist/memtree.d.ts +77 -3
- package/dist/memtree.d.ts.map +1 -1
- package/dist/memtree.js +267 -53
- package/dist/memtree.js.map +1 -1
- package/dist/paused-session.d.ts.map +1 -1
- package/dist/paused-session.js +11 -8
- package/dist/paused-session.js.map +1 -1
- package/dist/postinstall.d.ts +2 -0
- package/dist/postinstall.d.ts.map +1 -0
- package/dist/postinstall.js +4 -0
- package/dist/postinstall.js.map +1 -0
- package/dist/prefix-store.d.ts +2 -0
- package/dist/prefix-store.d.ts.map +1 -1
- package/dist/prefix-store.js +4 -0
- package/dist/prefix-store.js.map +1 -1
- package/dist/prepared-compression.d.ts +78 -0
- package/dist/prepared-compression.d.ts.map +1 -0
- package/dist/prepared-compression.js +127 -0
- package/dist/prepared-compression.js.map +1 -0
- package/dist/proxy.d.ts +370 -13
- package/dist/proxy.d.ts.map +1 -1
- package/dist/proxy.js +790 -92
- package/dist/proxy.js.map +1 -1
- package/dist/rate-limit.d.ts +64 -0
- package/dist/rate-limit.d.ts.map +1 -0
- package/dist/rate-limit.js +126 -0
- package/dist/rate-limit.js.map +1 -0
- package/dist/reqlog.d.ts +66 -2
- package/dist/reqlog.d.ts.map +1 -1
- package/dist/reqlog.js.map +1 -1
- package/dist/request-sizing.d.ts +21 -2
- package/dist/request-sizing.d.ts.map +1 -1
- package/dist/request-sizing.js +57 -11
- package/dist/request-sizing.js.map +1 -1
- package/dist/route-identity.d.ts +27 -0
- package/dist/route-identity.d.ts.map +1 -1
- package/dist/route-identity.js +88 -8
- package/dist/route-identity.js.map +1 -1
- package/dist/token-estimate.d.ts +3 -20
- package/dist/token-estimate.d.ts.map +1 -1
- package/dist/token-estimate.js +9 -50
- package/dist/token-estimate.js.map +1 -1
- package/dist/tool-output-store.d.ts +12 -0
- package/dist/tool-output-store.d.ts.map +1 -0
- package/dist/tool-output-store.js +146 -0
- package/dist/tool-output-store.js.map +1 -0
- package/dist/tool-result-truncation.d.ts +32 -0
- package/dist/tool-result-truncation.d.ts.map +1 -0
- package/dist/tool-result-truncation.js +135 -0
- package/dist/tool-result-truncation.js.map +1 -0
- package/package.json +2 -1
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Anthropic's 429/529 answers, told apart the way Claude Code tells them apart.
|
|
3
|
+
*
|
|
4
|
+
* - The Claude plan's usage limit: 429 with `anthropic-ratelimit-unified-status:
|
|
5
|
+
* rejected`; `anthropic-ratelimit-unified-reset` is when it lifts (epoch seconds).
|
|
6
|
+
* Claude Code does not retry into it.
|
|
7
|
+
* - Busy: 529 (overloaded_error), or any other 429 (an API key's rate limit, a
|
|
8
|
+
* bare 429). Claude Code retries these itself, with its own backoff.
|
|
9
|
+
*
|
|
10
|
+
* ccc only reads the status and headers; the response reaches Claude Code
|
|
11
|
+
* unchanged, so its retries and its own messages are untouched. What ccc adds is
|
|
12
|
+
* one plain line: on the next prompt and when ccc exits (interactive; hooks can't
|
|
13
|
+
* show anything on a turn an API error ended), or on stderr right away (print runs).
|
|
14
|
+
*/
|
|
15
|
+
import type { IncomingHttpHeaders } from "node:http";
|
|
16
|
+
export type RateLimitKind = "plan_limit" | "busy";
|
|
17
|
+
export interface RateLimitInfo {
|
|
18
|
+
kind: RateLimitKind;
|
|
19
|
+
status: number;
|
|
20
|
+
/** plan_limit: when it resets (epoch ms), when Anthropic said. */
|
|
21
|
+
resetsAt?: number;
|
|
22
|
+
}
|
|
23
|
+
export declare const BUSY_NOTICE = "Anthropic is busy; Claude Code will retry.";
|
|
24
|
+
/** Busy, said after the fact (next prompt, exit): Claude Code's retries have run out or stopped. */
|
|
25
|
+
export declare const BUSY_AFTER_NOTICE = "Anthropic was busy; try again in a moment.";
|
|
26
|
+
/** A plan limit with no reset time is forgotten after this (the 5-hour window). */
|
|
27
|
+
export declare const UNKNOWN_RESET_TTL_MS: number;
|
|
28
|
+
export declare const PLAN_LIMIT_NOTICE = "You've hit your Claude plan's usage limit.";
|
|
29
|
+
/** A 429/529 from Anthropic, classified; null for any other status. */
|
|
30
|
+
export declare function rateLimitFromResponse(status: number | undefined, headers: IncomingHttpHeaders, now?: number): RateLimitInfo | null;
|
|
31
|
+
/** The line for a rate limit: the plan's reset in local time when known. */
|
|
32
|
+
export declare function rateLimitNoticeText(info: RateLimitInfo, now?: number, formatTime?: (ms: number, now: number) => string,
|
|
33
|
+
/** Said after the turn ended (next prompt, exit) rather than as it happens. */
|
|
34
|
+
after?: boolean): string;
|
|
35
|
+
/**
|
|
36
|
+
* `3:00 PM` today; `Sat 3:00 PM` on another day; `Sat, Oct 31, 3:00 PM` six or more
|
|
37
|
+
* days away, where the weekday alone could mean today (this machine's locale and zone).
|
|
38
|
+
*/
|
|
39
|
+
export declare function localResetTime(ms: number, now: number): string;
|
|
40
|
+
/**
|
|
41
|
+
* What ccc has said about rate limits this run. A limit stays current until
|
|
42
|
+
* Anthropic answers a turn again (answered) or, for the plan limit, its reset.
|
|
43
|
+
*/
|
|
44
|
+
export declare class RateLimitNotices {
|
|
45
|
+
private readonly clock;
|
|
46
|
+
private current;
|
|
47
|
+
private seenAt;
|
|
48
|
+
private promptShown;
|
|
49
|
+
constructor(clock?: () => number);
|
|
50
|
+
/** A refusal of a turn's request; true when it starts a new episode (say it now). */
|
|
51
|
+
observe(info: RateLimitInfo): boolean;
|
|
52
|
+
/**
|
|
53
|
+
* Anthropic answered a turn's request that reached ccc at `startedAt`: nothing
|
|
54
|
+
* to say any more. One sent before the refusal (a subagent's, finishing late)
|
|
55
|
+
* proves nothing about the limit, so it is ignored.
|
|
56
|
+
*/
|
|
57
|
+
answered(startedAt?: number): void;
|
|
58
|
+
/** For the next prompt: the plan limit on every prompt until it resets; busy once. */
|
|
59
|
+
promptLine(): string | undefined;
|
|
60
|
+
/** For ccc's exit: the limit still in force, if any. */
|
|
61
|
+
exitLine(): string | undefined;
|
|
62
|
+
private active;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=rate-limit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limit.d.ts","sourceRoot":"","sources":["../src/rate-limit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAErD,MAAM,MAAM,aAAa,GAAG,YAAY,GAAG,MAAM,CAAC;AAElD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,aAAa,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,WAAW,+CAA+C,CAAC;AACxE,oGAAoG;AACpG,eAAO,MAAM,iBAAiB,+CAA+C,CAAC;AAC9E,mFAAmF;AACnF,eAAO,MAAM,oBAAoB,QAAkB,CAAC;AACpD,eAAO,MAAM,iBAAiB,+CAA+C,CAAC;AAE9E,uEAAuE;AACvE,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,OAAO,EAAE,mBAAmB,EAC5B,GAAG,GAAE,MAAmB,GACvB,aAAa,GAAG,IAAI,CAMtB;AAED,4EAA4E;AAC5E,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,aAAa,EACnB,GAAG,GAAE,MAAmB,EACxB,UAAU,GAAE,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,MAAuB;AAChE,+EAA+E;AAC/E,KAAK,UAAQ,GACZ,MAAM,CAIR;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAU9D;AAED;;;GAGG;AACH,qBAAa,gBAAgB;IAKf,OAAO,CAAC,QAAQ,CAAC,KAAK;IAJlC,OAAO,CAAC,OAAO,CAA8B;IAC7C,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,WAAW,CAAS;gBAEC,KAAK,GAAE,MAAM,MAAiB;IAE3D,qFAAqF;IACrF,OAAO,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO;IASrC;;;;OAIG;IACH,QAAQ,CAAC,SAAS,GAAE,MAAqB,GAAG,IAAI;IAIhD,sFAAsF;IACtF,UAAU,IAAI,MAAM,GAAG,SAAS;IAOhC,wDAAwD;IACxD,QAAQ,IAAI,MAAM,GAAG,SAAS;IAK9B,OAAO,CAAC,MAAM;CAQf"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Anthropic's 429/529 answers, told apart the way Claude Code tells them apart.
|
|
3
|
+
*
|
|
4
|
+
* - The Claude plan's usage limit: 429 with `anthropic-ratelimit-unified-status:
|
|
5
|
+
* rejected`; `anthropic-ratelimit-unified-reset` is when it lifts (epoch seconds).
|
|
6
|
+
* Claude Code does not retry into it.
|
|
7
|
+
* - Busy: 529 (overloaded_error), or any other 429 (an API key's rate limit, a
|
|
8
|
+
* bare 429). Claude Code retries these itself, with its own backoff.
|
|
9
|
+
*
|
|
10
|
+
* ccc only reads the status and headers; the response reaches Claude Code
|
|
11
|
+
* unchanged, so its retries and its own messages are untouched. What ccc adds is
|
|
12
|
+
* one plain line: on the next prompt and when ccc exits (interactive; hooks can't
|
|
13
|
+
* show anything on a turn an API error ended), or on stderr right away (print runs).
|
|
14
|
+
*/
|
|
15
|
+
export const BUSY_NOTICE = "Anthropic is busy; Claude Code will retry.";
|
|
16
|
+
/** Busy, said after the fact (next prompt, exit): Claude Code's retries have run out or stopped. */
|
|
17
|
+
export const BUSY_AFTER_NOTICE = "Anthropic was busy; try again in a moment.";
|
|
18
|
+
/** A plan limit with no reset time is forgotten after this (the 5-hour window). */
|
|
19
|
+
export const UNKNOWN_RESET_TTL_MS = 5 * 3600 * 1000;
|
|
20
|
+
export const PLAN_LIMIT_NOTICE = "You've hit your Claude plan's usage limit.";
|
|
21
|
+
/** A 429/529 from Anthropic, classified; null for any other status. */
|
|
22
|
+
export function rateLimitFromResponse(status, headers, now = Date.now()) {
|
|
23
|
+
if (status !== 429 && status !== 529)
|
|
24
|
+
return null;
|
|
25
|
+
if (status === 429 && header(headers, "anthropic-ratelimit-unified-status") === "rejected") {
|
|
26
|
+
return { kind: "plan_limit", status, resetsAt: resetTime(headers, now) };
|
|
27
|
+
}
|
|
28
|
+
return { kind: "busy", status };
|
|
29
|
+
}
|
|
30
|
+
/** The line for a rate limit: the plan's reset in local time when known. */
|
|
31
|
+
export function rateLimitNoticeText(info, now = Date.now(), formatTime = localResetTime,
|
|
32
|
+
/** Said after the turn ended (next prompt, exit) rather than as it happens. */
|
|
33
|
+
after = false) {
|
|
34
|
+
if (info.kind === "busy")
|
|
35
|
+
return after ? BUSY_AFTER_NOTICE : BUSY_NOTICE;
|
|
36
|
+
if (info.resetsAt === undefined || info.resetsAt <= now)
|
|
37
|
+
return PLAN_LIMIT_NOTICE;
|
|
38
|
+
return `${PLAN_LIMIT_NOTICE} It resets at ${formatTime(info.resetsAt, now)}.`;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* `3:00 PM` today; `Sat 3:00 PM` on another day; `Sat, Oct 31, 3:00 PM` six or more
|
|
42
|
+
* days away, where the weekday alone could mean today (this machine's locale and zone).
|
|
43
|
+
*/
|
|
44
|
+
export function localResetTime(ms, now) {
|
|
45
|
+
const at = new Date(ms);
|
|
46
|
+
const sameDay = at.toDateString() === new Date(now).toDateString();
|
|
47
|
+
const farOff = ms - now >= 6 * 86_400_000;
|
|
48
|
+
return at.toLocaleString(undefined, {
|
|
49
|
+
...(sameDay ? {} : { weekday: "short" }),
|
|
50
|
+
...(farOff ? { month: "short", day: "numeric" } : {}),
|
|
51
|
+
hour: "numeric",
|
|
52
|
+
minute: "2-digit",
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* What ccc has said about rate limits this run. A limit stays current until
|
|
57
|
+
* Anthropic answers a turn again (answered) or, for the plan limit, its reset.
|
|
58
|
+
*/
|
|
59
|
+
export class RateLimitNotices {
|
|
60
|
+
clock;
|
|
61
|
+
current = null;
|
|
62
|
+
seenAt = 0;
|
|
63
|
+
promptShown = false;
|
|
64
|
+
constructor(clock = Date.now) {
|
|
65
|
+
this.clock = clock;
|
|
66
|
+
}
|
|
67
|
+
/** A refusal of a turn's request; true when it starts a new episode (say it now). */
|
|
68
|
+
observe(info) {
|
|
69
|
+
const fresh = !this.current || this.current.kind !== info.kind ||
|
|
70
|
+
!sameReset(this.current.resetsAt, info.resetsAt);
|
|
71
|
+
this.current = info;
|
|
72
|
+
this.seenAt = this.clock();
|
|
73
|
+
if (fresh)
|
|
74
|
+
this.promptShown = false;
|
|
75
|
+
return fresh;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Anthropic answered a turn's request that reached ccc at `startedAt`: nothing
|
|
79
|
+
* to say any more. One sent before the refusal (a subagent's, finishing late)
|
|
80
|
+
* proves nothing about the limit, so it is ignored.
|
|
81
|
+
*/
|
|
82
|
+
answered(startedAt = this.clock()) {
|
|
83
|
+
if (startedAt >= this.seenAt)
|
|
84
|
+
this.current = null;
|
|
85
|
+
}
|
|
86
|
+
/** For the next prompt: the plan limit on every prompt until it resets; busy once. */
|
|
87
|
+
promptLine() {
|
|
88
|
+
const info = this.active();
|
|
89
|
+
if (!info || (info.kind === "busy" && this.promptShown))
|
|
90
|
+
return undefined;
|
|
91
|
+
this.promptShown = true;
|
|
92
|
+
return rateLimitNoticeText(info, this.clock(), localResetTime, true);
|
|
93
|
+
}
|
|
94
|
+
/** For ccc's exit: the limit still in force, if any. */
|
|
95
|
+
exitLine() {
|
|
96
|
+
const info = this.active();
|
|
97
|
+
return info ? rateLimitNoticeText(info, this.clock(), localResetTime, true) : undefined;
|
|
98
|
+
}
|
|
99
|
+
active() {
|
|
100
|
+
const info = this.current;
|
|
101
|
+
const now = this.clock();
|
|
102
|
+
const over = info?.kind === "plan_limit" && (info.resetsAt !== undefined
|
|
103
|
+
? info.resetsAt <= now : now - this.seenAt >= UNKNOWN_RESET_TTL_MS);
|
|
104
|
+
if (over)
|
|
105
|
+
this.current = null;
|
|
106
|
+
return this.current;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/** Resets within a minute are one limit (retry-after counts down per refusal). */
|
|
110
|
+
function sameReset(a, b) {
|
|
111
|
+
if (a === undefined || b === undefined)
|
|
112
|
+
return a === b;
|
|
113
|
+
return Math.abs(a - b) < 60_000;
|
|
114
|
+
}
|
|
115
|
+
function resetTime(headers, now) {
|
|
116
|
+
const reset = Number(header(headers, "anthropic-ratelimit-unified-reset"));
|
|
117
|
+
if (Number.isFinite(reset) && reset > 0)
|
|
118
|
+
return reset * 1000;
|
|
119
|
+
const retryAfter = Number(header(headers, "retry-after"));
|
|
120
|
+
return Number.isFinite(retryAfter) && retryAfter > 0 ? now + retryAfter * 1000 : undefined;
|
|
121
|
+
}
|
|
122
|
+
function header(headers, name) {
|
|
123
|
+
const value = headers[name];
|
|
124
|
+
return (Array.isArray(value) ? value[0] : value)?.trim();
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=rate-limit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limit.js","sourceRoot":"","sources":["../src/rate-limit.ts"],"names":[],"mappings":"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"}
|
package/dist/reqlog.d.ts
CHANGED
|
@@ -19,6 +19,7 @@
|
|
|
19
19
|
*/
|
|
20
20
|
import type { ClaudeCodeRequestInfo, TranscriptShape } from "./cc-request.js";
|
|
21
21
|
import type { ClaudeAuthType, UpstreamErrorCode } from "./claude-auth.js";
|
|
22
|
+
import type { RateLimitInfo } from "./rate-limit.js";
|
|
22
23
|
/** Rough bytes→tokens estimate (bytes/4). Label the result approximate. */
|
|
23
24
|
export declare function approxTokensFromBytes(bytes: number): number;
|
|
24
25
|
export declare function defaultLogPath(): string;
|
|
@@ -46,6 +47,12 @@ export type TurnType = "first-user" | "tool"
|
|
|
46
47
|
* cache read. See `compaction` for the size check that allowed it.
|
|
47
48
|
*/
|
|
48
49
|
| "followup-prefix" | "followup-noop"
|
|
50
|
+
/**
|
|
51
|
+
* A main-thread human turn clearly under the budget by its token count,
|
|
52
|
+
* forwarded whole at once; its compress call (a passthrough) ran in the
|
|
53
|
+
* background instead of before it.
|
|
54
|
+
*/
|
|
55
|
+
| "followup-under-budget"
|
|
49
56
|
/** Indexed response that carried no prior conversation; history forwarded. */
|
|
50
57
|
| "followup-empty-memory"
|
|
51
58
|
/**
|
|
@@ -126,6 +133,12 @@ export interface MessagesRecord {
|
|
|
126
133
|
forwardedBytes?: number;
|
|
127
134
|
/** forwardedBytes/4 — rough chars→tokens proxy, not a tokenizer count. */
|
|
128
135
|
approxInputTokens?: number;
|
|
136
|
+
/**
|
|
137
|
+
* A failed compress on a visible turn: "shown" queued the degraded notice
|
|
138
|
+
* (the turn needed compression); "quiet-under-budget" did not, because the
|
|
139
|
+
* turn fit its budget and went out exactly as MemTree would have sent it.
|
|
140
|
+
*/
|
|
141
|
+
degradedNotice?: "shown" | "quiet-under-budget";
|
|
129
142
|
/** Present when a blocking MemTree compress was attempted for this turn. */
|
|
130
143
|
compress?: {
|
|
131
144
|
/** Overall wall time of the compress step (all concurrent legs). */
|
|
@@ -144,6 +157,12 @@ export interface MessagesRecord {
|
|
|
144
157
|
* returned nothing.
|
|
145
158
|
*/
|
|
146
159
|
timedOut: boolean;
|
|
160
|
+
/**
|
|
161
|
+
* It returned nothing because a responsive MemTree refused this request
|
|
162
|
+
* (a 4xx other than 402, e.g. a 413 when the newest message alone leaves
|
|
163
|
+
* no room): MemTree has the conversation, unlike in an outage.
|
|
164
|
+
*/
|
|
165
|
+
refused?: true;
|
|
147
166
|
};
|
|
148
167
|
/**
|
|
149
168
|
* How much conversation the compressed response actually carried. Recorded
|
|
@@ -210,6 +229,21 @@ export interface MessagesRecord {
|
|
|
210
229
|
* the CCC_TOOL_ROUTE_RECOVERY=0 kill switch.
|
|
211
230
|
*/
|
|
212
231
|
compaction?: CompactionRecord;
|
|
232
|
+
/**
|
|
233
|
+
* Main thread near the budget: what preparing a compressed prefix decided
|
|
234
|
+
* (prepared-compression.ts): "prepare" started a background call; "fresh",
|
|
235
|
+
* "in-flight" and "unsupported" (the server does not prepare) did not.
|
|
236
|
+
*/
|
|
237
|
+
prepare?: "prepare" | "too-small" | "in-flight" | "fresh" | "unsupported";
|
|
238
|
+
/**
|
|
239
|
+
* A tool result too large for the window even after compression, saved
|
|
240
|
+
* whole (tool-output-store.ts) and sent with its middle replaced by a
|
|
241
|
+
* pointer to that copy.
|
|
242
|
+
*/
|
|
243
|
+
truncatedToolResult?: {
|
|
244
|
+
originalChars: number;
|
|
245
|
+
omittedChars: number;
|
|
246
|
+
};
|
|
213
247
|
/** Every actual counting attempt, in order; cached results add no entry. */
|
|
214
248
|
countTokens?: CountTokensRecord[];
|
|
215
249
|
/** One bounded compression after an assembled ride was counted above the soft budget. */
|
|
@@ -345,6 +379,8 @@ export interface MessagesRecord {
|
|
|
345
379
|
contextWindow?: number;
|
|
346
380
|
/** A known Anthropic error in the response body, by code (claude-auth.ts). */
|
|
347
381
|
upstreamError?: UpstreamErrorCode;
|
|
382
|
+
/** Anthropic's 429/529, by kind and reset time from its headers (rate-limit.ts). */
|
|
383
|
+
rateLimit?: RateLimitInfo;
|
|
348
384
|
/** The downstream client aborted before the response finished. */
|
|
349
385
|
clientAborted?: true;
|
|
350
386
|
/** Forward start → first response byte from Anthropic. */
|
|
@@ -374,8 +410,8 @@ export interface CompactionRecord {
|
|
|
374
410
|
budgetTokens: number;
|
|
375
411
|
/**
|
|
376
412
|
* Where the budget came from: CCC_BUDGET_TOKENS ("override"), the
|
|
377
|
-
* server's `model_budget_tokens` ("server"), or
|
|
378
|
-
*
|
|
413
|
+
* server's `model_budget_tokens` ("server"), or fallbackBudgetTokens
|
|
414
|
+
* (proxy.ts: a share of the context window) until the server reports one.
|
|
379
415
|
*/
|
|
380
416
|
budgetSource: "override" | "server" | "window-ratio";
|
|
381
417
|
/** What a compaction on this turn aims at (budget/2, or the explicit N). */
|
|
@@ -408,6 +444,15 @@ export interface CompactionRecord {
|
|
|
408
444
|
* down, no-op, unusable) and the turn rode the old prefix instead.
|
|
409
445
|
*/
|
|
410
446
|
keptPrefix?: true;
|
|
447
|
+
/**
|
|
448
|
+
* At the budget with a prepared prefix (prepared-compression.ts): "used"
|
|
449
|
+
* (the turn rode it, no compress call); else why not ("stale": another
|
|
450
|
+
* window or budget; "mismatch": no longer this history; "too-large"; "truncated": too
|
|
451
|
+
* large, then sent with its newest tool result shortened, and installed).
|
|
452
|
+
*/
|
|
453
|
+
prepared?: "used" | "stale" | "mismatch" | "too-large" | "truncated";
|
|
454
|
+
/** How long the turn waited for its session's preparation still in flight. */
|
|
455
|
+
preparedWaitMs?: number;
|
|
411
456
|
}
|
|
412
457
|
/** One MemTree API call (blocking compress or background index). */
|
|
413
458
|
export interface MemtreeRecord {
|
|
@@ -418,6 +463,25 @@ export interface MemtreeRecord {
|
|
|
418
463
|
/** HTTP status; absent when the call died before a response (network/timeout). */
|
|
419
464
|
status?: number;
|
|
420
465
|
requestBytes: number;
|
|
466
|
+
/**
|
|
467
|
+
* The body was over the HTTP/1 limit (memtree-body.ts): sent with its oldest images
|
|
468
|
+
* dropped (an index call) or not sent at all. Diagnostics: memtree_body_limit.
|
|
469
|
+
*/
|
|
470
|
+
bodyLimit?: {
|
|
471
|
+
action: "trimmed" | "skipped";
|
|
472
|
+
requestBytes: number;
|
|
473
|
+
imagesDropped: number;
|
|
474
|
+
};
|
|
475
|
+
/** Aborted because the exit drain ran out of time (diagnostics: exit_index_cut). */
|
|
476
|
+
exitCut?: boolean;
|
|
477
|
+
/** With exitCut: the call was the session's final index. */
|
|
478
|
+
finalIndex?: boolean;
|
|
479
|
+
/**
|
|
480
|
+
* Aborted by its caller before any answer, or while reading a 2xx body (the proxy's drain
|
|
481
|
+
* stops background compress
|
|
482
|
+
* and prepare calls): says nothing about the server, so no memtree_error.
|
|
483
|
+
*/
|
|
484
|
+
callerAborted?: boolean;
|
|
421
485
|
/** Model sent for server-side budget resolution (compression calls only). */
|
|
422
486
|
model?: string;
|
|
423
487
|
/**
|
package/dist/reqlog.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reqlog.d.ts","sourceRoot":"","sources":["../src/reqlog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAKH,OAAO,KAAK,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAC9E,OAAO,KAAK,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"reqlog.d.ts","sourceRoot":"","sources":["../src/reqlog.ts"],"names":[],"mappings":"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"}
|
package/dist/reqlog.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reqlog.js","sourceRoot":"","sources":["../src/reqlog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACtE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"reqlog.js","sourceRoot":"","sources":["../src/reqlog.ts"],"names":[],"mappings":"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"}
|
package/dist/request-sizing.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type CountTokensSession, type CountTokensResult, type SizeSample } from "./count-tokens.js";
|
|
2
|
+
import { type ImageTotals } from "./image-tokens.js";
|
|
2
3
|
/** Output room kept free on models that accept input + max_tokens over the
|
|
3
4
|
* window, so the model can still answer a request that barely fits. */
|
|
4
5
|
export declare const OUTPUT_FLOOR_TOKENS = 16000;
|
|
@@ -49,6 +50,8 @@ export declare class RequestSizing {
|
|
|
49
50
|
register(body: Buffer, kind: CandidateKind, sample?: SizeSample): RequestCandidate;
|
|
50
51
|
/** Eligibility belongs to route planning, not to a later byte-size guess. */
|
|
51
52
|
excludeFallback(candidate: RequestCandidate): void;
|
|
53
|
+
/** Every registered candidate planning has not excluded, in registration order. */
|
|
54
|
+
fallbacks(): RequestCandidate[];
|
|
52
55
|
/** Planning and metadata consult the same exact count, else the snapshotted estimate. */
|
|
53
56
|
plan(candidate: RequestCandidate): PlannedSize;
|
|
54
57
|
/** Whether this body could still get an exact count: counting is on and
|
|
@@ -68,6 +71,16 @@ export declare class RequestSizing {
|
|
|
68
71
|
clientInputTokens(candidate: RequestCandidate): number | undefined;
|
|
69
72
|
/** Count only when a size decision needs it; all views reuse the same result. */
|
|
70
73
|
measure(candidate: RequestCandidate, limits: SizingLimits, phase?: "plan" | "delivery"): Promise<CandidateMeasurement>;
|
|
74
|
+
/**
|
|
75
|
+
* When counting ran out of time, count again (once per request, with a
|
|
76
|
+
* fresh allowance) the smallest candidate whose count timed out, and select
|
|
77
|
+
* it if it then fits: a slow count must not refuse a body that fits
|
|
78
|
+
* (2026-10-23: an ~850k request was refused after its count timed out).
|
|
79
|
+
*/
|
|
80
|
+
retryTimedOutCount(limits: SizingLimits): Promise<{
|
|
81
|
+
candidate: RequestCandidate;
|
|
82
|
+
measurement: CandidateMeasurement;
|
|
83
|
+
} | undefined>;
|
|
71
84
|
/** The preferred body gets first chance; only validated registered candidates
|
|
72
85
|
* are considered afterward. Exact overflow never degrades to a byte guess. */
|
|
73
86
|
select(preferred: RequestCandidate, limits: SizingLimits): Promise<{
|
|
@@ -88,6 +101,12 @@ export declare function fitsMeasured(measurement: Pick<CandidateMeasurement, "to
|
|
|
88
101
|
export declare function estimateLimits(limits: SizingLimits): SizingLimits;
|
|
89
102
|
/** `limits.output` is the reservation from outputReservation, not raw max_tokens. */
|
|
90
103
|
export declare function fitsNative(input: number, limits: SizingLimits): boolean;
|
|
91
|
-
/**
|
|
92
|
-
|
|
104
|
+
/**
|
|
105
|
+
* One shared estimator for planner telemetry and request-local snapshots.
|
|
106
|
+
* Inline images (`images`, and the sample's own) are not text: their base64
|
|
107
|
+
* bytes are left out of the scaling and their visual tokens added as they are.
|
|
108
|
+
* 2026-10-23: a 295k-character PNG (420 tokens) read as ~74k tokens of text
|
|
109
|
+
* put an ~850k request at 892k and it was refused.
|
|
110
|
+
*/
|
|
111
|
+
export declare function estimateRequestTokens(sample: SizeSample | undefined, bytes: number, images?: ImageTotals): PlannedSize;
|
|
93
112
|
//# sourceMappingURL=request-sizing.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request-sizing.d.ts","sourceRoot":"","sources":["../src/request-sizing.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,KAAK,kBAAkB,EAAE,KAAK,iBAAiB,EAAE,KAAK,UAAU,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"request-sizing.d.ts","sourceRoot":"","sources":["../src/request-sizing.ts"],"names":[],"mappings":"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"}
|
package/dist/request-sizing.js
CHANGED
|
@@ -2,8 +2,9 @@
|
|
|
2
2
|
* exact counts remain attached to immutable body bytes, and every candidate
|
|
3
3
|
* shares the request's Count Tokens deadline and account cooldown. */
|
|
4
4
|
import { createHash } from "node:crypto";
|
|
5
|
-
import { exceedsRequestLimit, plausibleSample, shouldCountTokens } from "./count-tokens.js";
|
|
5
|
+
import { RETRYABLE_COUNT_OUTCOMES, exceedsRequestLimit, plausibleSample, shouldCountTokens } from "./count-tokens.js";
|
|
6
6
|
import { approxTokensFromBytes } from "./reqlog.js";
|
|
7
|
+
import { bodyImages, rememberImages } from "./image-tokens.js";
|
|
7
8
|
import { conservativeBodyTokens } from "./token-estimate.js";
|
|
8
9
|
import { acceptsContextOverflow } from "./turns.js";
|
|
9
10
|
/** Output room kept free on models that accept input + max_tokens over the
|
|
@@ -29,8 +30,12 @@ export class RequestSizing {
|
|
|
29
30
|
return existing;
|
|
30
31
|
const snapshot = plausibleSample(sample) ? Object.freeze({ ...sample }) : undefined;
|
|
31
32
|
const conservativeTokens = conservativeBodyTokens(body, this.model);
|
|
32
|
-
const
|
|
33
|
-
|
|
33
|
+
const images = bodyImages(body, this.model);
|
|
34
|
+
const owned = Buffer.from(body);
|
|
35
|
+
// The same totals answer for the owned copy (reportedSample of the sent bytes).
|
|
36
|
+
rememberImages(owned, this.model, images);
|
|
37
|
+
const candidate = Object.freeze({ key, body: owned, kind, sample: snapshot,
|
|
38
|
+
estimate: Object.freeze(capByteEstimate(estimateRequestTokens(snapshot, body.length, images), conservativeTokens)),
|
|
34
39
|
conservativeTokens });
|
|
35
40
|
this.candidates.set(key, candidate);
|
|
36
41
|
return candidate;
|
|
@@ -39,6 +44,10 @@ export class RequestSizing {
|
|
|
39
44
|
excludeFallback(candidate) {
|
|
40
45
|
this.excludedFallbacks.add(candidate);
|
|
41
46
|
}
|
|
47
|
+
/** Every registered candidate planning has not excluded, in registration order. */
|
|
48
|
+
fallbacks() {
|
|
49
|
+
return [...this.candidates.values()].filter(item => !this.excludedFallbacks.has(item));
|
|
50
|
+
}
|
|
42
51
|
/** Planning and metadata consult the same exact count, else the snapshotted estimate. */
|
|
43
52
|
plan(candidate) {
|
|
44
53
|
const exact = this.counts.peek(candidate.body)?.tokens;
|
|
@@ -108,6 +117,27 @@ export class RequestSizing {
|
|
|
108
117
|
source: bytes ? "bytes" : candidate.estimate.source,
|
|
109
118
|
estimatedTokens: estimate, count };
|
|
110
119
|
}
|
|
120
|
+
/**
|
|
121
|
+
* When counting ran out of time, count again (once per request, with a
|
|
122
|
+
* fresh allowance) the smallest candidate whose count timed out, and select
|
|
123
|
+
* it if it then fits: a slow count must not refuse a body that fits
|
|
124
|
+
* (2026-10-23: an ~850k request was refused after its count timed out).
|
|
125
|
+
*/
|
|
126
|
+
async retryTimedOutCount(limits) {
|
|
127
|
+
if (!this.enabled || !this.counts.retry)
|
|
128
|
+
return undefined;
|
|
129
|
+
const timedOut = this.fallbacks().filter((item) => !this.exceedsRequestLimit(item) &&
|
|
130
|
+
RETRYABLE_COUNT_OUTCOMES.has(this.counts.peek(item.body)?.outcome ?? "success"))
|
|
131
|
+
.sort((a, b) => a.body.length - b.body.length);
|
|
132
|
+
const smallest = timedOut[0];
|
|
133
|
+
if (!smallest)
|
|
134
|
+
return undefined;
|
|
135
|
+
const count = await this.counts.retry(smallest.body);
|
|
136
|
+
if (count?.tokens === undefined)
|
|
137
|
+
return undefined;
|
|
138
|
+
const measurement = await this.measure(smallest, limits);
|
|
139
|
+
return fitsMeasured(measurement, limits) ? { candidate: smallest, measurement } : undefined;
|
|
140
|
+
}
|
|
111
141
|
/** The preferred body gets first chance; only validated registered candidates
|
|
112
142
|
* are considered afterward. Exact overflow never degrades to a byte guess. */
|
|
113
143
|
async select(preferred, limits) {
|
|
@@ -162,13 +192,29 @@ function capByteEstimate(estimate, conservativeTokens) {
|
|
|
162
192
|
return estimate;
|
|
163
193
|
return { tokens: conservativeTokens, source: "bytes" };
|
|
164
194
|
}
|
|
165
|
-
/**
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
195
|
+
/**
|
|
196
|
+
* One shared estimator for planner telemetry and request-local snapshots.
|
|
197
|
+
* Inline images (`images`, and the sample's own) are not text: their base64
|
|
198
|
+
* bytes are left out of the scaling and their visual tokens added as they are.
|
|
199
|
+
* 2026-10-23: a 295k-character PNG (420 tokens) read as ~74k tokens of text
|
|
200
|
+
* put an ~850k request at 892k and it was refused.
|
|
201
|
+
*/
|
|
202
|
+
export function estimateRequestTokens(sample, bytes, images = NO_IMAGE_TOTALS) {
|
|
203
|
+
const textBytes = Math.max(0, bytes - images.imageBytes);
|
|
204
|
+
if (!plausibleSample(sample)) {
|
|
205
|
+
return { tokens: approxTokensFromBytes(textBytes) + images.imageTokens, source: "bytes" };
|
|
206
|
+
}
|
|
207
|
+
// A sample recorded without its images may hold them as text: scale this
|
|
208
|
+
// body's images as text too (an over-estimate) rather than against it.
|
|
209
|
+
if (sample.imageBytes === undefined && images.imageBytes > 0) {
|
|
210
|
+
return estimateRequestTokens(sample, bytes);
|
|
211
|
+
}
|
|
212
|
+
const sampleBytes = Math.max(1, sample.forwardedBytes - (sample.imageBytes ?? 0));
|
|
213
|
+
const sampleTokens = Math.max(1, sample.tokens - (sample.imageTokens ?? 0));
|
|
214
|
+
const ratio = sampleTokens / sampleBytes;
|
|
215
|
+
const text = textBytes <= sampleBytes ? Math.round(textBytes * ratio) : sampleTokens +
|
|
216
|
+
Math.max(approxTokensFromBytes(textBytes - sampleBytes), Math.round((textBytes - sampleBytes) * ratio));
|
|
217
|
+
return { tokens: text + images.imageTokens, source: "reported" };
|
|
173
218
|
}
|
|
219
|
+
const NO_IMAGE_TOTALS = Object.freeze({ imageBytes: 0, imageTokens: 0 });
|
|
174
220
|
//# sourceMappingURL=request-sizing.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request-sizing.js","sourceRoot":"","sources":["../src/request-sizing.ts"],"names":[],"mappings":"AAAA;;sEAEsE;AACtE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,iBAAiB,
|
|
1
|
+
{"version":3,"file":"request-sizing.js","sourceRoot":"","sources":["../src/request-sizing.ts"],"names":[],"mappings":"AAAA;;sEAEsE;AACtE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,eAAe,EAAE,iBAAiB,EACtB,MAAM,mBAAmB,CAAC;AAC9F,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,cAAc,EAAoB,MAAM,mBAAmB,CAAC;AACjF,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEpD;uEACuE;AACvE,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAC;AAmC1C,MAAM,OAAO,aAAa;IAKK;IAA6C;IACvD;IALF,UAAU,GAAG,IAAI,GAAG,EAA4B,CAAC;IACjD,iBAAiB,GAAG,IAAI,GAAG,EAAoB,CAAC;IAEjE,6EAA6E;IAC7E,YAA6B,MAA0B,EAAmB,OAAgB,EACvE,KAAc;QADJ,WAAM,GAAN,MAAM,CAAoB;QAAmB,YAAO,GAAP,OAAO,CAAS;QACvE,UAAK,GAAL,KAAK,CAAS;IAAG,CAAC;IAErC,mFAAmF;IACnF,QAAQ,CAAC,IAAY,EAAE,IAAmB,EAAE,MAAmB;QAC7D,MAAM,GAAG,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5D,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC1C,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAC;QAC9B,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACpF,MAAM,kBAAkB,GAAG,sBAAsB,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QACpE,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5C,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,gFAAgF;QAChF,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC1C,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ;YACxE,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,qBAAqB,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,EAC1F,kBAAkB,CAAC,CAAC;YACtB,kBAAkB,EAAE,CAAC,CAAC;QACxB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QACpC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,6EAA6E;IAC7E,eAAe,CAAC,SAA2B;QACzC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACxC,CAAC;IAED,mFAAmF;IACnF,SAAS;QACP,OAAO,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IACzF,CAAC;IAED,yFAAyF;IACzF,IAAI,CAAC,SAA2B;QAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QACvD,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC;IAC1F,CAAC;IAED;4EACwE;IACxE,QAAQ,CAAC,SAA2B;QAClC,OAAO,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,SAAS;YACnE,CAAC,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC;IACzC,CAAC;IAED,+EAA+E;IAC/E,mBAAmB,CAAC,SAA2B;QAC7C,OAAO,mBAAmB,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACpD,CAAC;IAED,4EAA4E;IAC5E,SAAS,CAAC,SAA2B,EAAE,MAAoB;QACzD,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC;YACzC,UAAU,CAAC,SAAS,CAAC,kBAAkB,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC;IACrE,CAAC;IAED;oFACgF;IAChF,KAAK,CAAC,gBAAgB,CAAC,SAA2B,EAAE,MAAoB;QACtE,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,MAAM,CAAC;YAAE,OAAO;QACtG,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;IAED,gEAAgE;IAChE,yEAAyE;IACzE,cAAc,CAAC,IAAY;QACzB,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACxC,CAAC;IAED,OAAO,CAAC,SAA2B;QACjC,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,KAAK,SAAS,CAAC;IAChE,CAAC;IAED,iBAAiB,CAAC,SAA2B;QAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAClC,OAAO,IAAI,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9D,CAAC;IAED,iFAAiF;IACjF,KAAK,CAAC,OAAO,CAAC,SAA2B,EAAE,MAAoB,EAC7D,QAA6B,UAAU;QACvC,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC7C,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC3C,IAAI,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC;YAAE,OAAO;gBAC9C,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,kBAAkB,CAAC,EAAE,MAAM,EAAE,OAAO;gBACzE,eAAe,EAAE,QAAQ,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI;aACvE,CAAC;QACF,2EAA2E;QAC3E,wEAAwE;QACxE,MAAM,MAAM,GAAG,iBAAiB,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC;YAChG,CAAC,KAAK,KAAK,UAAU,IAAI,CAAC,CAAC,UAAU,CAAC,QAAQ,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;gBACrE,UAAU,CAAC,SAAS,CAAC,kBAAkB,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QACvE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,OAAO,IAAI,MAAM;YAAE,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACtF,IAAI,KAAK,EAAE,MAAM,KAAK,SAAS;YAAE,OAAO;gBACtC,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,KAAK;aACxE,CAAC;QACF,wEAAwE;QACxE,oEAAoE;QACpE,2EAA2E;QAC3E,qEAAqE;QACrE,MAAM,KAAK,GAAG,KAAK,KAAK,UAAU;YAChC,CAAC,CAAC,IAAI,CAAC,OAAO,IAAI,KAAK,KAAK,SAAS,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC;QAClF,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC,CAAC,QAAQ;YAC9D,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM;YACnD,eAAe,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IACvC,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,kBAAkB,CAAC,MAAoB;QAG3C,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK;YAAE,OAAO,SAAS,CAAC;QAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC;YAChF,wBAAwB,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,IAAI,SAAS,CAAC,CAAC;aAC/E,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACjD,MAAM,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC7B,IAAI,CAAC,QAAQ;YAAE,OAAO,SAAS,CAAC;QAChC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACrD,IAAI,KAAK,EAAE,MAAM,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QAClD,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACzD,OAAO,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9F,CAAC;IAED;kFAC8E;IAC9E,KAAK,CAAC,MAAM,CAAC,SAA2B,EAAE,MAAoB;QAG5D,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CACzD,IAAI,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3D,MAAM,IAAI,GAAG,EAAE,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;QACtD,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACnD,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,KAAK,UAAU;YAC3C,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,UAAU,CAAC,EAAE,SAAS;gBAC9D,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;YACrD,CAAC,CAAC,CAAC,SAAS,EAAE,GAAG,MAAM,CAAC,CAAC;QAC3B,KAAK,MAAM,SAAS,IAAI,OAAO,EAAE,CAAC;YAChC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YAC1D,IAAI,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC;gBAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC;QAC3E,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;CACF;AAED;;;;2DAI2D;AAC3D,MAAM,UAAU,iBAAiB,CAAC,KAAyB,EAAE,SAAkB;IAC7E,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,CAAC,CAAC;IAC3E,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IACtC,OAAO,sBAAsB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;AACxF,CAAC;AAED;kFACkF;AAClF,MAAM,UAAU,YAAY,CAC1B,WAAyE,EAAE,MAAoB;IAE/F,OAAO,CAAC,WAAW,CAAC,QAAQ,IAAI,UAAU,CAAC,WAAW,CAAC,MAAM,EAC3D,WAAW,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC;AACtE,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,cAAc,CAAC,MAAoB;IACjD,OAAO,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,aAAa,IAAI,CAAC,CAAC,EAAE,CAAC;AACnF,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,UAAU,CAAC,KAAa,EAAE,MAAoB;IAC5D,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QAChG,KAAK,GAAG,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,OAAO,CAAC;AAC5C,CAAC;AAED;;;;;GAKG;AACH,SAAS,eAAe,CAAC,QAAqB,EAAE,kBAA0B;IACxE,IAAI,QAAQ,CAAC,MAAM,KAAK,OAAO,IAAI,QAAQ,CAAC,MAAM,IAAI,kBAAkB;QAAE,OAAO,QAAQ,CAAC;IAC1F,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;AACzD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CACnC,MAA8B,EAAE,KAAa,EAAE,SAAsB,eAAe;IAEpF,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;IACzD,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7B,OAAO,EAAE,MAAM,EAAE,qBAAqB,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAC5F,CAAC;IACD,yEAAyE;IACzE,uEAAuE;IACvE,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,IAAI,MAAM,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;QAC7D,OAAO,qBAAqB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC9C,CAAC;IACD,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,cAAc,GAAG,CAAC,MAAM,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC,CAAC;IAClF,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,MAAM,CAAC,WAAW,IAAI,CAAC,CAAC,CAAC,CAAC;IAC5E,MAAM,KAAK,GAAG,YAAY,GAAG,WAAW,CAAC;IACzC,MAAM,IAAI,GAAG,SAAS,IAAI,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY;QAClF,IAAI,CAAC,GAAG,CAAC,qBAAqB,CAAC,SAAS,GAAG,WAAW,CAAC,EACrD,IAAI,CAAC,KAAK,CAAC,CAAC,SAAS,GAAG,WAAW,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;IACnD,OAAO,EAAE,MAAM,EAAE,IAAI,GAAG,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;AACnE,CAAC;AAED,MAAM,eAAe,GAAgB,MAAM,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC"}
|
package/dist/route-identity.d.ts
CHANGED
|
@@ -1,6 +1,33 @@
|
|
|
1
1
|
import { type Message } from "./turns.js";
|
|
2
|
+
/** Which identity a compressed prefix uses: a route's, or a stable prefix's. */
|
|
3
|
+
export type PrefixIdentity = "route" | "stable";
|
|
2
4
|
/** Hash each incoming message once, then reuse it across route candidates/checks. */
|
|
3
5
|
export declare function routeMessageHash(message: Message): string;
|
|
4
6
|
/** Stable prefixes span turns in which Claude can omit earlier thinking blocks. */
|
|
5
7
|
export declare function stablePrefixMessageHash(message: Message): string;
|
|
8
|
+
/** The identities a prefix stores for the messages it stands for. */
|
|
9
|
+
export declare function prefixIdentity(messages: Message[], kind: PrefixIdentity): {
|
|
10
|
+
originalPrefixHashes: string[];
|
|
11
|
+
originalMediaFreeHashes: string[];
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Whether `message` still stands where a prefix's message stood: unchanged, or the same
|
|
15
|
+
* apart from media Claude Code evicted. Past its media caps (count, and bytes in 2.1.310)
|
|
16
|
+
* Claude Code evicts the oldest images and documents from its history: a tool result's
|
|
17
|
+
* becomes a placeholder, a top-level one is dropped, an emptied message becomes the
|
|
18
|
+
* placeholder. That counts only when the message has no media left, so an attachment
|
|
19
|
+
* replaced by another never matches; a removed one is indistinguishable from eviction.
|
|
20
|
+
* Prefixes stored before media-free hashes existed match exactly only.
|
|
21
|
+
*/
|
|
22
|
+
export declare function prefixMessageMatches(message: Message, kind: PrefixIdentity, exact: string, mediaFree: string | undefined): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Whether `newer` carries everything `older` does: every message of `older` after the
|
|
25
|
+
* system prompt (whose billing line changes per call), in place and unchanged apart from
|
|
26
|
+
* media Claude Code evicted since (prefixMessageMatches). Past its media caps every new
|
|
27
|
+
* screenshot evicts an old one, so an exact comparison would never hold there. About
|
|
28
|
+
* 20 ms for a 25 MB history; each message is hashed once.
|
|
29
|
+
*/
|
|
30
|
+
export declare function extendsHistory(newer: Message[], older: Message[]): boolean;
|
|
31
|
+
/** A message's route identity without its media (Claude Code's eviction keeps it). */
|
|
32
|
+
export declare function mediaFreeMessageHash(message: Message): string;
|
|
6
33
|
//# sourceMappingURL=route-identity.d.ts.map
|