feat: adapt codex app-server protocol updates

This commit is contained in:
AI Bot
2026-05-31 03:25:30 +08:00
parent e1aed590f8
commit b9d3cca2e7
820 changed files with 108070 additions and 71 deletions

View File

@@ -4,6 +4,8 @@ import readline from "node:readline";
const rl = readline.createInterface({ input: process.stdin });
const received = [];
let injectedItems = [];
let overloadedTurnStartEmitted = false;
function send(message) {
process.stdout.write(`${JSON.stringify(message)}\n`);
@@ -42,6 +44,42 @@ rl.on("line", (line) => {
return;
}
if (message.method === "thread/read") {
send({
id: message.id,
result: {
thread: {
id: message.params?.threadId,
name: "源线程",
},
items: [
{
type: "message",
role: "assistant",
content: [
{
type: "output_text",
text: "源线程最近结论:优先使用 app-server 协议。",
},
],
},
],
},
});
return;
}
if (message.method === "thread/inject_items") {
injectedItems = message.params?.items ?? [];
send({
id: message.id,
result: {
injected: injectedItems.length,
},
});
return;
}
if (message.method === "thread/start") {
send({
id: message.id,
@@ -56,6 +94,20 @@ rl.on("line", (line) => {
}
if (message.method === "turn/start") {
if (
process.env.BOSS_CODEX_APP_SERVER_FIXTURE_OVERLOAD_ON_TURN_START === "1" &&
!overloadedTurnStartEmitted
) {
overloadedTurnStartEmitted = true;
send({
id: message.id,
error: {
code: -32001,
message: "Server overloaded; retry later.",
},
});
return;
}
const text = message.params?.input?.find?.((item) => item?.type === "text")?.text ?? "";
send({
id: message.id,
@@ -69,12 +121,70 @@ rl.on("line", (line) => {
if (process.env.BOSS_CODEX_APP_SERVER_FIXTURE_EXIT_AFTER_TURN_START === "1") {
process.exit(0);
}
if (process.env.BOSS_CODEX_APP_SERVER_FIXTURE_EMIT_PROGRESS === "1") {
send({
method: "turn/plan/updated",
params: {
threadId: message.params?.threadId,
turnId: "turn-fixture",
plan: [
{ text: "读取 Codex 官方 app-server 协议", status: "completed" },
{ text: "执行 targeted/full test", status: "in_progress" },
],
},
});
send({
method: "turn/diff/updated",
params: {
threadId: message.params?.threadId,
turnId: "turn-fixture",
diff: {
changedFiles: 3,
additions: 181,
deletions: 52,
},
},
});
send({
method: "item/completed",
params: {
threadId: message.params?.threadId,
turnId: "turn-fixture",
item: {
type: "fileChange",
id: "file-change-1",
changes: [
{ path: "docs/protocol-snapshots/codex-app-server/codex-app-server-protocol-0.135.0.json" },
],
},
},
});
send({
method: "thread/started",
params: {
thread: {
id: "subagent-thread",
source: {
subAgent: {
thread_spawn: {
agent_nickname: "Mendel",
agent_role: "explorer",
},
},
},
},
},
});
}
send({
method: "item/agentMessage/delta",
params: {
threadId: message.params?.threadId,
turnId: "turn-fixture",
delta: `APP_SERVER_REPLY:${text}`,
delta:
process.env.BOSS_CODEX_APP_SERVER_FIXTURE_INTER_THREAD === "1"
? `INTER_THREAD_INJECTED:${JSON.stringify(injectedItems)}`
: `APP_SERVER_REPLY:${text}`,
},
});
send({
@@ -91,6 +201,42 @@ rl.on("line", (line) => {
return;
}
if (message.method === "turn/steer") {
const text = message.params?.input?.find?.((item) => item?.type === "text")?.text ?? "";
send({
id: message.id,
result: {
turn: {
id: message.params?.expectedTurnId,
threadId: message.params?.threadId,
},
},
});
send({
method: "item/agentMessage/delta",
params: {
threadId: message.params?.threadId,
turnId: message.params?.expectedTurnId,
delta:
process.env.BOSS_CODEX_APP_SERVER_FIXTURE_STEER === "1"
? `STEERED:${text}`
: `APP_SERVER_STEERED:${text}`,
},
});
send({
method: "turn/completed",
params: {
threadId: message.params?.threadId,
turn: {
id: message.params?.expectedTurnId,
status: "completed",
},
},
});
process.stderr.write(`${JSON.stringify({ received })}\n`);
return;
}
send({
id: message.id,
error: {