@openharness/core 0.1.0 → 0.2.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/README.md +190 -6
- package/dist/agent.d.ts +1 -2
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +10 -9
- package/dist/agent.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/session.d.ts +159 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +350 -0
- package/dist/session.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -8,7 +8,7 @@ OpenHarness is an open source project based on Vercel's AI SDK that aims to prov
|
|
|
8
8
|
|
|
9
9
|
## Agents
|
|
10
10
|
|
|
11
|
-
The `Agent` class is the core primitive. An agent wraps a language model, a set of tools, and a multi-step execution loop into a
|
|
11
|
+
The `Agent` class is the core primitive. An agent wraps a language model, a set of tools, and a multi-step execution loop into a stateless executor that you can `run()` with a message history and new input.
|
|
12
12
|
|
|
13
13
|
```typescript
|
|
14
14
|
import { Agent } from "@openharness/core";
|
|
@@ -27,10 +27,14 @@ const agent = new Agent({
|
|
|
27
27
|
|
|
28
28
|
### Running an agent
|
|
29
29
|
|
|
30
|
-
`agent.run()` is an async generator that yields a stream of typed events as the agent works.
|
|
30
|
+
`agent.run()` is an async generator that takes a message history and new input, and yields a stream of typed events as the agent works. The agent is **stateless** — it doesn't accumulate messages internally. You pass the conversation history in and get the updated history back in the `done` event.
|
|
31
31
|
|
|
32
32
|
```typescript
|
|
33
|
-
|
|
33
|
+
import type { ModelMessage } from "ai";
|
|
34
|
+
|
|
35
|
+
let messages: ModelMessage[] = [];
|
|
36
|
+
|
|
37
|
+
for await (const event of agent.run(messages, "Refactor the auth module to use JWTs")) {
|
|
34
38
|
switch (event.type) {
|
|
35
39
|
case "text.delta":
|
|
36
40
|
process.stdout.write(event.text);
|
|
@@ -42,13 +46,14 @@ for await (const event of agent.run("Refactor the auth module to use JWTs")) {
|
|
|
42
46
|
console.log(`${event.toolName} finished`);
|
|
43
47
|
break;
|
|
44
48
|
case "done":
|
|
49
|
+
messages = event.messages; // capture updated history for next turn
|
|
45
50
|
console.log(`Result: ${event.result}, tokens: ${event.totalUsage.totalTokens}`);
|
|
46
51
|
break;
|
|
47
52
|
}
|
|
48
53
|
}
|
|
49
54
|
```
|
|
50
55
|
|
|
51
|
-
|
|
56
|
+
This makes it easy to build multi-turn interactions — just pass the messages from the previous `done` event into the next `run()` call. It also means you have full control over the conversation history: you can inspect it, modify it, or share it between agents.
|
|
52
57
|
|
|
53
58
|
### Events
|
|
54
59
|
|
|
@@ -84,6 +89,185 @@ The full set of events emitted by `run()`:
|
|
|
84
89
|
| `subagents` | — | Child agents available via the `task` tool (see [Subagents](#subagents)) |
|
|
85
90
|
| `mcpServers` | — | MCP servers to connect to (see [MCP Servers](#mcp-servers)) |
|
|
86
91
|
|
|
92
|
+
## Sessions
|
|
93
|
+
|
|
94
|
+
While Agent is a stateless executor, `Session` adds the statefulness and resilience you need for interactive, multi-turn conversations. It owns the message history and handles compaction, retry, persistence, and lifecycle hooks automatically.
|
|
95
|
+
|
|
96
|
+
```typescript
|
|
97
|
+
import { Session } from "@openharness/core";
|
|
98
|
+
|
|
99
|
+
const session = new Session({
|
|
100
|
+
agent,
|
|
101
|
+
contextWindow: 200_000,
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
for await (const event of session.send("Refactor the auth module")) {
|
|
105
|
+
switch (event.type) {
|
|
106
|
+
case "text.delta":
|
|
107
|
+
process.stdout.write(event.text);
|
|
108
|
+
break;
|
|
109
|
+
case "compaction.done":
|
|
110
|
+
console.log(`Compacted: ${event.tokensBefore} → ${event.tokensAfter} tokens`);
|
|
111
|
+
break;
|
|
112
|
+
case "retry":
|
|
113
|
+
console.log(`Retrying in ${event.delayMs}ms...`);
|
|
114
|
+
break;
|
|
115
|
+
case "turn.done":
|
|
116
|
+
console.log(`Turn ${event.turnNumber} complete`);
|
|
117
|
+
break;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
`session.send()` yields all the same `AgentEvent` types as `agent.run()`, plus additional session lifecycle events.
|
|
123
|
+
|
|
124
|
+
### Session configuration
|
|
125
|
+
|
|
126
|
+
| Option | Default | Description |
|
|
127
|
+
| --- | --- | --- |
|
|
128
|
+
| `agent` | (required) | The `Agent` to use for execution |
|
|
129
|
+
| `contextWindow` | — | Model context window size in tokens. Required for auto-compaction |
|
|
130
|
+
| `reservedTokens` | `min(20_000, agent.maxTokens ?? 20_000)` | Tokens reserved for output |
|
|
131
|
+
| `autoCompact` | `true` when `contextWindow` is set | Enable auto-compaction |
|
|
132
|
+
| `shouldCompact` | — | Custom overflow detection function |
|
|
133
|
+
| `compactionStrategy` | `DefaultCompactionStrategy()` | Custom compaction strategy |
|
|
134
|
+
| `retry` | — | Retry config for transient API errors |
|
|
135
|
+
| `hooks` | — | Lifecycle hooks (see [Hooks](#hooks)) |
|
|
136
|
+
| `sessionStore` | — | Pluggable persistence backend |
|
|
137
|
+
| `sessionId` | auto-generated UUID | Session identifier |
|
|
138
|
+
|
|
139
|
+
### Session events
|
|
140
|
+
|
|
141
|
+
In addition to all `AgentEvent` types, `session.send()` yields:
|
|
142
|
+
|
|
143
|
+
| Event | Description |
|
|
144
|
+
| --- | --- |
|
|
145
|
+
| `turn.start` | A new turn is starting |
|
|
146
|
+
| `turn.done` | Turn completed (includes token usage) |
|
|
147
|
+
| `compaction.start` | Compaction triggered (includes reason and token count) |
|
|
148
|
+
| `compaction.pruned` | Tool results pruned (phase 1) |
|
|
149
|
+
| `compaction.summary` | Conversation summarized (phase 2) |
|
|
150
|
+
| `compaction.done` | Compaction finished (includes before/after token counts) |
|
|
151
|
+
| `retry` | Retrying after a transient error (includes attempt count and delay) |
|
|
152
|
+
|
|
153
|
+
### Compaction
|
|
154
|
+
|
|
155
|
+
When a conversation approaches the context window limit, the session automatically compacts the message history. The default strategy works in two phases:
|
|
156
|
+
|
|
157
|
+
1. **Pruning** — replaces tool result content in older messages with `"[pruned]"`, preserving the most recent ~40K tokens of context. No LLM call needed.
|
|
158
|
+
2. **Summarization** — when pruning isn't enough, calls the model to generate a structured summary and replaces the entire history with it.
|
|
159
|
+
|
|
160
|
+
You can customize compaction at multiple levels:
|
|
161
|
+
|
|
162
|
+
```typescript
|
|
163
|
+
import { DefaultCompactionStrategy } from "@openharness/core";
|
|
164
|
+
|
|
165
|
+
// Tune the default strategy
|
|
166
|
+
const session = new Session({
|
|
167
|
+
agent,
|
|
168
|
+
contextWindow: 128_000,
|
|
169
|
+
compactionStrategy: new DefaultCompactionStrategy({
|
|
170
|
+
protectedTokens: 60_000, // protect more recent context
|
|
171
|
+
summaryModel: cheapModel, // use a cheaper model for summarization
|
|
172
|
+
}),
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
// Or replace the strategy entirely
|
|
176
|
+
const session = new Session({
|
|
177
|
+
agent,
|
|
178
|
+
contextWindow: 128_000,
|
|
179
|
+
compactionStrategy: {
|
|
180
|
+
async compact(context) {
|
|
181
|
+
// your own compaction logic
|
|
182
|
+
return { messages: [...], messagesRemoved: 0, tokensPruned: 0 };
|
|
183
|
+
},
|
|
184
|
+
},
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
// Or go fully manual
|
|
188
|
+
const session = new Session({ agent, autoCompact: false });
|
|
189
|
+
// ...later:
|
|
190
|
+
for await (const event of session.compact()) { ... }
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
### Retry
|
|
194
|
+
|
|
195
|
+
Transient API errors (429, 500, 502, 503, 504, 529, rate limits, timeouts) are retried automatically with exponential backoff and jitter. Retries only happen **before** any content has been streamed to the consumer — once the model starts producing output, the session commits to that attempt.
|
|
196
|
+
|
|
197
|
+
```typescript
|
|
198
|
+
const session = new Session({
|
|
199
|
+
agent,
|
|
200
|
+
retry: {
|
|
201
|
+
maxRetries: 5,
|
|
202
|
+
initialDelayMs: 2000,
|
|
203
|
+
maxDelayMs: 60_000,
|
|
204
|
+
isRetryable: (error) => error.message.includes("overloaded"),
|
|
205
|
+
},
|
|
206
|
+
});
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
### Hooks
|
|
210
|
+
|
|
211
|
+
Hooks let you intercept and customize the session lifecycle:
|
|
212
|
+
|
|
213
|
+
```typescript
|
|
214
|
+
const session = new Session({
|
|
215
|
+
agent,
|
|
216
|
+
hooks: {
|
|
217
|
+
// Modify messages before each LLM call
|
|
218
|
+
onBeforeSend: (messages) => {
|
|
219
|
+
return messages.filter(m => !isStale(m));
|
|
220
|
+
},
|
|
221
|
+
// Post-processing after each turn
|
|
222
|
+
onAfterResponse: ({ turnNumber, messages, usage }) => {
|
|
223
|
+
console.log(`Turn ${turnNumber}: ${usage.totalTokens} tokens`);
|
|
224
|
+
},
|
|
225
|
+
// Custom compaction prompt
|
|
226
|
+
onCompaction: (context) => {
|
|
227
|
+
return "Summarize with emphasis on code changes and file paths.";
|
|
228
|
+
},
|
|
229
|
+
// Custom error handling (return true to suppress)
|
|
230
|
+
onError: (error, attempt) => {
|
|
231
|
+
logger.warn(`Attempt ${attempt} failed: ${error.message}`);
|
|
232
|
+
},
|
|
233
|
+
},
|
|
234
|
+
});
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
### Persistence
|
|
238
|
+
|
|
239
|
+
Plug in any storage backend by implementing the `SessionStore` interface:
|
|
240
|
+
|
|
241
|
+
```typescript
|
|
242
|
+
const session = new Session({
|
|
243
|
+
agent,
|
|
244
|
+
sessionId: "user-123-conversation-1",
|
|
245
|
+
sessionStore: {
|
|
246
|
+
async load(id) { return db.get(id); },
|
|
247
|
+
async save(id, messages) { await db.set(id, messages); },
|
|
248
|
+
async delete(id) { await db.del(id); },
|
|
249
|
+
},
|
|
250
|
+
});
|
|
251
|
+
|
|
252
|
+
// Restore a previous session
|
|
253
|
+
await session.load();
|
|
254
|
+
|
|
255
|
+
// Messages are auto-saved after each turn, or save manually:
|
|
256
|
+
await session.save();
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
### Direct state access
|
|
260
|
+
|
|
261
|
+
The session's message history is directly readable and writable:
|
|
262
|
+
|
|
263
|
+
```typescript
|
|
264
|
+
// Read current state
|
|
265
|
+
console.log(session.messages.length, session.turns, session.totalUsage);
|
|
266
|
+
|
|
267
|
+
// Inject or modify messages
|
|
268
|
+
session.messages.push({ role: "user", content: "Remember: always use TypeScript." });
|
|
269
|
+
```
|
|
270
|
+
|
|
87
271
|
## Tools
|
|
88
272
|
|
|
89
273
|
Tools use the Vercel AI SDK `tool()` helper with Zod schemas. OpenHarness ships a set of built-in tools that you can use as-is, compose, or replace entirely.
|
|
@@ -241,7 +425,7 @@ const agent = new Agent({
|
|
|
241
425
|
});
|
|
242
426
|
|
|
243
427
|
// MCP connections are established lazily on first run()
|
|
244
|
-
for await (const event of agent.run("What PRs are open?")) { ... }
|
|
428
|
+
for await (const event of agent.run([], "What PRs are open?")) { ... }
|
|
245
429
|
|
|
246
430
|
// Clean up MCP connections when done
|
|
247
431
|
await agent.close();
|
|
@@ -259,7 +443,7 @@ When multiple MCP servers are configured, tools are namespaced as `serverName_to
|
|
|
259
443
|
|
|
260
444
|
## Example CLI
|
|
261
445
|
|
|
262
|
-
[`example/cli.ts`](example/cli.ts) is a fully working agent CLI that ties everything together — tool approval prompts, ora spinners, streamed output,
|
|
446
|
+
[`example/cli.ts`](example/cli.ts) is a fully working agent CLI that ties everything together — a `Session` wrapping an `Agent` with tool approval prompts, ora spinners, streamed output, live subagent display, and a `/compact` command for manual compaction. It's a good reference for how to wire up all the primitives into an interactive application.
|
|
263
447
|
|
|
264
448
|
```bash
|
|
265
449
|
# requires a .env file with OPENAI_API_KEY
|
package/dist/agent.d.ts
CHANGED
|
@@ -77,7 +77,6 @@ export declare class Agent {
|
|
|
77
77
|
/** MCP server configs — connected lazily on first run. */
|
|
78
78
|
private mcpServerConfigs?;
|
|
79
79
|
private mcpConnection;
|
|
80
|
-
private messages;
|
|
81
80
|
private cachedInstructions;
|
|
82
81
|
constructor(options: {
|
|
83
82
|
name: string;
|
|
@@ -112,7 +111,7 @@ export declare class Agent {
|
|
|
112
111
|
* Close all MCP server connections. Call this when the agent is no longer needed.
|
|
113
112
|
*/
|
|
114
113
|
close(): Promise<void>;
|
|
115
|
-
run(input: string | ModelMessage[], options?: {
|
|
114
|
+
run(history: ModelMessage[], input: string | ModelMessage[], options?: {
|
|
116
115
|
signal?: AbortSignal;
|
|
117
116
|
}): AsyncGenerator<AgentEvent>;
|
|
118
117
|
}
|
package/dist/agent.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
|
package/dist/agent.js
CHANGED
|
@@ -19,7 +19,6 @@ export class Agent {
|
|
|
19
19
|
/** MCP server configs — connected lazily on first run. */
|
|
20
20
|
mcpServerConfigs;
|
|
21
21
|
mcpConnection = null;
|
|
22
|
-
messages = [];
|
|
23
22
|
cachedInstructions = null; // null = not loaded yet
|
|
24
23
|
constructor(options) {
|
|
25
24
|
this.name = options.name;
|
|
@@ -53,12 +52,14 @@ export class Agent {
|
|
|
53
52
|
this.mcpConnection = null;
|
|
54
53
|
}
|
|
55
54
|
}
|
|
56
|
-
async *run(input, options) {
|
|
55
|
+
async *run(history, input, options) {
|
|
56
|
+
// Build messages: history + new input (Agent does NOT mutate history)
|
|
57
|
+
const messages = [...history];
|
|
57
58
|
if (typeof input === "string") {
|
|
58
|
-
|
|
59
|
+
messages.push({ role: "user", content: input });
|
|
59
60
|
}
|
|
60
61
|
else {
|
|
61
|
-
|
|
62
|
+
messages.push(...input);
|
|
62
63
|
}
|
|
63
64
|
// Load AGENTS.md once per agent lifetime
|
|
64
65
|
if (this.instructions && this.cachedInstructions === null) {
|
|
@@ -83,7 +84,7 @@ export class Agent {
|
|
|
83
84
|
const stream = streamText({
|
|
84
85
|
model: this.model,
|
|
85
86
|
system,
|
|
86
|
-
messages
|
|
87
|
+
messages,
|
|
87
88
|
tools,
|
|
88
89
|
stopWhen: stepCountIs(this.maxSteps),
|
|
89
90
|
temperature: this.temperature,
|
|
@@ -167,11 +168,11 @@ export class Agent {
|
|
|
167
168
|
? "error"
|
|
168
169
|
: "stopped";
|
|
169
170
|
const response = await stream.response;
|
|
170
|
-
|
|
171
|
+
messages.push(...response.messages);
|
|
171
172
|
yield {
|
|
172
173
|
type: "done",
|
|
173
174
|
result,
|
|
174
|
-
messages
|
|
175
|
+
messages,
|
|
175
176
|
totalUsage: toTokenUsage(part.totalUsage),
|
|
176
177
|
};
|
|
177
178
|
break;
|
|
@@ -187,7 +188,7 @@ export class Agent {
|
|
|
187
188
|
yield {
|
|
188
189
|
type: "done",
|
|
189
190
|
result: "error",
|
|
190
|
-
messages
|
|
191
|
+
messages,
|
|
191
192
|
totalUsage: { inputTokens: undefined, outputTokens: undefined, totalTokens: undefined },
|
|
192
193
|
};
|
|
193
194
|
}
|
|
@@ -227,7 +228,7 @@ function createTaskTool(subagents, onSubagentEvent) {
|
|
|
227
228
|
// No subagents — prevent recursive nesting
|
|
228
229
|
});
|
|
229
230
|
let lastText = "";
|
|
230
|
-
for await (const event of child.run(prompt, { signal: abortSignal })) {
|
|
231
|
+
for await (const event of child.run([], prompt, { signal: abortSignal })) {
|
|
231
232
|
onSubagentEvent?.(agentName, event);
|
|
232
233
|
if (event.type === "text.done") {
|
|
233
234
|
lastText = event.text;
|
package/dist/agent.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,IAAI,EACJ,UAAU,EACV,WAAW,GAKZ,MAAM,IAAI,CAAC;AACZ,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EACL,iBAAiB,EACjB,eAAe,GAGhB,MAAM,UAAU,CAAC;AA+ClB,wEAAwE;AAExE,MAAM,OAAO,KAAK;IACP,IAAI,CAAS;IACb,WAAW,CAAU;IACrB,KAAK,CAAgB;IACrB,YAAY,CAAU;IACtB,QAAQ,CAAS;IACjB,WAAW,CAAU;IACrB,SAAS,CAAU;IACnB,YAAY,CAAU;IACtB,OAAO,CAAa;IACpB,eAAe,CAAmB;IAE3C,kDAAkD;IACzC,KAAK,CAAW;IAEzB,0DAA0D;IAClD,gBAAgB,CAAmC;IACnD,aAAa,GAAyB,IAAI,CAAC;IAE3C,
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export { Agent, ToolDeniedError, type AgentEvent, type TokenUsage, type ToolCallInfo, type ApproveFn, type SubagentEventFn, } from "./agent.js";
|
|
2
2
|
export { connectMCPServers, closeMCPClients, type MCPServerConfig, type MCPConnection, type StdioMCPServer, type HttpMCPServer, type SseMCPServer, } from "./mcp.js";
|
|
3
|
+
export { Session, DefaultCompactionStrategy, type SessionEvent, type SessionLifecycleEvent, type SessionOptions, type CompactionStrategy, type CompactionContext, type CompactionResult, type RetryConfig, type SessionHooks, type TurnInfo, type SessionStore, type CompactionCheckInfo, } from "./session.js";
|
|
3
4
|
export { findInstructions, loadInstructions } from "./instructions.js";
|
|
4
5
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,EACL,eAAe,EACf,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,SAAS,EACd,KAAK,eAAe,GACrB,MAAM,YAAY,CAAC;AAIpB,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,YAAY,GAClB,MAAM,UAAU,CAAC;AAIlB,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,EACL,eAAe,EACf,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,SAAS,EACd,KAAK,eAAe,GACrB,MAAM,YAAY,CAAC;AAIpB,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,YAAY,GAClB,MAAM,UAAU,CAAC;AAIlB,OAAO,EACL,OAAO,EACP,yBAAyB,EACzB,KAAK,YAAY,EACjB,KAAK,qBAAqB,EAC1B,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,QAAQ,EACb,KAAK,YAAY,EACjB,KAAK,mBAAmB,GACzB,MAAM,cAAc,CAAC;AAItB,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
export { Agent, ToolDeniedError, } from "./agent.js";
|
|
3
3
|
// ── MCP ─────────────────────────────────────────────────────────────
|
|
4
4
|
export { connectMCPServers, closeMCPClients, } from "./mcp.js";
|
|
5
|
+
// ── Session ─────────────────────────────────────────────────────────
|
|
6
|
+
export { Session, DefaultCompactionStrategy, } from "./session.js";
|
|
5
7
|
// ── Instructions ────────────────────────────────────────────────────
|
|
6
8
|
export { findInstructions, loadInstructions } from "./instructions.js";
|
|
7
9
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,wEAAwE;AAExE,OAAO,EACL,KAAK,EACL,eAAe,GAMhB,MAAM,YAAY,CAAC;AAEpB,uEAAuE;AAEvE,OAAO,EACL,iBAAiB,EACjB,eAAe,GAMhB,MAAM,UAAU,CAAC;AAElB,uEAAuE;AAEvE,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,wEAAwE;AAExE,OAAO,EACL,KAAK,EACL,eAAe,GAMhB,MAAM,YAAY,CAAC;AAEpB,uEAAuE;AAEvE,OAAO,EACL,iBAAiB,EACjB,eAAe,GAMhB,MAAM,UAAU,CAAC;AAElB,uEAAuE;AAEvE,OAAO,EACL,OAAO,EACP,yBAAyB,GAY1B,MAAM,cAAc,CAAC;AAEtB,uEAAuE;AAEvE,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { type LanguageModel, type ModelMessage } from "ai";
|
|
2
|
+
import { Agent, type AgentEvent, type TokenUsage } from "./agent.js";
|
|
3
|
+
export type SessionEvent = AgentEvent | SessionLifecycleEvent;
|
|
4
|
+
export type SessionLifecycleEvent = {
|
|
5
|
+
type: "turn.start";
|
|
6
|
+
turnNumber: number;
|
|
7
|
+
} | {
|
|
8
|
+
type: "turn.done";
|
|
9
|
+
turnNumber: number;
|
|
10
|
+
usage: TokenUsage;
|
|
11
|
+
} | {
|
|
12
|
+
type: "compaction.start";
|
|
13
|
+
reason: "overflow" | "manual";
|
|
14
|
+
tokensBefore: number;
|
|
15
|
+
} | {
|
|
16
|
+
type: "compaction.pruned";
|
|
17
|
+
tokensRemoved: number;
|
|
18
|
+
messagesRemoved: number;
|
|
19
|
+
} | {
|
|
20
|
+
type: "compaction.summary";
|
|
21
|
+
summary: string;
|
|
22
|
+
} | {
|
|
23
|
+
type: "compaction.done";
|
|
24
|
+
tokensBefore: number;
|
|
25
|
+
tokensAfter: number;
|
|
26
|
+
} | {
|
|
27
|
+
type: "retry";
|
|
28
|
+
attempt: number;
|
|
29
|
+
maxRetries: number;
|
|
30
|
+
delayMs: number;
|
|
31
|
+
error: Error;
|
|
32
|
+
};
|
|
33
|
+
export interface CompactionStrategy {
|
|
34
|
+
compact(context: CompactionContext): Promise<CompactionResult>;
|
|
35
|
+
}
|
|
36
|
+
export interface CompactionContext {
|
|
37
|
+
messages: ModelMessage[];
|
|
38
|
+
model: LanguageModel;
|
|
39
|
+
systemPrompt: string | undefined;
|
|
40
|
+
totalTokens: number;
|
|
41
|
+
targetTokens: number;
|
|
42
|
+
compactionPrompt?: string;
|
|
43
|
+
signal?: AbortSignal;
|
|
44
|
+
}
|
|
45
|
+
export interface CompactionResult {
|
|
46
|
+
messages: ModelMessage[];
|
|
47
|
+
summary?: string;
|
|
48
|
+
messagesRemoved: number;
|
|
49
|
+
tokensPruned: number;
|
|
50
|
+
}
|
|
51
|
+
export interface SessionStore {
|
|
52
|
+
load(sessionId: string): Promise<ModelMessage[] | undefined>;
|
|
53
|
+
save(sessionId: string, messages: ModelMessage[]): Promise<void>;
|
|
54
|
+
delete?(sessionId: string): Promise<void>;
|
|
55
|
+
}
|
|
56
|
+
export interface RetryConfig {
|
|
57
|
+
maxRetries: number;
|
|
58
|
+
initialDelayMs: number;
|
|
59
|
+
maxDelayMs: number;
|
|
60
|
+
backoffMultiplier: number;
|
|
61
|
+
isRetryable?: (error: Error) => boolean;
|
|
62
|
+
}
|
|
63
|
+
export interface SessionHooks {
|
|
64
|
+
/** Modify messages before each LLM call. */
|
|
65
|
+
onBeforeSend?: (messages: ModelMessage[]) => ModelMessage[] | Promise<ModelMessage[]>;
|
|
66
|
+
/** Called after each turn completes. */
|
|
67
|
+
onAfterResponse?: (info: TurnInfo) => void | Promise<void>;
|
|
68
|
+
/** Return a custom prompt for the compaction summarizer. */
|
|
69
|
+
onCompaction?: (context: CompactionContext) => string | undefined | Promise<string | undefined>;
|
|
70
|
+
/** Called on errors. Return true to suppress the error. */
|
|
71
|
+
onError?: (error: Error, attempt: number) => boolean | void | Promise<boolean | void>;
|
|
72
|
+
}
|
|
73
|
+
export interface TurnInfo {
|
|
74
|
+
turnNumber: number;
|
|
75
|
+
messages: ModelMessage[];
|
|
76
|
+
usage: TokenUsage;
|
|
77
|
+
}
|
|
78
|
+
export interface CompactionCheckInfo {
|
|
79
|
+
lastInputTokens: number;
|
|
80
|
+
contextWindow: number;
|
|
81
|
+
reservedTokens: number;
|
|
82
|
+
messages: ModelMessage[];
|
|
83
|
+
turnNumber: number;
|
|
84
|
+
}
|
|
85
|
+
export interface SessionOptions {
|
|
86
|
+
agent: Agent;
|
|
87
|
+
/** Model context window size in tokens. Required for auto-compaction. */
|
|
88
|
+
contextWindow?: number;
|
|
89
|
+
/** Tokens reserved for output. Default: min(20_000, agent.maxTokens ?? 20_000). */
|
|
90
|
+
reservedTokens?: number;
|
|
91
|
+
/** Enable auto-compaction. Default: true (when contextWindow is set). */
|
|
92
|
+
autoCompact?: boolean;
|
|
93
|
+
/** Custom overflow detection function. */
|
|
94
|
+
shouldCompact?: (info: CompactionCheckInfo) => boolean;
|
|
95
|
+
/** Custom compaction strategy. Default: DefaultCompactionStrategy(). */
|
|
96
|
+
compactionStrategy?: CompactionStrategy;
|
|
97
|
+
/** Retry config for transient API errors. */
|
|
98
|
+
retry?: Partial<RetryConfig>;
|
|
99
|
+
/** Lifecycle hooks. */
|
|
100
|
+
hooks?: SessionHooks;
|
|
101
|
+
/** Pluggable persistence. In-memory only when omitted. */
|
|
102
|
+
sessionStore?: SessionStore;
|
|
103
|
+
/** Session ID. Auto-generated UUID when omitted. */
|
|
104
|
+
sessionId?: string;
|
|
105
|
+
}
|
|
106
|
+
export declare class DefaultCompactionStrategy implements CompactionStrategy {
|
|
107
|
+
private protectedTokens;
|
|
108
|
+
private minPruneSavings;
|
|
109
|
+
private summaryModel?;
|
|
110
|
+
private summaryPrompt?;
|
|
111
|
+
private estimateTokens;
|
|
112
|
+
constructor(options?: {
|
|
113
|
+
/** Estimated tokens to protect at the end of conversation. Default: 40_000. */
|
|
114
|
+
protectedTokens?: number;
|
|
115
|
+
/** Minimum token savings for pruning-only compaction. Default: 20_000. */
|
|
116
|
+
minPruneSavings?: number;
|
|
117
|
+
/** Model to use for summarization. Defaults to the agent's model (from context). */
|
|
118
|
+
summaryModel?: LanguageModel;
|
|
119
|
+
/** Custom summarization prompt. Can also be set via onCompaction hook. */
|
|
120
|
+
summaryPrompt?: string;
|
|
121
|
+
/** Custom token estimator. Default: JSON.stringify(msg).length / 4. */
|
|
122
|
+
estimateTokens?: (messages: ModelMessage[]) => number;
|
|
123
|
+
});
|
|
124
|
+
compact(context: CompactionContext): Promise<CompactionResult>;
|
|
125
|
+
}
|
|
126
|
+
export declare class Session {
|
|
127
|
+
readonly agent: Agent;
|
|
128
|
+
readonly sessionId: string;
|
|
129
|
+
/** The conversation messages. Directly readable and replaceable. */
|
|
130
|
+
messages: ModelMessage[];
|
|
131
|
+
private _turns;
|
|
132
|
+
private _totalUsage;
|
|
133
|
+
private contextWindow?;
|
|
134
|
+
private reservedTokens;
|
|
135
|
+
private autoCompact;
|
|
136
|
+
private shouldCompactFn?;
|
|
137
|
+
private compactionStrategy;
|
|
138
|
+
private retryConfig;
|
|
139
|
+
private hooks;
|
|
140
|
+
private sessionStore?;
|
|
141
|
+
private lastInputTokens;
|
|
142
|
+
constructor(options: SessionOptions);
|
|
143
|
+
get turns(): number;
|
|
144
|
+
get totalUsage(): TokenUsage;
|
|
145
|
+
/** Load session from store. */
|
|
146
|
+
load(): Promise<boolean>;
|
|
147
|
+
/** Save session to store. */
|
|
148
|
+
save(): Promise<void>;
|
|
149
|
+
/** Send a message. Handles compaction + retry automatically. */
|
|
150
|
+
send(input: string | ModelMessage[], options?: {
|
|
151
|
+
signal?: AbortSignal;
|
|
152
|
+
}): AsyncGenerator<SessionEvent>;
|
|
153
|
+
/** Manually trigger compaction. */
|
|
154
|
+
compact(options?: {
|
|
155
|
+
signal?: AbortSignal;
|
|
156
|
+
}): AsyncGenerator<SessionLifecycleEvent>;
|
|
157
|
+
private shouldCompactCheck;
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"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"}
|
package/dist/session.js
ADDED
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
import { generateText } from "ai";
|
|
2
|
+
const DEFAULT_RETRY = {
|
|
3
|
+
maxRetries: 3,
|
|
4
|
+
initialDelayMs: 1000,
|
|
5
|
+
maxDelayMs: 30_000,
|
|
6
|
+
backoffMultiplier: 2,
|
|
7
|
+
};
|
|
8
|
+
// ── Default Compaction Strategy ─────────────────────────────────────
|
|
9
|
+
const DEFAULT_SUMMARY_PROMPT = `Summarize this conversation for the next agent turn:
|
|
10
|
+
1. Goal: What the user is trying to accomplish
|
|
11
|
+
2. Instructions: Key directives and constraints mentioned
|
|
12
|
+
3. Discoveries: Important findings during the conversation
|
|
13
|
+
4. Accomplished: What's been completed, files changed, actions taken
|
|
14
|
+
5. Current State: Where things stand, pending work
|
|
15
|
+
6. Relevant Context: File paths, code snippets, specific details needed to continue`;
|
|
16
|
+
export class DefaultCompactionStrategy {
|
|
17
|
+
protectedTokens;
|
|
18
|
+
minPruneSavings;
|
|
19
|
+
summaryModel;
|
|
20
|
+
summaryPrompt;
|
|
21
|
+
estimateTokens;
|
|
22
|
+
constructor(options) {
|
|
23
|
+
this.protectedTokens = options?.protectedTokens ?? 40_000;
|
|
24
|
+
this.minPruneSavings = options?.minPruneSavings ?? 20_000;
|
|
25
|
+
this.summaryModel = options?.summaryModel;
|
|
26
|
+
this.summaryPrompt = options?.summaryPrompt;
|
|
27
|
+
this.estimateTokens = options?.estimateTokens ?? defaultEstimateTokens;
|
|
28
|
+
}
|
|
29
|
+
async compact(context) {
|
|
30
|
+
// Phase 1: Pruning
|
|
31
|
+
const pruned = pruneToolResults(context.messages, this.protectedTokens, this.minPruneSavings, this.estimateTokens);
|
|
32
|
+
if (pruned.tokensSaved >= this.minPruneSavings) {
|
|
33
|
+
return {
|
|
34
|
+
messages: pruned.messages,
|
|
35
|
+
messagesRemoved: 0,
|
|
36
|
+
tokensPruned: pruned.tokensSaved,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
// Phase 2: Summarization
|
|
40
|
+
const model = this.summaryModel ?? context.model;
|
|
41
|
+
const prompt = context.compactionPrompt ?? this.summaryPrompt ?? DEFAULT_SUMMARY_PROMPT;
|
|
42
|
+
const conversationText = context.messages
|
|
43
|
+
.map((m) => `${m.role}: ${JSON.stringify(m.content)}`)
|
|
44
|
+
.join("\n");
|
|
45
|
+
const { text: summary } = await generateText({
|
|
46
|
+
model,
|
|
47
|
+
system: prompt,
|
|
48
|
+
messages: [{ role: "user", content: conversationText }],
|
|
49
|
+
abortSignal: context.signal,
|
|
50
|
+
});
|
|
51
|
+
const summaryMessages = [
|
|
52
|
+
{
|
|
53
|
+
role: "user",
|
|
54
|
+
content: `[Previous conversation summary]\n\n${summary}\n\n[The conversation continues from here]`,
|
|
55
|
+
},
|
|
56
|
+
];
|
|
57
|
+
return {
|
|
58
|
+
messages: summaryMessages,
|
|
59
|
+
summary,
|
|
60
|
+
messagesRemoved: context.messages.length - 1,
|
|
61
|
+
tokensPruned: this.estimateTokens(context.messages) - this.estimateTokens(summaryMessages),
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
function estimateMessageTokens(msg, estimator) {
|
|
66
|
+
return estimator([msg]);
|
|
67
|
+
}
|
|
68
|
+
function pruneToolResults(messages, protectedTokens, minSavings, estimateTokens) {
|
|
69
|
+
const result = structuredClone(messages);
|
|
70
|
+
let accumulated = 0;
|
|
71
|
+
let boundary = result.length;
|
|
72
|
+
// Find protection boundary (walk backward)
|
|
73
|
+
for (let i = result.length - 1; i >= 0; i--) {
|
|
74
|
+
accumulated += estimateMessageTokens(result[i], estimateTokens);
|
|
75
|
+
if (accumulated >= protectedTokens) {
|
|
76
|
+
boundary = i;
|
|
77
|
+
break;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// Prune tool results before boundary
|
|
81
|
+
let tokensSaved = 0;
|
|
82
|
+
let modified = 0;
|
|
83
|
+
for (let i = 0; i < boundary; i++) {
|
|
84
|
+
if (result[i].role === "tool") {
|
|
85
|
+
const before = estimateMessageTokens(result[i], estimateTokens);
|
|
86
|
+
const content = result[i].content;
|
|
87
|
+
if (Array.isArray(content)) {
|
|
88
|
+
result[i].content = content.map((part) => part.type === "tool-result" ? { ...part, result: "[pruned]" } : part);
|
|
89
|
+
}
|
|
90
|
+
const after = estimateMessageTokens(result[i], estimateTokens);
|
|
91
|
+
tokensSaved += before - after;
|
|
92
|
+
modified++;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
if (tokensSaved < minSavings) {
|
|
96
|
+
return { messages, tokensSaved: 0, messagesModified: 0 };
|
|
97
|
+
}
|
|
98
|
+
return { messages: result, tokensSaved, messagesModified: modified };
|
|
99
|
+
}
|
|
100
|
+
function defaultEstimateTokens(messages) {
|
|
101
|
+
return Math.ceil(JSON.stringify(messages).length / 4);
|
|
102
|
+
}
|
|
103
|
+
// ── Retry helpers ───────────────────────────────────────────────────
|
|
104
|
+
function isRetryableError(error) {
|
|
105
|
+
const msg = error.message.toLowerCase();
|
|
106
|
+
return (/429|500|502|503|504|529/.test(msg) ||
|
|
107
|
+
msg.includes("rate limit") ||
|
|
108
|
+
msg.includes("timeout") ||
|
|
109
|
+
msg.includes("econnreset") ||
|
|
110
|
+
msg.includes("overloaded"));
|
|
111
|
+
}
|
|
112
|
+
function getRetryDelay(attempt, config, error) {
|
|
113
|
+
const retryAfter = error.headers?.["retry-after"];
|
|
114
|
+
if (retryAfter)
|
|
115
|
+
return Math.min(parseInt(retryAfter) * 1000, config.maxDelayMs);
|
|
116
|
+
const base = config.initialDelayMs * config.backoffMultiplier ** attempt;
|
|
117
|
+
const jitter = Math.random() * 0.3 * base;
|
|
118
|
+
return Math.min(base + jitter, config.maxDelayMs);
|
|
119
|
+
}
|
|
120
|
+
function sleep(ms, signal) {
|
|
121
|
+
return new Promise((resolve, reject) => {
|
|
122
|
+
if (signal?.aborted) {
|
|
123
|
+
reject(signal.reason);
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
const timer = setTimeout(resolve, ms);
|
|
127
|
+
signal?.addEventListener("abort", () => {
|
|
128
|
+
clearTimeout(timer);
|
|
129
|
+
reject(signal.reason);
|
|
130
|
+
}, { once: true });
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
function addUsage(a, b) {
|
|
134
|
+
return {
|
|
135
|
+
inputTokens: (a.inputTokens ?? 0) + (b.inputTokens ?? 0),
|
|
136
|
+
outputTokens: (a.outputTokens ?? 0) + (b.outputTokens ?? 0),
|
|
137
|
+
totalTokens: (a.totalTokens ?? 0) + (b.totalTokens ?? 0),
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
// ── Session ─────────────────────────────────────────────────────────
|
|
141
|
+
export class Session {
|
|
142
|
+
agent;
|
|
143
|
+
sessionId;
|
|
144
|
+
/** The conversation messages. Directly readable and replaceable. */
|
|
145
|
+
messages = [];
|
|
146
|
+
_turns = 0;
|
|
147
|
+
_totalUsage = {
|
|
148
|
+
inputTokens: 0,
|
|
149
|
+
outputTokens: 0,
|
|
150
|
+
totalTokens: 0,
|
|
151
|
+
};
|
|
152
|
+
contextWindow;
|
|
153
|
+
reservedTokens;
|
|
154
|
+
autoCompact;
|
|
155
|
+
shouldCompactFn;
|
|
156
|
+
compactionStrategy;
|
|
157
|
+
retryConfig;
|
|
158
|
+
hooks;
|
|
159
|
+
sessionStore;
|
|
160
|
+
lastInputTokens = 0;
|
|
161
|
+
constructor(options) {
|
|
162
|
+
this.agent = options.agent;
|
|
163
|
+
this.sessionId = options.sessionId ?? crypto.randomUUID();
|
|
164
|
+
this.contextWindow = options.contextWindow;
|
|
165
|
+
this.reservedTokens =
|
|
166
|
+
options.reservedTokens ?? Math.min(20_000, options.agent.maxTokens ?? 20_000);
|
|
167
|
+
this.autoCompact = options.autoCompact ?? options.contextWindow !== undefined;
|
|
168
|
+
this.shouldCompactFn = options.shouldCompact;
|
|
169
|
+
this.compactionStrategy =
|
|
170
|
+
options.compactionStrategy ?? new DefaultCompactionStrategy();
|
|
171
|
+
this.retryConfig = { ...DEFAULT_RETRY, ...options.retry };
|
|
172
|
+
this.hooks = options.hooks ?? {};
|
|
173
|
+
this.sessionStore = options.sessionStore;
|
|
174
|
+
}
|
|
175
|
+
get turns() {
|
|
176
|
+
return this._turns;
|
|
177
|
+
}
|
|
178
|
+
get totalUsage() {
|
|
179
|
+
return this._totalUsage;
|
|
180
|
+
}
|
|
181
|
+
/** Load session from store. */
|
|
182
|
+
async load() {
|
|
183
|
+
if (!this.sessionStore)
|
|
184
|
+
return false;
|
|
185
|
+
const loaded = await this.sessionStore.load(this.sessionId);
|
|
186
|
+
if (loaded) {
|
|
187
|
+
this.messages = loaded;
|
|
188
|
+
return true;
|
|
189
|
+
}
|
|
190
|
+
return false;
|
|
191
|
+
}
|
|
192
|
+
/** Save session to store. */
|
|
193
|
+
async save() {
|
|
194
|
+
if (!this.sessionStore)
|
|
195
|
+
return;
|
|
196
|
+
await this.sessionStore.save(this.sessionId, this.messages);
|
|
197
|
+
}
|
|
198
|
+
/** Send a message. Handles compaction + retry automatically. */
|
|
199
|
+
async *send(input, options) {
|
|
200
|
+
this._turns++;
|
|
201
|
+
const turnNumber = this._turns;
|
|
202
|
+
yield { type: "turn.start", turnNumber };
|
|
203
|
+
// Auto-compaction check
|
|
204
|
+
if (this.autoCompact && this.contextWindow && this.shouldCompactCheck()) {
|
|
205
|
+
yield* this.compact({ signal: options?.signal });
|
|
206
|
+
}
|
|
207
|
+
// Hook: onBeforeSend
|
|
208
|
+
let effectiveMessages = this.messages;
|
|
209
|
+
if (this.hooks.onBeforeSend) {
|
|
210
|
+
effectiveMessages = await this.hooks.onBeforeSend([...this.messages]);
|
|
211
|
+
}
|
|
212
|
+
const snapshot = [...this.messages];
|
|
213
|
+
const { maxRetries } = this.retryConfig;
|
|
214
|
+
const isRetryable = this.retryConfig.isRetryable ?? isRetryableError;
|
|
215
|
+
let turnUsage = {
|
|
216
|
+
inputTokens: undefined,
|
|
217
|
+
outputTokens: undefined,
|
|
218
|
+
totalTokens: undefined,
|
|
219
|
+
};
|
|
220
|
+
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
221
|
+
let hasYieldedContent = false;
|
|
222
|
+
let shouldRetry = false;
|
|
223
|
+
try {
|
|
224
|
+
for await (const event of this.agent.run(effectiveMessages, input, {
|
|
225
|
+
signal: options?.signal,
|
|
226
|
+
})) {
|
|
227
|
+
if (event.type === "text.delta" || event.type === "tool.start") {
|
|
228
|
+
hasYieldedContent = true;
|
|
229
|
+
}
|
|
230
|
+
if (event.type === "step.done") {
|
|
231
|
+
this.lastInputTokens = event.usage.inputTokens ?? 0;
|
|
232
|
+
}
|
|
233
|
+
if (event.type === "error" &&
|
|
234
|
+
!hasYieldedContent &&
|
|
235
|
+
isRetryable(event.error) &&
|
|
236
|
+
attempt < maxRetries) {
|
|
237
|
+
const delayMs = getRetryDelay(attempt, this.retryConfig, event.error);
|
|
238
|
+
const suppressed = await this.hooks.onError?.(event.error, attempt);
|
|
239
|
+
yield {
|
|
240
|
+
type: "retry",
|
|
241
|
+
attempt,
|
|
242
|
+
maxRetries,
|
|
243
|
+
delayMs,
|
|
244
|
+
error: event.error,
|
|
245
|
+
};
|
|
246
|
+
this.messages = [...snapshot];
|
|
247
|
+
await sleep(delayMs, options?.signal);
|
|
248
|
+
shouldRetry = true;
|
|
249
|
+
break;
|
|
250
|
+
}
|
|
251
|
+
if (event.type === "done") {
|
|
252
|
+
this.messages = event.messages;
|
|
253
|
+
turnUsage = event.totalUsage;
|
|
254
|
+
yield event;
|
|
255
|
+
break;
|
|
256
|
+
}
|
|
257
|
+
yield event;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
catch (thrown) {
|
|
261
|
+
const error = thrown instanceof Error ? thrown : new Error(String(thrown));
|
|
262
|
+
if (!hasYieldedContent && isRetryable(error) && attempt < maxRetries) {
|
|
263
|
+
const delayMs = getRetryDelay(attempt, this.retryConfig, error);
|
|
264
|
+
await this.hooks.onError?.(error, attempt);
|
|
265
|
+
yield {
|
|
266
|
+
type: "retry",
|
|
267
|
+
attempt,
|
|
268
|
+
maxRetries,
|
|
269
|
+
delayMs,
|
|
270
|
+
error,
|
|
271
|
+
};
|
|
272
|
+
this.messages = [...snapshot];
|
|
273
|
+
await sleep(delayMs, options?.signal);
|
|
274
|
+
continue;
|
|
275
|
+
}
|
|
276
|
+
throw thrown;
|
|
277
|
+
}
|
|
278
|
+
if (shouldRetry)
|
|
279
|
+
continue;
|
|
280
|
+
break;
|
|
281
|
+
}
|
|
282
|
+
// Hook: onAfterResponse
|
|
283
|
+
if (this.hooks.onAfterResponse) {
|
|
284
|
+
await this.hooks.onAfterResponse({
|
|
285
|
+
turnNumber,
|
|
286
|
+
messages: this.messages,
|
|
287
|
+
usage: turnUsage,
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
// Persist
|
|
291
|
+
if (this.sessionStore) {
|
|
292
|
+
await this.sessionStore.save(this.sessionId, this.messages);
|
|
293
|
+
}
|
|
294
|
+
this._totalUsage = addUsage(this._totalUsage, turnUsage);
|
|
295
|
+
yield { type: "turn.done", turnNumber, usage: turnUsage };
|
|
296
|
+
}
|
|
297
|
+
/** Manually trigger compaction. */
|
|
298
|
+
async *compact(options) {
|
|
299
|
+
const reason = this.shouldCompactCheck() ? "overflow" : "manual";
|
|
300
|
+
const tokensBefore = defaultEstimateTokens(this.messages);
|
|
301
|
+
yield { type: "compaction.start", reason, tokensBefore };
|
|
302
|
+
// Get custom prompt from hook
|
|
303
|
+
const context = {
|
|
304
|
+
messages: this.messages,
|
|
305
|
+
model: this.agent.model,
|
|
306
|
+
systemPrompt: this.agent.systemPrompt,
|
|
307
|
+
totalTokens: tokensBefore,
|
|
308
|
+
targetTokens: this.contextWindow
|
|
309
|
+
? this.contextWindow - this.reservedTokens
|
|
310
|
+
: tokensBefore / 2,
|
|
311
|
+
signal: options?.signal,
|
|
312
|
+
};
|
|
313
|
+
if (this.hooks.onCompaction) {
|
|
314
|
+
const customPrompt = await this.hooks.onCompaction(context);
|
|
315
|
+
if (customPrompt) {
|
|
316
|
+
context.compactionPrompt = customPrompt;
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
const result = await this.compactionStrategy.compact(context);
|
|
320
|
+
if (result.tokensPruned > 0) {
|
|
321
|
+
yield {
|
|
322
|
+
type: "compaction.pruned",
|
|
323
|
+
tokensRemoved: result.tokensPruned,
|
|
324
|
+
messagesRemoved: result.messagesRemoved,
|
|
325
|
+
};
|
|
326
|
+
}
|
|
327
|
+
if (result.summary) {
|
|
328
|
+
yield { type: "compaction.summary", summary: result.summary };
|
|
329
|
+
}
|
|
330
|
+
this.messages = result.messages;
|
|
331
|
+
const tokensAfter = defaultEstimateTokens(this.messages);
|
|
332
|
+
yield { type: "compaction.done", tokensBefore, tokensAfter };
|
|
333
|
+
}
|
|
334
|
+
shouldCompactCheck() {
|
|
335
|
+
if (!this.contextWindow)
|
|
336
|
+
return false;
|
|
337
|
+
const info = {
|
|
338
|
+
lastInputTokens: this.lastInputTokens,
|
|
339
|
+
contextWindow: this.contextWindow,
|
|
340
|
+
reservedTokens: this.reservedTokens,
|
|
341
|
+
messages: this.messages,
|
|
342
|
+
turnNumber: this._turns,
|
|
343
|
+
};
|
|
344
|
+
if (this.shouldCompactFn) {
|
|
345
|
+
return this.shouldCompactFn(info);
|
|
346
|
+
}
|
|
347
|
+
return this.lastInputTokens >= this.contextWindow - this.reservedTokens;
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"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"}
|