condukt 0.25.0 → 0.27.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/dist/runtimes/claude/bridge-cache.d.ts +58 -0
- package/dist/runtimes/claude/bridge-cache.d.ts.map +1 -0
- package/dist/runtimes/claude/bridge-cache.js +257 -0
- package/dist/runtimes/claude/bridge-cache.js.map +1 -0
- package/dist/runtimes/claude/claude-runtime.d.ts +30 -0
- package/dist/runtimes/claude/claude-runtime.d.ts.map +1 -0
- package/dist/runtimes/claude/claude-runtime.js +88 -0
- package/dist/runtimes/claude/claude-runtime.js.map +1 -0
- package/dist/runtimes/claude/claude-session.d.ts +154 -0
- package/dist/runtimes/claude/claude-session.d.ts.map +1 -0
- package/dist/runtimes/claude/claude-session.js +851 -0
- package/dist/runtimes/claude/claude-session.js.map +1 -0
- package/dist/runtimes/claude/config-mapper.d.ts +69 -0
- package/dist/runtimes/claude/config-mapper.d.ts.map +1 -0
- package/dist/runtimes/claude/config-mapper.js +458 -0
- package/dist/runtimes/claude/config-mapper.js.map +1 -0
- package/dist/runtimes/claude/epoch-store.d.ts +28 -0
- package/dist/runtimes/claude/epoch-store.d.ts.map +1 -0
- package/dist/runtimes/claude/epoch-store.js +199 -0
- package/dist/runtimes/claude/epoch-store.js.map +1 -0
- package/dist/runtimes/claude/fallback-runtime.d.ts +14 -0
- package/dist/runtimes/claude/fallback-runtime.d.ts.map +1 -0
- package/dist/runtimes/claude/fallback-runtime.js +64 -0
- package/dist/runtimes/claude/fallback-runtime.js.map +1 -0
- package/dist/runtimes/claude/index.d.ts +24 -0
- package/dist/runtimes/claude/index.d.ts.map +1 -0
- package/dist/runtimes/claude/index.js +61 -0
- package/dist/runtimes/claude/index.js.map +1 -0
- package/dist/runtimes/claude/message-mapper.d.ts +135 -0
- package/dist/runtimes/claude/message-mapper.d.ts.map +1 -0
- package/dist/runtimes/claude/message-mapper.js +504 -0
- package/dist/runtimes/claude/message-mapper.js.map +1 -0
- package/dist/runtimes/claude/one-shot.d.ts +48 -0
- package/dist/runtimes/claude/one-shot.d.ts.map +1 -0
- package/dist/runtimes/claude/one-shot.js +186 -0
- package/dist/runtimes/claude/one-shot.js.map +1 -0
- package/dist/runtimes/claude/protocol-bridge.d.ts +138 -0
- package/dist/runtimes/claude/protocol-bridge.d.ts.map +1 -0
- package/dist/runtimes/claude/protocol-bridge.js +1170 -0
- package/dist/runtimes/claude/protocol-bridge.js.map +1 -0
- package/dist/runtimes/claude/protocol-router.d.ts +113 -0
- package/dist/runtimes/claude/protocol-router.d.ts.map +1 -0
- package/dist/runtimes/claude/protocol-router.js +514 -0
- package/dist/runtimes/claude/protocol-router.js.map +1 -0
- package/dist/runtimes/claude/session-epoch.d.ts +156 -0
- package/dist/runtimes/claude/session-epoch.d.ts.map +1 -0
- package/dist/runtimes/claude/session-epoch.js +365 -0
- package/dist/runtimes/claude/session-epoch.js.map +1 -0
- package/dist/runtimes/claude/session-recovery.d.ts +78 -0
- package/dist/runtimes/claude/session-recovery.d.ts.map +1 -0
- package/dist/runtimes/claude/session-recovery.js +259 -0
- package/dist/runtimes/claude/session-recovery.js.map +1 -0
- package/dist/runtimes/claude/sse.d.ts +16 -0
- package/dist/runtimes/claude/sse.d.ts.map +1 -0
- package/dist/runtimes/claude/sse.js +46 -0
- package/dist/runtimes/claude/sse.js.map +1 -0
- package/dist/runtimes/claude/translate-chat.d.ts +106 -0
- package/dist/runtimes/claude/translate-chat.d.ts.map +1 -0
- package/dist/runtimes/claude/translate-chat.js +857 -0
- package/dist/runtimes/claude/translate-chat.js.map +1 -0
- package/dist/runtimes/claude/translate-responses.d.ts +76 -0
- package/dist/runtimes/claude/translate-responses.d.ts.map +1 -0
- package/dist/runtimes/claude/translate-responses.js +625 -0
- package/dist/runtimes/claude/translate-responses.js.map +1 -0
- package/dist/runtimes/claude/usage-ledger.d.ts +108 -0
- package/dist/runtimes/claude/usage-ledger.d.ts.map +1 -0
- package/dist/runtimes/claude/usage-ledger.js +189 -0
- package/dist/runtimes/claude/usage-ledger.js.map +1 -0
- package/dist/runtimes/copilot/copilot-backend.d.ts +8 -0
- package/dist/runtimes/copilot/copilot-backend.d.ts.map +1 -1
- package/dist/runtimes/copilot/sdk-backend.d.ts.map +1 -1
- package/dist/runtimes/copilot/sdk-backend.js +314 -135
- package/dist/runtimes/copilot/sdk-backend.js.map +1 -1
- package/dist/runtimes/mcp-env.d.ts +24 -0
- package/dist/runtimes/mcp-env.d.ts.map +1 -0
- package/dist/runtimes/mcp-env.js +81 -0
- package/dist/runtimes/mcp-env.js.map +1 -0
- package/dist/runtimes/mock/mock-runtime.d.ts +2 -2
- package/dist/runtimes/mock/mock-runtime.d.ts.map +1 -1
- package/dist/runtimes/mock/mock-runtime.js +38 -1
- package/dist/runtimes/mock/mock-runtime.js.map +1 -1
- package/dist/src/agent.d.ts.map +1 -1
- package/dist/src/agent.js +171 -3
- package/dist/src/agent.js.map +1 -1
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/session-recovery-policy.d.ts +19 -0
- package/dist/src/session-recovery-policy.d.ts.map +1 -0
- package/dist/src/session-recovery-policy.js +43 -0
- package/dist/src/session-recovery-policy.js.map +1 -0
- package/dist/src/types.d.ts +118 -1
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js +11 -1
- package/dist/src/types.js.map +1 -1
- package/package.json +20 -4
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session compaction epochs — reference-proxy parity (opencode.py
|
|
3
|
+
* `_epoch_*`, tests/test_session_epoch.py).
|
|
4
|
+
*
|
|
5
|
+
* A post-compaction conversation must read as a NEW session upstream
|
|
6
|
+
* (fresh routing affinity + cache namespace), and every session is
|
|
7
|
+
* era-labeled from birth (`{id}-e0`; the kill-switch restores verbatim).
|
|
8
|
+
* A frozen cache pin (cached flat while input grows) with no compaction
|
|
9
|
+
* in sight never recovers on its own, so N consecutive materially
|
|
10
|
+
* deficient frozen turns rotate a persistent `-rM` marker (superseded by
|
|
11
|
+
* the next compaction bump). The suffix advances only on shrink +
|
|
12
|
+
* novelty + calm (compaction) or on a confirmed stagnation streak, never
|
|
13
|
+
* mid-conversation otherwise.
|
|
14
|
+
*
|
|
15
|
+
* Pure logic only: no I/O, no clocks. Callers own the per-session state
|
|
16
|
+
* map, persistence, and logging.
|
|
17
|
+
*/
|
|
18
|
+
export declare const SESSION_EPOCH_DEFAULTS: {
|
|
19
|
+
/** Fire only below 60% of the tracked max. */
|
|
20
|
+
readonly ratio: 0.6;
|
|
21
|
+
/** Tracked max must reach 40K est tokens (compaction-scale only). */
|
|
22
|
+
readonly preFloor: 40000;
|
|
23
|
+
/** Shrunken request must still be 25K+ (excludes subagent-scale traffic). */
|
|
24
|
+
readonly postFloor: 25000;
|
|
25
|
+
/** Pre-shrink head steady this many consecutive turns. */
|
|
26
|
+
readonly calm: 3;
|
|
27
|
+
/** "Steady" = size within 75% of tracked max (growth counts). */
|
|
28
|
+
readonly steady: 0.75;
|
|
29
|
+
/** Adopt upward jumps only within 1.5x (rewind guard / rebase). */
|
|
30
|
+
readonly growthCap: 1.5;
|
|
31
|
+
/** Requests before another bump/rotation may fire. */
|
|
32
|
+
readonly cooldown: 5;
|
|
33
|
+
/** Bounded msgs-hash history per session (rewind guard). */
|
|
34
|
+
readonly seenMax: 64;
|
|
35
|
+
/** GC sessions unseen this long. */
|
|
36
|
+
readonly ttlMs: number;
|
|
37
|
+
/** Cached flat within ±this many tokens across turns. */
|
|
38
|
+
readonly rotateBand: 5000;
|
|
39
|
+
/** Frozen value must exceed this (cold all-zero streaks never fire). */
|
|
40
|
+
readonly rotateMinPin: 10000;
|
|
41
|
+
/** input − cached must exceed this (near-whole-prefix eras never fire). */
|
|
42
|
+
readonly rotateMinGap: 10000;
|
|
43
|
+
/** Consecutive frozen turns to arm (6th continuing turn rotates). */
|
|
44
|
+
readonly rotateStreak: 5;
|
|
45
|
+
/** input − cached at/above this takes the fast tier. */
|
|
46
|
+
readonly rotateFastGap: 25000;
|
|
47
|
+
/** Consecutive frozen turns to arm the fast tier. */
|
|
48
|
+
readonly rotateFastStreak: 3;
|
|
49
|
+
};
|
|
50
|
+
export type SessionEpochConstants = {
|
|
51
|
+
readonly [K in keyof typeof SESSION_EPOCH_DEFAULTS]: number;
|
|
52
|
+
};
|
|
53
|
+
export declare function epochConstants(overrides?: Partial<SessionEpochConstants>): SessionEpochConstants;
|
|
54
|
+
/** Per-base-session epoch + stagnation tracking state. */
|
|
55
|
+
export interface SessionEpochState {
|
|
56
|
+
epoch: number;
|
|
57
|
+
rot: number;
|
|
58
|
+
max: number;
|
|
59
|
+
calm: number;
|
|
60
|
+
seen: string[];
|
|
61
|
+
cooldown: number;
|
|
62
|
+
lastSeen: number;
|
|
63
|
+
rebaseSize: number;
|
|
64
|
+
rebaseHits: number;
|
|
65
|
+
streak: number;
|
|
66
|
+
prevIn: number | null;
|
|
67
|
+
prevCached: number | null;
|
|
68
|
+
prevSize: number | null;
|
|
69
|
+
streakHead: string | null;
|
|
70
|
+
}
|
|
71
|
+
export declare function initialEpochState(now?: number): SessionEpochState;
|
|
72
|
+
/** (size_est_tokens, msgs_hash, head) for triggers, or null on failure. */
|
|
73
|
+
export interface EpochFingerprint {
|
|
74
|
+
readonly size: number;
|
|
75
|
+
readonly msgsHash: string;
|
|
76
|
+
readonly head: string;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* `head` is the (system, tools) hash pair — stable across normal turns
|
|
80
|
+
* (messages grow; sys/tools don't), so it names the conversation phase
|
|
81
|
+
* for both novelty (compaction) and head-stability (stagnation) checks.
|
|
82
|
+
*/
|
|
83
|
+
export declare function epochFingerprint(body: unknown): EpochFingerprint | null;
|
|
84
|
+
/** Pure trigger predicate: shrink + novelty + calm (+ cooldown + floors). */
|
|
85
|
+
export declare function shouldFire(state: SessionEpochState, size: number, msgsHash: string, c: SessionEpochConstants): boolean;
|
|
86
|
+
/**
|
|
87
|
+
* Non-firing update. `max` ratchets up only within the growth cap — an
|
|
88
|
+
* abrupt multi-x jump is a rewind-to-old and adopts only if the new
|
|
89
|
+
* level persists `calm` consecutive (band-matched) turns (rebase); a
|
|
90
|
+
* one-turn excursion is abandoned on return. Small/interleaved traffic
|
|
91
|
+
* resets calm.
|
|
92
|
+
*/
|
|
93
|
+
export declare function trackLocked(state: SessionEpochState, size: number, msgsHash: string | null, c: SessionEpochConstants): void;
|
|
94
|
+
/**
|
|
95
|
+
* Pure stagnation predicate: the pin is frozen AND the freeze is
|
|
96
|
+
* material AND the turn continues the run. Shares the epoch cooldown;
|
|
97
|
+
* `gap` (previous measured input − cached) selects the tier: at/above
|
|
98
|
+
* 25K the fast tier (3-turn streak), above 10K the slow tier (5).
|
|
99
|
+
*/
|
|
100
|
+
export declare function rotationArmed(state: SessionEpochState, size: number, head: string | null, c: SessionEpochConstants): boolean;
|
|
101
|
+
/**
|
|
102
|
+
* Record a completed turn's outcome for the stagnation detector.
|
|
103
|
+
* `measured` false (estimated/failed usage) skips WITHOUT touching
|
|
104
|
+
* state — an observation gap must neither confirm nor reset the streak.
|
|
105
|
+
* Streak counts consecutive frozen turns with baseline 1 (the first
|
|
106
|
+
* observed turn adopts the head as the run baseline); any violation
|
|
107
|
+
* (cache jump, input drop, head change) restarts at 0. Never throws.
|
|
108
|
+
*/
|
|
109
|
+
export declare function noteTurn(state: SessionEpochState, body: unknown, inTokens: number, cacheTokens: number, measured: boolean, c: SessionEpochConstants, now?: number): boolean;
|
|
110
|
+
/**
|
|
111
|
+
* Exact-compaction bump (the in-process bridge observes the SDK's
|
|
112
|
+
* compact boundary; the reference proxy bumps heuristically on shrink).
|
|
113
|
+
* Mirrors the reference fire path with an unknown post-compaction body:
|
|
114
|
+
* `max` re-learns the new level, `seen` starts fresh, rotation is
|
|
115
|
+
* dropped, and the shared cooldown suppresses a duplicate heuristic
|
|
116
|
+
* fire on the immediately following shrunken request.
|
|
117
|
+
*/
|
|
118
|
+
export declare function bumpEpochOnCompaction(state: SessionEpochState, c: SessionEpochConstants, now?: number): void;
|
|
119
|
+
export interface EpochVerdict {
|
|
120
|
+
readonly effectiveSession: string;
|
|
121
|
+
readonly fired: boolean;
|
|
122
|
+
readonly rotated: boolean;
|
|
123
|
+
/**
|
|
124
|
+
* True when the request carried a usable fingerprint (state was
|
|
125
|
+
* read/tracked); false for unusable bodies, which are read-only.
|
|
126
|
+
*/
|
|
127
|
+
readonly observed: boolean;
|
|
128
|
+
/** Diagnostics for logging/metrics when fired/rotated. */
|
|
129
|
+
readonly firedDetail?: {
|
|
130
|
+
readonly prevMax: number;
|
|
131
|
+
readonly size: number;
|
|
132
|
+
readonly epoch: number;
|
|
133
|
+
};
|
|
134
|
+
readonly rotatedDetail?: {
|
|
135
|
+
readonly prevCached: number | null;
|
|
136
|
+
readonly gap: number | null;
|
|
137
|
+
readonly prevStreak: number;
|
|
138
|
+
readonly rot: number;
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
/** The single verdict point: suffixed whenever enabled, verbatim otherwise. */
|
|
142
|
+
export declare function suffixedSession(session: string, epoch: number, rot: number, enabled: boolean): string;
|
|
143
|
+
export interface ApplyEpochOptions {
|
|
144
|
+
readonly enabled: boolean;
|
|
145
|
+
readonly rotate: boolean;
|
|
146
|
+
readonly constants: SessionEpochConstants;
|
|
147
|
+
readonly now?: () => number;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Resolve the effective upstream session for one request, mutating
|
|
151
|
+
* `state`. Fail-open throughout: kill-switch off returns the verbatim
|
|
152
|
+
* session (tracking continues); unusable fingerprints return the stored
|
|
153
|
+
* epoch with zero state mutation.
|
|
154
|
+
*/
|
|
155
|
+
export declare function applySessionEpoch(base: string, state: SessionEpochState, body: unknown, opts: ApplyEpochOptions): EpochVerdict;
|
|
156
|
+
//# sourceMappingURL=session-epoch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-epoch.d.ts","sourceRoot":"","sources":["../../../runtimes/claude/session-epoch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,365 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Session compaction epochs — reference-proxy parity (opencode.py
|
|
4
|
+
* `_epoch_*`, tests/test_session_epoch.py).
|
|
5
|
+
*
|
|
6
|
+
* A post-compaction conversation must read as a NEW session upstream
|
|
7
|
+
* (fresh routing affinity + cache namespace), and every session is
|
|
8
|
+
* era-labeled from birth (`{id}-e0`; the kill-switch restores verbatim).
|
|
9
|
+
* A frozen cache pin (cached flat while input grows) with no compaction
|
|
10
|
+
* in sight never recovers on its own, so N consecutive materially
|
|
11
|
+
* deficient frozen turns rotate a persistent `-rM` marker (superseded by
|
|
12
|
+
* the next compaction bump). The suffix advances only on shrink +
|
|
13
|
+
* novelty + calm (compaction) or on a confirmed stagnation streak, never
|
|
14
|
+
* mid-conversation otherwise.
|
|
15
|
+
*
|
|
16
|
+
* Pure logic only: no I/O, no clocks. Callers own the per-session state
|
|
17
|
+
* map, persistence, and logging.
|
|
18
|
+
*/
|
|
19
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
+
exports.SESSION_EPOCH_DEFAULTS = void 0;
|
|
21
|
+
exports.epochConstants = epochConstants;
|
|
22
|
+
exports.initialEpochState = initialEpochState;
|
|
23
|
+
exports.epochFingerprint = epochFingerprint;
|
|
24
|
+
exports.shouldFire = shouldFire;
|
|
25
|
+
exports.trackLocked = trackLocked;
|
|
26
|
+
exports.rotationArmed = rotationArmed;
|
|
27
|
+
exports.noteTurn = noteTurn;
|
|
28
|
+
exports.bumpEpochOnCompaction = bumpEpochOnCompaction;
|
|
29
|
+
exports.suffixedSession = suffixedSession;
|
|
30
|
+
exports.applySessionEpoch = applySessionEpoch;
|
|
31
|
+
const node_crypto_1 = require("node:crypto");
|
|
32
|
+
const bridge_cache_1 = require("./bridge-cache");
|
|
33
|
+
const translate_chat_1 = require("./translate-chat");
|
|
34
|
+
exports.SESSION_EPOCH_DEFAULTS = {
|
|
35
|
+
/** Fire only below 60% of the tracked max. */
|
|
36
|
+
ratio: 0.6,
|
|
37
|
+
/** Tracked max must reach 40K est tokens (compaction-scale only). */
|
|
38
|
+
preFloor: 40000,
|
|
39
|
+
/** Shrunken request must still be 25K+ (excludes subagent-scale traffic). */
|
|
40
|
+
postFloor: 25000,
|
|
41
|
+
/** Pre-shrink head steady this many consecutive turns. */
|
|
42
|
+
calm: 3,
|
|
43
|
+
/** "Steady" = size within 75% of tracked max (growth counts). */
|
|
44
|
+
steady: 0.75,
|
|
45
|
+
/** Adopt upward jumps only within 1.5x (rewind guard / rebase). */
|
|
46
|
+
growthCap: 1.5,
|
|
47
|
+
/** Requests before another bump/rotation may fire. */
|
|
48
|
+
cooldown: 5,
|
|
49
|
+
/** Bounded msgs-hash history per session (rewind guard). */
|
|
50
|
+
seenMax: 64,
|
|
51
|
+
/** GC sessions unseen this long. */
|
|
52
|
+
ttlMs: 7 * 86400_000,
|
|
53
|
+
/** Cached flat within ±this many tokens across turns. */
|
|
54
|
+
rotateBand: 5000,
|
|
55
|
+
/** Frozen value must exceed this (cold all-zero streaks never fire). */
|
|
56
|
+
rotateMinPin: 10000,
|
|
57
|
+
/** input − cached must exceed this (near-whole-prefix eras never fire). */
|
|
58
|
+
rotateMinGap: 10000,
|
|
59
|
+
/** Consecutive frozen turns to arm (6th continuing turn rotates). */
|
|
60
|
+
rotateStreak: 5,
|
|
61
|
+
/** input − cached at/above this takes the fast tier. */
|
|
62
|
+
rotateFastGap: 25000,
|
|
63
|
+
/** Consecutive frozen turns to arm the fast tier. */
|
|
64
|
+
rotateFastStreak: 3,
|
|
65
|
+
};
|
|
66
|
+
function epochConstants(overrides) {
|
|
67
|
+
return { ...exports.SESSION_EPOCH_DEFAULTS, ...(overrides ?? {}) };
|
|
68
|
+
}
|
|
69
|
+
function initialEpochState(now = Date.now()) {
|
|
70
|
+
return {
|
|
71
|
+
epoch: 0,
|
|
72
|
+
rot: 0,
|
|
73
|
+
max: 0,
|
|
74
|
+
calm: 0,
|
|
75
|
+
seen: [],
|
|
76
|
+
cooldown: 0,
|
|
77
|
+
lastSeen: now,
|
|
78
|
+
rebaseSize: 0,
|
|
79
|
+
rebaseHits: 0,
|
|
80
|
+
streak: 0,
|
|
81
|
+
prevIn: null,
|
|
82
|
+
prevCached: null,
|
|
83
|
+
prevSize: null,
|
|
84
|
+
streakHead: null,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
function hash16(value) {
|
|
88
|
+
return (0, node_crypto_1.createHash)('sha256').update((0, bridge_cache_1.stableJson)(value), 'utf8').digest('hex').slice(0, 16);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* `head` is the (system, tools) hash pair — stable across normal turns
|
|
92
|
+
* (messages grow; sys/tools don't), so it names the conversation phase
|
|
93
|
+
* for both novelty (compaction) and head-stability (stagnation) checks.
|
|
94
|
+
*/
|
|
95
|
+
function epochFingerprint(body) {
|
|
96
|
+
if (!body || typeof body !== 'object' || Array.isArray(body))
|
|
97
|
+
return null;
|
|
98
|
+
const b = body;
|
|
99
|
+
if (!Array.isArray(b['messages']))
|
|
100
|
+
return null;
|
|
101
|
+
try {
|
|
102
|
+
return {
|
|
103
|
+
size: Math.max(0, Math.floor((0, translate_chat_1.estimateInputTokens)(b))),
|
|
104
|
+
msgsHash: hash16(b['messages']),
|
|
105
|
+
head: hash16([b['system'] ?? null, b['tools'] ?? null]),
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/** Pure trigger predicate: shrink + novelty + calm (+ cooldown + floors). */
|
|
113
|
+
function shouldFire(state, size, msgsHash, c) {
|
|
114
|
+
if (state.cooldown > 0)
|
|
115
|
+
return false;
|
|
116
|
+
if (state.max < c.preFloor)
|
|
117
|
+
return false;
|
|
118
|
+
if (size < c.postFloor)
|
|
119
|
+
return false;
|
|
120
|
+
if (size >= c.ratio * state.max)
|
|
121
|
+
return false;
|
|
122
|
+
if (state.seen.includes(msgsHash))
|
|
123
|
+
return false;
|
|
124
|
+
if (state.calm < c.calm)
|
|
125
|
+
return false;
|
|
126
|
+
return true;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Non-firing update. `max` ratchets up only within the growth cap — an
|
|
130
|
+
* abrupt multi-x jump is a rewind-to-old and adopts only if the new
|
|
131
|
+
* level persists `calm` consecutive (band-matched) turns (rebase); a
|
|
132
|
+
* one-turn excursion is abandoned on return. Small/interleaved traffic
|
|
133
|
+
* resets calm.
|
|
134
|
+
*/
|
|
135
|
+
function trackLocked(state, size, msgsHash, c) {
|
|
136
|
+
if (size > state.max) {
|
|
137
|
+
if (state.max === 0 || size <= c.growthCap * state.max) {
|
|
138
|
+
state.max = size;
|
|
139
|
+
state.rebaseSize = 0;
|
|
140
|
+
state.rebaseHits = 0;
|
|
141
|
+
}
|
|
142
|
+
else if (state.rebaseSize > 0 &&
|
|
143
|
+
Math.abs(size - state.rebaseSize) <= (1 - c.steady) * state.rebaseSize) {
|
|
144
|
+
state.rebaseSize = size;
|
|
145
|
+
state.rebaseHits += 1;
|
|
146
|
+
if (state.rebaseHits >= c.calm) {
|
|
147
|
+
state.max = size;
|
|
148
|
+
state.rebaseSize = 0;
|
|
149
|
+
state.rebaseHits = 0;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
state.rebaseSize = size;
|
|
154
|
+
state.rebaseHits = 1;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
state.rebaseSize = 0;
|
|
159
|
+
state.rebaseHits = 0;
|
|
160
|
+
}
|
|
161
|
+
if (msgsHash !== null && !state.seen.includes(msgsHash)) {
|
|
162
|
+
state.seen.push(msgsHash);
|
|
163
|
+
if (state.seen.length > c.seenMax)
|
|
164
|
+
state.seen.splice(0, state.seen.length - c.seenMax);
|
|
165
|
+
}
|
|
166
|
+
state.calm = size >= c.steady * state.max ? state.calm + 1 : 0;
|
|
167
|
+
if (state.cooldown > 0)
|
|
168
|
+
state.cooldown -= 1;
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Pure stagnation predicate: the pin is frozen AND the freeze is
|
|
172
|
+
* material AND the turn continues the run. Shares the epoch cooldown;
|
|
173
|
+
* `gap` (previous measured input − cached) selects the tier: at/above
|
|
174
|
+
* 25K the fast tier (3-turn streak), above 10K the slow tier (5).
|
|
175
|
+
*/
|
|
176
|
+
function rotationArmed(state, size, head, c) {
|
|
177
|
+
if (state.cooldown > 0)
|
|
178
|
+
return false;
|
|
179
|
+
const pi = state.prevIn;
|
|
180
|
+
const pc = state.prevCached;
|
|
181
|
+
if (pi === null || pc === null)
|
|
182
|
+
return false;
|
|
183
|
+
const gap = pi - pc;
|
|
184
|
+
let required;
|
|
185
|
+
if (gap >= c.rotateFastGap)
|
|
186
|
+
required = c.rotateFastStreak;
|
|
187
|
+
else if (gap > c.rotateMinGap)
|
|
188
|
+
required = c.rotateStreak;
|
|
189
|
+
else
|
|
190
|
+
return false;
|
|
191
|
+
if (state.streak < required)
|
|
192
|
+
return false;
|
|
193
|
+
if (size < c.postFloor)
|
|
194
|
+
return false;
|
|
195
|
+
if (pc < c.rotateMinPin)
|
|
196
|
+
return false;
|
|
197
|
+
if (state.prevSize === null || size <= state.prevSize)
|
|
198
|
+
return false;
|
|
199
|
+
if (head === null || head !== state.streakHead)
|
|
200
|
+
return false;
|
|
201
|
+
return true;
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Record a completed turn's outcome for the stagnation detector.
|
|
205
|
+
* `measured` false (estimated/failed usage) skips WITHOUT touching
|
|
206
|
+
* state — an observation gap must neither confirm nor reset the streak.
|
|
207
|
+
* Streak counts consecutive frozen turns with baseline 1 (the first
|
|
208
|
+
* observed turn adopts the head as the run baseline); any violation
|
|
209
|
+
* (cache jump, input drop, head change) restarts at 0. Never throws.
|
|
210
|
+
*/
|
|
211
|
+
function noteTurn(state, body, inTokens, cacheTokens, measured, c, now = Date.now()) {
|
|
212
|
+
if (!measured)
|
|
213
|
+
return false;
|
|
214
|
+
try {
|
|
215
|
+
if (!Number.isFinite(inTokens) || !Number.isFinite(cacheTokens))
|
|
216
|
+
return false;
|
|
217
|
+
const fp = epochFingerprint(body);
|
|
218
|
+
if (!fp)
|
|
219
|
+
return false;
|
|
220
|
+
state.lastSeen = now;
|
|
221
|
+
if (state.streakHead === null || fp.head !== state.streakHead) {
|
|
222
|
+
state.streakHead = fp.head;
|
|
223
|
+
state.prevIn = inTokens;
|
|
224
|
+
state.prevCached = cacheTokens;
|
|
225
|
+
state.prevSize = fp.size;
|
|
226
|
+
state.streak = 1;
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
const prevIn = state.prevIn;
|
|
230
|
+
const prevCached = state.prevCached;
|
|
231
|
+
const frozen = prevCached !== null &&
|
|
232
|
+
prevIn !== null &&
|
|
233
|
+
Math.abs(cacheTokens - prevCached) <= c.rotateBand &&
|
|
234
|
+
inTokens > prevIn;
|
|
235
|
+
state.streak = frozen ? state.streak + 1 : 0;
|
|
236
|
+
state.prevIn = inTokens;
|
|
237
|
+
state.prevCached = cacheTokens;
|
|
238
|
+
state.prevSize = fp.size;
|
|
239
|
+
}
|
|
240
|
+
return true;
|
|
241
|
+
}
|
|
242
|
+
catch {
|
|
243
|
+
return false;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Exact-compaction bump (the in-process bridge observes the SDK's
|
|
248
|
+
* compact boundary; the reference proxy bumps heuristically on shrink).
|
|
249
|
+
* Mirrors the reference fire path with an unknown post-compaction body:
|
|
250
|
+
* `max` re-learns the new level, `seen` starts fresh, rotation is
|
|
251
|
+
* dropped, and the shared cooldown suppresses a duplicate heuristic
|
|
252
|
+
* fire on the immediately following shrunken request.
|
|
253
|
+
*/
|
|
254
|
+
function bumpEpochOnCompaction(state, c, now = Date.now()) {
|
|
255
|
+
state.epoch += 1;
|
|
256
|
+
state.max = 0;
|
|
257
|
+
state.seen = [];
|
|
258
|
+
state.calm = 0;
|
|
259
|
+
state.cooldown = c.cooldown;
|
|
260
|
+
state.rebaseSize = 0;
|
|
261
|
+
state.rebaseHits = 0;
|
|
262
|
+
state.rot = 0;
|
|
263
|
+
state.streak = 0;
|
|
264
|
+
state.prevIn = null;
|
|
265
|
+
state.prevCached = null;
|
|
266
|
+
state.prevSize = null;
|
|
267
|
+
state.streakHead = null;
|
|
268
|
+
state.lastSeen = now;
|
|
269
|
+
}
|
|
270
|
+
/** The single verdict point: suffixed whenever enabled, verbatim otherwise. */
|
|
271
|
+
function suffixedSession(session, epoch, rot, enabled) {
|
|
272
|
+
if (!enabled)
|
|
273
|
+
return session;
|
|
274
|
+
let s = `${session}-e${epoch}`;
|
|
275
|
+
if (rot > 0)
|
|
276
|
+
s += `-r${rot}`;
|
|
277
|
+
return s;
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Resolve the effective upstream session for one request, mutating
|
|
281
|
+
* `state`. Fail-open throughout: kill-switch off returns the verbatim
|
|
282
|
+
* session (tracking continues); unusable fingerprints return the stored
|
|
283
|
+
* epoch with zero state mutation.
|
|
284
|
+
*/
|
|
285
|
+
function applySessionEpoch(base, state, body, opts) {
|
|
286
|
+
const c = opts.constants;
|
|
287
|
+
const now = opts.now ?? Date.now;
|
|
288
|
+
const rotateOn = opts.enabled && opts.rotate;
|
|
289
|
+
let fp = null;
|
|
290
|
+
try {
|
|
291
|
+
fp = epochFingerprint(body);
|
|
292
|
+
}
|
|
293
|
+
catch {
|
|
294
|
+
fp = null;
|
|
295
|
+
}
|
|
296
|
+
if (!fp) {
|
|
297
|
+
return {
|
|
298
|
+
effectiveSession: suffixedSession(base, state.epoch, state.rot, opts.enabled),
|
|
299
|
+
fired: false,
|
|
300
|
+
rotated: false,
|
|
301
|
+
observed: false,
|
|
302
|
+
};
|
|
303
|
+
}
|
|
304
|
+
state.lastSeen = now();
|
|
305
|
+
try {
|
|
306
|
+
if (opts.enabled && shouldFire(state, fp.size, fp.msgsHash, c)) {
|
|
307
|
+
const prevMax = state.max;
|
|
308
|
+
state.epoch += 1;
|
|
309
|
+
state.max = fp.size;
|
|
310
|
+
state.seen = [fp.msgsHash];
|
|
311
|
+
state.calm = 0;
|
|
312
|
+
state.cooldown = c.cooldown;
|
|
313
|
+
state.rebaseSize = 0;
|
|
314
|
+
state.rebaseHits = 0;
|
|
315
|
+
state.rot = 0;
|
|
316
|
+
state.streak = 0;
|
|
317
|
+
state.prevIn = null;
|
|
318
|
+
state.prevCached = null;
|
|
319
|
+
state.prevSize = null;
|
|
320
|
+
state.streakHead = null;
|
|
321
|
+
return {
|
|
322
|
+
effectiveSession: suffixedSession(base, state.epoch, state.rot, opts.enabled),
|
|
323
|
+
fired: true,
|
|
324
|
+
rotated: false,
|
|
325
|
+
observed: true,
|
|
326
|
+
firedDetail: { prevMax, size: fp.size, epoch: state.epoch },
|
|
327
|
+
};
|
|
328
|
+
}
|
|
329
|
+
if (rotateOn && rotationArmed(state, fp.size, fp.head, c)) {
|
|
330
|
+
const prevCached = state.prevCached;
|
|
331
|
+
const prevIn = state.prevIn;
|
|
332
|
+
const prevStreak = state.streak;
|
|
333
|
+
state.rot += 1;
|
|
334
|
+
state.streak = 0;
|
|
335
|
+
state.prevIn = null;
|
|
336
|
+
state.prevCached = null;
|
|
337
|
+
state.prevSize = null;
|
|
338
|
+
state.streakHead = null;
|
|
339
|
+
state.cooldown = c.cooldown;
|
|
340
|
+
return {
|
|
341
|
+
effectiveSession: suffixedSession(base, state.epoch, state.rot, opts.enabled),
|
|
342
|
+
fired: false,
|
|
343
|
+
rotated: true,
|
|
344
|
+
observed: true,
|
|
345
|
+
rotatedDetail: {
|
|
346
|
+
prevCached,
|
|
347
|
+
gap: prevIn !== null && prevCached !== null ? prevIn - prevCached : null,
|
|
348
|
+
prevStreak,
|
|
349
|
+
rot: state.rot,
|
|
350
|
+
},
|
|
351
|
+
};
|
|
352
|
+
}
|
|
353
|
+
trackLocked(state, fp.size, fp.msgsHash, c);
|
|
354
|
+
}
|
|
355
|
+
catch {
|
|
356
|
+
/* fail-open: return the stored-epoch verdict below */
|
|
357
|
+
}
|
|
358
|
+
return {
|
|
359
|
+
effectiveSession: suffixedSession(base, state.epoch, state.rot, opts.enabled),
|
|
360
|
+
fired: false,
|
|
361
|
+
rotated: false,
|
|
362
|
+
observed: true,
|
|
363
|
+
};
|
|
364
|
+
}
|
|
365
|
+
//# sourceMappingURL=session-epoch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-epoch.js","sourceRoot":"","sources":["../../../runtimes/claude/session-epoch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Same-session recovery for the Claude runtime (ADR-009, ADR-008 parity).
|
|
3
|
+
*
|
|
4
|
+
* The Claude SDK has no empty-turn primitive in string-prompt mode, so
|
|
5
|
+
* recovery here resumes the failed session and sends one fixed,
|
|
6
|
+
* task-free continuation. Everything in this module is pure so it can be
|
|
7
|
+
* unit-tested without a CLI: the session owns the loop and the events.
|
|
8
|
+
*/
|
|
9
|
+
import type { ClaudeResultOutcome } from './message-mapper';
|
|
10
|
+
/**
|
|
11
|
+
* The idempotent nudge sent after a resume. It must not repeat the original
|
|
12
|
+
* task: `resume` may already have re-run an interrupted turn on its own
|
|
13
|
+
* (`resume_reason` frames), and a second full task would duplicate work.
|
|
14
|
+
*/
|
|
15
|
+
export declare const CONTINUATION_PROMPT: string;
|
|
16
|
+
/**
|
|
17
|
+
* The reconnect step that produced an error. Mirrors the `stage` values on a
|
|
18
|
+
* `SessionRecoveryEvent` so an `exhausted` event can name what failed.
|
|
19
|
+
*/
|
|
20
|
+
export type ClaudeRecoveryStage = 'fence' | 'client' | 'resume' | 'configuration' | 'audit' | 'continuation';
|
|
21
|
+
/**
|
|
22
|
+
* A failed recovery step.
|
|
23
|
+
*
|
|
24
|
+
* `fatal` marks steps whose failure cannot change its answer on a retry: the
|
|
25
|
+
* resumed session reported a different id than the one asked for, or the CLI
|
|
26
|
+
* refused the required permission mode. Every other step is retried until
|
|
27
|
+
* the continuation count or the recovery budget runs out.
|
|
28
|
+
*/
|
|
29
|
+
export declare class ClaudeResumeAttemptError extends Error {
|
|
30
|
+
readonly stage: ClaudeRecoveryStage;
|
|
31
|
+
readonly fatal: boolean;
|
|
32
|
+
constructor(stage: ClaudeRecoveryStage, message: string, fatal: boolean, options?: {
|
|
33
|
+
cause?: unknown;
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
export declare function toResumeAttemptError(value: unknown, stage: ClaudeRecoveryStage): ClaudeResumeAttemptError;
|
|
37
|
+
/** The CLI accepted the prompt but the query stream ended with no result. */
|
|
38
|
+
export declare class ClaudeStreamEndedError extends Error {
|
|
39
|
+
constructor(message?: string);
|
|
40
|
+
}
|
|
41
|
+
/** A requested configuration invariant was not applied by the CLI. */
|
|
42
|
+
export declare class ClaudeConfigurationError extends Error {
|
|
43
|
+
constructor(message: string);
|
|
44
|
+
}
|
|
45
|
+
export interface ClaudeFailureSignals {
|
|
46
|
+
/** The terminal message, when the stream produced one. */
|
|
47
|
+
readonly outcome?: ClaudeResultOutcome;
|
|
48
|
+
/** Last `assistant.error` value seen during the failed turn. */
|
|
49
|
+
readonly assistantError?: string;
|
|
50
|
+
/** A thrown stream/transport error, when the turn never produced a result. */
|
|
51
|
+
readonly error?: Error;
|
|
52
|
+
/** condukt aborted the turn; nothing is recoverable. */
|
|
53
|
+
readonly aborted: boolean;
|
|
54
|
+
}
|
|
55
|
+
export interface ClaudeFailureClassification {
|
|
56
|
+
readonly recoverable: boolean;
|
|
57
|
+
/** Human-readable evidence, also used in the `exhausted` reason. */
|
|
58
|
+
readonly reason: string;
|
|
59
|
+
readonly statusCode?: number;
|
|
60
|
+
readonly errorCode?: string;
|
|
61
|
+
readonly failureKind?: string;
|
|
62
|
+
}
|
|
63
|
+
/** `result.subtype !== 'success'` or a transient API failure flagged in-band. */
|
|
64
|
+
export declare function outcomeIsFailure(outcome: ClaudeResultOutcome): boolean;
|
|
65
|
+
/** The error a terminal result should fail the turn with. */
|
|
66
|
+
export declare function failureFromOutcome(outcome: ClaudeResultOutcome): Error;
|
|
67
|
+
/**
|
|
68
|
+
* Decides whether resuming the same session can plausibly fix a failed turn.
|
|
69
|
+
*
|
|
70
|
+
* Evidence is checked in the order the SDK makes it authoritative:
|
|
71
|
+
* `startup_failure_reason` and fatal local errors first, then the assistant
|
|
72
|
+
* error enum, then the HTTP status, then `terminal_reason`, then message
|
|
73
|
+
* text. A thrown stream error with no explicit signal is treated as a
|
|
74
|
+
* transport failure and is recoverable; a result error with no evidence is
|
|
75
|
+
* not retried blindly.
|
|
76
|
+
*/
|
|
77
|
+
export declare function classifyClaudeFailure(signals: ClaudeFailureSignals): ClaudeFailureClassification;
|
|
78
|
+
//# sourceMappingURL=session-recovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-recovery.d.ts","sourceRoot":"","sources":["../../../runtimes/claude/session-recovery.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAE5D;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,QAEmC,CAAC;AAEpE;;;GAGG;AACH,MAAM,MAAM,mBAAmB,GAC3B,OAAO,GACP,QAAQ,GACR,QAAQ,GACR,eAAe,GACf,OAAO,GACP,cAAc,CAAC;AAEnB;;;;;;;GAOG;AACH,qBAAa,wBAAyB,SAAQ,KAAK;IAE/C,QAAQ,CAAC,KAAK,EAAE,mBAAmB;IAEnC,QAAQ,CAAC,KAAK,EAAE,OAAO;gBAFd,KAAK,EAAE,mBAAmB,EACnC,OAAO,EAAE,MAAM,EACN,KAAK,EAAE,OAAO,EACvB,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAKhC;AAED,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,mBAAmB,GACzB,wBAAwB,CAM1B;AAED,6EAA6E;AAC7E,qBAAa,sBAAuB,SAAQ,KAAK;gBACnC,OAAO,SAAgD;CAIpE;AAED,sEAAsE;AACtE,qBAAa,wBAAyB,SAAQ,KAAK;gBACrC,OAAO,EAAE,MAAM;CAI5B;AAED,MAAM,WAAW,oBAAoB;IACnC,0DAA0D;IAC1D,QAAQ,CAAC,OAAO,CAAC,EAAE,mBAAmB,CAAC;IACvC,gEAAgE;IAChE,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,8EAA8E;IAC9E,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;IACvB,wDAAwD;IACxD,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,oEAAoE;IACpE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AA8DD,iFAAiF;AACjF,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAEtE;AAED,6DAA6D;AAC7D,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,mBAAmB,GAAG,KAAK,CAUtE;AAED;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,oBAAoB,GAC5B,2BAA2B,CAuH7B"}
|