@koda-sl/baker-bridge 0.39.20 → 0.39.24-dev.b4473486
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 +15 -6
- package/dist/cli.d.ts +1 -1
- package/dist/cli.js +1 -1
- package/dist/hono/agent-session.d.ts +17 -5
- package/dist/hono/agent-session.d.ts.map +1 -1
- package/dist/hono/agent-session.js +108 -38
- package/dist/hono/agent-session.js.map +1 -1
- package/dist/hono/agent-session.test.js +147 -1
- package/dist/hono/agent-session.test.js.map +1 -1
- package/dist/hono/agent.d.ts +12 -5
- package/dist/hono/agent.d.ts.map +1 -1
- package/dist/hono/agent.js +79 -29
- package/dist/hono/agent.js.map +1 -1
- package/dist/hono/agent.test.js +209 -59
- package/dist/hono/agent.test.js.map +1 -1
- package/dist/hono/bridge-job.d.ts +29 -20
- package/dist/hono/bridge-job.d.ts.map +1 -1
- package/dist/hono/bridge-job.js +199 -126
- package/dist/hono/bridge-job.js.map +1 -1
- package/dist/hono/bridge-job.test.js +296 -65
- package/dist/hono/bridge-job.test.js.map +1 -1
- package/dist/hono/session-continuity.d.ts +31 -0
- package/dist/hono/session-continuity.d.ts.map +1 -0
- package/dist/hono/session-continuity.integration.test.d.ts +2 -0
- package/dist/hono/session-continuity.integration.test.d.ts.map +1 -0
- package/dist/hono/session-continuity.integration.test.js +435 -0
- package/dist/hono/session-continuity.integration.test.js.map +1 -0
- package/dist/hono/session-continuity.js +91 -0
- package/dist/hono/session-continuity.js.map +1 -0
- package/dist/hono/session-store.d.ts +17 -3
- package/dist/hono/session-store.d.ts.map +1 -1
- package/dist/hono/session-store.js +52 -14
- package/dist/hono/session-store.js.map +1 -1
- package/package.json +6 -4
package/README.md
CHANGED
|
@@ -130,7 +130,7 @@ Convex action ──POST /message/async──▶ Bridge AgentSession
|
|
|
130
130
|
Summary.
|
|
131
131
|
- **Context source diagnostics** go to `/api/chat/context` so support can tell
|
|
132
132
|
whether a turn used `local_resume`, `rehydrated_missing_session`,
|
|
133
|
-
`rehydrated_invalid_resume`, or `
|
|
133
|
+
`rehydrated_invalid_resume`, or hit `rehydration_failed`.
|
|
134
134
|
|
|
135
135
|
## Attachment validation
|
|
136
136
|
|
|
@@ -170,9 +170,16 @@ oversized images still block the commit.
|
|
|
170
170
|
`~/.baker/relay-errors.jsonl` with the thread and turn ids for diagnosis.
|
|
171
171
|
- The session registry evicts entries idle for >24h to bound memory.
|
|
172
172
|
- Convex dispatches include a bounded rendered current-thread history snapshot.
|
|
173
|
-
The bridge uses
|
|
174
|
-
persisted transcript when the session
|
|
175
|
-
resume is retried at most once before surfacing an error.
|
|
173
|
+
The bridge uses a local clean Claude session boundary when valid, but falls
|
|
174
|
+
back to this persisted transcript when the session boundary is missing or
|
|
175
|
+
invalid; invalid resume is retried at most once before surfacing an error.
|
|
176
|
+
Session ids observed before a non-error final SDK result are treated as
|
|
177
|
+
in-progress only and are never persisted as resumable state. Session-boundary
|
|
178
|
+
save/clear mutations are fenced to active runs and reconciled by generation,
|
|
179
|
+
so stale aborts or delayed cleanup from replaced runs cannot delete a newer
|
|
180
|
+
clean boundary. Session creation and replacement are single-flight per thread,
|
|
181
|
+
so concurrent dispatches cannot split continuity across duplicate runtime
|
|
182
|
+
sessions or let a stale watchdog abort the current replacement. Prior attachment
|
|
176
183
|
metadata is rendered by Convex, capped, and counted against the same
|
|
177
184
|
deterministic history budget.
|
|
178
185
|
- Each dispatched turn carries an explicit `turnId`; bridge callbacks preserve
|
|
@@ -198,8 +205,10 @@ returned in the dispatch response besides 202.
|
|
|
198
205
|
|
|
199
206
|
- **One session per thread** — `getOrCreateSession(threadId)` ensures every
|
|
200
207
|
message on the same thread shares an `AgentSession`. Multi-turn context uses
|
|
201
|
-
`~/.baker/sessions/<threadId>.json` as the fast path
|
|
202
|
-
|
|
208
|
+
`~/.baker/sessions/<threadId>.json` as the fast path only after Bridge has
|
|
209
|
+
persisted a v2 clean Claude session boundary. Convex persisted current-thread
|
|
210
|
+
history remains the fallback when local continuity is unavailable or legacy
|
|
211
|
+
`{ "sessionId": "..." }` files are encountered.
|
|
203
212
|
- **Run-token cancellation** — each call to `sendAndStream` mints a Symbol; if
|
|
204
213
|
the symbol changes (abort, replace) the run cleans up and exits without
|
|
205
214
|
writing further. No globally-mutable abort flag.
|
package/dist/cli.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
declare const args: string[];
|
|
3
3
|
declare const command: string;
|
|
4
|
-
declare const VERSION = "0.39.
|
|
4
|
+
declare const VERSION = "0.39.24";
|
|
5
5
|
declare function printUsage(): void;
|
|
6
6
|
declare function main(): Promise<void>;
|
|
7
7
|
//# sourceMappingURL=cli.d.ts.map
|
package/dist/cli.js
CHANGED
|
@@ -8,8 +8,9 @@ export type AgentSessionExecutor = {
|
|
|
8
8
|
};
|
|
9
9
|
type AgentSessionDependencies = {
|
|
10
10
|
createExecutor(): AgentSessionExecutor;
|
|
11
|
-
complete(outcome: BridgeJobOutcome, job: BridgeJob): Promise<void>;
|
|
11
|
+
complete(outcome: BridgeJobOutcome, job: BridgeJob, runToken: symbol): Promise<void>;
|
|
12
12
|
heartbeat(job: BridgeJob): Promise<void>;
|
|
13
|
+
beforeReplace?(): Promise<void>;
|
|
13
14
|
replaceTimeoutMs?: number;
|
|
14
15
|
heartbeatIntervalMs?: number;
|
|
15
16
|
sdkWatchdogMs?: number;
|
|
@@ -21,19 +22,29 @@ export declare class AgentSession {
|
|
|
21
22
|
private readonly dependencies;
|
|
22
23
|
private readonly pendingQuestions;
|
|
23
24
|
private activeRun;
|
|
25
|
+
private continuityRun;
|
|
24
26
|
private activeAbort;
|
|
25
27
|
private streamingPromise;
|
|
26
|
-
private
|
|
28
|
+
private latestStartSequence;
|
|
29
|
+
private readonly suppressedCompletionRuns;
|
|
27
30
|
lastUsedAt: number;
|
|
28
31
|
constructor(threadId: string, dependencies: AgentSessionDependencies);
|
|
29
32
|
start(job: BridgeJob): Promise<void>;
|
|
30
|
-
abort():
|
|
33
|
+
abort(): symbol | null;
|
|
34
|
+
private drainPreviousStreamForReplacement;
|
|
35
|
+
private previousStreamTimeout;
|
|
31
36
|
answer(input: AskUserAnswer): boolean;
|
|
37
|
+
isContinuityMutationCurrent(runToken: symbol): boolean;
|
|
38
|
+
markContinuityCommitted(runToken: symbol): void;
|
|
39
|
+
private abortForReplacement;
|
|
40
|
+
private abortRun;
|
|
41
|
+
private abortCurrentRun;
|
|
32
42
|
private run;
|
|
43
|
+
private clearRunState;
|
|
33
44
|
}
|
|
34
45
|
type AgentSessionRegistryDependencies<TSession extends {
|
|
35
46
|
lastUsedAt: number;
|
|
36
|
-
abort():
|
|
47
|
+
abort(): unknown;
|
|
37
48
|
}> = {
|
|
38
49
|
createSession(threadId: string): TSession | Promise<TSession>;
|
|
39
50
|
idleTtlMs: number;
|
|
@@ -41,9 +52,10 @@ type AgentSessionRegistryDependencies<TSession extends {
|
|
|
41
52
|
};
|
|
42
53
|
export declare class AgentSessionRegistry<TSession extends {
|
|
43
54
|
lastUsedAt: number;
|
|
44
|
-
abort():
|
|
55
|
+
abort(): unknown;
|
|
45
56
|
} = AgentSession> {
|
|
46
57
|
private readonly sessions;
|
|
58
|
+
private readonly pendingSessions;
|
|
47
59
|
private readonly dependencies;
|
|
48
60
|
constructor(dependencies: AgentSessionRegistryDependencies<TSession>);
|
|
49
61
|
get(threadId: string): Promise<TSession>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-session.d.ts","sourceRoot":"","sources":["../../src/hono/agent-session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,iBAAiB,EAAE,gBAAgB,EAAmB,MAAM,iBAAiB,CAAC;AAOvG,KAAK,aAAa,GAAG;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,OAAO,CAAC,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;CACjF,CAAC;AAEF,KAAK,wBAAwB,GAAG;IAC9B,cAAc,IAAI,oBAAoB,CAAC;IACvC,QAAQ,CAAC,OAAO,EAAE,gBAAgB,EAAE,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"agent-session.d.ts","sourceRoot":"","sources":["../../src/hono/agent-session.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,9 +7,11 @@ export class AgentSession {
|
|
|
7
7
|
dependencies;
|
|
8
8
|
pendingQuestions = new Map();
|
|
9
9
|
activeRun = null;
|
|
10
|
+
continuityRun = null;
|
|
10
11
|
activeAbort = null;
|
|
11
12
|
streamingPromise = null;
|
|
12
|
-
|
|
13
|
+
latestStartSequence = 0;
|
|
14
|
+
suppressedCompletionRuns = new Set();
|
|
13
15
|
lastUsedAt;
|
|
14
16
|
constructor(threadId, dependencies) {
|
|
15
17
|
this.threadId = threadId;
|
|
@@ -17,24 +19,11 @@ export class AgentSession {
|
|
|
17
19
|
this.lastUsedAt = (dependencies.now ?? Date.now)();
|
|
18
20
|
}
|
|
19
21
|
async start(job) {
|
|
22
|
+
const startSequence = ++this.latestStartSequence;
|
|
20
23
|
if (this.streamingPromise) {
|
|
21
|
-
|
|
22
|
-
this.
|
|
23
|
-
|
|
24
|
-
try {
|
|
25
|
-
await Promise.race([
|
|
26
|
-
previousPromise,
|
|
27
|
-
new Promise((_, reject) => setTimeout(() => reject(new Error("previous stream timed out")), this.dependencies.replaceTimeoutMs ?? DEFAULT_REPLACE_TIMEOUT_MS)),
|
|
28
|
-
]);
|
|
29
|
-
}
|
|
30
|
-
catch (err) {
|
|
31
|
-
console.error(`[AgentSession] previous stream did not drain on thread ${this.threadId} — forcing reset:`, err instanceof Error ? err.message : err);
|
|
32
|
-
}
|
|
33
|
-
finally {
|
|
34
|
-
if (this.streamingPromise === previousPromise) {
|
|
35
|
-
this.streamingPromise = null;
|
|
36
|
-
}
|
|
37
|
-
this.replacingStream = false;
|
|
24
|
+
await this.drainPreviousStreamForReplacement();
|
|
25
|
+
if (startSequence !== this.latestStartSequence) {
|
|
26
|
+
return;
|
|
38
27
|
}
|
|
39
28
|
}
|
|
40
29
|
const runPromise = this.run(job);
|
|
@@ -49,15 +38,39 @@ export class AgentSession {
|
|
|
49
38
|
}
|
|
50
39
|
}
|
|
51
40
|
abort() {
|
|
52
|
-
this.
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
41
|
+
return this.abortCurrentRun();
|
|
42
|
+
}
|
|
43
|
+
async drainPreviousStreamForReplacement() {
|
|
44
|
+
const previousPromise = this.streamingPromise;
|
|
45
|
+
if (!previousPromise) {
|
|
46
|
+
return;
|
|
56
47
|
}
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
48
|
+
const continuityRunToReplace = this.continuityRun;
|
|
49
|
+
const shouldClearContinuity = continuityRunToReplace !== null;
|
|
50
|
+
if (continuityRunToReplace) {
|
|
51
|
+
this.suppressedCompletionRuns.add(continuityRunToReplace);
|
|
60
52
|
}
|
|
53
|
+
this.abortForReplacement();
|
|
54
|
+
if (shouldClearContinuity) {
|
|
55
|
+
await this.dependencies.beforeReplace?.();
|
|
56
|
+
}
|
|
57
|
+
try {
|
|
58
|
+
await Promise.race([previousPromise, this.previousStreamTimeout()]);
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
console.error(`[AgentSession] previous stream did not drain on thread ${this.threadId} — forcing reset:`, err instanceof Error ? err.message : err);
|
|
62
|
+
}
|
|
63
|
+
finally {
|
|
64
|
+
if (this.streamingPromise === previousPromise) {
|
|
65
|
+
this.streamingPromise = null;
|
|
66
|
+
}
|
|
67
|
+
if (shouldClearContinuity) {
|
|
68
|
+
await this.dependencies.beforeReplace?.();
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
previousStreamTimeout() {
|
|
73
|
+
return new Promise((_, reject) => setTimeout(() => reject(new Error("previous stream timed out")), this.dependencies.replaceTimeoutMs ?? DEFAULT_REPLACE_TIMEOUT_MS));
|
|
61
74
|
}
|
|
62
75
|
answer(input) {
|
|
63
76
|
const pending = this.pendingQuestions.get(input.toolUseId);
|
|
@@ -68,9 +81,44 @@ export class AgentSession {
|
|
|
68
81
|
this.pendingQuestions.delete(input.toolUseId);
|
|
69
82
|
return true;
|
|
70
83
|
}
|
|
84
|
+
isContinuityMutationCurrent(runToken) {
|
|
85
|
+
return this.continuityRun === runToken;
|
|
86
|
+
}
|
|
87
|
+
markContinuityCommitted(runToken) {
|
|
88
|
+
if (this.continuityRun === runToken) {
|
|
89
|
+
this.continuityRun = null;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
abortForReplacement() {
|
|
93
|
+
const abortedRun = this.abortCurrentRun();
|
|
94
|
+
if (abortedRun) {
|
|
95
|
+
this.suppressedCompletionRuns.add(abortedRun);
|
|
96
|
+
}
|
|
97
|
+
return abortedRun;
|
|
98
|
+
}
|
|
99
|
+
abortRun(runToken) {
|
|
100
|
+
if (this.activeRun !== runToken) {
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
return this.abortCurrentRun();
|
|
104
|
+
}
|
|
105
|
+
abortCurrentRun() {
|
|
106
|
+
const abortedRun = this.activeRun;
|
|
107
|
+
this.activeRun = null;
|
|
108
|
+
if (this.activeAbort) {
|
|
109
|
+
this.activeAbort.abort();
|
|
110
|
+
this.activeAbort = null;
|
|
111
|
+
}
|
|
112
|
+
for (const [id, pending] of this.pendingQuestions) {
|
|
113
|
+
this.pendingQuestions.delete(id);
|
|
114
|
+
pending.reject(new Error("AskUserQuestion aborted"));
|
|
115
|
+
}
|
|
116
|
+
return abortedRun;
|
|
117
|
+
}
|
|
71
118
|
async run(job) {
|
|
72
119
|
const runToken = Symbol("agent-run");
|
|
73
120
|
this.activeRun = runToken;
|
|
121
|
+
this.continuityRun = runToken;
|
|
74
122
|
this.lastUsedAt = (this.dependencies.now ?? Date.now)();
|
|
75
123
|
const abortController = new AbortController();
|
|
76
124
|
this.activeAbort = abortController;
|
|
@@ -82,7 +130,7 @@ export class AgentSession {
|
|
|
82
130
|
return;
|
|
83
131
|
}
|
|
84
132
|
console.error(`[AgentSession] watchdog: no SDK event for ${this.dependencies.sdkWatchdogMs ?? DEFAULT_SDK_WATCHDOG_MS}ms — aborting thread ${this.threadId}`);
|
|
85
|
-
this.
|
|
133
|
+
this.abortRun(runToken);
|
|
86
134
|
}, this.dependencies.watchdogIntervalMs ?? DEFAULT_WATCHDOG_INTERVAL_MS).unref();
|
|
87
135
|
try {
|
|
88
136
|
let outcome;
|
|
@@ -106,25 +154,35 @@ export class AgentSession {
|
|
|
106
154
|
: { kind: "cancelled", costUsd: 0 };
|
|
107
155
|
}
|
|
108
156
|
if (outcome.kind === "cancelled" || this.activeRun !== runToken) {
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
await this.dependencies.complete({ kind: "cancelled", costUsd: outcome.costUsd, model: outcome.model }, job);
|
|
157
|
+
if (!this.suppressedCompletionRuns.has(runToken)) {
|
|
158
|
+
await this.dependencies.complete({ kind: "cancelled", costUsd: outcome.costUsd, model: outcome.model }, job, runToken);
|
|
112
159
|
}
|
|
113
160
|
return;
|
|
114
161
|
}
|
|
115
|
-
await this.dependencies.complete(outcome, job);
|
|
162
|
+
await this.dependencies.complete(outcome, job, runToken);
|
|
116
163
|
}
|
|
117
164
|
finally {
|
|
118
165
|
clearInterval(heartbeat);
|
|
119
166
|
clearInterval(watchdog);
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
167
|
+
this.suppressedCompletionRuns.delete(runToken);
|
|
168
|
+
this.clearRunState(runToken, abortController);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
clearRunState(runToken, abortController) {
|
|
172
|
+
if (this.activeAbort === abortController) {
|
|
173
|
+
this.activeAbort = null;
|
|
174
|
+
}
|
|
175
|
+
if (this.activeRun === runToken) {
|
|
176
|
+
this.activeRun = null;
|
|
177
|
+
}
|
|
178
|
+
if (this.continuityRun === runToken) {
|
|
179
|
+
this.continuityRun = null;
|
|
123
180
|
}
|
|
124
181
|
}
|
|
125
182
|
}
|
|
126
183
|
export class AgentSessionRegistry {
|
|
127
184
|
sessions = new Map();
|
|
185
|
+
pendingSessions = new Map();
|
|
128
186
|
dependencies;
|
|
129
187
|
constructor(dependencies) {
|
|
130
188
|
this.dependencies = dependencies;
|
|
@@ -135,17 +193,29 @@ export class AgentSessionRegistry {
|
|
|
135
193
|
existing.lastUsedAt = (this.dependencies.now ?? Date.now)();
|
|
136
194
|
return existing;
|
|
137
195
|
}
|
|
138
|
-
const
|
|
139
|
-
|
|
140
|
-
|
|
196
|
+
const pending = this.pendingSessions.get(threadId);
|
|
197
|
+
if (pending) {
|
|
198
|
+
const session = await pending;
|
|
199
|
+
session.lastUsedAt = (this.dependencies.now ?? Date.now)();
|
|
200
|
+
return session;
|
|
201
|
+
}
|
|
202
|
+
const pendingSession = Promise.resolve(this.dependencies.createSession(threadId));
|
|
203
|
+
this.pendingSessions.set(threadId, pendingSession);
|
|
204
|
+
try {
|
|
205
|
+
const session = await pendingSession;
|
|
206
|
+
this.sessions.set(threadId, session);
|
|
207
|
+
return session;
|
|
208
|
+
}
|
|
209
|
+
finally {
|
|
210
|
+
this.pendingSessions.delete(threadId);
|
|
211
|
+
}
|
|
141
212
|
}
|
|
142
213
|
abort(threadId) {
|
|
143
214
|
const session = this.sessions.get(threadId);
|
|
144
215
|
if (!session) {
|
|
145
216
|
return false;
|
|
146
217
|
}
|
|
147
|
-
session.abort();
|
|
148
|
-
return true;
|
|
218
|
+
return Boolean(session.abort());
|
|
149
219
|
}
|
|
150
220
|
sweepIdle(now = (this.dependencies.now ?? Date.now)()) {
|
|
151
221
|
const cutoff = now - this.dependencies.idleTtlMs;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-session.js","sourceRoot":"","sources":["../../src/hono/agent-session.ts"],"names":[],"mappings":"AAEA,MAAM,0BAA0B,GAAG,MAAM,CAAC;AAC1C,MAAM,6BAA6B,GAAG,MAAM,CAAC;AAC7C,MAAM,uBAAuB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAC/C,MAAM,4BAA4B,GAAG,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"agent-session.js","sourceRoot":"","sources":["../../src/hono/agent-session.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { describe, expect, it } from "vitest";
|
|
1
|
+
import { describe, expect, it, vi } from "vitest";
|
|
2
2
|
import { AgentSession, AgentSessionRegistry } from "./agent-session.js";
|
|
3
3
|
function deferred() {
|
|
4
4
|
let resolve;
|
|
@@ -71,6 +71,130 @@ describe("AgentSession", () => {
|
|
|
71
71
|
{ turnId: "turn_2", outcome: { kind: "completed", costUsd: 0.5, model: "claude-opus-4-6" } },
|
|
72
72
|
]);
|
|
73
73
|
});
|
|
74
|
+
it("runs only the latest replacement when multiple prompts arrive before the first drain finishes", async () => {
|
|
75
|
+
const firstDrain = deferred();
|
|
76
|
+
const executedTurns = [];
|
|
77
|
+
const completions = [];
|
|
78
|
+
const session = new AgentSession("thread_1", {
|
|
79
|
+
createExecutor: () => ({
|
|
80
|
+
execute(job) {
|
|
81
|
+
executedTurns.push(job.turnId);
|
|
82
|
+
if (job.turnId === "turn_1") {
|
|
83
|
+
return firstDrain.promise;
|
|
84
|
+
}
|
|
85
|
+
return Promise.resolve({ kind: "completed", costUsd: job.turnId === "turn_2" ? 0.2 : 0.3 });
|
|
86
|
+
},
|
|
87
|
+
}),
|
|
88
|
+
complete: (outcome, job) => {
|
|
89
|
+
completions.push({ turnId: job.turnId, outcome });
|
|
90
|
+
return Promise.resolve();
|
|
91
|
+
},
|
|
92
|
+
heartbeat: () => Promise.resolve(),
|
|
93
|
+
replaceTimeoutMs: 100,
|
|
94
|
+
});
|
|
95
|
+
const first = session.start({ threadId: "thread_1", turnId: "turn_1", prompt: "first" });
|
|
96
|
+
await Promise.resolve();
|
|
97
|
+
const second = session.start({ threadId: "thread_1", turnId: "turn_2", prompt: "second" });
|
|
98
|
+
await Promise.resolve();
|
|
99
|
+
const third = session.start({ threadId: "thread_1", turnId: "turn_3", prompt: "third" });
|
|
100
|
+
await Promise.resolve();
|
|
101
|
+
firstDrain.resolve({ kind: "cancelled", costUsd: 0.1 });
|
|
102
|
+
await expect(Promise.all([first, second, third])).resolves.toEqual([undefined, undefined, undefined]);
|
|
103
|
+
expect(executedTurns).toEqual(["turn_1", "turn_3"]);
|
|
104
|
+
expect(completions).toEqual([{ turnId: "turn_3", outcome: { kind: "completed", costUsd: 0.3 } }]);
|
|
105
|
+
});
|
|
106
|
+
it("clears continuity before replacing a watchdog-aborted run that has not drained", async () => {
|
|
107
|
+
vi.useFakeTimers();
|
|
108
|
+
try {
|
|
109
|
+
const firstDrain = deferred();
|
|
110
|
+
const executedTurns = [];
|
|
111
|
+
const completions = [];
|
|
112
|
+
let beforeReplaceCalls = 0;
|
|
113
|
+
const session = new AgentSession("thread_1", {
|
|
114
|
+
createExecutor: () => ({
|
|
115
|
+
execute(job) {
|
|
116
|
+
executedTurns.push(job.turnId);
|
|
117
|
+
if (job.turnId === "turn_1") {
|
|
118
|
+
return firstDrain.promise;
|
|
119
|
+
}
|
|
120
|
+
return Promise.resolve({ kind: "completed", costUsd: 0.2 });
|
|
121
|
+
},
|
|
122
|
+
}),
|
|
123
|
+
complete: (outcome, job) => {
|
|
124
|
+
completions.push({ turnId: job.turnId, outcome });
|
|
125
|
+
return Promise.resolve();
|
|
126
|
+
},
|
|
127
|
+
heartbeat: () => Promise.resolve(),
|
|
128
|
+
beforeReplace: () => {
|
|
129
|
+
beforeReplaceCalls += 1;
|
|
130
|
+
return Promise.resolve();
|
|
131
|
+
},
|
|
132
|
+
replaceTimeoutMs: 1,
|
|
133
|
+
sdkWatchdogMs: 1,
|
|
134
|
+
watchdogIntervalMs: 1,
|
|
135
|
+
});
|
|
136
|
+
const first = session.start({ threadId: "thread_1", turnId: "turn_1", prompt: "first" });
|
|
137
|
+
await Promise.resolve();
|
|
138
|
+
await vi.advanceTimersByTimeAsync(2);
|
|
139
|
+
const replacement = session.start({ threadId: "thread_1", turnId: "turn_2", prompt: "replacement" });
|
|
140
|
+
await vi.advanceTimersByTimeAsync(1);
|
|
141
|
+
await replacement;
|
|
142
|
+
firstDrain.resolve({ kind: "cancelled", costUsd: 0.1 });
|
|
143
|
+
await first;
|
|
144
|
+
expect(executedTurns).toEqual(["turn_1", "turn_2"]);
|
|
145
|
+
expect(beforeReplaceCalls).toBeGreaterThan(0);
|
|
146
|
+
expect(completions).toEqual([{ turnId: "turn_2", outcome: { kind: "completed", costUsd: 0.2 } }]);
|
|
147
|
+
}
|
|
148
|
+
finally {
|
|
149
|
+
vi.useRealTimers();
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
it("keeps a stale watchdog from aborting the current replacement", async () => {
|
|
153
|
+
vi.useFakeTimers();
|
|
154
|
+
try {
|
|
155
|
+
const firstDrain = deferred();
|
|
156
|
+
const currentDrain = deferred();
|
|
157
|
+
const abortedTurns = [];
|
|
158
|
+
const executedTurns = [];
|
|
159
|
+
const completions = [];
|
|
160
|
+
const session = new AgentSession("thread_1", {
|
|
161
|
+
createExecutor: () => ({
|
|
162
|
+
execute(job, controls) {
|
|
163
|
+
executedTurns.push(job.turnId);
|
|
164
|
+
controls.abortSignal.addEventListener("abort", () => abortedTurns.push(job.turnId), { once: true });
|
|
165
|
+
if (job.turnId === "turn_1") {
|
|
166
|
+
return firstDrain.promise;
|
|
167
|
+
}
|
|
168
|
+
return currentDrain.promise;
|
|
169
|
+
},
|
|
170
|
+
}),
|
|
171
|
+
complete: (outcome, job) => {
|
|
172
|
+
completions.push({ turnId: job.turnId, outcome });
|
|
173
|
+
return Promise.resolve();
|
|
174
|
+
},
|
|
175
|
+
heartbeat: () => Promise.resolve(),
|
|
176
|
+
replaceTimeoutMs: 1,
|
|
177
|
+
sdkWatchdogMs: 10,
|
|
178
|
+
watchdogIntervalMs: 1,
|
|
179
|
+
});
|
|
180
|
+
const first = session.start({ threadId: "thread_1", turnId: "turn_1", prompt: "first" });
|
|
181
|
+
await Promise.resolve();
|
|
182
|
+
const replacement = session.start({ threadId: "thread_1", turnId: "turn_2", prompt: "replacement" });
|
|
183
|
+
await vi.advanceTimersByTimeAsync(1);
|
|
184
|
+
await Promise.resolve();
|
|
185
|
+
expect(executedTurns).toEqual(["turn_1", "turn_2"]);
|
|
186
|
+
await vi.advanceTimersByTimeAsync(10);
|
|
187
|
+
expect(abortedTurns).toEqual(["turn_1"]);
|
|
188
|
+
currentDrain.resolve({ kind: "completed", costUsd: 0.4 });
|
|
189
|
+
await replacement;
|
|
190
|
+
firstDrain.resolve({ kind: "cancelled", costUsd: 0.1 });
|
|
191
|
+
await first;
|
|
192
|
+
expect(completions).toEqual([{ turnId: "turn_2", outcome: { kind: "completed", costUsd: 0.4 } }]);
|
|
193
|
+
}
|
|
194
|
+
finally {
|
|
195
|
+
vi.useRealTimers();
|
|
196
|
+
}
|
|
197
|
+
});
|
|
74
198
|
it("aborts a Bridge Job when the SDK watchdog expires", async () => {
|
|
75
199
|
const completions = [];
|
|
76
200
|
const abortedTurns = [];
|
|
@@ -126,6 +250,28 @@ describe("AgentSession", () => {
|
|
|
126
250
|
});
|
|
127
251
|
});
|
|
128
252
|
describe("AgentSessionRegistry", () => {
|
|
253
|
+
it("returns the same session while first creation is still loading", async () => {
|
|
254
|
+
const creationAllowed = deferred();
|
|
255
|
+
let createCalls = 0;
|
|
256
|
+
const registry = new AgentSessionRegistry({
|
|
257
|
+
createSession: async (threadId) => {
|
|
258
|
+
createCalls += 1;
|
|
259
|
+
await creationAllowed.promise;
|
|
260
|
+
return new AgentSession(threadId, {
|
|
261
|
+
createExecutor: () => ({ execute: () => Promise.resolve({ kind: "completed", costUsd: 0 }) }),
|
|
262
|
+
complete: () => Promise.resolve(),
|
|
263
|
+
heartbeat: () => Promise.resolve(),
|
|
264
|
+
});
|
|
265
|
+
},
|
|
266
|
+
idleTtlMs: 100,
|
|
267
|
+
});
|
|
268
|
+
const first = registry.get("thread_1");
|
|
269
|
+
const second = registry.get("thread_1");
|
|
270
|
+
creationAllowed.resolve(undefined);
|
|
271
|
+
const [firstSession, secondSession] = await Promise.all([first, second]);
|
|
272
|
+
expect(createCalls).toBe(1);
|
|
273
|
+
expect(firstSession).toBe(secondSession);
|
|
274
|
+
});
|
|
129
275
|
it("evicts only sessions idle beyond the TTL", async () => {
|
|
130
276
|
let now = 1_000;
|
|
131
277
|
const registry = new AgentSessionRegistry({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-session.test.js","sourceRoot":"","sources":["../../src/hono/agent-session.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"agent-session.test.js","sourceRoot":"","sources":["../../src/hono/agent-session.test.ts"],"names":[],"mappings":"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"}
|
package/dist/hono/agent.d.ts
CHANGED
|
@@ -1,21 +1,28 @@
|
|
|
1
1
|
import type { SlashCommand } from "@anthropic-ai/claude-agent-sdk";
|
|
2
|
+
import { type ClaudeSessionBoundary } from "./session-store.ts";
|
|
2
3
|
import type { ChatAttachment, ChatChange, DispatchHistorySnapshot } from "./types.ts";
|
|
3
4
|
export declare function buildRehydratedPrompt(content: string, history?: DispatchHistorySnapshot): string;
|
|
4
5
|
export declare function isResumeSessionError(error: unknown): boolean;
|
|
5
|
-
export declare function isRecoverableToolUseConcurrencyError(error: unknown): boolean;
|
|
6
6
|
declare class BridgeRuntimeSession {
|
|
7
7
|
readonly threadId: string;
|
|
8
|
-
private
|
|
8
|
+
private boundary;
|
|
9
9
|
private model;
|
|
10
|
+
private continuityGeneration;
|
|
10
11
|
private readonly agentSession;
|
|
11
|
-
constructor(threadId: string);
|
|
12
|
+
constructor(threadId: string, initialBoundary?: ClaudeSessionBoundary);
|
|
12
13
|
get lastUsedAt(): number;
|
|
13
14
|
set lastUsedAt(value: number);
|
|
14
|
-
abort():
|
|
15
|
-
setSessionId(id: string): void;
|
|
15
|
+
abort(): boolean;
|
|
16
16
|
resolveQuestion(toolUseId: string, answers: Record<string, string>): boolean;
|
|
17
17
|
sendAndStream(content: string, attachments: ChatAttachment[] | undefined, history: DispatchHistorySnapshot | undefined, turnId: string, currentChanges?: ChatChange[]): Promise<void>;
|
|
18
18
|
private createBridgeJobExecutor;
|
|
19
|
+
private saveBoundaryForRun;
|
|
20
|
+
private clearBoundaryForRun;
|
|
21
|
+
private clearCommittedBoundary;
|
|
22
|
+
private commitBoundary;
|
|
23
|
+
private nextContinuityGeneration;
|
|
24
|
+
private persistBoundarySnapshot;
|
|
25
|
+
private reconcilePersistedBoundaryAfter;
|
|
19
26
|
private completeBridgeJobOutcome;
|
|
20
27
|
private completeWithCancel;
|
|
21
28
|
}
|