@enderfga/claw-orchestrator 7.13.0 → 7.15.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 +163 -137
- package/configs/autoloop-reviewer-prompt.md +1 -1
- package/configs/engines/README.md +45 -5
- package/configs/engines/dsh.json +17 -0
- package/configs/engines/kimi-code.json +17 -0
- package/dist/bin/acp-server.js +7 -12
- package/dist/bin/acp-server.js.map +1 -1
- package/dist/bin/cli.js +127 -67
- package/dist/bin/cli.js.map +1 -1
- package/dist/bin/mcp-server.js +2 -54
- package/dist/bin/mcp-server.js.map +1 -1
- package/dist/src/acp-server.d.ts +17 -9
- package/dist/src/acp-server.js +151 -30
- package/dist/src/acp-server.js.map +1 -1
- package/dist/src/autoloop/agent-tools.d.ts +2 -0
- package/dist/src/autoloop/agent-tools.js +7 -0
- package/dist/src/autoloop/agent-tools.js.map +1 -1
- package/dist/src/autoloop/dispatcher.d.ts +6 -0
- package/dist/src/autoloop/dispatcher.js +23 -1
- package/dist/src/autoloop/dispatcher.js.map +1 -1
- package/dist/src/autoloop/planner-tools.js +2 -0
- package/dist/src/autoloop/planner-tools.js.map +1 -1
- package/dist/src/council.d.ts +8 -0
- package/dist/src/council.js +45 -12
- package/dist/src/council.js.map +1 -1
- package/dist/src/dashboard/index.html +28 -14
- package/dist/src/embedded-server.js +34 -10
- package/dist/src/embedded-server.js.map +1 -1
- package/dist/src/engine-presets.d.ts +7 -3
- package/dist/src/engine-presets.js +39 -6
- package/dist/src/engine-presets.js.map +1 -1
- package/dist/src/engine-spawn.js +3 -1
- package/dist/src/engine-spawn.js.map +1 -1
- package/dist/src/fanout.d.ts +13 -3
- package/dist/src/fanout.js +10 -0
- package/dist/src/fanout.js.map +1 -1
- package/dist/src/inbox-manager.d.ts +9 -0
- package/dist/src/inbox-manager.js +8 -2
- package/dist/src/inbox-manager.js.map +1 -1
- package/dist/src/index.d.ts +2 -0
- package/dist/src/index.js +136 -52
- package/dist/src/index.js.map +1 -1
- package/dist/src/kernel/conditions.d.ts +1 -1
- package/dist/src/kernel/conditions.js +1 -1
- package/dist/src/kernel/engine.d.ts +28 -8
- package/dist/src/kernel/engine.js +93 -19
- package/dist/src/kernel/engine.js.map +1 -1
- package/dist/src/kernel/nodes/agent.js +2 -0
- package/dist/src/kernel/nodes/agent.js.map +1 -1
- package/dist/src/kernel/nodes/council.js +9 -4
- package/dist/src/kernel/nodes/council.js.map +1 -1
- package/dist/src/kernel/nodes/fanout.js +5 -0
- package/dist/src/kernel/nodes/fanout.js.map +1 -1
- package/dist/src/kernel/nodes/goal.d.ts +8 -1
- package/dist/src/kernel/nodes/goal.js +40 -19
- package/dist/src/kernel/nodes/goal.js.map +1 -1
- package/dist/src/kernel/nodes/subflow.js +9 -1
- package/dist/src/kernel/nodes/subflow.js.map +1 -1
- package/dist/src/kernel/nodes/ultraapp.d.ts +1 -0
- package/dist/src/kernel/nodes/ultraapp.js +1 -0
- package/dist/src/kernel/nodes/ultraapp.js.map +1 -1
- package/dist/src/kernel/nodes/verifier.js +5 -1
- package/dist/src/kernel/nodes/verifier.js.map +1 -1
- package/dist/src/kernel/projections.d.ts +1 -0
- package/dist/src/kernel/projections.js +7 -1
- package/dist/src/kernel/projections.js.map +1 -1
- package/dist/src/kernel/templates/index.d.ts +6 -3
- package/dist/src/kernel/templates/index.js +8 -3
- package/dist/src/kernel/templates/index.js.map +1 -1
- package/dist/src/kernel/types.d.ts +30 -10
- package/dist/src/kernel/types.js.map +1 -1
- package/dist/src/logger.d.ts +6 -0
- package/dist/src/logger.js +14 -0
- package/dist/src/logger.js.map +1 -1
- package/dist/src/mcp-annotations.d.ts +13 -0
- package/dist/src/mcp-annotations.js +100 -0
- package/dist/src/mcp-annotations.js.map +1 -0
- package/dist/src/models.d.ts +7 -0
- package/dist/src/models.js +9 -0
- package/dist/src/models.js.map +1 -1
- package/dist/src/openai-compat.d.ts +11 -5
- package/dist/src/openai-compat.js +55 -54
- package/dist/src/openai-compat.js.map +1 -1
- package/dist/src/persistent-acp-session.d.ts +83 -0
- package/dist/src/persistent-acp-session.js +433 -0
- package/dist/src/persistent-acp-session.js.map +1 -0
- package/dist/src/persistent-codex-app-session.d.ts +2 -0
- package/dist/src/persistent-codex-app-session.js +18 -9
- package/dist/src/persistent-codex-app-session.js.map +1 -1
- package/dist/src/persistent-codex-session.d.ts +14 -3
- package/dist/src/persistent-codex-session.js +22 -19
- package/dist/src/persistent-codex-session.js.map +1 -1
- package/dist/src/persistent-custom-session.d.ts +9 -0
- package/dist/src/persistent-custom-session.js +41 -21
- package/dist/src/persistent-custom-session.js.map +1 -1
- package/dist/src/persistent-grok-session.js +1 -1
- package/dist/src/persistent-grok-session.js.map +1 -1
- package/dist/src/run-ledger.d.ts +3 -3
- package/dist/src/session-manager.d.ts +34 -1
- package/dist/src/session-manager.js +169 -30
- package/dist/src/session-manager.js.map +1 -1
- package/dist/src/types.d.ts +63 -12
- package/dist/src/types.js +2 -0
- package/dist/src/types.js.map +1 -1
- package/dist/src/ultraapp/build.d.ts +5 -11
- package/dist/src/ultraapp/build.js +5 -11
- package/dist/src/ultraapp/build.js.map +1 -1
- package/dist/src/ultraapp/council-adapter.d.ts +5 -2
- package/dist/src/ultraapp/council-adapter.js +6 -6
- package/dist/src/ultraapp/council-adapter.js.map +1 -1
- package/dist/src/ultraapp/files.d.ts +7 -0
- package/dist/src/ultraapp/files.js +7 -1
- package/dist/src/ultraapp/files.js.map +1 -1
- package/dist/src/ultraapp/manager.d.ts +23 -3
- package/dist/src/ultraapp/manager.js +170 -72
- package/dist/src/ultraapp/manager.js.map +1 -1
- package/dist/src/ultraapp/narrator.js +1 -1
- package/dist/src/ultraapp/narrator.js.map +1 -1
- package/dist/src/ultraapp/versions.d.ts +27 -5
- package/dist/src/ultraapp/versions.js +58 -13
- package/dist/src/ultraapp/versions.js.map +1 -1
- package/openclaw.plugin.json +4 -13
- package/package.json +13 -6
- package/skills/SKILL.md +52 -24
- package/skills/references/acp.md +140 -57
- package/skills/references/autoloop.md +141 -35
- package/skills/references/claude-cli-tracking.md +9 -6
- package/skills/references/cli.md +129 -91
- package/skills/references/council.md +44 -22
- package/skills/references/dashboard.md +37 -21
- package/skills/references/getting-started.md +49 -15
- package/skills/references/inbox.md +13 -8
- package/skills/references/mcp.md +25 -17
- package/skills/references/multi-engine.md +180 -144
- package/skills/references/observability.md +90 -58
- package/skills/references/openai-compat.md +172 -82
- package/skills/references/sessions.md +101 -65
- package/skills/references/tools.md +209 -157
- package/skills/references/ultra.md +7 -7
- package/skills/references/ultraapp.md +101 -56
- package/skills/references/verification.md +112 -56
- package/skills/references/workflow.md +227 -93
- package/assets/banner.jpg +0 -0
|
@@ -0,0 +1,433 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ACP Session — drives any agent that speaks the Agent Client Protocol on stdio.
|
|
3
|
+
*
|
|
4
|
+
* `acp-server.ts` is the other half: there the orchestrator is the agent. Here
|
|
5
|
+
* it is the client, so one wrapper covers every ACP agent (`kimi acp`,
|
|
6
|
+
* `opencode acp`, a Claude Code ACP adapter, …) with no per-agent parsing. The
|
|
7
|
+
* agent process lives as long as the session; each send is one `session/prompt`.
|
|
8
|
+
*
|
|
9
|
+
* Protocol notes (`@agentclientprotocol/sdk` 1.3.0, protocol v1):
|
|
10
|
+
* - `initialize` → `session/new` (or `session/load` / `session/resume` for a
|
|
11
|
+
* stored session id) → `session/prompt` per send. The prompt's response
|
|
12
|
+
* carries the stop reason; text, tool calls and usage arrive before it as
|
|
13
|
+
* `session/update` notifications.
|
|
14
|
+
* - The client advertises no `fs` or `terminal` capability, so the agent
|
|
15
|
+
* reads, writes and runs commands with its own tools, in its own process.
|
|
16
|
+
* - `session/request_permission` is answered at once from the session's
|
|
17
|
+
* permission mode. Nothing here can put a question to a person, and an
|
|
18
|
+
* unanswered request would hold the turn until it times out.
|
|
19
|
+
*/
|
|
20
|
+
import { EventEmitter } from 'node:events';
|
|
21
|
+
import * as fs from 'node:fs';
|
|
22
|
+
import * as path from 'node:path';
|
|
23
|
+
import { Readable, Writable } from 'node:stream';
|
|
24
|
+
import * as acp from '@agentclientprotocol/sdk';
|
|
25
|
+
import { killEngineTree, spawnEngine } from './engine-spawn.js';
|
|
26
|
+
import { resolveAcpAgent } from './engine-presets.js';
|
|
27
|
+
import { resolveAlias } from './models.js';
|
|
28
|
+
import { SESSION_EVENT, MAX_HISTORY_ITEMS, DEFAULT_HISTORY_LIMIT } from './constants.js';
|
|
29
|
+
import { sanitizeSecrets } from './sanitize.js';
|
|
30
|
+
const DEFAULT_TURN_TIMEOUT_MS = 600_000;
|
|
31
|
+
/** Permission modes under which the agent may act without asking. */
|
|
32
|
+
const ALLOWING_MODES = new Set(['bypassPermissions', 'acceptEdits', 'auto', 'dontAsk']);
|
|
33
|
+
export class PersistentAcpSession extends EventEmitter {
|
|
34
|
+
options;
|
|
35
|
+
agent;
|
|
36
|
+
proc = null;
|
|
37
|
+
conn = null;
|
|
38
|
+
acpSessionId;
|
|
39
|
+
_isReady = false;
|
|
40
|
+
_isPaused = false;
|
|
41
|
+
_isBusy = false;
|
|
42
|
+
_startTime = null;
|
|
43
|
+
_history = [];
|
|
44
|
+
_requests = 0;
|
|
45
|
+
/**
|
|
46
|
+
* `systemPrompt` and `appendSystemPrompt`, waiting for the first prompt of a new
|
|
47
|
+
* session. ACP has no system-prompt channel, so they go at the top of the first
|
|
48
|
+
* message, as the one-shot engines do it — a council seat's charter travels this
|
|
49
|
+
* way. A resumed session already holds them.
|
|
50
|
+
*/
|
|
51
|
+
pendingInstructions;
|
|
52
|
+
/** The turn in flight: its text so far and how to fail it if the process dies. */
|
|
53
|
+
turnText = '';
|
|
54
|
+
turnFail = null;
|
|
55
|
+
sessionId;
|
|
56
|
+
_stats = {
|
|
57
|
+
turns: 0,
|
|
58
|
+
turnsSucceeded: 0,
|
|
59
|
+
toolCalls: 0,
|
|
60
|
+
toolErrors: 0,
|
|
61
|
+
tokensIn: 0,
|
|
62
|
+
tokensOut: 0,
|
|
63
|
+
cachedTokens: 0,
|
|
64
|
+
costUsd: 0,
|
|
65
|
+
/** True once the agent has reported a cost; the registry estimate is then never used. */
|
|
66
|
+
costReported: false,
|
|
67
|
+
contextUsed: 0,
|
|
68
|
+
contextSize: 0,
|
|
69
|
+
lastActivity: null,
|
|
70
|
+
};
|
|
71
|
+
constructor(config) {
|
|
72
|
+
super();
|
|
73
|
+
const agent = resolveAcpAgent(config.acpAgent);
|
|
74
|
+
if (!agent)
|
|
75
|
+
throw new Error("engine 'acp' needs `acpAgent`: a bundled preset id or an inline config");
|
|
76
|
+
// The agent's tools run inside the agent process; this client only sees the
|
|
77
|
+
// permission requests the agent chooses to send. Nothing here can stop a write,
|
|
78
|
+
// so a read-only session is refused rather than run writable under that label.
|
|
79
|
+
if (config.sandboxMode === 'read-only') {
|
|
80
|
+
throw new Error(`ACP agent '${agent.name}' cannot be held to sandboxMode 'read-only': its tools run inside the agent. ` +
|
|
81
|
+
"permissionMode 'plan' rejects the permission requests it sends, for agents that ask.");
|
|
82
|
+
}
|
|
83
|
+
this.agent = agent;
|
|
84
|
+
this.options = { ...config, permissionMode: config.permissionMode || 'bypassPermissions' };
|
|
85
|
+
}
|
|
86
|
+
// ── Property accessors ─────────────────────────────────────────────────
|
|
87
|
+
get pid() {
|
|
88
|
+
return this.proc?.pid ?? undefined;
|
|
89
|
+
}
|
|
90
|
+
get isReady() {
|
|
91
|
+
return this._isReady;
|
|
92
|
+
}
|
|
93
|
+
get isPaused() {
|
|
94
|
+
return this._isPaused;
|
|
95
|
+
}
|
|
96
|
+
get isBusy() {
|
|
97
|
+
return this._isBusy;
|
|
98
|
+
}
|
|
99
|
+
/** The agent's own session id; a later session resumes it. */
|
|
100
|
+
get agentSessionId() {
|
|
101
|
+
return this.acpSessionId;
|
|
102
|
+
}
|
|
103
|
+
// ── Lifecycle ──────────────────────────────────────────────────────────
|
|
104
|
+
async start() {
|
|
105
|
+
const cwd = path.resolve(this.options.cwd || process.cwd());
|
|
106
|
+
if (!fs.existsSync(cwd))
|
|
107
|
+
fs.mkdirSync(cwd, { recursive: true });
|
|
108
|
+
this.options.cwd = cwd;
|
|
109
|
+
const command = (this.agent.commandEnv && process.env[this.agent.commandEnv]) || this.agent.command;
|
|
110
|
+
const proc = spawnEngine(command, this.agent.args ?? [], {
|
|
111
|
+
launcher: this.options.launcher,
|
|
112
|
+
cwd,
|
|
113
|
+
env: { ...process.env, ...this.agent.env },
|
|
114
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
115
|
+
});
|
|
116
|
+
this.proc = proc;
|
|
117
|
+
proc.stderr?.on('data', (d) => this.emit(SESSION_EVENT.LOG, `[acp:${this.agent.name}] ${sanitizeSecrets(d.toString())}`));
|
|
118
|
+
const exited = new Promise((_, reject) => {
|
|
119
|
+
proc.once('error', (err) => reject(new Error(`could not start ${command}: ${err.message}`)));
|
|
120
|
+
proc.once('exit', (code, signal) => {
|
|
121
|
+
this._isReady = false;
|
|
122
|
+
const err = new Error(`ACP agent ${this.agent.name} exited (${signal ?? `code ${code}`})`);
|
|
123
|
+
this.turnFail?.(err);
|
|
124
|
+
this.turnFail = null;
|
|
125
|
+
this.conn?.close(err);
|
|
126
|
+
reject(err);
|
|
127
|
+
this.emit(SESSION_EVENT.CLOSE, code ?? 0);
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
exited.catch(() => undefined);
|
|
131
|
+
const stream = acp.ndJsonStream(Writable.toWeb(proc.stdin), Readable.toWeb(proc.stdout));
|
|
132
|
+
this.conn = acp
|
|
133
|
+
.client({ name: 'claw-orchestrator' })
|
|
134
|
+
.onRequest(acp.methods.client.session.requestPermission, (ctx) => this._answerPermission(ctx.params))
|
|
135
|
+
.onNotification(acp.methods.client.session.update, (ctx) => this._onUpdate(ctx.params))
|
|
136
|
+
.connect(stream);
|
|
137
|
+
// A closed connection is a dead session, whether or not the exit has been reported yet.
|
|
138
|
+
this.conn.closed.then(() => (this._isReady = false), () => (this._isReady = false));
|
|
139
|
+
const agent = this.conn.agent;
|
|
140
|
+
const init = await Promise.race([
|
|
141
|
+
agent.request(acp.methods.agent.initialize, {
|
|
142
|
+
protocolVersion: acp.PROTOCOL_VERSION,
|
|
143
|
+
clientCapabilities: {},
|
|
144
|
+
clientInfo: { name: 'claw-orchestrator', version: '1' },
|
|
145
|
+
}),
|
|
146
|
+
exited,
|
|
147
|
+
]);
|
|
148
|
+
const caps = init.agentCapabilities ?? {};
|
|
149
|
+
const resumeId = this.options.resumeSessionId;
|
|
150
|
+
if (resumeId) {
|
|
151
|
+
// A stored id that cannot be honoured is an error, not a fresh session:
|
|
152
|
+
// the caller asked for that conversation, and a new one would silently
|
|
153
|
+
// drop everything it knew.
|
|
154
|
+
if (caps.sessionCapabilities?.resume) {
|
|
155
|
+
await Promise.race([
|
|
156
|
+
agent.request(acp.methods.agent.session.resume, { sessionId: resumeId, cwd, mcpServers: [] }),
|
|
157
|
+
exited,
|
|
158
|
+
]);
|
|
159
|
+
}
|
|
160
|
+
else if (caps.loadSession) {
|
|
161
|
+
await Promise.race([
|
|
162
|
+
agent.request(acp.methods.agent.session.load, { sessionId: resumeId, cwd, mcpServers: [] }),
|
|
163
|
+
exited,
|
|
164
|
+
]);
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
this.stop();
|
|
168
|
+
throw new Error(`ACP agent ${this.agent.name} cannot resume a session (no loadSession or resume capability)`);
|
|
169
|
+
}
|
|
170
|
+
// Set only now: `session/load` replays the conversation as updates
|
|
171
|
+
// before it returns, and an update for an id not yet ours is dropped —
|
|
172
|
+
// that history is not this session's work.
|
|
173
|
+
this.acpSessionId = resumeId;
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
const created = await Promise.race([
|
|
177
|
+
agent.request(acp.methods.agent.session.new, { cwd, mcpServers: [] }),
|
|
178
|
+
exited,
|
|
179
|
+
]);
|
|
180
|
+
this.acpSessionId = created.sessionId;
|
|
181
|
+
const instructions = [this.options.systemPrompt, this.options.appendSystemPrompt]
|
|
182
|
+
.map((t) => t?.trim())
|
|
183
|
+
.filter(Boolean)
|
|
184
|
+
.join('\n\n');
|
|
185
|
+
this.pendingInstructions = instructions || undefined;
|
|
186
|
+
}
|
|
187
|
+
this.sessionId = `acp-${this.agent.name}-${Date.now().toString(36)}`;
|
|
188
|
+
this._startTime = new Date().toISOString();
|
|
189
|
+
this._isReady = true;
|
|
190
|
+
this.emit(SESSION_EVENT.READY);
|
|
191
|
+
this.emit(SESSION_EVENT.INIT, { type: 'system', subtype: 'init', session_id: this.sessionId });
|
|
192
|
+
return this;
|
|
193
|
+
}
|
|
194
|
+
stop() {
|
|
195
|
+
this._isReady = false;
|
|
196
|
+
this._isPaused = false;
|
|
197
|
+
if (this.conn && this.acpSessionId && this._isBusy) {
|
|
198
|
+
this.conn.agent.notify(acp.methods.agent.session.cancel, { sessionId: this.acpSessionId }).catch(() => undefined);
|
|
199
|
+
}
|
|
200
|
+
this.conn?.close();
|
|
201
|
+
this.conn = null;
|
|
202
|
+
if (this.proc) {
|
|
203
|
+
killEngineTree(this.proc);
|
|
204
|
+
this.proc = null;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
pause() {
|
|
208
|
+
this._isPaused = true;
|
|
209
|
+
this.emit(SESSION_EVENT.PAUSED, { sessionId: this.sessionId });
|
|
210
|
+
}
|
|
211
|
+
resume() {
|
|
212
|
+
this._isPaused = false;
|
|
213
|
+
this.emit(SESSION_EVENT.RESUMED, { sessionId: this.sessionId });
|
|
214
|
+
}
|
|
215
|
+
// ── send() ─────────────────────────────────────────────────────────────
|
|
216
|
+
async send(message, options = {}) {
|
|
217
|
+
if (!this._isReady || !this.conn || !this.acpSessionId)
|
|
218
|
+
throw new Error('Session not ready. Call start() first.');
|
|
219
|
+
if (this._isBusy)
|
|
220
|
+
throw new Error('A turn is already running on this ACP session');
|
|
221
|
+
let text = typeof message === 'string' ? message : JSON.stringify(message);
|
|
222
|
+
if (this.pendingInstructions) {
|
|
223
|
+
text = `${this.pendingInstructions}\n\n---\n\n${text}`;
|
|
224
|
+
this.pendingInstructions = undefined;
|
|
225
|
+
}
|
|
226
|
+
const id = ++this._requests;
|
|
227
|
+
if (!options.waitForComplete) {
|
|
228
|
+
this._turn(text, options).catch((err) => this._emitError(err));
|
|
229
|
+
return { requestId: id, sent: true };
|
|
230
|
+
}
|
|
231
|
+
return this._turn(text, options);
|
|
232
|
+
}
|
|
233
|
+
async _turn(text, options) {
|
|
234
|
+
const conn = this.conn;
|
|
235
|
+
const sessionId = this.acpSessionId;
|
|
236
|
+
this._isBusy = true;
|
|
237
|
+
this.turnText = '';
|
|
238
|
+
const onText = (chunk) => {
|
|
239
|
+
try {
|
|
240
|
+
options.callbacks?.onText?.(chunk);
|
|
241
|
+
}
|
|
242
|
+
catch {
|
|
243
|
+
// A caller's callback failing does not fail the turn.
|
|
244
|
+
}
|
|
245
|
+
};
|
|
246
|
+
this.on(SESSION_EVENT.TEXT, onText);
|
|
247
|
+
let timer;
|
|
248
|
+
try {
|
|
249
|
+
const aborted = new Promise((_, reject) => {
|
|
250
|
+
this.turnFail = reject;
|
|
251
|
+
timer = setTimeout(() => {
|
|
252
|
+
conn.agent.notify(acp.methods.agent.session.cancel, { sessionId }).catch(() => undefined);
|
|
253
|
+
reject(new Error(`Timeout waiting for ACP agent ${this.agent.name} to finish the turn`));
|
|
254
|
+
}, options.timeout || DEFAULT_TURN_TIMEOUT_MS);
|
|
255
|
+
});
|
|
256
|
+
const response = await Promise.race([
|
|
257
|
+
conn.agent.request(acp.methods.agent.session.prompt, { sessionId, prompt: [{ type: 'text', text }] }),
|
|
258
|
+
aborted,
|
|
259
|
+
]);
|
|
260
|
+
this._absorbUsage(response.usage);
|
|
261
|
+
const ok = response.stopReason === 'end_turn';
|
|
262
|
+
this._stats.turns++;
|
|
263
|
+
if (ok)
|
|
264
|
+
this._stats.turnsSucceeded++;
|
|
265
|
+
this._stats.lastActivity = new Date().toISOString();
|
|
266
|
+
const event = {
|
|
267
|
+
type: 'result',
|
|
268
|
+
subtype: ok ? 'success' : 'error',
|
|
269
|
+
result: this.turnText,
|
|
270
|
+
is_error: !ok,
|
|
271
|
+
stop_reason: response.stopReason,
|
|
272
|
+
session_id: this.sessionId,
|
|
273
|
+
total_cost_usd: this._stats.costUsd,
|
|
274
|
+
};
|
|
275
|
+
this._addHistory({ time: this._stats.lastActivity, type: 'result', event });
|
|
276
|
+
this.emit(SESSION_EVENT.RESULT, event);
|
|
277
|
+
this.emit(SESSION_EVENT.TURN_COMPLETE, event);
|
|
278
|
+
if (!ok)
|
|
279
|
+
throw new Error(`ACP agent ${this.agent.name} stopped the turn: ${response.stopReason}`);
|
|
280
|
+
return { text: this.turnText, event };
|
|
281
|
+
}
|
|
282
|
+
catch (err) {
|
|
283
|
+
if (!(err instanceof Error && err.message.startsWith(`ACP agent ${this.agent.name} stopped`))) {
|
|
284
|
+
this._stats.turns++;
|
|
285
|
+
}
|
|
286
|
+
// The connection usually ends (stdout EOF) before the exit is reported.
|
|
287
|
+
if (err instanceof Error && /connection closed/i.test(err.message)) {
|
|
288
|
+
throw new Error(`ACP agent ${this.agent.name} exited mid-turn`);
|
|
289
|
+
}
|
|
290
|
+
throw err;
|
|
291
|
+
}
|
|
292
|
+
finally {
|
|
293
|
+
clearTimeout(timer);
|
|
294
|
+
this.turnFail = null;
|
|
295
|
+
this._isBusy = false;
|
|
296
|
+
this.removeListener(SESSION_EVENT.TEXT, onText);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
// ── Agent → client ─────────────────────────────────────────────────────
|
|
300
|
+
_answerPermission(params) {
|
|
301
|
+
const allow = ALLOWING_MODES.has(this.options.permissionMode ?? '');
|
|
302
|
+
const kinds = allow ? ['allow_once', 'allow_always'] : ['reject_once', 'reject_always'];
|
|
303
|
+
const option = kinds.map((k) => params.options.find((o) => o.kind === k)).find(Boolean);
|
|
304
|
+
this._addHistory({
|
|
305
|
+
time: new Date().toISOString(),
|
|
306
|
+
type: 'permission',
|
|
307
|
+
event: { tool: params.toolCall.title, answer: option?.kind ?? 'cancelled' },
|
|
308
|
+
});
|
|
309
|
+
return option
|
|
310
|
+
? { outcome: { outcome: 'selected', optionId: option.optionId } }
|
|
311
|
+
: { outcome: { outcome: 'cancelled' } };
|
|
312
|
+
}
|
|
313
|
+
_onUpdate(params) {
|
|
314
|
+
if (params.sessionId !== this.acpSessionId)
|
|
315
|
+
return;
|
|
316
|
+
const update = params.update;
|
|
317
|
+
this._stats.lastActivity = new Date().toISOString();
|
|
318
|
+
switch (update.sessionUpdate) {
|
|
319
|
+
case 'agent_message_chunk':
|
|
320
|
+
if (update.content.type === 'text') {
|
|
321
|
+
this.turnText += update.content.text;
|
|
322
|
+
this.emit(SESSION_EVENT.TEXT, update.content.text);
|
|
323
|
+
}
|
|
324
|
+
break;
|
|
325
|
+
case 'tool_call':
|
|
326
|
+
this._stats.toolCalls++;
|
|
327
|
+
this.emit(SESSION_EVENT.TOOL_USE, { id: update.toolCallId, name: update.title, input: update.rawInput });
|
|
328
|
+
if (update.status === 'failed')
|
|
329
|
+
this._stats.toolErrors++;
|
|
330
|
+
break;
|
|
331
|
+
case 'tool_call_update':
|
|
332
|
+
if (update.status === 'failed')
|
|
333
|
+
this._stats.toolErrors++;
|
|
334
|
+
if (update.status === 'completed' || update.status === 'failed') {
|
|
335
|
+
this.emit(SESSION_EVENT.TOOL_RESULT, {
|
|
336
|
+
id: update.toolCallId,
|
|
337
|
+
is_error: update.status === 'failed',
|
|
338
|
+
output: update.rawOutput,
|
|
339
|
+
});
|
|
340
|
+
}
|
|
341
|
+
break;
|
|
342
|
+
case 'usage_update':
|
|
343
|
+
this._stats.contextUsed = update.used;
|
|
344
|
+
this._stats.contextSize = update.size;
|
|
345
|
+
if (update.cost && update.cost.currency.toUpperCase() === 'USD') {
|
|
346
|
+
this._stats.costUsd = update.cost.amount;
|
|
347
|
+
this._stats.costReported = true;
|
|
348
|
+
}
|
|
349
|
+
break;
|
|
350
|
+
default:
|
|
351
|
+
break;
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
/** `PromptResponse.usage` holds session totals, so it replaces, never adds. */
|
|
355
|
+
_absorbUsage(usage) {
|
|
356
|
+
if (!usage)
|
|
357
|
+
return;
|
|
358
|
+
this._stats.tokensIn = usage.inputTokens;
|
|
359
|
+
this._stats.tokensOut = usage.outputTokens;
|
|
360
|
+
this._stats.cachedTokens = usage.cachedReadTokens ?? 0;
|
|
361
|
+
if (!this._stats.costReported && this.agent.pricing) {
|
|
362
|
+
const p = this.agent.pricing;
|
|
363
|
+
const fresh = Math.max(0, this._stats.tokensIn - this._stats.cachedTokens);
|
|
364
|
+
this._stats.costUsd =
|
|
365
|
+
(fresh * p.input + this._stats.cachedTokens * (p.cached ?? p.input) + this._stats.tokensOut * p.output) /
|
|
366
|
+
1_000_000;
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
// ── ISession surface ───────────────────────────────────────────────────
|
|
370
|
+
getStats() {
|
|
371
|
+
const window = this._stats.contextSize || this.agent.contextWindow || 0;
|
|
372
|
+
return {
|
|
373
|
+
turns: this._stats.turns,
|
|
374
|
+
turnsSucceeded: this._stats.turnsSucceeded,
|
|
375
|
+
toolCalls: this._stats.toolCalls,
|
|
376
|
+
toolErrors: this._stats.toolErrors,
|
|
377
|
+
tokensIn: this._stats.tokensIn,
|
|
378
|
+
tokensOut: this._stats.tokensOut,
|
|
379
|
+
cachedTokens: this._stats.cachedTokens,
|
|
380
|
+
costUsd: Math.round(this._stats.costUsd * 10000) / 10000,
|
|
381
|
+
isReady: this._isReady,
|
|
382
|
+
startTime: this._startTime,
|
|
383
|
+
lastActivity: this._stats.lastActivity,
|
|
384
|
+
contextPercent: window ? Math.min(100, Math.round((this._stats.contextUsed / window) * 100)) : 0,
|
|
385
|
+
retries: 0,
|
|
386
|
+
sessionId: this.sessionId,
|
|
387
|
+
uptime: this._startTime ? Math.round((Date.now() - new Date(this._startTime).getTime()) / 1000) : 0,
|
|
388
|
+
acpSessionId: this.acpSessionId,
|
|
389
|
+
};
|
|
390
|
+
}
|
|
391
|
+
getHistory(limit = DEFAULT_HISTORY_LIMIT) {
|
|
392
|
+
return this._history.slice(-limit);
|
|
393
|
+
}
|
|
394
|
+
getCost() {
|
|
395
|
+
const p = this.agent.pricing;
|
|
396
|
+
return {
|
|
397
|
+
model: this.options.model || this.agent.name,
|
|
398
|
+
tokensIn: this._stats.tokensIn,
|
|
399
|
+
tokensOut: this._stats.tokensOut,
|
|
400
|
+
cachedTokens: this._stats.cachedTokens,
|
|
401
|
+
pricing: { inputPer1M: p?.input ?? 0, outputPer1M: p?.output ?? 0, cachedPer1M: p?.cached },
|
|
402
|
+
breakdown: { inputCost: 0, cachedCost: 0, outputCost: 0 },
|
|
403
|
+
totalUsd: this._stats.costUsd,
|
|
404
|
+
};
|
|
405
|
+
}
|
|
406
|
+
async compact(_summary) {
|
|
407
|
+
const event = { type: 'result', result: 'ACP agents manage their own context' };
|
|
408
|
+
return { text: 'ACP agents manage their own context', event };
|
|
409
|
+
}
|
|
410
|
+
getEffort() {
|
|
411
|
+
return this.options.effort || 'auto';
|
|
412
|
+
}
|
|
413
|
+
setEffort(level) {
|
|
414
|
+
this.options.effort = level;
|
|
415
|
+
}
|
|
416
|
+
resolveModel(alias) {
|
|
417
|
+
return resolveAlias(alias);
|
|
418
|
+
}
|
|
419
|
+
// ── Helpers ────────────────────────────────────────────────────────────
|
|
420
|
+
/** As in codex-app: with no listener, an `'error'` event would throw and take the process down. */
|
|
421
|
+
_emitError(err) {
|
|
422
|
+
if (this.listenerCount(SESSION_EVENT.ERROR) > 0)
|
|
423
|
+
this.emit(SESSION_EVENT.ERROR, err);
|
|
424
|
+
else
|
|
425
|
+
this.emit(SESSION_EVENT.LOG, `[acp:${this.agent.name}] ${err.message}`);
|
|
426
|
+
}
|
|
427
|
+
_addHistory(entry) {
|
|
428
|
+
this._history.push(entry);
|
|
429
|
+
if (this._history.length > MAX_HISTORY_ITEMS)
|
|
430
|
+
this._history.shift();
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
//# sourceMappingURL=persistent-acp-session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persistent-acp-session.js","sourceRoot":"","sources":["../../src/persistent-acp-session.ts"],"names":[],"mappings":"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"}
|
|
@@ -105,6 +105,8 @@ export declare class PersistentCodexAppServerSession extends EventEmitter implem
|
|
|
105
105
|
sent: boolean;
|
|
106
106
|
}>;
|
|
107
107
|
private _fireAndForgetTurn;
|
|
108
|
+
/** `turn/start` params. The effort holds for this turn and the ones after it. */
|
|
109
|
+
private _turnStartParams;
|
|
108
110
|
private _runTurn;
|
|
109
111
|
private _request;
|
|
110
112
|
private _reply;
|
|
@@ -31,6 +31,8 @@ import * as fs from 'node:fs';
|
|
|
31
31
|
import * as path from 'node:path';
|
|
32
32
|
import { getModelPricing, resolveAlias, getContextWindow } from './models.js';
|
|
33
33
|
import { SESSION_EVENT, MAX_HISTORY_ITEMS, DEFAULT_HISTORY_LIMIT } from './constants.js';
|
|
34
|
+
import { sanitizeSecrets } from './sanitize.js';
|
|
35
|
+
import { codexReasoningEffort } from './persistent-codex-session.js';
|
|
34
36
|
/** Name of a `CodexErrorInfo` value: `'serverOverloaded'`, or `'httpConnectionFailed'` for `{ httpConnectionFailed: … }`. */
|
|
35
37
|
function errorInfoName(info) {
|
|
36
38
|
if (typeof info === 'string')
|
|
@@ -139,7 +141,7 @@ export class PersistentCodexAppServerSession extends EventEmitter {
|
|
|
139
141
|
this._rl = readline.createInterface({ input: this.proc.stdout, crlfDelay: Infinity });
|
|
140
142
|
this._rl.on('line', (line) => this._handleLine(line));
|
|
141
143
|
this.proc.stderr?.on('data', (data) => {
|
|
142
|
-
this.emit(SESSION_EVENT.LOG, `[codex-app-stderr] ${data.toString()}`);
|
|
144
|
+
this.emit(SESSION_EVENT.LOG, `[codex-app-stderr] ${sanitizeSecrets(data.toString())}`);
|
|
143
145
|
});
|
|
144
146
|
this.proc.on('exit', (code) => {
|
|
145
147
|
this._isReady = false;
|
|
@@ -162,6 +164,7 @@ export class PersistentCodexAppServerSession extends EventEmitter {
|
|
|
162
164
|
// 2. thread/start — captures threadId both from the response and the
|
|
163
165
|
// `thread/started` notification (which arrives before the response per
|
|
164
166
|
// observed protocol semantics).
|
|
167
|
+
const effort = codexReasoningEffort(this.options.effort);
|
|
165
168
|
const startParams = {
|
|
166
169
|
cwd: this.options.cwd,
|
|
167
170
|
model: this.options.model,
|
|
@@ -171,6 +174,9 @@ export class PersistentCodexAppServerSession extends EventEmitter {
|
|
|
171
174
|
// that wanted approval left the turn waiting forever. The sandbox mode is
|
|
172
175
|
// the boundary instead.
|
|
173
176
|
approvalPolicy: 'never',
|
|
177
|
+
// On the thread, not only on `turn/start`: the goal loop starts its own
|
|
178
|
+
// turns, and those read the thread's config.
|
|
179
|
+
...(effort ? { config: { model_reasoning_effort: effort } } : {}),
|
|
174
180
|
};
|
|
175
181
|
// When resuming a known thread, use `thread/resume` (loads prior turns)
|
|
176
182
|
// instead of `thread/start` (which opens a fresh thread). A stale/unknown
|
|
@@ -246,7 +252,7 @@ export class PersistentCodexAppServerSession extends EventEmitter {
|
|
|
246
252
|
if (instructions)
|
|
247
253
|
text = `${instructions}\n\n---\n\n${text}`;
|
|
248
254
|
if (!options.waitForComplete) {
|
|
249
|
-
this._fireAndForgetTurn(text).catch((err) => this._emitError(err));
|
|
255
|
+
this._fireAndForgetTurn(text, options).catch((err) => this._emitError(err));
|
|
250
256
|
return { requestId: this._nextRpcId, sent: true };
|
|
251
257
|
}
|
|
252
258
|
this._isBusy = true;
|
|
@@ -257,11 +263,17 @@ export class PersistentCodexAppServerSession extends EventEmitter {
|
|
|
257
263
|
this._isBusy = false;
|
|
258
264
|
}
|
|
259
265
|
}
|
|
260
|
-
async _fireAndForgetTurn(text) {
|
|
261
|
-
await this._request('turn/start',
|
|
266
|
+
async _fireAndForgetTurn(text, options) {
|
|
267
|
+
await this._request('turn/start', this._turnStartParams(text, options));
|
|
268
|
+
}
|
|
269
|
+
/** `turn/start` params. The effort holds for this turn and the ones after it. */
|
|
270
|
+
_turnStartParams(text, options) {
|
|
271
|
+
const effort = codexReasoningEffort(options.effort ?? this.options.effort);
|
|
272
|
+
return {
|
|
262
273
|
threadId: this.threadId,
|
|
263
274
|
input: [{ type: 'text', text, text_elements: [] }],
|
|
264
|
-
|
|
275
|
+
...(effort ? { effort } : {}),
|
|
276
|
+
};
|
|
265
277
|
}
|
|
266
278
|
async _runTurn(text, options) {
|
|
267
279
|
const timeout = options.timeout || 600_000;
|
|
@@ -290,10 +302,7 @@ export class PersistentCodexAppServerSession extends EventEmitter {
|
|
|
290
302
|
}
|
|
291
303
|
}, timeout);
|
|
292
304
|
try {
|
|
293
|
-
await this._request('turn/start',
|
|
294
|
-
threadId: this.threadId,
|
|
295
|
-
input: [{ type: 'text', text, text_elements: [] }],
|
|
296
|
-
});
|
|
305
|
+
await this._request('turn/start', this._turnStartParams(text, options));
|
|
297
306
|
const result = await turnPromise;
|
|
298
307
|
return result;
|
|
299
308
|
}
|