@autonome-research/thread-phase-agents 3.0.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/LICENSE +21 -0
- package/README.md +207 -0
- package/dist/acp/adapter.d.ts +89 -0
- package/dist/acp/adapter.d.ts.map +1 -0
- package/dist/acp/adapter.js +461 -0
- package/dist/acp/adapter.js.map +1 -0
- package/dist/acp/index.d.ts +12 -0
- package/dist/acp/index.d.ts.map +1 -0
- package/dist/acp/index.js +10 -0
- package/dist/acp/index.js.map +1 -0
- package/dist/acp/transport.d.ts +82 -0
- package/dist/acp/transport.d.ts.map +1 -0
- package/dist/acp/transport.js +199 -0
- package/dist/acp/transport.js.map +1 -0
- package/dist/acp/types.d.ts +157 -0
- package/dist/acp/types.d.ts.map +1 -0
- package/dist/acp/types.js +34 -0
- package/dist/acp/types.js.map +1 -0
- package/dist/anthropic/adapter.d.ts +55 -0
- package/dist/anthropic/adapter.d.ts.map +1 -0
- package/dist/anthropic/adapter.js +259 -0
- package/dist/anthropic/adapter.js.map +1 -0
- package/dist/anthropic/index.d.ts +8 -0
- package/dist/anthropic/index.d.ts.map +1 -0
- package/dist/anthropic/index.js +8 -0
- package/dist/anthropic/index.js.map +1 -0
- package/dist/claude-code/adapter.d.ts +56 -0
- package/dist/claude-code/adapter.d.ts.map +1 -0
- package/dist/claude-code/adapter.js +319 -0
- package/dist/claude-code/adapter.js.map +1 -0
- package/dist/claude-code/index.d.ts +8 -0
- package/dist/claude-code/index.d.ts.map +1 -0
- package/dist/claude-code/index.js +8 -0
- package/dist/claude-code/index.js.map +1 -0
- package/dist/codex/adapter.d.ts +62 -0
- package/dist/codex/adapter.d.ts.map +1 -0
- package/dist/codex/adapter.js +258 -0
- package/dist/codex/adapter.js.map +1 -0
- package/dist/codex/index.d.ts +9 -0
- package/dist/codex/index.d.ts.map +1 -0
- package/dist/codex/index.js +9 -0
- package/dist/codex/index.js.map +1 -0
- package/dist/codex-cli/adapter.d.ts +70 -0
- package/dist/codex-cli/adapter.d.ts.map +1 -0
- package/dist/codex-cli/adapter.js +368 -0
- package/dist/codex-cli/adapter.js.map +1 -0
- package/dist/codex-cli/index.d.ts +10 -0
- package/dist/codex-cli/index.d.ts.map +1 -0
- package/dist/codex-cli/index.js +10 -0
- package/dist/codex-cli/index.js.map +1 -0
- package/dist/hermes/index.d.ts +50 -0
- package/dist/hermes/index.d.ts.map +1 -0
- package/dist/hermes/index.js +43 -0
- package/dist/hermes/index.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/injectors.d.ts +104 -0
- package/dist/injectors.d.ts.map +1 -0
- package/dist/injectors.js +219 -0
- package/dist/injectors.js.map +1 -0
- package/dist/openclaw/index.d.ts +54 -0
- package/dist/openclaw/index.d.ts.map +1 -0
- package/dist/openclaw/index.js +61 -0
- package/dist/openclaw/index.js.map +1 -0
- package/dist/pi/adapter.d.ts +79 -0
- package/dist/pi/adapter.d.ts.map +1 -0
- package/dist/pi/adapter.js +396 -0
- package/dist/pi/adapter.js.map +1 -0
- package/dist/pi/index.d.ts +14 -0
- package/dist/pi/index.d.ts.map +1 -0
- package/dist/pi/index.js +14 -0
- package/dist/pi/index.js.map +1 -0
- package/dist/thread-bridge.d.ts +83 -0
- package/dist/thread-bridge.d.ts.map +1 -0
- package/dist/thread-bridge.js +143 -0
- package/dist/thread-bridge.js.map +1 -0
- package/package.json +46 -0
|
@@ -0,0 +1,368 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Codex CLI adapter — subprocess wrapper around `codex exec --json`.
|
|
3
|
+
*
|
|
4
|
+
* Why this exists alongside `codexAgent`: that adapter talks to OpenAI's
|
|
5
|
+
* Responses API directly via the SDK and needs `OPENAI_API_KEY`. The
|
|
6
|
+
* Codex CLI carries its own ChatGPT-subscription OAuth flow (`~/.codex/`),
|
|
7
|
+
* so users who installed `codex` and ran `codex login` already have a
|
|
8
|
+
* working agent without an API key. This adapter delegates auth and
|
|
9
|
+
* model selection entirely to the CLI; we just parse its NDJSON output
|
|
10
|
+
* stream into canonical AgentEvents.
|
|
11
|
+
*
|
|
12
|
+
* Capabilities:
|
|
13
|
+
* streaming 'text'
|
|
14
|
+
* cancellation 'forceful'
|
|
15
|
+
* resumption 'opaque' (codex thread id)
|
|
16
|
+
* structuredOutput 'prompted'
|
|
17
|
+
*
|
|
18
|
+
* The CLI's `--json` event vocabulary is higher-level than the raw
|
|
19
|
+
* Responses API stream:
|
|
20
|
+
* thread.started -> capture thread_id as resumeToken
|
|
21
|
+
* turn.started -> (informational, surfaced as native)
|
|
22
|
+
* item.started type=command_execution
|
|
23
|
+
* -> tool_call event
|
|
24
|
+
* item.completed type=command_execution
|
|
25
|
+
* -> tool_result event (isError from exit_code)
|
|
26
|
+
* item.completed type=agent_message
|
|
27
|
+
* -> text event with item.text
|
|
28
|
+
* item.completed type=reasoning
|
|
29
|
+
* -> thinking event
|
|
30
|
+
* turn.completed -> turn_end with usage
|
|
31
|
+
*
|
|
32
|
+
* @internal
|
|
33
|
+
*/
|
|
34
|
+
import { spawn } from 'node:child_process';
|
|
35
|
+
import { applyStructuredOutputPrompt, composeAbort, createEventQueue, defineAgentAdapter, lazyEvents, parseStructuredFromText, serializeError, TurnAccumulator, } from '@autonome-research/thread-phase/agents';
|
|
36
|
+
const ADAPTER_ID = 'codex-cli';
|
|
37
|
+
/** @internal */
|
|
38
|
+
export const codexCliAgent = defineAgentAdapter({
|
|
39
|
+
id: ADAPTER_ID,
|
|
40
|
+
capabilities: {
|
|
41
|
+
streaming: 'text',
|
|
42
|
+
cancellation: 'forceful',
|
|
43
|
+
resumption: 'opaque',
|
|
44
|
+
structuredOutput: 'prompted',
|
|
45
|
+
},
|
|
46
|
+
adapter: createCodexCliAdapter,
|
|
47
|
+
});
|
|
48
|
+
function createCodexCliAdapter(config, options = {}) {
|
|
49
|
+
const source = ADAPTER_ID;
|
|
50
|
+
const traceId = options.traceId;
|
|
51
|
+
const killGraceMs = config.killGraceMs ?? 3000;
|
|
52
|
+
const { signal: compositeSignal, controller } = composeAbort(options.signal);
|
|
53
|
+
const queue = createEventQueue(options.eventBus);
|
|
54
|
+
const turns = new TurnAccumulator(queue.push, source, traceId);
|
|
55
|
+
let started = false;
|
|
56
|
+
let runPromise = null;
|
|
57
|
+
const startIfNeeded = () => {
|
|
58
|
+
if (runPromise)
|
|
59
|
+
return runPromise;
|
|
60
|
+
started = true;
|
|
61
|
+
runPromise = runOnce();
|
|
62
|
+
return runPromise;
|
|
63
|
+
};
|
|
64
|
+
async function runOnce() {
|
|
65
|
+
let resumeToken = config.resumeThreadId
|
|
66
|
+
? { kind: 'opaque', data: config.resumeThreadId }
|
|
67
|
+
: undefined;
|
|
68
|
+
queue.push({ type: 'agent_start', source, traceId, resumeToken });
|
|
69
|
+
const effectivePrompt = config.outputSchema
|
|
70
|
+
? `${config.prompt}\n\n${applyStructuredOutputPrompt('', config.outputSchema)}`
|
|
71
|
+
: config.prompt;
|
|
72
|
+
const args = config.codexArgs ?? buildDefaultArgs(config, effectivePrompt);
|
|
73
|
+
const env = config.env ? { ...process.env, ...config.env } : process.env;
|
|
74
|
+
const executable = config.codexExecutable ?? 'codex';
|
|
75
|
+
let child;
|
|
76
|
+
try {
|
|
77
|
+
child = spawn(executable, args, {
|
|
78
|
+
cwd: config.cwd,
|
|
79
|
+
env,
|
|
80
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
81
|
+
});
|
|
82
|
+
// codex reads stdin if no prompt arg is on the cmdline; close it
|
|
83
|
+
// so the subprocess doesn't hang waiting.
|
|
84
|
+
child.stdin.end();
|
|
85
|
+
}
|
|
86
|
+
catch (err) {
|
|
87
|
+
turns.close();
|
|
88
|
+
queue.push({
|
|
89
|
+
type: 'error',
|
|
90
|
+
source,
|
|
91
|
+
traceId,
|
|
92
|
+
error: serializeError(err),
|
|
93
|
+
transient: false,
|
|
94
|
+
});
|
|
95
|
+
queue.push({ type: 'agent_end', source, traceId, reason: 'error', resumeToken });
|
|
96
|
+
queue.close();
|
|
97
|
+
return {
|
|
98
|
+
text: '',
|
|
99
|
+
finishReason: 'error',
|
|
100
|
+
usage: { promptTokens: 0, completionTokens: 0, totalTokens: 0 },
|
|
101
|
+
executedToolCalls: [],
|
|
102
|
+
resumeToken,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
let stdoutBuf = '';
|
|
106
|
+
let assembledText = '';
|
|
107
|
+
let threadId = config.resumeThreadId;
|
|
108
|
+
let inputTokens = 0;
|
|
109
|
+
let outputTokens = 0;
|
|
110
|
+
const executedToolCalls = [];
|
|
111
|
+
const pendingTools = new Map();
|
|
112
|
+
const parseLine = (line) => {
|
|
113
|
+
let msg;
|
|
114
|
+
try {
|
|
115
|
+
msg = JSON.parse(line);
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
turns.native('codex-cli:non-json', line);
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
if (msg === null || typeof msg !== 'object') {
|
|
122
|
+
turns.native('codex-cli:non-object', msg);
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
handleMessage(msg);
|
|
126
|
+
};
|
|
127
|
+
const handleMessage = (msg) => {
|
|
128
|
+
const type = typeof msg.type === 'string' ? msg.type : 'unknown';
|
|
129
|
+
if (type === 'thread.started') {
|
|
130
|
+
const tid = typeof msg.thread_id === 'string' ? msg.thread_id : undefined;
|
|
131
|
+
if (tid) {
|
|
132
|
+
threadId = tid;
|
|
133
|
+
resumeToken = { kind: 'opaque', data: tid };
|
|
134
|
+
}
|
|
135
|
+
turns.native('codex-cli:thread_started', msg);
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
if (type === 'turn.started') {
|
|
139
|
+
turns.native('codex-cli:turn_started', msg);
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
if (type === 'turn.completed') {
|
|
143
|
+
const usage = msg.usage;
|
|
144
|
+
if (usage) {
|
|
145
|
+
const input = Number(usage.input_tokens) || 0;
|
|
146
|
+
const output = Number(usage.output_tokens) || 0;
|
|
147
|
+
inputTokens += input;
|
|
148
|
+
outputTokens += output;
|
|
149
|
+
}
|
|
150
|
+
turns.endTurn(usage
|
|
151
|
+
? {
|
|
152
|
+
promptTokens: Number(usage.input_tokens) || 0,
|
|
153
|
+
completionTokens: Number(usage.output_tokens) || 0,
|
|
154
|
+
totalTokens: (Number(usage.input_tokens) || 0) + (Number(usage.output_tokens) || 0),
|
|
155
|
+
}
|
|
156
|
+
: undefined);
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
if (type === 'item.started' || type === 'item.completed') {
|
|
160
|
+
const item = (msg.item ?? {});
|
|
161
|
+
const itemType = typeof item.type === 'string' ? item.type : 'unknown';
|
|
162
|
+
const itemId = typeof item.id === 'string' ? item.id : `codex-${pendingTools.size}`;
|
|
163
|
+
if (itemType === 'command_execution') {
|
|
164
|
+
const command = typeof item.command === 'string' ? item.command : '';
|
|
165
|
+
if (type === 'item.started') {
|
|
166
|
+
const input = { command };
|
|
167
|
+
pendingTools.set(itemId, { name: 'shell', input });
|
|
168
|
+
turns.toolCall(itemId, 'shell', input);
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
// completed
|
|
172
|
+
const output = typeof item.aggregated_output === 'string' ? item.aggregated_output : '';
|
|
173
|
+
const exitCode = typeof item.exit_code === 'number' ? item.exit_code : null;
|
|
174
|
+
const isError = exitCode !== null && exitCode !== 0;
|
|
175
|
+
turns.toolResult(itemId, 'shell', output, isError);
|
|
176
|
+
const tool = pendingTools.get(itemId);
|
|
177
|
+
if (tool) {
|
|
178
|
+
executedToolCalls.push({ id: itemId, name: tool.name, input: tool.input });
|
|
179
|
+
pendingTools.delete(itemId);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
if (itemType === 'agent_message' && type === 'item.completed') {
|
|
185
|
+
const text = typeof item.text === 'string' ? item.text : '';
|
|
186
|
+
if (text) {
|
|
187
|
+
assembledText += text;
|
|
188
|
+
turns.text(text);
|
|
189
|
+
}
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
if (itemType === 'reasoning' && type === 'item.completed') {
|
|
193
|
+
const text = typeof item.text === 'string' ? item.text : '';
|
|
194
|
+
if (text)
|
|
195
|
+
turns.thinking(text);
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
if (itemType === 'function_call' && type === 'item.completed') {
|
|
199
|
+
const name = typeof item.name === 'string' ? item.name : 'function';
|
|
200
|
+
const rawInput = item.arguments ?? item.input ?? {};
|
|
201
|
+
const parsed = typeof rawInput === 'string'
|
|
202
|
+
? safeParseJson(rawInput)
|
|
203
|
+
: rawInput;
|
|
204
|
+
turns.toolCall(itemId, name, parsed);
|
|
205
|
+
executedToolCalls.push({ id: itemId, name, input: parsed });
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
// Unknown item type — surface as native.
|
|
209
|
+
turns.native(`codex-cli:item:${itemType}`, msg);
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
turns.native(`codex-cli:${type}`, msg);
|
|
213
|
+
};
|
|
214
|
+
const onAbortSignal = () => {
|
|
215
|
+
if (child.exitCode !== null || child.signalCode !== null)
|
|
216
|
+
return;
|
|
217
|
+
try {
|
|
218
|
+
child.kill('SIGTERM');
|
|
219
|
+
}
|
|
220
|
+
catch {
|
|
221
|
+
// already gone
|
|
222
|
+
}
|
|
223
|
+
setTimeout(() => {
|
|
224
|
+
if (child.exitCode === null && child.signalCode === null) {
|
|
225
|
+
try {
|
|
226
|
+
child.kill('SIGKILL');
|
|
227
|
+
}
|
|
228
|
+
catch {
|
|
229
|
+
// already gone
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}, killGraceMs);
|
|
233
|
+
};
|
|
234
|
+
if (compositeSignal.aborted) {
|
|
235
|
+
onAbortSignal();
|
|
236
|
+
}
|
|
237
|
+
else {
|
|
238
|
+
compositeSignal.addEventListener('abort', onAbortSignal, { once: true });
|
|
239
|
+
}
|
|
240
|
+
return new Promise((resolve) => {
|
|
241
|
+
child.stdout.setEncoding('utf8');
|
|
242
|
+
child.stdout.on('data', (chunk) => {
|
|
243
|
+
stdoutBuf += chunk;
|
|
244
|
+
let nl;
|
|
245
|
+
while ((nl = stdoutBuf.indexOf('\n')) !== -1) {
|
|
246
|
+
const line = stdoutBuf.slice(0, nl);
|
|
247
|
+
stdoutBuf = stdoutBuf.slice(nl + 1);
|
|
248
|
+
if (line.trim().length > 0)
|
|
249
|
+
parseLine(line);
|
|
250
|
+
}
|
|
251
|
+
});
|
|
252
|
+
child.stderr.setEncoding('utf8');
|
|
253
|
+
child.stderr.on('data', (chunk) => {
|
|
254
|
+
queue.push({
|
|
255
|
+
type: 'native',
|
|
256
|
+
source,
|
|
257
|
+
traceId,
|
|
258
|
+
kind: 'codex-cli:stderr',
|
|
259
|
+
payload: chunk,
|
|
260
|
+
});
|
|
261
|
+
});
|
|
262
|
+
child.on('error', (err) => {
|
|
263
|
+
queue.push({
|
|
264
|
+
type: 'error',
|
|
265
|
+
source,
|
|
266
|
+
traceId,
|
|
267
|
+
error: serializeError(err),
|
|
268
|
+
transient: false,
|
|
269
|
+
});
|
|
270
|
+
});
|
|
271
|
+
child.on('close', (code, signal) => {
|
|
272
|
+
if (stdoutBuf.trim().length > 0)
|
|
273
|
+
parseLine(stdoutBuf.trim());
|
|
274
|
+
turns.close();
|
|
275
|
+
const aborted = compositeSignal.aborted;
|
|
276
|
+
let finishReason;
|
|
277
|
+
if (aborted)
|
|
278
|
+
finishReason = 'aborted';
|
|
279
|
+
else if (code === 0)
|
|
280
|
+
finishReason = executedToolCalls.length > 0 ? 'tool_calls' : 'stop';
|
|
281
|
+
else
|
|
282
|
+
finishReason = 'error';
|
|
283
|
+
if (finishReason === 'error') {
|
|
284
|
+
queue.push({
|
|
285
|
+
type: 'error',
|
|
286
|
+
source,
|
|
287
|
+
traceId,
|
|
288
|
+
error: {
|
|
289
|
+
name: 'CodexCliExitError',
|
|
290
|
+
message: signal
|
|
291
|
+
? `codex exited via signal ${signal}`
|
|
292
|
+
: `codex exited with code ${code ?? 'null'}`,
|
|
293
|
+
},
|
|
294
|
+
transient: false,
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
if (threadId) {
|
|
298
|
+
resumeToken = { kind: 'opaque', data: threadId };
|
|
299
|
+
}
|
|
300
|
+
let parsed = undefined;
|
|
301
|
+
let parseError = undefined;
|
|
302
|
+
if (config.outputSchema && finishReason === 'stop') {
|
|
303
|
+
try {
|
|
304
|
+
parsed = parseStructuredFromText(assembledText, config.outputSchema);
|
|
305
|
+
}
|
|
306
|
+
catch (err) {
|
|
307
|
+
parseError = serializeError(err);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
queue.push({ type: 'agent_end', source, traceId, reason: finishReason, resumeToken });
|
|
311
|
+
queue.close();
|
|
312
|
+
resolve({
|
|
313
|
+
text: assembledText,
|
|
314
|
+
finishReason,
|
|
315
|
+
usage: {
|
|
316
|
+
promptTokens: inputTokens,
|
|
317
|
+
completionTokens: outputTokens,
|
|
318
|
+
totalTokens: inputTokens + outputTokens,
|
|
319
|
+
},
|
|
320
|
+
executedToolCalls,
|
|
321
|
+
parsed,
|
|
322
|
+
parseError,
|
|
323
|
+
resumeToken,
|
|
324
|
+
});
|
|
325
|
+
});
|
|
326
|
+
});
|
|
327
|
+
}
|
|
328
|
+
return {
|
|
329
|
+
events: lazyEvents(queue.events, startIfNeeded),
|
|
330
|
+
get result() {
|
|
331
|
+
return startIfNeeded();
|
|
332
|
+
},
|
|
333
|
+
abort(reason) {
|
|
334
|
+
controller.abort(reason);
|
|
335
|
+
if (!started)
|
|
336
|
+
startIfNeeded();
|
|
337
|
+
},
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
function buildDefaultArgs(config, prompt) {
|
|
341
|
+
const args = ['exec', '--json', '--skip-git-repo-check'];
|
|
342
|
+
if (config.sandbox)
|
|
343
|
+
args.push('-s', config.sandbox);
|
|
344
|
+
else
|
|
345
|
+
args.push('-s', 'read-only');
|
|
346
|
+
if (config.model)
|
|
347
|
+
args.push('-m', config.model);
|
|
348
|
+
if (config.resumeThreadId) {
|
|
349
|
+
args.push('resume', config.resumeThreadId, prompt);
|
|
350
|
+
}
|
|
351
|
+
else {
|
|
352
|
+
args.push(prompt);
|
|
353
|
+
}
|
|
354
|
+
return args;
|
|
355
|
+
}
|
|
356
|
+
function safeParseJson(s) {
|
|
357
|
+
try {
|
|
358
|
+
const parsed = JSON.parse(s);
|
|
359
|
+
if (parsed !== null && typeof parsed === 'object' && !Array.isArray(parsed)) {
|
|
360
|
+
return parsed;
|
|
361
|
+
}
|
|
362
|
+
return { _rawJson: s };
|
|
363
|
+
}
|
|
364
|
+
catch {
|
|
365
|
+
return { _rawJson: s };
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
//# sourceMappingURL=adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/codex-cli/adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Codex CLI adapter entry. Subprocess wrapper around `codex exec --json`.
|
|
3
|
+
* Uses codex's own auth (ChatGPT OAuth or API key, whichever's configured
|
|
4
|
+
* via `codex login`). For API-key-only callers, see `codexAgent` (the
|
|
5
|
+
* in-process OpenAI Responses API adapter).
|
|
6
|
+
*
|
|
7
|
+
* @internal
|
|
8
|
+
*/
|
|
9
|
+
export { codexCliAgent, type CodexCliAgentConfig } from './adapter.js';
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/codex-cli/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,aAAa,EAAE,KAAK,mBAAmB,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Codex CLI adapter entry. Subprocess wrapper around `codex exec --json`.
|
|
3
|
+
* Uses codex's own auth (ChatGPT OAuth or API key, whichever's configured
|
|
4
|
+
* via `codex login`). For API-key-only callers, see `codexAgent` (the
|
|
5
|
+
* in-process OpenAI Responses API adapter).
|
|
6
|
+
*
|
|
7
|
+
* @internal
|
|
8
|
+
*/
|
|
9
|
+
export { codexCliAgent } from './adapter.js';
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/codex-cli/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,aAAa,EAA4B,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hermes adapter — wraps the ACP chassis to talk to `hermes acp`.
|
|
3
|
+
*
|
|
4
|
+
* Hermes ships an ACP-native server entry point (`hermes acp`), so the
|
|
5
|
+
* adapter is a thin configuration layer over `createAcpAdapter({ id: 'hermes' })`
|
|
6
|
+
* with sensible defaults for the executable and arguments.
|
|
7
|
+
*
|
|
8
|
+
* Requirements:
|
|
9
|
+
* - `hermes` binary installed and in PATH (or override via `hermesExecutable`)
|
|
10
|
+
* - Hermes configured with an OpenAI-compatible inference endpoint
|
|
11
|
+
*
|
|
12
|
+
* Session state persists in `~/.hermes/state.db`; resumption is via
|
|
13
|
+
* Hermes session ids, exposed by the chassis as
|
|
14
|
+
* `ResumeToken{ kind: 'opaque' }`.
|
|
15
|
+
*
|
|
16
|
+
* @internal
|
|
17
|
+
*/
|
|
18
|
+
import { type AgentAdapterMeta } from '@autonome-research/thread-phase/agents';
|
|
19
|
+
import { type AcpAgentConfig, type ContentBlock, type McpServer } from '../acp/index.js';
|
|
20
|
+
/** @internal */
|
|
21
|
+
export interface HermesAgentConfig {
|
|
22
|
+
/** Working directory advertised to Hermes at session/new. */
|
|
23
|
+
cwd: string;
|
|
24
|
+
/** Prompt sent via session/prompt. Strings become a single text block. */
|
|
25
|
+
prompt: string | ContentBlock[];
|
|
26
|
+
/** Resume a prior Hermes session by its id. */
|
|
27
|
+
resumeSessionId?: string;
|
|
28
|
+
/** Executable name; default 'hermes'. */
|
|
29
|
+
hermesExecutable?: string;
|
|
30
|
+
/**
|
|
31
|
+
* Full args list passed to the executable. Default `['acp']` so the
|
|
32
|
+
* standard `hermes acp` invocation works out of the box. Override
|
|
33
|
+
* when running a different subcommand or when the executable is not
|
|
34
|
+
* the `hermes` binary (tests using a stub, custom wrappers, etc.).
|
|
35
|
+
*/
|
|
36
|
+
hermesArgs?: string[];
|
|
37
|
+
/** Environment overrides merged with process.env. */
|
|
38
|
+
env?: Record<string, string>;
|
|
39
|
+
/** MCP servers exposed to Hermes; default []. */
|
|
40
|
+
mcpServers?: McpServer[];
|
|
41
|
+
/** Permission handling for tool calls Hermes asks the client to authorize. */
|
|
42
|
+
permissionMode?: AcpAgentConfig['permissionMode'];
|
|
43
|
+
/** Cancel-then-SIGTERM grace window in ms; default 2000. */
|
|
44
|
+
cancelGraceMs?: number;
|
|
45
|
+
/** SIGTERM-then-SIGKILL grace window in ms; default 3000. */
|
|
46
|
+
killGraceMs?: number;
|
|
47
|
+
}
|
|
48
|
+
/** @internal */
|
|
49
|
+
export declare const hermesAgent: AgentAdapterMeta<HermesAgentConfig>;
|
|
50
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hermes/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAsB,KAAK,gBAAgB,EAAE,MAAM,wCAAwC,CAAC;AACnG,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,SAAS,EACf,MAAM,iBAAiB,CAAC;AAEzB,gBAAgB;AAChB,MAAM,WAAW,iBAAiB;IAChC,6DAA6D;IAC7D,GAAG,EAAE,MAAM,CAAC;IACZ,0EAA0E;IAC1E,MAAM,EAAE,MAAM,GAAG,YAAY,EAAE,CAAC;IAChC,+CAA+C;IAC/C,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,yCAAyC;IACzC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;;;OAKG;IACH,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,qDAAqD;IACrD,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,iDAAiD;IACjD,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC;IACzB,8EAA8E;IAC9E,cAAc,CAAC,EAAE,cAAc,CAAC,gBAAgB,CAAC,CAAC;IAClD,4DAA4D;IAC5D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,6DAA6D;IAC7D,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAqBD,gBAAgB;AAChB,eAAO,MAAM,WAAW,EAAE,gBAAgB,CAAC,iBAAiB,CAI1D,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hermes adapter — wraps the ACP chassis to talk to `hermes acp`.
|
|
3
|
+
*
|
|
4
|
+
* Hermes ships an ACP-native server entry point (`hermes acp`), so the
|
|
5
|
+
* adapter is a thin configuration layer over `createAcpAdapter({ id: 'hermes' })`
|
|
6
|
+
* with sensible defaults for the executable and arguments.
|
|
7
|
+
*
|
|
8
|
+
* Requirements:
|
|
9
|
+
* - `hermes` binary installed and in PATH (or override via `hermesExecutable`)
|
|
10
|
+
* - Hermes configured with an OpenAI-compatible inference endpoint
|
|
11
|
+
*
|
|
12
|
+
* Session state persists in `~/.hermes/state.db`; resumption is via
|
|
13
|
+
* Hermes session ids, exposed by the chassis as
|
|
14
|
+
* `ResumeToken{ kind: 'opaque' }`.
|
|
15
|
+
*
|
|
16
|
+
* @internal
|
|
17
|
+
*/
|
|
18
|
+
import { defineAgentAdapter } from '@autonome-research/thread-phase/agents';
|
|
19
|
+
import { createAcpAdapter, } from '../acp/index.js';
|
|
20
|
+
const chassis = createAcpAdapter({ id: 'hermes' });
|
|
21
|
+
function toAcpConfig(config) {
|
|
22
|
+
const executable = config.hermesExecutable ?? 'hermes';
|
|
23
|
+
return {
|
|
24
|
+
command: executable,
|
|
25
|
+
args: config.hermesArgs ?? ['acp'],
|
|
26
|
+
cwd: config.cwd,
|
|
27
|
+
prompt: config.prompt,
|
|
28
|
+
resumeSessionId: config.resumeSessionId,
|
|
29
|
+
env: config.env,
|
|
30
|
+
mcpServers: config.mcpServers,
|
|
31
|
+
permissionMode: config.permissionMode,
|
|
32
|
+
cancelGraceMs: config.cancelGraceMs,
|
|
33
|
+
killGraceMs: config.killGraceMs,
|
|
34
|
+
clientInfo: { name: 'thread-phase-agents', version: '0.0.1' },
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
/** @internal */
|
|
38
|
+
export const hermesAgent = defineAgentAdapter({
|
|
39
|
+
id: chassis.id,
|
|
40
|
+
capabilities: chassis.capabilities,
|
|
41
|
+
adapter: (config, options) => chassis.adapter(toAcpConfig(config), options),
|
|
42
|
+
});
|
|
43
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hermes/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,kBAAkB,EAAyB,MAAM,wCAAwC,CAAC;AACnG,OAAO,EACL,gBAAgB,GAIjB,MAAM,iBAAiB,CAAC;AA+BzB,MAAM,OAAO,GAAG,gBAAgB,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;AAEnD,SAAS,WAAW,CAAC,MAAyB;IAC5C,MAAM,UAAU,GAAG,MAAM,CAAC,gBAAgB,IAAI,QAAQ,CAAC;IACvD,OAAO;QACL,OAAO,EAAE,UAAU;QACnB,IAAI,EAAE,MAAM,CAAC,UAAU,IAAI,CAAC,KAAK,CAAC;QAClC,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,eAAe,EAAE,MAAM,CAAC,eAAe;QACvC,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,UAAU,EAAE,EAAE,IAAI,EAAE,qBAAqB,EAAE,OAAO,EAAE,OAAO,EAAE;KAC9D,CAAC;AACJ,CAAC;AAED,gBAAgB;AAChB,MAAM,CAAC,MAAM,WAAW,GAAwC,kBAAkB,CAAC;IACjF,EAAE,EAAE,OAAO,CAAC,EAAE;IACd,YAAY,EAAE,OAAO,CAAC,YAAY;IAClC,OAAO,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;CAC5E,CAAC,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export { acpAgent, createAcpAdapter, JsonRpcCallError, type AcpAgentConfig, type CreateAcpAdapterOptions, type AcpAgentCapabilities, type AuthMethod, type ClientCapabilities, type ContentBlock, type Implementation, type McpServer, type SessionId, type StopReason, type ToolCallStatus, } from './acp/index.js';
|
|
2
|
+
export { hermesAgent, type HermesAgentConfig } from './hermes/index.js';
|
|
3
|
+
export { openClawAgent, type OpenClawAgentConfig } from './openclaw/index.js';
|
|
4
|
+
export { anthropicAgent, type AnthropicAgentConfig } from './anthropic/index.js';
|
|
5
|
+
export { codexAgent, type CodexAgentConfig } from './codex/index.js';
|
|
6
|
+
export { codexCliAgent, type CodexCliAgentConfig } from './codex-cli/index.js';
|
|
7
|
+
export { claudeCodeAgent, type ClaudeCodeAgentConfig } from './claude-code/index.js';
|
|
8
|
+
export { piAgent, type PiAgentConfig } from './pi/index.js';
|
|
9
|
+
export { injectMemory, injectResume } from './injectors.js';
|
|
10
|
+
export { threadToTranscript, threadToAcpPrompt, threadToAnthropicMessages, threadToClaudeCodePrompt, threadToCodexInput, threadToMessages, } from './thread-bridge.js';
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,QAAQ,EACR,gBAAgB,EAChB,gBAAgB,EAChB,KAAK,cAAc,EACnB,KAAK,uBAAuB,EAC5B,KAAK,oBAAoB,EACzB,KAAK,UAAU,EACf,KAAK,kBAAkB,EACvB,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,SAAS,EACd,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,cAAc,GACpB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,WAAW,EAAE,KAAK,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,KAAK,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,KAAK,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,KAAK,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EAAE,eAAe,EAAE,KAAK,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AACrF,OAAO,EAAE,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC;AAG5D,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAG5D,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,yBAAyB,EACzB,wBAAwB,EACxB,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,oBAAoB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// Adapter implementations will be exported from here as they land.
|
|
2
|
+
export { acpAgent, createAcpAdapter, JsonRpcCallError, } from './acp/index.js';
|
|
3
|
+
export { hermesAgent } from './hermes/index.js';
|
|
4
|
+
export { openClawAgent } from './openclaw/index.js';
|
|
5
|
+
export { anthropicAgent } from './anthropic/index.js';
|
|
6
|
+
export { codexAgent } from './codex/index.js';
|
|
7
|
+
export { codexCliAgent } from './codex-cli/index.js';
|
|
8
|
+
export { claudeCodeAgent } from './claude-code/index.js';
|
|
9
|
+
export { piAgent } from './pi/index.js';
|
|
10
|
+
// Pre-built inject callbacks for withMemory / withThread.
|
|
11
|
+
export { injectMemory, injectResume } from './injectors.js';
|
|
12
|
+
// Thread → adapter-input rendering helpers for cross-adapter handoff.
|
|
13
|
+
export { threadToTranscript, threadToAcpPrompt, threadToAnthropicMessages, threadToClaudeCodePrompt, threadToCodexInput, threadToMessages, } from './thread-bridge.js';
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,mEAAmE;AAEnE,OAAO,EACL,QAAQ,EACR,gBAAgB,EAChB,gBAAgB,GAYjB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,WAAW,EAA0B,MAAM,mBAAmB,CAAC;AACxE,OAAO,EAAE,aAAa,EAA4B,MAAM,qBAAqB,CAAC;AAC9E,OAAO,EAAE,cAAc,EAA6B,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAE,UAAU,EAAyB,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,aAAa,EAA4B,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EAAE,eAAe,EAA8B,MAAM,wBAAwB,CAAC;AACrF,OAAO,EAAE,OAAO,EAAsB,MAAM,eAAe,CAAC;AAE5D,0DAA0D;AAC1D,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE5D,sEAAsE;AACtE,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,yBAAyB,EACzB,wBAAwB,EACxB,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,oBAAoB,CAAC"}
|