oh-my-knowledge 0.22.0 → 0.24.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 +63 -63
- package/README.zh.md +64 -62
- package/dist/src/analysis/report-diagnostics.d.ts +28 -3
- package/dist/src/analysis/report-diagnostics.d.ts.map +1 -1
- package/dist/src/analysis/report-diagnostics.js +201 -81
- package/dist/src/analysis/report-diagnostics.js.map +1 -1
- package/dist/src/analysis/sample-diagnostics.d.ts +9 -2
- package/dist/src/analysis/sample-diagnostics.d.ts.map +1 -1
- package/dist/src/analysis/sample-diagnostics.js +224 -25
- package/dist/src/analysis/sample-diagnostics.js.map +1 -1
- package/dist/src/authoring/evolver.d.ts +7 -2
- package/dist/src/authoring/evolver.d.ts.map +1 -1
- package/dist/src/authoring/evolver.js +43 -9
- package/dist/src/authoring/evolver.js.map +1 -1
- package/dist/src/authoring/generator.d.ts +24 -0
- package/dist/src/authoring/generator.d.ts.map +1 -1
- package/dist/src/authoring/generator.js +67 -5
- package/dist/src/authoring/generator.js.map +1 -1
- package/dist/src/cli/coverage-renderer.d.ts +15 -0
- package/dist/src/cli/coverage-renderer.d.ts.map +1 -0
- package/dist/src/cli/coverage-renderer.js +74 -0
- package/dist/src/cli/coverage-renderer.js.map +1 -0
- package/dist/src/cli/i18n-dict.d.ts +1 -1
- package/dist/src/cli/i18n-dict.d.ts.map +1 -1
- package/dist/src/cli/i18n-dict.js +62 -40
- package/dist/src/cli/i18n-dict.js.map +1 -1
- package/dist/src/cli/index.d.ts +3 -0
- package/dist/src/cli/index.d.ts.map +1 -0
- package/dist/src/{cli.js → cli/index.js} +123 -384
- package/dist/src/cli/index.js.map +1 -0
- package/dist/src/cli/parse-run-config.d.ts +56 -0
- package/dist/src/cli/parse-run-config.d.ts.map +1 -0
- package/dist/src/cli/parse-run-config.js +195 -0
- package/dist/src/cli/parse-run-config.js.map +1 -0
- package/dist/src/cli/progress.d.ts +25 -0
- package/dist/src/cli/progress.d.ts.map +1 -0
- package/dist/src/cli/progress.js +62 -0
- package/dist/src/cli/progress.js.map +1 -0
- package/dist/src/cli/update-check.d.ts +3 -0
- package/dist/src/cli/update-check.d.ts.map +1 -0
- package/dist/src/cli/update-check.js +37 -0
- package/dist/src/cli/update-check.js.map +1 -0
- package/dist/src/eval-core/cache.d.ts +7 -5
- package/dist/src/eval-core/cache.d.ts.map +1 -1
- package/dist/src/eval-core/cache.js +11 -7
- package/dist/src/eval-core/cache.js.map +1 -1
- package/dist/src/eval-core/comparability.d.ts +11 -0
- package/dist/src/eval-core/comparability.d.ts.map +1 -0
- package/dist/src/eval-core/comparability.js +271 -0
- package/dist/src/eval-core/comparability.js.map +1 -0
- package/dist/src/eval-core/dependency-checker.d.ts +1 -1
- package/dist/src/eval-core/dependency-checker.js +1 -1
- package/dist/src/eval-core/evaluation-execution.d.ts +5 -2
- package/dist/src/eval-core/evaluation-execution.d.ts.map +1 -1
- package/dist/src/eval-core/evaluation-execution.js +29 -21
- package/dist/src/eval-core/evaluation-execution.js.map +1 -1
- package/dist/src/eval-core/evaluation-job.d.ts +2 -2
- package/dist/src/eval-core/evaluation-job.d.ts.map +1 -1
- package/dist/src/eval-core/evaluation-job.js +2 -2
- package/dist/src/eval-core/evaluation-job.js.map +1 -1
- package/dist/src/eval-core/evaluation-reporting.d.ts +3 -1
- package/dist/src/eval-core/evaluation-reporting.d.ts.map +1 -1
- package/dist/src/eval-core/evaluation-reporting.js +65 -5
- package/dist/src/eval-core/evaluation-reporting.js.map +1 -1
- package/dist/src/eval-core/execution-strategy.js +6 -6
- package/dist/src/eval-core/execution-strategy.js.map +1 -1
- package/dist/src/eval-core/schema.d.ts.map +1 -1
- package/dist/src/eval-core/schema.js +14 -1
- package/dist/src/eval-core/schema.js.map +1 -1
- package/dist/src/eval-core/verdict.d.ts +3 -3
- package/dist/src/eval-core/verdict.js +3 -3
- package/dist/src/eval-workflows/batch-evaluation-workflow.d.ts +111 -0
- package/dist/src/eval-workflows/batch-evaluation-workflow.d.ts.map +1 -0
- package/dist/src/eval-workflows/batch-evaluation-workflow.js +215 -0
- package/dist/src/eval-workflows/batch-evaluation-workflow.js.map +1 -0
- package/dist/src/eval-workflows/evaluation-pipeline.d.ts +7 -5
- package/dist/src/eval-workflows/evaluation-pipeline.d.ts.map +1 -1
- package/dist/src/eval-workflows/evaluation-pipeline.js +13 -8
- package/dist/src/eval-workflows/evaluation-pipeline.js.map +1 -1
- package/dist/src/eval-workflows/evaluation-preparation.d.ts +10 -8
- package/dist/src/eval-workflows/evaluation-preparation.d.ts.map +1 -1
- package/dist/src/eval-workflows/evaluation-preparation.js +8 -4
- package/dist/src/eval-workflows/evaluation-preparation.js.map +1 -1
- package/dist/src/eval-workflows/run-evaluation.d.ts +23 -20
- package/dist/src/eval-workflows/run-evaluation.d.ts.map +1 -1
- package/dist/src/eval-workflows/run-evaluation.js +34 -25
- package/dist/src/eval-workflows/run-evaluation.js.map +1 -1
- package/dist/src/executors/claude-cli.d.ts.map +1 -1
- package/dist/src/executors/claude-cli.js +12 -7
- package/dist/src/executors/claude-cli.js.map +1 -1
- package/dist/src/executors/claude-sdk.d.ts +1 -1
- package/dist/src/executors/claude-sdk.js +1 -1
- package/dist/src/executors/codex-cli-trace.d.ts +10 -0
- package/dist/src/executors/codex-cli-trace.d.ts.map +1 -0
- package/dist/src/executors/codex-cli-trace.js +123 -0
- package/dist/src/executors/codex-cli-trace.js.map +1 -0
- package/dist/src/executors/codex-cli.d.ts +18 -0
- package/dist/src/executors/codex-cli.d.ts.map +1 -0
- package/dist/src/executors/codex-cli.js +254 -0
- package/dist/src/executors/codex-cli.js.map +1 -0
- package/dist/src/executors/codex-sdk.d.ts +18 -0
- package/dist/src/executors/codex-sdk.d.ts.map +1 -0
- package/dist/src/executors/codex-sdk.js +214 -0
- package/dist/src/executors/codex-sdk.js.map +1 -0
- package/dist/src/executors/gemini.d.ts.map +1 -1
- package/dist/src/executors/gemini.js +28 -24
- package/dist/src/executors/gemini.js.map +1 -1
- package/dist/src/executors/index.d.ts.map +1 -1
- package/dist/src/executors/index.js +7 -2
- package/dist/src/executors/index.js.map +1 -1
- package/dist/src/executors/runtime-fingerprint.d.ts +7 -0
- package/dist/src/executors/runtime-fingerprint.d.ts.map +1 -0
- package/dist/src/executors/runtime-fingerprint.js +277 -0
- package/dist/src/executors/runtime-fingerprint.js.map +1 -0
- package/dist/src/executors/script.d.ts.map +1 -1
- package/dist/src/executors/script.js +48 -56
- package/dist/src/executors/script.js.map +1 -1
- package/dist/src/executors/shared.d.ts +78 -1
- package/dist/src/executors/shared.d.ts.map +1 -1
- package/dist/src/executors/shared.js +203 -1
- package/dist/src/executors/shared.js.map +1 -1
- package/dist/src/grading/assertions.d.ts.map +1 -1
- package/dist/src/grading/assertions.js +21 -6
- package/dist/src/grading/assertions.js.map +1 -1
- package/dist/src/grading/gold-dataset.d.ts +1 -1
- package/dist/src/grading/gold-dataset.js +1 -1
- package/dist/src/grading/index.d.ts.map +1 -1
- package/dist/src/grading/index.js +11 -0
- package/dist/src/grading/index.js.map +1 -1
- package/dist/src/grading/judge.d.ts.map +1 -1
- package/dist/src/grading/judge.js +75 -6
- package/dist/src/grading/judge.js.map +1 -1
- package/dist/src/inputs/eval-config.js +2 -2
- package/dist/src/inputs/eval-config.js.map +1 -1
- package/dist/src/inputs/load-samples.d.ts.map +1 -1
- package/dist/src/inputs/load-samples.js +30 -4
- package/dist/src/inputs/load-samples.js.map +1 -1
- package/dist/src/inputs/skill-loader.d.ts +2 -2
- package/dist/src/inputs/skill-loader.d.ts.map +1 -1
- package/dist/src/inputs/skill-loader.js +2 -2
- package/dist/src/inputs/skill-loader.js.map +1 -1
- package/dist/src/renderer/html-renderer.d.ts +5 -4
- package/dist/src/renderer/html-renderer.d.ts.map +1 -1
- package/dist/src/renderer/html-renderer.js +217 -93
- package/dist/src/renderer/html-renderer.js.map +1 -1
- package/dist/src/renderer/layout.d.ts +2 -1
- package/dist/src/renderer/layout.d.ts.map +1 -1
- package/dist/src/renderer/layout.js +30 -42
- package/dist/src/renderer/layout.js.map +1 -1
- package/dist/src/renderer/summary.d.ts +3 -3
- package/dist/src/renderer/summary.d.ts.map +1 -1
- package/dist/src/renderer/summary.js +232 -55
- package/dist/src/renderer/summary.js.map +1 -1
- package/dist/src/renderer/trends.d.ts.map +1 -1
- package/dist/src/renderer/trends.js +5 -3
- package/dist/src/renderer/trends.js.map +1 -1
- package/dist/src/server/report-server.js +4 -4
- package/dist/src/server/report-server.js.map +1 -1
- package/dist/src/server/report-store.d.ts +7 -5
- package/dist/src/server/report-store.d.ts.map +1 -1
- package/dist/src/server/report-store.js +39 -11
- package/dist/src/server/report-store.js.map +1 -1
- package/dist/src/types/eval.d.ts +27 -5
- package/dist/src/types/eval.d.ts.map +1 -1
- package/dist/src/types/executor.d.ts +5 -0
- package/dist/src/types/executor.d.ts.map +1 -1
- package/dist/src/types/judge.d.ts +10 -0
- package/dist/src/types/judge.d.ts.map +1 -1
- package/dist/src/types/report.d.ts +151 -29
- package/dist/src/types/report.d.ts.map +1 -1
- package/dist/src/types/storage.d.ts +7 -7
- package/dist/src/types/storage.d.ts.map +1 -1
- package/package.json +14 -5
- package/dist/src/cli.d.ts +0 -3
- package/dist/src/cli.d.ts.map +0 -1
- package/dist/src/cli.js.map +0 -1
- package/dist/src/eval-workflows/each-evaluation-workflow.d.ts +0 -153
- package/dist/src/eval-workflows/each-evaluation-workflow.d.ts.map +0 -1
- package/dist/src/eval-workflows/each-evaluation-workflow.js +0 -178
- package/dist/src/eval-workflows/each-evaluation-workflow.js.map +0 -1
- package/dist/src/executors/openai-cli.d.ts +0 -3
- package/dist/src/executors/openai-cli.d.ts.map +0 -1
- package/dist/src/executors/openai-cli.js +0 -60
- package/dist/src/executors/openai-cli.js.map +0 -1
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
import { extractCodexTrace, isCodexResultEvent } from './codex-cli-trace.js';
|
|
2
|
+
import { buildExecEnv, DEFAULT_TIMEOUT_MS, errorMessage, interruptedExecResult, MAX_BUFFER, spawnWithSigintPropagation, timeoutExecResult, } from './shared.js';
|
|
3
|
+
// codex CLI(0.125)隔离能力对比 claude-cli:
|
|
4
|
+
// Claude:三条 channel(SDK skills auto-discovery / subagent Skill 工具 /
|
|
5
|
+
// cwd 文件系统),`--disable-slash-commands` + `--disallowedTools Skill`
|
|
6
|
+
// 堵前两条,cwd 切空目录堵第三条
|
|
7
|
+
// Codex:无 SDK 等价 channel(它就是 CLI 不是 SDK),无 subagent Skill 等价
|
|
8
|
+
// (没有 Agent 工具),只剩 cwd 文件系统这一条 channel(`-C/--cd`)
|
|
9
|
+
// → AGENTS.md / .agents/skills/ 自动加载只能靠 cwd 切到隔离空目录避免
|
|
10
|
+
//
|
|
11
|
+
// undefined → 不传 -C(原行为,看 cwd 里有什么 codex 自己决定)
|
|
12
|
+
// [] → 必须提供 cwd 非空(否则 throw),caller 应传一个
|
|
13
|
+
// isolated 空目录(如 ~/.oh-my-knowledge/isolated-cwd/)
|
|
14
|
+
// [...] (length>0) → throw,codex CLI 没有 partial 白名单 flag
|
|
15
|
+
export function isolateCodexCwd(allowedSkills, cwd, executorName = 'codex-cli') {
|
|
16
|
+
if (allowedSkills === undefined)
|
|
17
|
+
return;
|
|
18
|
+
if (allowedSkills.length > 0) {
|
|
19
|
+
throw new Error(`${executorName} executor 不支持 partial skill 白名单(allowedSkills=${JSON.stringify(allowedSkills)})。\n`
|
|
20
|
+
+ ` 仅支持 [](强制 cwd 隔离,需提供 cwd 非空)或 undefined(默认)。\n`
|
|
21
|
+
+ ` codex CLI 无 partial 白名单 flag,请改用其他 executor 或显式 cwd 隔离。`);
|
|
22
|
+
}
|
|
23
|
+
// allowedSkills === [] 时必须有 cwd(channel 3 cwd 隔离是 codex 唯一 channel)
|
|
24
|
+
if (!cwd) {
|
|
25
|
+
throw new Error(`${executorName} executor allowedSkills=[] 需要提供 cwd 非空(channel 3 cwd 隔离)。\n`
|
|
26
|
+
+ ' codex 没有 SDK skill 自动发现 / subagent Skill 工具这两条 channel,\n'
|
|
27
|
+
+ ' cwd 文件系统隔离是它唯一能堵 AGENTS.md / .agents/skills/ 自动加载的途径。\n'
|
|
28
|
+
+ ' caller 应传一个 isolated 空目录(如 ~/.oh-my-knowledge/isolated-cwd/)。');
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
// codex 的 verbose 降级提示是 binary 能力快照(无 --system-prompt flag / 不报 cost),
|
|
32
|
+
// 不会逐次调用变化。executor 在 sample × variant × judge_repeat × dimension 多次被调,
|
|
33
|
+
// 每次都打两行会让 stderr 被同样文本刷屏(140-280 行)。模块级 flag 一个 process 只打一次。
|
|
34
|
+
let hasWarnedSystem = false;
|
|
35
|
+
let hasWarnedCost = false;
|
|
36
|
+
function parseCodexJsonl(stdout) {
|
|
37
|
+
const events = [];
|
|
38
|
+
for (const line of stdout.split('\n')) {
|
|
39
|
+
const trimmed = line.trim();
|
|
40
|
+
if (!trimmed)
|
|
41
|
+
continue;
|
|
42
|
+
try {
|
|
43
|
+
events.push(JSON.parse(trimmed));
|
|
44
|
+
}
|
|
45
|
+
catch { /* skip non-JSON lines */ }
|
|
46
|
+
}
|
|
47
|
+
return events;
|
|
48
|
+
}
|
|
49
|
+
export function extractCodexUsage(events) {
|
|
50
|
+
let input = 0;
|
|
51
|
+
let cached = 0;
|
|
52
|
+
let output = 0;
|
|
53
|
+
for (const e of events) {
|
|
54
|
+
if (!isCodexResultEvent(e) || !e.usage)
|
|
55
|
+
continue;
|
|
56
|
+
input += e.usage.input_tokens || 0;
|
|
57
|
+
cached += e.usage.cached_input_tokens || 0;
|
|
58
|
+
output += e.usage.output_tokens || 0;
|
|
59
|
+
}
|
|
60
|
+
return { input, cached, output };
|
|
61
|
+
}
|
|
62
|
+
// exported for unit tests
|
|
63
|
+
export function extractCodexFinalOutput(events) {
|
|
64
|
+
// 抓 item.completed + item.type='agent_message' 的 text 全部拼起来。
|
|
65
|
+
// codex 同 turn 内可能 emit 多条 agent_message(如 "step 1" / "step 2" / "final answer"),
|
|
66
|
+
// 取最后一条会让 grader / assertion / LLM judge 只看到最后片段,跟 extractCodexTrace
|
|
67
|
+
// 把多条拼到 turn.content 的语义不一致(test/executors/codex-cli-trace.test.ts:120-130 锁住)。
|
|
68
|
+
// 一致化:final output 也拼,跟 trace UI 看到的内容对齐。
|
|
69
|
+
const allTexts = [];
|
|
70
|
+
for (const e of events) {
|
|
71
|
+
if (e.type !== 'item.completed')
|
|
72
|
+
continue;
|
|
73
|
+
if (e.item?.type !== 'agent_message')
|
|
74
|
+
continue;
|
|
75
|
+
const txt = e.item.text;
|
|
76
|
+
if (txt)
|
|
77
|
+
allTexts.push(txt);
|
|
78
|
+
}
|
|
79
|
+
return allTexts.join('\n');
|
|
80
|
+
}
|
|
81
|
+
export function extractCodexStopReason(events) {
|
|
82
|
+
const last = [...events].reverse().find((e) => isCodexResultEvent(e));
|
|
83
|
+
if (!last)
|
|
84
|
+
return 'unknown';
|
|
85
|
+
if (last.type === 'turn.failed')
|
|
86
|
+
return 'error';
|
|
87
|
+
return last.stop_reason || 'end_turn';
|
|
88
|
+
}
|
|
89
|
+
// codex 每个 turn.completed 携带本 turn 的 elapsed_ms(per-turn delta),
|
|
90
|
+
// 跟 extractCodexUsage 把 token 累加多 turn 是同一语义假设(events 是 per-turn delta,
|
|
91
|
+
// 不是 cumulative)。multi-turn 只取最后一条会漏算前面 turn 的耗时。fallback:
|
|
92
|
+
// 累加为 0 / 全部缺失时退到 wall-clock,避免 elapsed_ms===0 单 turn 抹平 duration。
|
|
93
|
+
// exported for unit tests
|
|
94
|
+
export function sumCodexElapsed(resultEvents, wallClock) {
|
|
95
|
+
const total = resultEvents.reduce((s, e) => s + (e.elapsed_ms ?? 0), 0);
|
|
96
|
+
return total > 0 ? total : wallClock;
|
|
97
|
+
}
|
|
98
|
+
// exported for arg-shape regression tests
|
|
99
|
+
export function buildCodexArgs({ model, cwd, prompt }) {
|
|
100
|
+
// codex exec [OPTIONS] [PROMPT];prompt 走 positional(execFile 不走 shell,自动 escape)
|
|
101
|
+
// approval_policy 走 -c config override:codex CLI 0.125 起去掉了 `--ask-for-approval` flag,
|
|
102
|
+
// 但 approval_policy 这个 config key 仍在,通过 -c 透传不依赖 flag 表面 schema。
|
|
103
|
+
const args = [
|
|
104
|
+
'exec',
|
|
105
|
+
'--json',
|
|
106
|
+
'--ephemeral', // 不持久化 session 文件
|
|
107
|
+
'--ignore-user-config', // 不读 $CODEX_HOME/config.toml
|
|
108
|
+
'--skip-git-repo-check', // 允许 isolated cwd 不是 git 仓库
|
|
109
|
+
'--sandbox', 'read-only', // 评测场景不需要写文件
|
|
110
|
+
'-c', 'approval_policy="never"', // non-interactive 必须;TOML 字符串需要 quote
|
|
111
|
+
];
|
|
112
|
+
if (model)
|
|
113
|
+
args.push('--model', model);
|
|
114
|
+
if (cwd)
|
|
115
|
+
args.push('-C', cwd);
|
|
116
|
+
args.push(prompt);
|
|
117
|
+
return args;
|
|
118
|
+
}
|
|
119
|
+
// codex 看到 stdin 是 pipe 就当作 `<stdin>` 块读,会卡到 timeout。spawn 后立刻
|
|
120
|
+
// child.stdin.end() 发 EOF。SIGINT 传播 / timeout / maxBuffer / kill 由 helper 统一处理。
|
|
121
|
+
function runCodexExec(args, options) {
|
|
122
|
+
const { child, done } = spawnWithSigintPropagation('codex', args, {
|
|
123
|
+
env: options.env,
|
|
124
|
+
cwd: options.cwd,
|
|
125
|
+
timeoutMs: options.timeout,
|
|
126
|
+
maxBuffer: options.maxBuffer,
|
|
127
|
+
});
|
|
128
|
+
child.stdin?.end();
|
|
129
|
+
return done.then((r) => ({ stdout: r.stdout, stderr: r.stderr }));
|
|
130
|
+
}
|
|
131
|
+
export async function codexCliExecutor({ model, system, prompt, cwd, skillDir, timeoutMs = DEFAULT_TIMEOUT_MS, allowedSkills, verbose }) {
|
|
132
|
+
isolateCodexCwd(allowedSkills, cwd);
|
|
133
|
+
// codex CLI 没有 --system-prompt flag。降级:把 system 拼到 prompt 头部,
|
|
134
|
+
// verbose 输出降级提示。reproducibility 略受影响,但语义大致等价。
|
|
135
|
+
const finalPrompt = system ? `${system}\n\n---\n\n${prompt}` : prompt;
|
|
136
|
+
if (system && verbose && !hasWarnedSystem) {
|
|
137
|
+
process.stderr.write('[codex] system prompt prepended (codex CLI lacks --system-prompt flag)\n');
|
|
138
|
+
hasWarnedSystem = true;
|
|
139
|
+
}
|
|
140
|
+
if (verbose && !hasWarnedCost) {
|
|
141
|
+
process.stderr.write('[codex] cost not reported by binary; costReportedByExecutor=false (renderer shows 「—」 instead of $0.0000)\n');
|
|
142
|
+
hasWarnedCost = true;
|
|
143
|
+
}
|
|
144
|
+
const args = buildCodexArgs({ model, cwd, prompt: finalPrompt });
|
|
145
|
+
const env = buildExecEnv(skillDir);
|
|
146
|
+
const start = Date.now();
|
|
147
|
+
try {
|
|
148
|
+
const { stdout } = await runCodexExec(args, {
|
|
149
|
+
maxBuffer: MAX_BUFFER,
|
|
150
|
+
timeout: timeoutMs,
|
|
151
|
+
env,
|
|
152
|
+
...(cwd && { cwd }),
|
|
153
|
+
});
|
|
154
|
+
const durationMs = Date.now() - start;
|
|
155
|
+
const events = parseCodexJsonl(stdout);
|
|
156
|
+
const resultEvents = events.filter(isCodexResultEvent);
|
|
157
|
+
if (resultEvents.length === 0) {
|
|
158
|
+
return {
|
|
159
|
+
ok: false,
|
|
160
|
+
error: 'no turn.completed/turn.failed event in codex --json output',
|
|
161
|
+
durationMs,
|
|
162
|
+
durationApiMs: 0,
|
|
163
|
+
inputTokens: 0,
|
|
164
|
+
outputTokens: 0,
|
|
165
|
+
cacheReadTokens: 0,
|
|
166
|
+
cacheCreationTokens: 0,
|
|
167
|
+
costUSD: 0,
|
|
168
|
+
costReportedByExecutor: false,
|
|
169
|
+
output: null,
|
|
170
|
+
stopReason: 'error',
|
|
171
|
+
numTurns: 0,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
const last = resultEvents[resultEvents.length - 1];
|
|
175
|
+
const usage = extractCodexUsage(events);
|
|
176
|
+
const trace = extractCodexTrace(events);
|
|
177
|
+
const stopReason = extractCodexStopReason(events);
|
|
178
|
+
const finalOutput = extractCodexFinalOutput(events);
|
|
179
|
+
const ok = last.type !== 'turn.failed' && !last.error;
|
|
180
|
+
return {
|
|
181
|
+
ok,
|
|
182
|
+
// multi-turn 累加 elapsed_ms(per-turn delta);全 0 fallback wall-clock。详见 sumCodexElapsed
|
|
183
|
+
durationMs: sumCodexElapsed(resultEvents, durationMs),
|
|
184
|
+
durationApiMs: 0, // codex 不报 API duration
|
|
185
|
+
inputTokens: usage.input,
|
|
186
|
+
outputTokens: usage.output,
|
|
187
|
+
cacheReadTokens: usage.cached,
|
|
188
|
+
cacheCreationTokens: 0, // codex 不报 cache creation
|
|
189
|
+
costUSD: 0, // 占位:codex 0.125 binary 不输出 cost
|
|
190
|
+
costReportedByExecutor: false, // renderer 据此显示「未报告」而非 $0.0000
|
|
191
|
+
output: finalOutput,
|
|
192
|
+
stopReason,
|
|
193
|
+
// success path:ok=false(turn.failed)时透传 last.error.message 给 caller 看到
|
|
194
|
+
// 失败原因。catch path 历史上已经透传(对称化)。
|
|
195
|
+
...(!ok && { error: last.error?.message || 'codex turn.failed' }),
|
|
196
|
+
numTurns: resultEvents.length,
|
|
197
|
+
fullNumTurns: trace.fullNumTurns,
|
|
198
|
+
numSubAgents: trace.numSubAgents,
|
|
199
|
+
...(trace.turns.length > 0 && { turns: trace.turns }),
|
|
200
|
+
...(trace.toolCalls.length > 0 && { toolCalls: trace.toolCalls }),
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
catch (err) {
|
|
204
|
+
const durationMs = Date.now() - start;
|
|
205
|
+
const details = err;
|
|
206
|
+
if (details.killedByTimeout)
|
|
207
|
+
return { ...timeoutExecResult(timeoutMs, durationMs), costReportedByExecutor: false };
|
|
208
|
+
if (details.killedBySignal)
|
|
209
|
+
return { ...interruptedExecResult(durationMs), costReportedByExecutor: false };
|
|
210
|
+
// 尝试从 stdout parse 部分结果(同 claude-cli 防御性写法)
|
|
211
|
+
const events = parseCodexJsonl(details.stdout || '');
|
|
212
|
+
const resultEvents = events.filter(isCodexResultEvent);
|
|
213
|
+
if (resultEvents.length > 0) {
|
|
214
|
+
const last = resultEvents[resultEvents.length - 1];
|
|
215
|
+
const usage = extractCodexUsage(events);
|
|
216
|
+
const trace = extractCodexTrace(events);
|
|
217
|
+
return {
|
|
218
|
+
ok: false,
|
|
219
|
+
error: last.error?.message || errorMessage(err),
|
|
220
|
+
durationMs: sumCodexElapsed(resultEvents, durationMs),
|
|
221
|
+
durationApiMs: 0,
|
|
222
|
+
inputTokens: usage.input,
|
|
223
|
+
outputTokens: usage.output,
|
|
224
|
+
cacheReadTokens: usage.cached,
|
|
225
|
+
cacheCreationTokens: 0,
|
|
226
|
+
costUSD: 0,
|
|
227
|
+
costReportedByExecutor: false,
|
|
228
|
+
output: extractCodexFinalOutput(events) || null,
|
|
229
|
+
stopReason: 'error',
|
|
230
|
+
numTurns: resultEvents.length,
|
|
231
|
+
fullNumTurns: trace.fullNumTurns,
|
|
232
|
+
numSubAgents: trace.numSubAgents,
|
|
233
|
+
...(trace.turns.length > 0 && { turns: trace.turns }),
|
|
234
|
+
...(trace.toolCalls.length > 0 && { toolCalls: trace.toolCalls }),
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
return {
|
|
238
|
+
ok: false,
|
|
239
|
+
error: errorMessage(err),
|
|
240
|
+
durationMs,
|
|
241
|
+
durationApiMs: 0,
|
|
242
|
+
inputTokens: 0,
|
|
243
|
+
outputTokens: 0,
|
|
244
|
+
cacheReadTokens: 0,
|
|
245
|
+
cacheCreationTokens: 0,
|
|
246
|
+
costUSD: 0,
|
|
247
|
+
costReportedByExecutor: false,
|
|
248
|
+
output: null,
|
|
249
|
+
stopReason: 'error',
|
|
250
|
+
numTurns: 0,
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
//# sourceMappingURL=codex-cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-cli.js","sourceRoot":"","sources":["../../../src/executors/codex-cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Codex, CodexOptions } from '@openai/codex-sdk';
|
|
2
|
+
import type { ExecResult, ExecutorInput } from '../types/index.js';
|
|
3
|
+
export declare function getIsolatedCodexHome(): Promise<string>;
|
|
4
|
+
export declare function __resetCodexSdkStateForTest(): void;
|
|
5
|
+
export declare function buildCodexSdkThreadOptions({ model, cwd }: {
|
|
6
|
+
model: string;
|
|
7
|
+
cwd?: string | null;
|
|
8
|
+
}): {
|
|
9
|
+
model?: string;
|
|
10
|
+
sandboxMode: 'read-only';
|
|
11
|
+
workingDirectory?: string;
|
|
12
|
+
skipGitRepoCheck: true;
|
|
13
|
+
approvalPolicy: 'never';
|
|
14
|
+
};
|
|
15
|
+
export declare function buildCodexSdkClientOptions(env: NodeJS.ProcessEnv): CodexOptions;
|
|
16
|
+
export declare function createCodexSdkClient(env: NodeJS.ProcessEnv): Promise<Codex>;
|
|
17
|
+
export declare function codexSdkExecutor({ model, system, prompt, cwd, skillDir, timeoutMs, allowedSkills, verbose }: ExecutorInput): Promise<ExecResult>;
|
|
18
|
+
//# sourceMappingURL=codex-sdk.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-sdk.d.ts","sourceRoot":"","sources":["../../../src/executors/codex-sdk.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,KAAK,EAAE,YAAY,EAAe,MAAM,mBAAmB,CAAC;AAC1E,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAiDnE,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,MAAM,CAAC,CAiB5D;AAGD,wBAAgB,2BAA2B,IAAI,IAAI,CAKlD;AAED,wBAAgB,0BAA0B,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG;IAClG,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,WAAW,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,IAAI,CAAC;IACvB,cAAc,EAAE,OAAO,CAAC;CACzB,CAQA;AAED,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,YAAY,CAM/E;AAED,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,CAGjF;AAMD,wBAAsB,gBAAgB,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,SAA8B,EAAE,aAAa,EAAE,OAAO,EAAE,EAAE,aAAa,GAAG,OAAO,CAAC,UAAU,CAAC,CA0I3K"}
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { mkdtemp, symlink } from 'node:fs/promises';
|
|
3
|
+
import { homedir, tmpdir } from 'node:os';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import { extractCodexTrace, isCodexResultEvent } from './codex-cli-trace.js';
|
|
6
|
+
import { asErrorLike, buildExecEnv, DEFAULT_TIMEOUT_MS, errorMessage, timeoutExecResult, } from './shared.js';
|
|
7
|
+
import { extractCodexFinalOutput, extractCodexStopReason, extractCodexUsage, isolateCodexCwd, sumCodexElapsed, } from './codex-cli.js';
|
|
8
|
+
let CodexCtor = null;
|
|
9
|
+
let codexHomePromise = null;
|
|
10
|
+
let hasWarnedSystem = false;
|
|
11
|
+
let hasWarnedCost = false;
|
|
12
|
+
async function getCodexCtor() {
|
|
13
|
+
if (!CodexCtor) {
|
|
14
|
+
const sdk = await import('@openai/codex-sdk');
|
|
15
|
+
CodexCtor = sdk.Codex;
|
|
16
|
+
}
|
|
17
|
+
return CodexCtor;
|
|
18
|
+
}
|
|
19
|
+
// Construct-validity invariant: codex-cli passes `--ephemeral`(no session
|
|
20
|
+
// persistence)+ `--ignore-user-config`(skip $CODEX_HOME/config.toml)so eval
|
|
21
|
+
// runs are independent of the user's local codex profile. @openai/codex-sdk's
|
|
22
|
+
// ThreadOptions does NOT expose either flag, so without intervention codex-sdk
|
|
23
|
+
// runs would leak `~/.codex/config.toml`(custom model_reasoning_effort,
|
|
24
|
+
// instructions, tool config)into the eval and pollute `~/.codex/sessions/`
|
|
25
|
+
// across runs.
|
|
26
|
+
//
|
|
27
|
+
// Mitigation: redirect $CODEX_HOME to a per-process tmp dir for codex-sdk only.
|
|
28
|
+
// auth.json is symlinked from the real CODEX_HOME so the SDK can still
|
|
29
|
+
// authenticate; config.toml + sessions/ stay isolated. Tmp dir stays alive for
|
|
30
|
+
// the OS to rotate(no explicit cleanup, matches DEFAULT_TIMEOUT_MS scope).
|
|
31
|
+
//
|
|
32
|
+
// Best-effort on Windows where symlink may need elevated privileges; on
|
|
33
|
+
// failure, the codex-sdk executor still runs but lands in the user's real
|
|
34
|
+
// CODEX_HOME with a stderr warning.
|
|
35
|
+
export async function getIsolatedCodexHome() {
|
|
36
|
+
if (!codexHomePromise) {
|
|
37
|
+
codexHomePromise = (async () => {
|
|
38
|
+
const tmpHome = await mkdtemp(join(tmpdir(), 'omk-codex-sdk-'));
|
|
39
|
+
const realHome = process.env.CODEX_HOME || join(homedir(), '.codex');
|
|
40
|
+
const realAuth = join(realHome, 'auth.json');
|
|
41
|
+
if (existsSync(realAuth)) {
|
|
42
|
+
try {
|
|
43
|
+
await symlink(realAuth, join(tmpHome, 'auth.json'));
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
process.stderr.write(`[codex-sdk] CODEX_HOME isolation: auth.json symlink failed (${err.message}); SDK will use bare tmp home and may fail to authenticate\n`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return tmpHome;
|
|
50
|
+
})();
|
|
51
|
+
}
|
|
52
|
+
return codexHomePromise;
|
|
53
|
+
}
|
|
54
|
+
// exported for test isolation
|
|
55
|
+
export function __resetCodexSdkStateForTest() {
|
|
56
|
+
CodexCtor = null;
|
|
57
|
+
codexHomePromise = null;
|
|
58
|
+
hasWarnedSystem = false;
|
|
59
|
+
hasWarnedCost = false;
|
|
60
|
+
}
|
|
61
|
+
export function buildCodexSdkThreadOptions({ model, cwd }) {
|
|
62
|
+
return {
|
|
63
|
+
...(model && { model }),
|
|
64
|
+
sandboxMode: 'read-only',
|
|
65
|
+
...(cwd && { workingDirectory: cwd }),
|
|
66
|
+
skipGitRepoCheck: true,
|
|
67
|
+
approvalPolicy: 'never',
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
export function buildCodexSdkClientOptions(env) {
|
|
71
|
+
return {
|
|
72
|
+
// Leave codexPathOverride unset: the SDK should use its bundled @openai/codex
|
|
73
|
+
// binary, matching the SDK executor contract instead of delegating to PATH.
|
|
74
|
+
env: env,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
export async function createCodexSdkClient(env) {
|
|
78
|
+
const CodexClient = await getCodexCtor();
|
|
79
|
+
return new CodexClient(buildCodexSdkClientOptions(env));
|
|
80
|
+
}
|
|
81
|
+
function normalizeSdkEvent(event) {
|
|
82
|
+
return event;
|
|
83
|
+
}
|
|
84
|
+
export async function codexSdkExecutor({ model, system, prompt, cwd, skillDir, timeoutMs = DEFAULT_TIMEOUT_MS, allowedSkills, verbose }) {
|
|
85
|
+
isolateCodexCwd(allowedSkills, cwd, 'codex-sdk');
|
|
86
|
+
const finalPrompt = system ? `${system}\n\n---\n\n${prompt}` : prompt;
|
|
87
|
+
if (system && verbose && !hasWarnedSystem) {
|
|
88
|
+
process.stderr.write('[codex-sdk] system prompt prepended (codex CLI/SDK lacks a system-prompt option)\n');
|
|
89
|
+
hasWarnedSystem = true;
|
|
90
|
+
}
|
|
91
|
+
if (verbose && !hasWarnedCost) {
|
|
92
|
+
process.stderr.write('[codex-sdk] cost not reported by binary; costReportedByExecutor=false (renderer shows 「—」 instead of $0.0000)\n');
|
|
93
|
+
hasWarnedCost = true;
|
|
94
|
+
}
|
|
95
|
+
const env = buildExecEnv(skillDir);
|
|
96
|
+
const start = Date.now();
|
|
97
|
+
const abortController = new AbortController();
|
|
98
|
+
const timer = setTimeout(() => abortController.abort(), timeoutMs);
|
|
99
|
+
// SIGINT propagation: PR #33 helper only tracks child process refs registered
|
|
100
|
+
// via spawnWithSigintPropagation; @openai/codex-sdk does its own spawn()
|
|
101
|
+
// internally and the SDK child is not in that registry. Hook the
|
|
102
|
+
// AbortController to SIGINT so the SDK kills its child via the standard
|
|
103
|
+
// abortSignal pipeline (SDK passes `signal: args.signal` to spawn). Without
|
|
104
|
+
// this, Ctrl+C in a nested host orphans the codex SDK child until DEFAULT
|
|
105
|
+
// timeout elapses, regressing PR #33's nested-host fix.
|
|
106
|
+
const sigintListener = () => abortController.abort();
|
|
107
|
+
process.on('SIGINT', sigintListener);
|
|
108
|
+
const events = [];
|
|
109
|
+
try {
|
|
110
|
+
env.CODEX_HOME = await getIsolatedCodexHome();
|
|
111
|
+
const codex = await createCodexSdkClient(env);
|
|
112
|
+
const thread = codex.startThread(buildCodexSdkThreadOptions({ model, cwd }));
|
|
113
|
+
const streamed = await thread.runStreamed(finalPrompt, { signal: abortController.signal });
|
|
114
|
+
for await (const event of streamed.events) {
|
|
115
|
+
events.push(normalizeSdkEvent(event));
|
|
116
|
+
}
|
|
117
|
+
const durationMs = Date.now() - start;
|
|
118
|
+
const resultEvents = events.filter(isCodexResultEvent);
|
|
119
|
+
if (resultEvents.length === 0) {
|
|
120
|
+
return {
|
|
121
|
+
ok: false,
|
|
122
|
+
error: 'no turn.completed/turn.failed event in codex-sdk output',
|
|
123
|
+
durationMs,
|
|
124
|
+
durationApiMs: 0,
|
|
125
|
+
inputTokens: 0,
|
|
126
|
+
outputTokens: 0,
|
|
127
|
+
cacheReadTokens: 0,
|
|
128
|
+
cacheCreationTokens: 0,
|
|
129
|
+
costUSD: 0,
|
|
130
|
+
costReportedByExecutor: false,
|
|
131
|
+
output: null,
|
|
132
|
+
stopReason: 'error',
|
|
133
|
+
numTurns: 0,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
const last = resultEvents[resultEvents.length - 1];
|
|
137
|
+
const usage = extractCodexUsage(events);
|
|
138
|
+
const trace = extractCodexTrace(events);
|
|
139
|
+
const stopReason = extractCodexStopReason(events);
|
|
140
|
+
const finalOutput = extractCodexFinalOutput(events);
|
|
141
|
+
const ok = last.type !== 'turn.failed' && !last.error;
|
|
142
|
+
return {
|
|
143
|
+
ok,
|
|
144
|
+
durationMs: sumCodexElapsed(resultEvents, durationMs),
|
|
145
|
+
durationApiMs: 0,
|
|
146
|
+
inputTokens: usage.input,
|
|
147
|
+
outputTokens: usage.output,
|
|
148
|
+
cacheReadTokens: usage.cached,
|
|
149
|
+
cacheCreationTokens: 0,
|
|
150
|
+
costUSD: 0,
|
|
151
|
+
costReportedByExecutor: false,
|
|
152
|
+
output: finalOutput,
|
|
153
|
+
stopReason,
|
|
154
|
+
...(!ok && { error: last.error?.message || 'codex-sdk turn.failed' }),
|
|
155
|
+
numTurns: resultEvents.length,
|
|
156
|
+
fullNumTurns: trace.fullNumTurns,
|
|
157
|
+
numSubAgents: trace.numSubAgents,
|
|
158
|
+
...(trace.turns.length > 0 && { turns: trace.turns }),
|
|
159
|
+
...(trace.toolCalls.length > 0 && { toolCalls: trace.toolCalls }),
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
catch (err) {
|
|
163
|
+
const durationMs = Date.now() - start;
|
|
164
|
+
const details = asErrorLike(err);
|
|
165
|
+
const isAbort = details.name === 'AbortError' || abortController.signal.aborted;
|
|
166
|
+
if (isAbort)
|
|
167
|
+
return { ...timeoutExecResult(timeoutMs, durationMs), costReportedByExecutor: false };
|
|
168
|
+
const resultEvents = events.filter(isCodexResultEvent);
|
|
169
|
+
if (resultEvents.length > 0) {
|
|
170
|
+
const last = resultEvents[resultEvents.length - 1];
|
|
171
|
+
const usage = extractCodexUsage(events);
|
|
172
|
+
const trace = extractCodexTrace(events);
|
|
173
|
+
return {
|
|
174
|
+
ok: false,
|
|
175
|
+
error: last.error?.message || errorMessage(err),
|
|
176
|
+
durationMs: sumCodexElapsed(resultEvents, durationMs),
|
|
177
|
+
durationApiMs: 0,
|
|
178
|
+
inputTokens: usage.input,
|
|
179
|
+
outputTokens: usage.output,
|
|
180
|
+
cacheReadTokens: usage.cached,
|
|
181
|
+
cacheCreationTokens: 0,
|
|
182
|
+
costUSD: 0,
|
|
183
|
+
costReportedByExecutor: false,
|
|
184
|
+
output: extractCodexFinalOutput(events) || null,
|
|
185
|
+
stopReason: 'error',
|
|
186
|
+
numTurns: resultEvents.length,
|
|
187
|
+
fullNumTurns: trace.fullNumTurns,
|
|
188
|
+
numSubAgents: trace.numSubAgents,
|
|
189
|
+
...(trace.turns.length > 0 && { turns: trace.turns }),
|
|
190
|
+
...(trace.toolCalls.length > 0 && { toolCalls: trace.toolCalls }),
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
return {
|
|
194
|
+
ok: false,
|
|
195
|
+
error: errorMessage(err),
|
|
196
|
+
durationMs,
|
|
197
|
+
durationApiMs: 0,
|
|
198
|
+
inputTokens: 0,
|
|
199
|
+
outputTokens: 0,
|
|
200
|
+
cacheReadTokens: 0,
|
|
201
|
+
cacheCreationTokens: 0,
|
|
202
|
+
costUSD: 0,
|
|
203
|
+
costReportedByExecutor: false,
|
|
204
|
+
output: null,
|
|
205
|
+
stopReason: 'error',
|
|
206
|
+
numTurns: 0,
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
finally {
|
|
210
|
+
clearTimeout(timer);
|
|
211
|
+
process.removeListener('SIGINT', sigintListener);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
//# sourceMappingURL=codex-sdk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-sdk.js","sourceRoot":"","sources":["../../../src/executors/codex-sdk.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../../src/executors/gemini.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../../src/executors/gemini.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAYnE,wBAAsB,cAAc,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,SAA8B,EAAE,EAAE,aAAa,GAAG,OAAO,CAAC,UAAU,CAAC,CAyElI"}
|
|
@@ -1,32 +1,36 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { DEFAULT_TIMEOUT_MS, errorMessage, parseJson } from './shared.js';
|
|
1
|
+
import { DEFAULT_TIMEOUT_MS, errorMessage, interruptedExecResult, parseJson, spawnWithSigintPropagation, timeoutExecResult, } from './shared.js';
|
|
3
2
|
export async function geminiExecutor({ model, system, prompt, timeoutMs = DEFAULT_TIMEOUT_MS }) {
|
|
4
3
|
const fullPrompt = system ? `${system}\n\n${prompt}` : prompt;
|
|
5
4
|
const start = Date.now();
|
|
6
5
|
try {
|
|
7
|
-
const
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
env: { ...process.env },
|
|
14
|
-
timeout: timeoutMs,
|
|
15
|
-
});
|
|
16
|
-
let stdout = '';
|
|
17
|
-
let stderr = '';
|
|
18
|
-
child.stdout.on('data', (chunk) => { stdout += chunk; });
|
|
19
|
-
child.stderr.on('data', (chunk) => { stderr += chunk; });
|
|
20
|
-
child.on('error', (err) => reject(err));
|
|
21
|
-
child.on('close', (code) => {
|
|
22
|
-
if (code !== 0 && !stdout)
|
|
23
|
-
reject(new Error(stderr || `gemini exited with code ${code}`));
|
|
24
|
-
else
|
|
25
|
-
resolve(stdout);
|
|
26
|
-
});
|
|
27
|
-
child.stdin.write(fullPrompt);
|
|
28
|
-
child.stdin.end();
|
|
6
|
+
const args = [];
|
|
7
|
+
if (model)
|
|
8
|
+
args.push('--model', model);
|
|
9
|
+
const { child, done } = spawnWithSigintPropagation('gemini', args, {
|
|
10
|
+
env: { ...process.env },
|
|
11
|
+
timeoutMs,
|
|
29
12
|
});
|
|
13
|
+
child.stdin?.write(fullPrompt);
|
|
14
|
+
child.stdin?.end();
|
|
15
|
+
let output;
|
|
16
|
+
try {
|
|
17
|
+
const r = await done;
|
|
18
|
+
output = r.stdout;
|
|
19
|
+
}
|
|
20
|
+
catch (err) {
|
|
21
|
+
const details = err;
|
|
22
|
+
if (details.killedByTimeout)
|
|
23
|
+
return timeoutExecResult(timeoutMs, Date.now() - start);
|
|
24
|
+
if (details.killedBySignal)
|
|
25
|
+
return interruptedExecResult(Date.now() - start);
|
|
26
|
+
// gemini 退出码非 0 但有 stdout 时仍按成功路径解析(原行为);只在 stdout 为空时才视为失败
|
|
27
|
+
if (details.stdout && details.stdout.length > 0) {
|
|
28
|
+
output = details.stdout;
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
throw err;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
30
34
|
const durationMs = Date.now() - start;
|
|
31
35
|
let text = output;
|
|
32
36
|
let inputTokens = 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../../src/executors/gemini.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../../src/executors/gemini.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/executors/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAIpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/executors/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAIpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAK1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAezD,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,CAAC;AAE/E,wBAAgB,cAAc,CAAC,IAAI,GAAE,MAAiB,GAAG,UAAU,CAElE"}
|
|
@@ -2,15 +2,20 @@ import { anthropicApiExecutor } from './anthropic-api.js';
|
|
|
2
2
|
import { claudeCliExecutor } from './claude-cli.js';
|
|
3
3
|
import { claudeSdkExecutor } from './claude-sdk.js';
|
|
4
4
|
import { extractAgentTrace } from './claude-sdk-trace.js';
|
|
5
|
+
import { codexCliExecutor } from './codex-cli.js';
|
|
6
|
+
import { codexSdkExecutor } from './codex-sdk.js';
|
|
5
7
|
import { geminiExecutor } from './gemini.js';
|
|
6
8
|
import { openAiApiExecutor } from './openai-api.js';
|
|
7
|
-
import { openAiCliExecutor } from './openai-cli.js';
|
|
8
9
|
import { createScriptExecutor } from './script.js';
|
|
9
10
|
import { DEFAULT_MODEL, JUDGE_MODEL } from './shared.js';
|
|
11
|
+
// 命名一致性:provider HTTP 路径统一用 `<vendor>-api`(`anthropic-api` / `openai-api`),
|
|
12
|
+
// vendor coding agent CLI 用 vendor 名(`claude` / `codex`)。`openai` 这个不带 -api 后缀的
|
|
13
|
+
// 旧 alias 历史上指 openai-cli 子进程实现,删除后不再设别名 — 用 `--executor openai-api`。
|
|
10
14
|
const EXECUTOR_REGISTRY = {
|
|
11
15
|
claude: claudeCliExecutor,
|
|
12
16
|
'claude-sdk': claudeSdkExecutor,
|
|
13
|
-
|
|
17
|
+
codex: codexCliExecutor,
|
|
18
|
+
'codex-sdk': codexSdkExecutor,
|
|
14
19
|
gemini: geminiExecutor,
|
|
15
20
|
'anthropic-api': anthropicApiExecutor,
|
|
16
21
|
'openai-api': openAiApiExecutor,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/executors/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/executors/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAEzD,4EAA4E;AAC5E,gFAAgF;AAChF,sEAAsE;AACtE,MAAM,iBAAiB,GAA+B;IACpD,MAAM,EAAE,iBAAiB;IACzB,YAAY,EAAE,iBAAiB;IAC/B,KAAK,EAAE,gBAAgB;IACvB,WAAW,EAAE,gBAAgB;IAC7B,MAAM,EAAE,cAAc;IACtB,eAAe,EAAE,oBAAoB;IACrC,YAAY,EAAE,iBAAiB;CAChC,CAAC;AAEF,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,CAAC;AAE/E,MAAM,UAAU,cAAc,CAAC,OAAe,QAAQ;IACpD,OAAO,iBAAiB,CAAC,IAAI,CAAC,IAAI,oBAAoB,CAAC,IAAI,CAAC,CAAC;AAC/D,CAAC"}
|