niceeval 0.13.2 → 0.13.3-canary.37
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agents/claude-code-native.cjs +213 -0
- package/dist/agents/claude-code-native.cjs.map +1 -0
- package/dist/agents/claude-code-native.d.cts +5 -0
- package/dist/agents/claude-code-native.d.mts +5 -0
- package/dist/agents/claude-code-native.d.ts +5 -0
- package/dist/agents/claude-code-native.js +6 -0
- package/dist/agents/claude-code-native.js.map +1 -0
- package/dist/agents/claude-code.cjs +26 -80
- package/dist/agents/claude-code.cjs.map +1 -1
- package/dist/agents/codex-app-server.cjs +315 -0
- package/dist/agents/codex-app-server.cjs.map +1 -0
- package/dist/agents/codex-app-server.d.cts +9 -0
- package/dist/agents/codex-app-server.d.mts +9 -0
- package/dist/agents/codex-app-server.d.ts +9 -0
- package/dist/agents/codex-app-server.js +6 -0
- package/dist/agents/codex-app-server.js.map +1 -0
- package/dist/agents/codex.cjs +16 -65
- package/dist/agents/codex.cjs.map +1 -1
- package/dist/agents/index.cjs +3 -1
- package/dist/agents/index.cjs.map +1 -1
- package/dist/agents/index.d.cts +1 -0
- package/dist/agents/index.d.mts +1 -0
- package/dist/agents/index.d.ts +1 -0
- package/dist/agents/index.js +84 -82
- package/dist/agents/index.mjs +84 -82
- package/dist/agents/managed-jsonl.cjs +207 -0
- package/dist/agents/managed-jsonl.cjs.map +1 -0
- package/dist/agents/managed-jsonl.d.cts +39 -0
- package/dist/agents/managed-jsonl.d.mts +39 -0
- package/dist/agents/managed-jsonl.d.ts +39 -0
- package/dist/agents/managed-jsonl.js +6 -0
- package/dist/agents/managed-jsonl.js.map +1 -0
- package/dist/agents/managed-process.cjs +31 -0
- package/dist/agents/managed-process.cjs.map +1 -0
- package/dist/agents/managed-process.d.cts +3 -0
- package/dist/agents/managed-process.d.mts +3 -0
- package/dist/agents/managed-process.d.ts +3 -0
- package/dist/agents/managed-process.js +6 -0
- package/dist/agents/managed-process.js.map +1 -0
- package/dist/agents/omp.cjs +18 -1
- package/dist/agents/omp.cjs.map +1 -1
- package/dist/agents/types.cjs.map +1 -1
- package/dist/agents/types.d.cts +8 -0
- package/dist/agents/types.d.mts +8 -0
- package/dist/agents/types.d.ts +8 -0
- package/dist/context/assert-first.cjs +1 -0
- package/dist/context/assert-first.cjs.map +1 -1
- package/dist/context/assert-first.d.cts +1 -0
- package/dist/context/assert-first.d.mts +1 -0
- package/dist/context/assert-first.d.ts +1 -0
- package/dist/context/attempt-resources.cjs +13 -0
- package/dist/context/attempt-resources.cjs.map +1 -0
- package/dist/context/attempt-resources.d.cts +3 -0
- package/dist/context/attempt-resources.d.mts +3 -0
- package/dist/context/attempt-resources.d.ts +3 -0
- package/dist/context/attempt-resources.js +8 -0
- package/dist/context/attempt-resources.js.map +1 -0
- package/dist/context/session.cjs +4 -3
- package/dist/context/session.cjs.map +1 -1
- package/dist/context/session.d.cts +1 -0
- package/dist/context/session.d.mts +1 -0
- package/dist/context/session.d.ts +1 -0
- package/dist/report/assets/styles.css +4 -0
- package/dist/report/components/attempt-detail/compute.cjs +4 -2
- package/dist/report/components/attempt-detail/compute.cjs.map +1 -1
- package/dist/report/components/attempt-detail/compute.d.cts +2 -2
- package/dist/report/components/attempt-detail/compute.d.mts +2 -2
- package/dist/report/components/attempt-detail/compute.d.ts +2 -2
- package/dist/report/components/attempt-detail/content.cjs +1 -0
- package/dist/report/components/attempt-detail/content.cjs.map +1 -1
- package/dist/report/components/attempt-detail/validate.cjs +3 -2
- package/dist/report/components/attempt-detail/validate.cjs.map +1 -1
- package/dist/report/components/summaries/index.cjs +5 -1
- package/dist/report/components/summaries/index.cjs.map +1 -1
- package/dist/report/definition/primitives/conversation.cjs +7 -0
- package/dist/report/definition/primitives/conversation.cjs.map +1 -1
- package/dist/report/definition/primitives/conversation.d.cts +2 -0
- package/dist/report/definition/primitives/conversation.d.mts +2 -0
- package/dist/report/definition/primitives/conversation.d.ts +2 -0
- package/dist/report/definition/primitives/turn-trace.cjs +53 -3
- package/dist/report/definition/primitives/turn-trace.cjs.map +1 -1
- package/dist/report/react/styles.css +4 -0
- package/dist/runner/attempt-resources.cjs +60 -0
- package/dist/runner/attempt-resources.cjs.map +1 -0
- package/dist/runner/attempt-resources.d.cts +13 -0
- package/dist/runner/attempt-resources.d.mts +13 -0
- package/dist/runner/attempt-resources.d.ts +13 -0
- package/dist/runner/attempt-resources.js +6 -0
- package/dist/runner/attempt-resources.js.map +1 -0
- package/dist/runner/attempt.cjs +37 -3
- package/dist/runner/attempt.cjs.map +1 -1
- package/dist/sandbox/backend.cjs +32 -2
- package/dist/sandbox/backend.cjs.map +1 -1
- package/dist/sandbox/backend.d.cts +12 -1
- package/dist/sandbox/backend.d.mts +12 -1
- package/dist/sandbox/backend.d.ts +12 -1
- package/dist/sandbox/backend.js +28 -22
- package/dist/sandbox/docker.cjs +140 -0
- package/dist/sandbox/docker.cjs.map +1 -1
- package/dist/sandbox/docker.d.cts +3 -1
- package/dist/sandbox/docker.d.mts +3 -1
- package/dist/sandbox/docker.d.ts +3 -1
- package/dist/sandbox/e2b.cjs +42 -0
- package/dist/sandbox/e2b.cjs.map +1 -1
- package/dist/sandbox/e2b.d.cts +2 -0
- package/dist/sandbox/e2b.d.mts +2 -0
- package/dist/sandbox/e2b.d.ts +2 -0
- package/dist/sandbox/local.cjs +64 -0
- package/dist/sandbox/local.cjs.map +1 -1
- package/dist/sandbox/local.d.cts +3 -1
- package/dist/sandbox/local.d.mts +3 -1
- package/dist/sandbox/local.d.ts +3 -1
- package/dist/sandbox/managed-process.cjs +49 -0
- package/dist/sandbox/managed-process.cjs.map +1 -0
- package/dist/sandbox/managed-process.d.cts +11 -0
- package/dist/sandbox/managed-process.d.mts +11 -0
- package/dist/sandbox/managed-process.d.ts +11 -0
- package/dist/sandbox/managed-process.js +6 -0
- package/dist/sandbox/managed-process.js.map +1 -0
- package/dist/sandbox/types.cjs.map +1 -1
- package/dist/sandbox/types.d.cts +24 -0
- package/dist/sandbox/types.d.mts +24 -0
- package/dist/sandbox/types.d.ts +24 -0
- package/dist/sandbox/vercel.cjs +1 -0
- package/dist/sandbox/vercel.cjs.map +1 -1
- package/dist/sandbox/vercel.d.cts +1 -0
- package/dist/sandbox/vercel.d.mts +1 -0
- package/dist/sandbox/vercel.d.ts +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.sendCodexAppServer = sendCodexAppServer;
|
|
4
|
+
const session_slot_ts_1 = require("./session-slot.cjs");
|
|
5
|
+
const managed_jsonl_ts_1 = require("./managed-jsonl.cjs");
|
|
6
|
+
const shared_ts_1 = require("./shared.cjs");
|
|
7
|
+
const command_projection_ts_1 = require("../o11y/command-projection.cjs");
|
|
8
|
+
const send_failures_ts_1 = require("../context/send-failures.cjs");
|
|
9
|
+
const external_cause_ts_1 = require("../shared/external-cause.cjs");
|
|
10
|
+
const attempt_resources_ts_1 = require("../context/attempt-resources.cjs");
|
|
11
|
+
const stateSlot = (0, session_slot_ts_1.createSessionSlot)("codex/app-server-native");
|
|
12
|
+
function record(value) {
|
|
13
|
+
return value !== null && typeof value === "object" && !Array.isArray(value) ? value : undefined;
|
|
14
|
+
}
|
|
15
|
+
function eventKey(event) {
|
|
16
|
+
if (event.type === "operation.started" || event.type === "operation.finished")
|
|
17
|
+
return `${event.type}:${event.operationId}`;
|
|
18
|
+
if (event.type === "skill.loaded" && event.operationId)
|
|
19
|
+
return `${event.type}:${event.operationId}`;
|
|
20
|
+
return undefined;
|
|
21
|
+
}
|
|
22
|
+
function normalizeItem(value) {
|
|
23
|
+
const item = record(value);
|
|
24
|
+
if (!item || typeof item.type !== "string")
|
|
25
|
+
return value;
|
|
26
|
+
const type = {
|
|
27
|
+
agentMessage: "agent_message",
|
|
28
|
+
commandExecution: "command_execution",
|
|
29
|
+
mcpToolCall: "mcp_tool_call",
|
|
30
|
+
fileChange: "file_change",
|
|
31
|
+
webSearch: "web_search",
|
|
32
|
+
}[item.type] ?? item.type;
|
|
33
|
+
return { ...item, type };
|
|
34
|
+
}
|
|
35
|
+
function appServerUsage(frames) {
|
|
36
|
+
for (let index = frames.length - 1; index >= 0; index -= 1) {
|
|
37
|
+
const frame = record(frames[index]);
|
|
38
|
+
if (frame?.method !== "thread/tokenUsage/updated")
|
|
39
|
+
continue;
|
|
40
|
+
const last = record(record(record(frame.params)?.tokenUsage)?.last);
|
|
41
|
+
if (!last)
|
|
42
|
+
continue;
|
|
43
|
+
const number = (value) => typeof value === "number" && Number.isFinite(value) && value >= 0 ? value : 0;
|
|
44
|
+
const rawInput = number(last.inputTokens);
|
|
45
|
+
const cacheReadTokens = number(last.cachedInputTokens);
|
|
46
|
+
const reasoningTokens = number(last.reasoningOutputTokens);
|
|
47
|
+
return {
|
|
48
|
+
inputTokens: Math.max(0, rawInput - cacheReadTokens),
|
|
49
|
+
outputTokens: number(last.outputTokens),
|
|
50
|
+
...(cacheReadTokens > 0 ? { cacheReadTokens } : {}),
|
|
51
|
+
...(reasoningTokens > 0 ? { reasoningTokens } : {}),
|
|
52
|
+
requests: 1,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
return undefined;
|
|
56
|
+
}
|
|
57
|
+
function protocolEvents(frames, reported) {
|
|
58
|
+
const normalized = frames.flatMap((value) => {
|
|
59
|
+
const frame = record(value);
|
|
60
|
+
if (!frame || typeof frame.method !== "string")
|
|
61
|
+
return [];
|
|
62
|
+
const params = record(frame.params) ?? {};
|
|
63
|
+
const type = frame.method.replaceAll("/", ".");
|
|
64
|
+
return [{ type, ...params, ...(params.item === undefined ? {} : { item: normalizeItem(params.item) }) }];
|
|
65
|
+
});
|
|
66
|
+
const parsed = shared_ts_1.shared.parseCodex(normalized.map((frame) => JSON.stringify(frame)).join("\n"));
|
|
67
|
+
// app-server v2 streams per-turn usage separately from `turn/completed`.
|
|
68
|
+
// `last` is already the current turn's total, so take the latest notification
|
|
69
|
+
// in this send window instead of summing intermediate cumulative updates.
|
|
70
|
+
const usage = appServerUsage(frames) ?? (Object.keys(parsed.usage).length === 0 ? undefined : parsed.usage);
|
|
71
|
+
const events = parsed.events.filter((event) => {
|
|
72
|
+
const key = eventKey(event);
|
|
73
|
+
if (key === undefined)
|
|
74
|
+
return true;
|
|
75
|
+
if (reported.has(key))
|
|
76
|
+
return false;
|
|
77
|
+
reported.add(key);
|
|
78
|
+
return true;
|
|
79
|
+
});
|
|
80
|
+
return { events, ...(usage === undefined ? {} : { usage }) };
|
|
81
|
+
}
|
|
82
|
+
function evidence(frames, parseSuccess, events) {
|
|
83
|
+
if (frames.length === 0) {
|
|
84
|
+
const reason = "Codex app-server protocol output was unavailable; tool trajectory was not observed.";
|
|
85
|
+
return { events: { status: "unavailable", reason }, actions: { status: "unavailable", reason }, usage: { status: "unavailable", reason } };
|
|
86
|
+
}
|
|
87
|
+
if (!parseSuccess) {
|
|
88
|
+
const reason = "Some Codex app-server protocol frames could not be parsed.";
|
|
89
|
+
return { events: { status: "partial", reason }, actions: { status: "partial", reason } };
|
|
90
|
+
}
|
|
91
|
+
return (0, command_projection_ts_1.unclassifiedToolActionsCoverage)(events) ?? {};
|
|
92
|
+
}
|
|
93
|
+
async function resolveBin(sandbox) {
|
|
94
|
+
const result = await sandbox.runShell('if [ -x "$HOME/.local/bin/codex" ]; then printf %s "$HOME/.local/bin/codex"; else command -v codex; fi');
|
|
95
|
+
const value = result.stdout.trim();
|
|
96
|
+
if (result.exitCode !== 0 || !value)
|
|
97
|
+
throw new Error(`Codex CLI path resolution failed: ${result.stderr}`);
|
|
98
|
+
return value;
|
|
99
|
+
}
|
|
100
|
+
async function rpc(driver, cursor, id, method, params, signal) {
|
|
101
|
+
await driver.write({ id, method, params });
|
|
102
|
+
const receipt = await driver.waitFor(cursor, (value) => record(value)?.id === id, signal);
|
|
103
|
+
const frame = record(receipt.frame);
|
|
104
|
+
if (frame.error !== undefined)
|
|
105
|
+
throw new Error(`Codex app-server ${method} failed: ${JSON.stringify(frame.error)}`);
|
|
106
|
+
return { result: record(frame.result) ?? {}, cursor: receipt.cursor };
|
|
107
|
+
}
|
|
108
|
+
async function createState(ctx, env) {
|
|
109
|
+
const resources = (0, attempt_resources_ts_1.attemptResources)(ctx);
|
|
110
|
+
if (!resources)
|
|
111
|
+
throw new Error("Codex app-server requires an Attempt resource registry");
|
|
112
|
+
const driver = await managed_jsonl_ts_1.ManagedJsonlDriver.start(ctx.sandbox, "codex", resources, {
|
|
113
|
+
argv: [
|
|
114
|
+
await resolveBin(ctx.sandbox),
|
|
115
|
+
"app-server",
|
|
116
|
+
"--stdio",
|
|
117
|
+
"--enable", "default_mode_request_user_input",
|
|
118
|
+
"-c", 'sandbox_mode="danger-full-access"',
|
|
119
|
+
"-c", 'approval_policy="never"',
|
|
120
|
+
],
|
|
121
|
+
cwd: ctx.sandbox.workdir,
|
|
122
|
+
env,
|
|
123
|
+
}, () => ({ id: 9999999, method: "shutdown", params: {} }), (value) => {
|
|
124
|
+
const frame = record(value);
|
|
125
|
+
if (frame?.method !== "item/started")
|
|
126
|
+
return;
|
|
127
|
+
const item = record(record(frame.params)?.item);
|
|
128
|
+
const detail = typeof item?.type === "string" ? item.type : "Codex operation";
|
|
129
|
+
ctx.progress({ message: detail });
|
|
130
|
+
});
|
|
131
|
+
let cursor = 0;
|
|
132
|
+
const initialized = await rpc(driver, cursor, 1, "initialize", {
|
|
133
|
+
clientInfo: { name: "niceeval", title: "NiceEval", version: "1" },
|
|
134
|
+
}, ctx.signal);
|
|
135
|
+
cursor = initialized.cursor;
|
|
136
|
+
await driver.write({ method: "initialized" });
|
|
137
|
+
const started = await rpc(driver, cursor, 2, "thread/start", {
|
|
138
|
+
cwd: ctx.sandbox.workdir,
|
|
139
|
+
...(ctx.model === undefined ? {} : { model: ctx.model }),
|
|
140
|
+
approvalPolicy: "never",
|
|
141
|
+
sandbox: "danger-full-access",
|
|
142
|
+
// app-server 没有 `codex exec --dangerously-bypass-hook-trust` 的顶层 flag,
|
|
143
|
+
// 但 thread/start.config 会把这个 runtime-only override 交给同一 ConfigBuilder。
|
|
144
|
+
// Eval Sandbox 中的 hook 出处由 agent 配置显式声明,因此非交互运行统一 bypass。
|
|
145
|
+
config: { bypass_hook_trust: true },
|
|
146
|
+
}, ctx.signal);
|
|
147
|
+
cursor = started.cursor;
|
|
148
|
+
const threadId = record(started.result.thread)?.id;
|
|
149
|
+
if (typeof threadId !== "string" || !threadId)
|
|
150
|
+
throw new Error("Codex app-server thread/start returned no native thread id");
|
|
151
|
+
ctx.session.capture(threadId);
|
|
152
|
+
return { driver, cursor, threadId, reported: new Set() };
|
|
153
|
+
}
|
|
154
|
+
function validateResponses(pending, responses) {
|
|
155
|
+
if (!responses)
|
|
156
|
+
throw new Error("Codex app-server is waiting for structured input responses");
|
|
157
|
+
const byId = new Map(responses.map((response) => [response.requestId, response]));
|
|
158
|
+
if (byId.size !== responses.length)
|
|
159
|
+
throw new Error("Codex input responses contain duplicate request ids");
|
|
160
|
+
const expected = new Set(pending.questions.map((question) => question.requestId));
|
|
161
|
+
for (const id of byId.keys())
|
|
162
|
+
if (!expected.has(id))
|
|
163
|
+
throw new Error(`Unknown Codex input request ${id}`);
|
|
164
|
+
if (byId.size !== expected.size)
|
|
165
|
+
throw new Error("Codex input responses must answer the complete native question batch");
|
|
166
|
+
const answers = {};
|
|
167
|
+
for (const question of pending.questions) {
|
|
168
|
+
const response = byId.get(question.requestId);
|
|
169
|
+
const answer = "optionId" in response ? response.optionId : response.text;
|
|
170
|
+
if (answer === undefined)
|
|
171
|
+
throw new Error(`Codex input request ${question.requestId} has no answer`);
|
|
172
|
+
if ("optionId" in response && response.optionId !== undefined && !question.options.includes(response.optionId)) {
|
|
173
|
+
throw new Error(`Option ${response.optionId} is not available for Codex input request ${question.requestId}`);
|
|
174
|
+
}
|
|
175
|
+
answers[question.nativeQuestionId] = { answers: [answer] };
|
|
176
|
+
}
|
|
177
|
+
return answers;
|
|
178
|
+
}
|
|
179
|
+
function waitingTurn(state, frame, from, cursor, ctx) {
|
|
180
|
+
const params = record(frame.params) ?? {};
|
|
181
|
+
const questionsRaw = Array.isArray(params.questions) ? params.questions : [];
|
|
182
|
+
const itemId = typeof params.itemId === "string" ? params.itemId : "unknown-item";
|
|
183
|
+
const turnId = typeof params.turnId === "string" ? params.turnId : "unknown-turn";
|
|
184
|
+
const questions = questionsRaw.map((value) => {
|
|
185
|
+
const question = record(value) ?? {};
|
|
186
|
+
const nativeQuestionId = String(question.id ?? "unknown-question");
|
|
187
|
+
const options = Array.isArray(question.options)
|
|
188
|
+
? question.options.map((option) => String(record(option)?.label ?? "")).filter(Boolean)
|
|
189
|
+
: [];
|
|
190
|
+
return {
|
|
191
|
+
requestId: `${state.threadId}:${turnId}:${itemId}:${nativeQuestionId}`,
|
|
192
|
+
nativeQuestionId,
|
|
193
|
+
prompt: String(question.question ?? ""),
|
|
194
|
+
options,
|
|
195
|
+
};
|
|
196
|
+
});
|
|
197
|
+
if (questions.length === 0)
|
|
198
|
+
throw new Error("Codex app-server request_user_input contained no questions");
|
|
199
|
+
const rpcId = frame.id;
|
|
200
|
+
if (typeof rpcId !== "string" && typeof rpcId !== "number")
|
|
201
|
+
throw new Error("Codex app-server request_user_input had no JSON-RPC id");
|
|
202
|
+
state.pending = { rpcId, questions };
|
|
203
|
+
const parsed = protocolEvents(state.driver.framesSince(from).slice(0, cursor - from), state.reported);
|
|
204
|
+
for (const event of parsed.events)
|
|
205
|
+
if (event.type === "operation.started")
|
|
206
|
+
ctx.progress({ message: event.operation.name });
|
|
207
|
+
return {
|
|
208
|
+
status: "waiting",
|
|
209
|
+
events: [
|
|
210
|
+
...parsed.events,
|
|
211
|
+
...questions.map((question) => ({
|
|
212
|
+
type: "input.requested",
|
|
213
|
+
request: {
|
|
214
|
+
id: question.requestId,
|
|
215
|
+
action: "request_user_input",
|
|
216
|
+
prompt: question.prompt,
|
|
217
|
+
options: question.options.map((id) => ({ id })),
|
|
218
|
+
},
|
|
219
|
+
})),
|
|
220
|
+
],
|
|
221
|
+
...(parsed.usage === undefined ? {} : { usage: parsed.usage }),
|
|
222
|
+
evidenceCoverage: evidence(state.driver.framesSince(from).slice(0, cursor - from), true, parsed.events),
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
async function drive(state, ctx, from) {
|
|
226
|
+
const receipt = await state.driver.waitFor(state.cursor, (value) => {
|
|
227
|
+
const frame = record(value);
|
|
228
|
+
return frame?.method === "item/tool/requestUserInput" || frame?.method === "turn/completed" || frame?.method === "error";
|
|
229
|
+
}, ctx.signal);
|
|
230
|
+
state.cursor = receipt.cursor;
|
|
231
|
+
const frame = record(receipt.frame);
|
|
232
|
+
if (frame.method === "item/tool/requestUserInput")
|
|
233
|
+
return waitingTurn(state, frame, from, receipt.cursor, ctx);
|
|
234
|
+
const parsed = protocolEvents(state.driver.framesSince(from).slice(0, receipt.cursor - from), state.reported);
|
|
235
|
+
const turn = record(record(frame.params)?.turn);
|
|
236
|
+
const status = turn?.status;
|
|
237
|
+
if (frame.method === "error" || status === "failed") {
|
|
238
|
+
const raw = state.driver.framesSince(from).map((value) => JSON.stringify(value)).join("\n");
|
|
239
|
+
throw (0, send_failures_ts_1.makeSendFailure)({
|
|
240
|
+
acceptance: (0, send_failures_ts_1.sendAcceptanceFromEvents)(parsed.events),
|
|
241
|
+
message: `Codex app-server turn failed: ${JSON.stringify(frame.params)}`,
|
|
242
|
+
cause: (0, external_cause_ts_1.normalizeExternalCause)(frame.params),
|
|
243
|
+
events: parsed.events,
|
|
244
|
+
...(parsed.usage === undefined ? {} : { usage: parsed.usage }),
|
|
245
|
+
process: state.driver.processReceipt(),
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
for (const event of parsed.events)
|
|
249
|
+
if (event.type === "operation.started")
|
|
250
|
+
ctx.progress({ message: event.operation.name });
|
|
251
|
+
return {
|
|
252
|
+
status: "completed", events: parsed.events,
|
|
253
|
+
...(parsed.usage === undefined ? {} : { usage: parsed.usage }),
|
|
254
|
+
evidenceCoverage: evidence(state.driver.framesSince(from).slice(0, receipt.cursor - from), true, parsed.events),
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
async function sendCodexAppServer(input, ctx, env, failureFacts) {
|
|
258
|
+
let state = ctx.session.get(stateSlot);
|
|
259
|
+
if (!state) {
|
|
260
|
+
state = await createState(ctx, env);
|
|
261
|
+
ctx.session.set(stateSlot, state);
|
|
262
|
+
}
|
|
263
|
+
const from = state.cursor;
|
|
264
|
+
if (state.pending) {
|
|
265
|
+
const pending = state.pending;
|
|
266
|
+
const answers = validateResponses(pending, input.responses);
|
|
267
|
+
if (state.driver.framesSince(state.cursor).length !== 0) {
|
|
268
|
+
throw new Error("Codex app-server produced activity after entering waiting state; refusing an ambiguous answer");
|
|
269
|
+
}
|
|
270
|
+
try {
|
|
271
|
+
await state.driver.write({ id: pending.rpcId, result: { answers } });
|
|
272
|
+
}
|
|
273
|
+
catch (cause) {
|
|
274
|
+
throw (0, send_failures_ts_1.makeSendFailure)({
|
|
275
|
+
acceptance: "started",
|
|
276
|
+
message: `Codex app-server answer transport failed: ${cause instanceof Error ? cause.message : String(cause)}`,
|
|
277
|
+
cause: (0, external_cause_ts_1.normalizeExternalCause)(cause),
|
|
278
|
+
process: state.driver.processReceipt(),
|
|
279
|
+
});
|
|
280
|
+
}
|
|
281
|
+
// JSON-RPC response ids are native idempotency identities. Keep pending through
|
|
282
|
+
// validation and transport failure; commit only after the write receipt succeeds.
|
|
283
|
+
state.pending = undefined;
|
|
284
|
+
}
|
|
285
|
+
else {
|
|
286
|
+
if (input.responses?.length)
|
|
287
|
+
throw new Error("Codex app-server received responses while no input request was pending");
|
|
288
|
+
const started = await rpc(state.driver, state.cursor, 10000 + state.cursor, "turn/start", {
|
|
289
|
+
threadId: state.threadId,
|
|
290
|
+
input: [{ type: "text", text: input.text }],
|
|
291
|
+
approvalPolicy: "never",
|
|
292
|
+
sandboxPolicy: { type: "dangerFullAccess" },
|
|
293
|
+
...(ctx.model === undefined ? {} : { model: ctx.model }),
|
|
294
|
+
...(ctx.reasoningEffort === undefined ? {} : { effort: ctx.reasoningEffort }),
|
|
295
|
+
}, ctx.signal);
|
|
296
|
+
state.cursor = started.cursor;
|
|
297
|
+
}
|
|
298
|
+
try {
|
|
299
|
+
return await drive(state, ctx, from);
|
|
300
|
+
}
|
|
301
|
+
catch (cause) {
|
|
302
|
+
if (typeof cause === "object" && cause !== null && cause.type === "agent-send-failed")
|
|
303
|
+
throw cause;
|
|
304
|
+
const raw = state.driver.framesSince(from).map((value) => JSON.stringify(value)).join("\n");
|
|
305
|
+
const message = cause instanceof Error ? cause.message : String(cause);
|
|
306
|
+
const facts = failureFacts?.(raw, protocolEvents(state.driver.framesSince(from), new Set()).events, message);
|
|
307
|
+
throw (0, send_failures_ts_1.makeSendFailure)({
|
|
308
|
+
acceptance: facts?.acceptance ?? (state.pending === undefined ? "unknown" : "started"),
|
|
309
|
+
message: `Codex app-server transport failed: ${message} (frames=${state.driver.frameKinds() || "none"})`,
|
|
310
|
+
cause: facts?.cause ?? (0, external_cause_ts_1.normalizeExternalCause)(cause),
|
|
311
|
+
process: state.driver.processReceipt(),
|
|
312
|
+
});
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
//# sourceMappingURL=codex-app-server.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-app-server.js","sourceRoot":"","sources":["codex-app-server.ts"],"names":[],"mappings":"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","sourcesContent":["import type { InputResponse, SandboxAgentContext, StreamEvent, Turn, TurnEvidenceCoverage, Usage } from \"../types.ts\";\nimport { createSessionSlot } from \"./session-slot.ts\";\nimport { ManagedJsonlDriver } from \"./managed-jsonl.ts\";\nimport { shared } from \"./shared.ts\";\nimport { unclassifiedToolActionsCoverage } from \"../o11y/command-projection.ts\";\nimport { makeSendFailure, sendAcceptanceFromEvents } from \"../context/send-failures.ts\";\nimport { normalizeExternalCause, type ExternalCause } from \"../shared/external-cause.ts\";\nimport { attemptResources } from \"../context/attempt-resources.ts\";\ntype RecordValue = globalThis.Record<string, unknown>;\ntype PendingQuestion = {\n readonly requestId: string;\n readonly nativeQuestionId: string;\n readonly prompt: string;\n readonly options: readonly string[];\n};\ntype PendingBatch = {\n readonly rpcId: string | number;\n readonly questions: readonly PendingQuestion[];\n};\ntype CodexState = {\n readonly driver: ManagedJsonlDriver;\n cursor: number;\n readonly threadId: string;\n pending?: PendingBatch;\n readonly reported: Set<string>;\n};\nconst stateSlot = createSessionSlot<CodexState>(\"codex/app-server-native\");\nfunction record(value: unknown): RecordValue | undefined {\n return value !== null && typeof value === \"object\" && !Array.isArray(value) ? value as RecordValue : undefined;\n}\nfunction eventKey(event: StreamEvent): string | undefined {\n if (event.type === \"operation.started\" || event.type === \"operation.finished\")\n return `${event.type}:${event.operationId}`;\n if (event.type === \"skill.loaded\" && event.operationId)\n return `${event.type}:${event.operationId}`;\n return undefined;\n}\nfunction normalizeItem(value: unknown): unknown {\n const item = record(value);\n if (!item || typeof item.type !== \"string\")\n return value;\n const type = ({\n agentMessage: \"agent_message\",\n commandExecution: \"command_execution\",\n mcpToolCall: \"mcp_tool_call\",\n fileChange: \"file_change\",\n webSearch: \"web_search\",\n } as Record<string, string>)[item.type] ?? item.type;\n return { ...item, type };\n}\nfunction appServerUsage(frames: readonly unknown[]): Usage | undefined {\n for (let index = frames.length - 1; index >= 0; index -= 1) {\n const frame = record(frames[index]);\n if (frame?.method !== \"thread/tokenUsage/updated\")\n continue;\n const last = record(record(record(frame.params)?.tokenUsage)?.last);\n if (!last)\n continue;\n const number = (value: unknown): number => typeof value === \"number\" && Number.isFinite(value) && value >= 0 ? value : 0;\n const rawInput = number(last.inputTokens);\n const cacheReadTokens = number(last.cachedInputTokens);\n const reasoningTokens = number(last.reasoningOutputTokens);\n return {\n inputTokens: Math.max(0, rawInput - cacheReadTokens),\n outputTokens: number(last.outputTokens),\n ...(cacheReadTokens > 0 ? { cacheReadTokens } : {}),\n ...(reasoningTokens > 0 ? { reasoningTokens } : {}),\n requests: 1,\n };\n }\n return undefined;\n}\nfunction protocolEvents(frames: readonly unknown[], reported: Set<string>): {\n events: StreamEvent[];\n usage?: Usage;\n} {\n const normalized = frames.flatMap((value) => {\n const frame = record(value);\n if (!frame || typeof frame.method !== \"string\")\n return [];\n const params = record(frame.params) ?? {};\n const type = frame.method.replaceAll(\"/\", \".\");\n return [{ type, ...params, ...(params.item === undefined ? {} : { item: normalizeItem(params.item) }) }];\n });\n const parsed = shared.parseCodex(normalized.map((frame) => JSON.stringify(frame)).join(\"\\n\"));\n // app-server v2 streams per-turn usage separately from `turn/completed`.\n // `last` is already the current turn's total, so take the latest notification\n // in this send window instead of summing intermediate cumulative updates.\n const usage = appServerUsage(frames) ?? (Object.keys(parsed.usage).length === 0 ? undefined : parsed.usage);\n const events = parsed.events.filter((event) => {\n const key = eventKey(event);\n if (key === undefined)\n return true;\n if (reported.has(key))\n return false;\n reported.add(key);\n return true;\n });\n return { events, ...(usage === undefined ? {} : { usage }) };\n}\nfunction evidence(frames: readonly unknown[], parseSuccess: boolean, events: readonly StreamEvent[]): TurnEvidenceCoverage {\n if (frames.length === 0) {\n const reason = \"Codex app-server protocol output was unavailable; tool trajectory was not observed.\";\n return { events: { status: \"unavailable\", reason }, actions: { status: \"unavailable\", reason }, usage: { status: \"unavailable\", reason } };\n }\n if (!parseSuccess) {\n const reason = \"Some Codex app-server protocol frames could not be parsed.\";\n return { events: { status: \"partial\", reason }, actions: { status: \"partial\", reason } };\n }\n return unclassifiedToolActionsCoverage(events) ?? {};\n}\nasync function resolveBin(sandbox: SandboxAgentContext[\"sandbox\"]): Promise<string> {\n const result = await sandbox.runShell('if [ -x \"$HOME/.local/bin/codex\" ]; then printf %s \"$HOME/.local/bin/codex\"; else command -v codex; fi');\n const value = result.stdout.trim();\n if (result.exitCode !== 0 || !value)\n throw new Error(`Codex CLI path resolution failed: ${result.stderr}`);\n return value;\n}\nasync function rpc(driver: ManagedJsonlDriver, cursor: number, id: number, method: string, params: unknown, signal: AbortSignal): Promise<{\n result: RecordValue;\n cursor: number;\n}> {\n await driver.write({ id, method, params });\n const receipt = await driver.waitFor(cursor, (value) => record(value)?.id === id, signal);\n const frame = record(receipt.frame)!;\n if (frame.error !== undefined)\n throw new Error(`Codex app-server ${method} failed: ${JSON.stringify(frame.error)}`);\n return { result: record(frame.result) ?? {}, cursor: receipt.cursor };\n}\nasync function createState(ctx: SandboxAgentContext, env: Readonly<Record<string, string>>): Promise<CodexState> {\n const resources = attemptResources(ctx);\n if (!resources)\n throw new Error(\"Codex app-server requires an Attempt resource registry\");\n const driver = await ManagedJsonlDriver.start(ctx.sandbox, \"codex\", resources, {\n argv: [\n await resolveBin(ctx.sandbox),\n \"app-server\",\n \"--stdio\",\n \"--enable\", \"default_mode_request_user_input\",\n \"-c\", 'sandbox_mode=\"danger-full-access\"',\n \"-c\", 'approval_policy=\"never\"',\n ],\n cwd: ctx.sandbox.workdir,\n env,\n }, () => ({ id: 9999999, method: \"shutdown\", params: {} }), (value) => {\n const frame = record(value);\n if (frame?.method !== \"item/started\")\n return;\n const item = record(record(frame.params)?.item);\n const detail = typeof item?.type === \"string\" ? item.type : \"Codex operation\";\n ctx.progress({ message: detail });\n });\n let cursor = 0;\n const initialized = await rpc(driver, cursor, 1, \"initialize\", {\n clientInfo: { name: \"niceeval\", title: \"NiceEval\", version: \"1\" },\n }, ctx.signal);\n cursor = initialized.cursor;\n await driver.write({ method: \"initialized\" });\n const started = await rpc(driver, cursor, 2, \"thread/start\", {\n cwd: ctx.sandbox.workdir,\n ...(ctx.model === undefined ? {} : { model: ctx.model }),\n approvalPolicy: \"never\",\n sandbox: \"danger-full-access\",\n // app-server 没有 `codex exec --dangerously-bypass-hook-trust` 的顶层 flag,\n // 但 thread/start.config 会把这个 runtime-only override 交给同一 ConfigBuilder。\n // Eval Sandbox 中的 hook 出处由 agent 配置显式声明,因此非交互运行统一 bypass。\n config: { bypass_hook_trust: true },\n }, ctx.signal);\n cursor = started.cursor;\n const threadId = record(started.result.thread)?.id;\n if (typeof threadId !== \"string\" || !threadId)\n throw new Error(\"Codex app-server thread/start returned no native thread id\");\n ctx.session.capture(threadId);\n return { driver, cursor, threadId, reported: new Set() };\n}\nfunction validateResponses(pending: PendingBatch, responses: readonly InputResponse[] | undefined): Record<string, {\n answers: string[];\n}> {\n if (!responses)\n throw new Error(\"Codex app-server is waiting for structured input responses\");\n const byId = new Map(responses.map((response) => [response.requestId, response]));\n if (byId.size !== responses.length)\n throw new Error(\"Codex input responses contain duplicate request ids\");\n const expected = new Set(pending.questions.map((question) => question.requestId));\n for (const id of byId.keys())\n if (!expected.has(id))\n throw new Error(`Unknown Codex input request ${id}`);\n if (byId.size !== expected.size)\n throw new Error(\"Codex input responses must answer the complete native question batch\");\n const answers: Record<string, {\n answers: string[];\n }> = {};\n for (const question of pending.questions) {\n const response = byId.get(question.requestId)!;\n const answer = \"optionId\" in response ? response.optionId : response.text;\n if (answer === undefined)\n throw new Error(`Codex input request ${question.requestId} has no answer`);\n if (\"optionId\" in response && response.optionId !== undefined && !question.options.includes(response.optionId)) {\n throw new Error(`Option ${response.optionId} is not available for Codex input request ${question.requestId}`);\n }\n answers[question.nativeQuestionId] = { answers: [answer] };\n }\n return answers;\n}\nfunction waitingTurn(state: CodexState, frame: RecordValue, from: number, cursor: number, ctx: SandboxAgentContext): Turn {\n const params = record(frame.params) ?? {};\n const questionsRaw = Array.isArray(params.questions) ? params.questions : [];\n const itemId = typeof params.itemId === \"string\" ? params.itemId : \"unknown-item\";\n const turnId = typeof params.turnId === \"string\" ? params.turnId : \"unknown-turn\";\n const questions: PendingQuestion[] = questionsRaw.map((value) => {\n const question = record(value) ?? {};\n const nativeQuestionId = String(question.id ?? \"unknown-question\");\n const options = Array.isArray(question.options)\n ? question.options.map((option) => String(record(option)?.label ?? \"\")).filter(Boolean)\n : [];\n return {\n requestId: `${state.threadId}:${turnId}:${itemId}:${nativeQuestionId}`,\n nativeQuestionId,\n prompt: String(question.question ?? \"\"),\n options,\n };\n });\n if (questions.length === 0)\n throw new Error(\"Codex app-server request_user_input contained no questions\");\n const rpcId = frame.id;\n if (typeof rpcId !== \"string\" && typeof rpcId !== \"number\")\n throw new Error(\"Codex app-server request_user_input had no JSON-RPC id\");\n state.pending = { rpcId, questions };\n const parsed = protocolEvents(state.driver.framesSince(from).slice(0, cursor - from), state.reported);\n for (const event of parsed.events)\n if (event.type === \"operation.started\")\n ctx.progress({ message: event.operation.name });\n return {\n status: \"waiting\",\n events: [\n ...parsed.events,\n ...questions.map((question): StreamEvent => ({\n type: \"input.requested\",\n request: {\n id: question.requestId,\n action: \"request_user_input\",\n prompt: question.prompt,\n options: question.options.map((id) => ({ id })),\n },\n })),\n ],\n ...(parsed.usage === undefined ? {} : { usage: parsed.usage }),\n evidenceCoverage: evidence(state.driver.framesSince(from).slice(0, cursor - from), true, parsed.events),\n };\n}\nasync function drive(state: CodexState, ctx: SandboxAgentContext, from: number): Promise<Turn> {\n const receipt = await state.driver.waitFor(state.cursor, (value) => {\n const frame = record(value);\n return frame?.method === \"item/tool/requestUserInput\" || frame?.method === \"turn/completed\" || frame?.method === \"error\";\n }, ctx.signal);\n state.cursor = receipt.cursor;\n const frame = record(receipt.frame)!;\n if (frame.method === \"item/tool/requestUserInput\")\n return waitingTurn(state, frame, from, receipt.cursor, ctx);\n const parsed = protocolEvents(state.driver.framesSince(from).slice(0, receipt.cursor - from), state.reported);\n const turn = record(record(frame.params)?.turn);\n const status = turn?.status;\n if (frame.method === \"error\" || status === \"failed\") {\n const raw = state.driver.framesSince(from).map((value) => JSON.stringify(value)).join(\"\\n\");\n throw makeSendFailure({\n acceptance: sendAcceptanceFromEvents(parsed.events),\n message: `Codex app-server turn failed: ${JSON.stringify(frame.params)}`,\n cause: normalizeExternalCause(frame.params),\n events: parsed.events,\n ...(parsed.usage === undefined ? {} : { usage: parsed.usage }),\n process: state.driver.processReceipt(),\n });\n }\n for (const event of parsed.events)\n if (event.type === \"operation.started\")\n ctx.progress({ message: event.operation.name });\n return {\n status: \"completed\", events: parsed.events,\n ...(parsed.usage === undefined ? {} : { usage: parsed.usage }),\n evidenceCoverage: evidence(state.driver.framesSince(from).slice(0, receipt.cursor - from), true, parsed.events),\n };\n}\nexport async function sendCodexAppServer(input: {\n readonly text: string;\n readonly responses?: readonly InputResponse[];\n}, ctx: SandboxAgentContext, env: Readonly<Record<string, string>>, failureFacts?: (raw: string, events: readonly StreamEvent[], nativeText: string) => {\n readonly acceptance: \"rejected\" | \"started\" | \"unknown\";\n readonly cause?: ExternalCause;\n}): Promise<Turn> {\n let state = ctx.session.get(stateSlot);\n if (!state) {\n state = await createState(ctx, env);\n ctx.session.set(stateSlot, state);\n }\n const from = state.cursor;\n if (state.pending) {\n const pending = state.pending;\n const answers = validateResponses(pending, input.responses);\n if (state.driver.framesSince(state.cursor).length !== 0) {\n throw new Error(\"Codex app-server produced activity after entering waiting state; refusing an ambiguous answer\");\n }\n try {\n await state.driver.write({ id: pending.rpcId, result: { answers } });\n }\n catch (cause) {\n throw makeSendFailure({\n acceptance: \"started\",\n message: `Codex app-server answer transport failed: ${cause instanceof Error ? cause.message : String(cause)}`,\n cause: normalizeExternalCause(cause),\n process: state.driver.processReceipt(),\n });\n }\n // JSON-RPC response ids are native idempotency identities. Keep pending through\n // validation and transport failure; commit only after the write receipt succeeds.\n state.pending = undefined;\n }\n else {\n if (input.responses?.length)\n throw new Error(\"Codex app-server received responses while no input request was pending\");\n const started = await rpc(state.driver, state.cursor, 10000 + state.cursor, \"turn/start\", {\n threadId: state.threadId,\n input: [{ type: \"text\", text: input.text }],\n approvalPolicy: \"never\",\n sandboxPolicy: { type: \"dangerFullAccess\" },\n ...(ctx.model === undefined ? {} : { model: ctx.model }),\n ...(ctx.reasoningEffort === undefined ? {} : { effort: ctx.reasoningEffort }),\n }, ctx.signal);\n state.cursor = started.cursor;\n }\n try {\n return await drive(state, ctx, from);\n }\n catch (cause) {\n if (typeof cause === \"object\" && cause !== null && (cause as {\n type?: unknown;\n }).type === \"agent-send-failed\")\n throw cause;\n const raw = state.driver.framesSince(from).map((value) => JSON.stringify(value)).join(\"\\n\");\n const message = cause instanceof Error ? cause.message : String(cause);\n const facts = failureFacts?.(raw, protocolEvents(state.driver.framesSince(from), new Set()).events, message);\n throw makeSendFailure({\n acceptance: facts?.acceptance ?? (state.pending === undefined ? \"unknown\" : \"started\"),\n message: `Codex app-server transport failed: ${message} (frames=${state.driver.frameKinds() || \"none\"})`,\n cause: facts?.cause ?? normalizeExternalCause(cause),\n process: state.driver.processReceipt(),\n });\n }\n}\n"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { InputResponse, SandboxAgentContext, StreamEvent, Turn } from "../types.cjs";
|
|
2
|
+
import { type ExternalCause } from "../shared/external-cause.cjs";
|
|
3
|
+
export declare function sendCodexAppServer(input: {
|
|
4
|
+
readonly text: string;
|
|
5
|
+
readonly responses?: readonly InputResponse[];
|
|
6
|
+
}, ctx: SandboxAgentContext, env: Readonly<Record<string, string>>, failureFacts?: (raw: string, events: readonly StreamEvent[], nativeText: string) => {
|
|
7
|
+
readonly acceptance: "rejected" | "started" | "unknown";
|
|
8
|
+
readonly cause?: ExternalCause;
|
|
9
|
+
}): Promise<Turn>;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { InputResponse, SandboxAgentContext, StreamEvent, Turn } from "../types.mjs";
|
|
2
|
+
import { type ExternalCause } from "../shared/external-cause.mjs";
|
|
3
|
+
export declare function sendCodexAppServer(input: {
|
|
4
|
+
readonly text: string;
|
|
5
|
+
readonly responses?: readonly InputResponse[];
|
|
6
|
+
}, ctx: SandboxAgentContext, env: Readonly<Record<string, string>>, failureFacts?: (raw: string, events: readonly StreamEvent[], nativeText: string) => {
|
|
7
|
+
readonly acceptance: "rejected" | "started" | "unknown";
|
|
8
|
+
readonly cause?: ExternalCause;
|
|
9
|
+
}): Promise<Turn>;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { InputResponse, SandboxAgentContext, StreamEvent, Turn } from "../types.js";
|
|
2
|
+
import { type ExternalCause } from "../shared/external-cause.js";
|
|
3
|
+
export declare function sendCodexAppServer(input: {
|
|
4
|
+
readonly text: string;
|
|
5
|
+
readonly responses?: readonly InputResponse[];
|
|
6
|
+
}, ctx: SandboxAgentContext, env: Readonly<Record<string, string>>, failureFacts?: (raw: string, events: readonly StreamEvent[], nativeText: string) => {
|
|
7
|
+
readonly acceptance: "rejected" | "started" | "unknown";
|
|
8
|
+
readonly cause?: ExternalCause;
|
|
9
|
+
}): Promise<Turn>;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { createRequire as __niceevalCreateRequire } from "node:module";
|
|
2
|
+
const __niceevalRequire = __niceevalCreateRequire(import.meta.url);
|
|
3
|
+
const __niceevalCanonical = __niceevalRequire("./codex-app-server.cjs");
|
|
4
|
+
const __niceevalExport0 = __niceevalCanonical["sendCodexAppServer"];
|
|
5
|
+
export { __niceevalExport0 as sendCodexAppServer };
|
|
6
|
+
//# sourceMappingURL=codex-app-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-app-server.js","sources":[],"names":[],"mappings":""}
|
package/dist/agents/codex.cjs
CHANGED
|
@@ -11,7 +11,6 @@ const skills_ts_1 = require("./skills.cjs");
|
|
|
11
11
|
const marketplace_ts_1 = require("./marketplace.cjs");
|
|
12
12
|
const native_config_ts_1 = require("./native-config.cjs");
|
|
13
13
|
const codex_ts_1 = require("../o11y/otlp/mappers/codex.cjs");
|
|
14
|
-
const command_projection_ts_1 = require("../o11y/command-projection.cjs");
|
|
15
14
|
const index_ts_1 = require("../i18n/index.cjs");
|
|
16
15
|
const coding_cli_versions_ts_1 = require("./coding-cli-versions.cjs");
|
|
17
16
|
const mcp_ts_1 = require("./mcp.cjs");
|
|
@@ -19,10 +18,13 @@ const post_setup_ts_1 = require("./post-setup.cjs");
|
|
|
19
18
|
const npm_staged_ts_1 = require("./npm-staged.cjs");
|
|
20
19
|
const send_failures_ts_1 = require("../context/send-failures.cjs");
|
|
21
20
|
const external_cause_ts_1 = require("../shared/external-cause.cjs");
|
|
21
|
+
const backend_ts_1 = require("../sandbox/backend.cjs");
|
|
22
|
+
const attempt_resources_ts_1 = require("../context/attempt-resources.cjs");
|
|
23
|
+
const codex_app_server_ts_1 = require("./codex-app-server.cjs");
|
|
22
24
|
// ───────────────────────────────────────────────────────────────────────────
|
|
23
25
|
// OpenAI Codex CLI 的 agent adapter(沙箱型)。
|
|
24
26
|
//
|
|
25
|
-
//
|
|
27
|
+
// 连接方式:在沙箱里维护 Codex app-server stdio,原生通知 → 标准事件流。
|
|
26
28
|
// 配置:鉴权本地(config / env),模型交给实验(ctx.model),推理努力程度经 ctx.reasoningEffort,
|
|
27
29
|
// 其余参数经 ctx.flags。
|
|
28
30
|
// 扩展(skill / plugin / MCP)是构造参数,setup 翻译成 codex 的原生形态并写 manifest。
|
|
@@ -206,6 +208,7 @@ function codexAgent(config) {
|
|
|
206
208
|
ensure,
|
|
207
209
|
installers: [installer],
|
|
208
210
|
setup: (sb, ctx) => effect_1.Effect.runPromise(effect_1.Effect.scoped(effect_1.Effect.gen(function* () {
|
|
211
|
+
yield* effect_1.Effect.try({ try: () => (0, backend_ts_1.requireManagedProcessCapability)(sb, "codex"), catch: (cause) => cause });
|
|
209
212
|
// 用户的原生配置文件:本地读原始字节 → 验 TOML 语法与保留键。字节 SHA-256 进
|
|
210
213
|
// manifest 与安装 checkpoint key(见 native-config.ts 的 nativeConfigCheckpointItem)。
|
|
211
214
|
let nativeConfig;
|
|
@@ -348,6 +351,7 @@ function codexAgent(config) {
|
|
|
348
351
|
// preTeardown 与 postSetup 成对:LIFO 镜像,先于 agent 自己的收尾步骤执行。
|
|
349
352
|
// codex 目前没有其它收尾步骤,这段就是整个 teardown。
|
|
350
353
|
await (0, post_setup_ts_1.runPreTeardownHooks)(sb, ctx, "codex", config?.preTeardown);
|
|
354
|
+
await (0, attempt_resources_ts_1.attemptResources)(ctx)?.shutdownAll(ctx.signal);
|
|
351
355
|
},
|
|
352
356
|
tracing: {
|
|
353
357
|
protocol: "http/json",
|
|
@@ -364,71 +368,18 @@ function codexAgent(config) {
|
|
|
364
368
|
},
|
|
365
369
|
},
|
|
366
370
|
async send(input, ctx) {
|
|
367
|
-
const sb = ctx.sandbox;
|
|
368
|
-
// hook trust bypass 是 runtime-only(config.toml 设不了):headless 下 codex 对非 managed
|
|
369
|
-
// 来源 hook 的交互式授信永远无人应答,不带它插件装的 hook 会被静默跳过、零报错
|
|
370
|
-
// (见 memory/codex-hook-trust-headless-silent-skip.md)。沙箱内 hook 来源全部由实验配置
|
|
371
|
-
// 声明,与 approvals/sandbox bypass 同一信任层级。
|
|
372
|
-
const flags = "--json --dangerously-bypass-approvals-and-sandbox --skip-git-repo-check --dangerously-bypass-hook-trust";
|
|
373
|
-
const prompt = shared_ts_1.shared.shellQuote(input.text);
|
|
374
|
-
const resuming = ctx.session.id;
|
|
375
|
-
const cmd = resuming
|
|
376
|
-
? `${shared_ts_1.shared.agentBin("codex")} exec resume ${ctx.session.id} ${flags} ${prompt}`
|
|
377
|
-
: `${shared_ts_1.shared.agentBin("codex")} exec ${flags} ${prompt}`;
|
|
378
|
-
// `codex exec --json` 持续写出 ThreadEvent JSONL。把它压成短 step 送进 runner
|
|
379
|
-
// progress,human dashboard 因而能显示真正的 tool / reasoning / assistant 活动;完整
|
|
380
|
-
// transcript 仍在命令结束后一次解析并落入 events artifact,不能让 live 文案变成第二份结果。
|
|
381
|
-
const onStdout = codexProgressReporter(ctx);
|
|
382
371
|
const apiKey = getApiKey();
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
env
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
ctx.session.capture(shared_ts_1.shared.codexThreadId(res.stdout));
|
|
393
|
-
const parsed = shared_ts_1.shared.parseCodex(raw);
|
|
394
|
-
const events = [...parsed.events];
|
|
395
|
-
let turnEvidenceCoverage;
|
|
396
|
-
if (!raw?.trim()) {
|
|
397
|
-
const reason = "Codex JSONL transcript was unavailable; tool trajectory was not observed.";
|
|
398
|
-
turnEvidenceCoverage = {
|
|
399
|
-
events: { status: "unavailable", reason },
|
|
400
|
-
actions: { status: "unavailable", reason },
|
|
401
|
-
usage: { status: "unavailable", reason },
|
|
402
|
-
};
|
|
403
|
-
}
|
|
404
|
-
else if (!parsed.parseSuccess) {
|
|
405
|
-
const reason = "Some Codex JSONL transcript lines could not be parsed.";
|
|
406
|
-
turnEvidenceCoverage = {
|
|
407
|
-
events: { status: "partial", reason },
|
|
408
|
-
actions: { status: "partial", reason },
|
|
372
|
+
return (0, codex_app_server_ts_1.sendCodexAppServer)(input, ctx, {
|
|
373
|
+
...agentEnv,
|
|
374
|
+
OPENAI_API_KEY: apiKey,
|
|
375
|
+
...ctx.telemetry?.env,
|
|
376
|
+
}, (raw, events, nativeText) => {
|
|
377
|
+
const code = codexCapacityCode(raw);
|
|
378
|
+
return {
|
|
379
|
+
acceptance: codexAcceptance(raw, events, nativeText),
|
|
380
|
+
...(code === undefined ? {} : { cause: (0, external_cause_ts_1.normalizeExternalCause)({ code }) }),
|
|
409
381
|
};
|
|
410
|
-
}
|
|
411
|
-
else {
|
|
412
|
-
turnEvidenceCoverage = (0, command_projection_ts_1.unclassifiedToolActionsCoverage)(events);
|
|
413
|
-
}
|
|
414
|
-
if (res.exitCode !== 0) {
|
|
415
|
-
throw (0, send_failures_ts_1.makeSendFailure)({
|
|
416
|
-
acceptance: codexAcceptance(raw, events, res.stderr),
|
|
417
|
-
message: shared_ts_1.shared.diagnoseFailure(res, parsed.events, raw),
|
|
418
|
-
...(codexCapacityCode(raw) !== undefined
|
|
419
|
-
? { cause: (0, external_cause_ts_1.normalizeExternalCause)({ code: codexCapacityCode(raw) }) }
|
|
420
|
-
: {}),
|
|
421
|
-
events,
|
|
422
|
-
usage: parsed.usage,
|
|
423
|
-
process: res,
|
|
424
|
-
});
|
|
425
|
-
}
|
|
426
|
-
return {
|
|
427
|
-
events,
|
|
428
|
-
usage: parsed.usage,
|
|
429
|
-
status: "completed",
|
|
430
|
-
...(turnEvidenceCoverage === undefined ? {} : { evidenceCoverage: turnEvidenceCoverage }),
|
|
431
|
-
};
|
|
382
|
+
});
|
|
432
383
|
},
|
|
433
384
|
}), config?.postSetup, config?.preTeardown);
|
|
434
385
|
}
|