@jx-grxf/patchpilot 0.2.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.
Files changed (95) hide show
  1. package/.env.example +13 -0
  2. package/LICENSE +21 -0
  3. package/README.md +314 -0
  4. package/dist/cli.d.ts +2 -0
  5. package/dist/cli.js +71 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/core/agent.d.ts +21 -0
  8. package/dist/core/agent.js +346 -0
  9. package/dist/core/agent.js.map +1 -0
  10. package/dist/core/codex.d.ts +22 -0
  11. package/dist/core/codex.js +242 -0
  12. package/dist/core/codex.js.map +1 -0
  13. package/dist/core/compute.d.ts +9 -0
  14. package/dist/core/compute.js +18 -0
  15. package/dist/core/compute.js.map +1 -0
  16. package/dist/core/doctor.d.ts +7 -0
  17. package/dist/core/doctor.js +226 -0
  18. package/dist/core/doctor.js.map +1 -0
  19. package/dist/core/env.d.ts +6 -0
  20. package/dist/core/env.js +103 -0
  21. package/dist/core/env.js.map +1 -0
  22. package/dist/core/gemini.d.ts +20 -0
  23. package/dist/core/gemini.js +177 -0
  24. package/dist/core/gemini.js.map +1 -0
  25. package/dist/core/json.d.ts +3 -0
  26. package/dist/core/json.js +95 -0
  27. package/dist/core/json.js.map +1 -0
  28. package/dist/core/modelClient.d.ts +8 -0
  29. package/dist/core/modelClient.js +42 -0
  30. package/dist/core/modelClient.js.map +1 -0
  31. package/dist/core/nvidia.d.ts +19 -0
  32. package/dist/core/nvidia.js +160 -0
  33. package/dist/core/nvidia.js.map +1 -0
  34. package/dist/core/ollama.d.ts +31 -0
  35. package/dist/core/ollama.js +176 -0
  36. package/dist/core/ollama.js.map +1 -0
  37. package/dist/core/openrouter.d.ts +27 -0
  38. package/dist/core/openrouter.js +168 -0
  39. package/dist/core/openrouter.js.map +1 -0
  40. package/dist/core/subagents.d.ts +14 -0
  41. package/dist/core/subagents.js +89 -0
  42. package/dist/core/subagents.js.map +1 -0
  43. package/dist/core/tokenAccounting.d.ts +6 -0
  44. package/dist/core/tokenAccounting.js +134 -0
  45. package/dist/core/tokenAccounting.js.map +1 -0
  46. package/dist/core/types.d.ts +90 -0
  47. package/dist/core/types.js +2 -0
  48. package/dist/core/types.js.map +1 -0
  49. package/dist/core/workspace.d.ts +28 -0
  50. package/dist/core/workspace.js +616 -0
  51. package/dist/core/workspace.js.map +1 -0
  52. package/dist/tui/App.d.ts +6 -0
  53. package/dist/tui/App.js +1717 -0
  54. package/dist/tui/App.js.map +1 -0
  55. package/dist/tui/commands.d.ts +14 -0
  56. package/dist/tui/commands.js +210 -0
  57. package/dist/tui/commands.js.map +1 -0
  58. package/dist/tui/components/CommandSuggestions.d.ts +12 -0
  59. package/dist/tui/components/CommandSuggestions.js +12 -0
  60. package/dist/tui/components/CommandSuggestions.js.map +1 -0
  61. package/dist/tui/components/Composer.d.ts +13 -0
  62. package/dist/tui/components/Composer.js +29 -0
  63. package/dist/tui/components/Composer.js.map +1 -0
  64. package/dist/tui/components/Header.d.ts +25 -0
  65. package/dist/tui/components/Header.js +62 -0
  66. package/dist/tui/components/Header.js.map +1 -0
  67. package/dist/tui/components/OnboardingPanel.d.ts +38 -0
  68. package/dist/tui/components/OnboardingPanel.js +85 -0
  69. package/dist/tui/components/OnboardingPanel.js.map +1 -0
  70. package/dist/tui/components/Sidebar.d.ts +22 -0
  71. package/dist/tui/components/Sidebar.js +133 -0
  72. package/dist/tui/components/Sidebar.js.map +1 -0
  73. package/dist/tui/components/Transcript.d.ts +10 -0
  74. package/dist/tui/components/Transcript.js +111 -0
  75. package/dist/tui/components/Transcript.js.map +1 -0
  76. package/dist/tui/format.d.ts +29 -0
  77. package/dist/tui/format.js +202 -0
  78. package/dist/tui/format.js.map +1 -0
  79. package/dist/tui/hosts.d.ts +34 -0
  80. package/dist/tui/hosts.js +338 -0
  81. package/dist/tui/hosts.js.map +1 -0
  82. package/dist/tui/inputRouting.d.ts +8 -0
  83. package/dist/tui/inputRouting.js +94 -0
  84. package/dist/tui/inputRouting.js.map +1 -0
  85. package/dist/tui/platform.d.ts +2 -0
  86. package/dist/tui/platform.js +13 -0
  87. package/dist/tui/platform.js.map +1 -0
  88. package/dist/tui/systemStats.d.ts +25 -0
  89. package/dist/tui/systemStats.js +88 -0
  90. package/dist/tui/systemStats.js.map +1 -0
  91. package/dist/tui/types.d.ts +16 -0
  92. package/dist/tui/types.js +2 -0
  93. package/dist/tui/types.js.map +1 -0
  94. package/docs/showcase/patchpilot-showcase.svg +39 -0
  95. package/package.json +63 -0
@@ -0,0 +1,346 @@
1
+ import { formatParseError, parseAgentResponse } from "./json.js";
2
+ import path from "node:path";
3
+ import { platform, release, type } from "node:os";
4
+ import { createModelClient } from "./modelClient.js";
5
+ import { formatSubagentContext, runSubagentAdvisors } from "./subagents.js";
6
+ import { WorkspaceTools } from "./workspace.js";
7
+ export class AgentRunner {
8
+ client;
9
+ tools;
10
+ options;
11
+ constructor(options) {
12
+ this.options = options;
13
+ this.client = createModelClient({
14
+ provider: options.provider,
15
+ ollamaUrl: options.ollamaUrl,
16
+ workspace: options.workspace
17
+ });
18
+ this.tools = new WorkspaceTools({
19
+ root: options.workspace,
20
+ allowWrite: options.allowWrite,
21
+ allowShell: options.allowShell,
22
+ signal: options.signal
23
+ });
24
+ }
25
+ async *run(task) {
26
+ const workspaceSummary = await buildWorkspaceSummary(this.tools.root);
27
+ let maxSteps = resolveMaxSteps(task, this.options.maxSteps, this.options.thinkingMode);
28
+ const reasoningEffort = resolveReasoningEffort(task, this.options.reasoningEffort);
29
+ let stepIndex = 0;
30
+ let repairs = 0;
31
+ let subagentContext = "";
32
+ if (this.options.subagents && shouldUseSubagents(task)) {
33
+ yield {
34
+ type: "status",
35
+ message: "consulting planner and reviewer subagents"
36
+ };
37
+ const advice = await runSubagentAdvisors({
38
+ client: this.client,
39
+ model: this.options.model,
40
+ task,
41
+ workspaceRoot: this.tools.root,
42
+ workspaceSummary
43
+ });
44
+ subagentContext = formatSubagentContext(advice);
45
+ for (const item of advice) {
46
+ yield {
47
+ type: "subagent",
48
+ role: item.role,
49
+ message: item.message,
50
+ metrics: item.telemetry
51
+ };
52
+ }
53
+ }
54
+ const messages = [
55
+ {
56
+ role: "system",
57
+ content: buildSystemPrompt(this.tools.root, subagentContext, workspaceSummary)
58
+ },
59
+ {
60
+ role: "user",
61
+ content: task
62
+ }
63
+ ];
64
+ while (stepIndex < maxSteps) {
65
+ if (this.options.signal?.aborted) {
66
+ yield {
67
+ type: "final",
68
+ message: "Stopped."
69
+ };
70
+ return;
71
+ }
72
+ yield {
73
+ type: "status",
74
+ message: `thinking step ${stepIndex + 1}/${maxSteps}${this.options.thinkingMode === "adaptive" ? " adaptive" : ""}`
75
+ };
76
+ const modelResponse = await this.client.chat({
77
+ model: this.options.model,
78
+ messages,
79
+ formatJson: true,
80
+ reasoningEffort,
81
+ signal: this.options.signal
82
+ });
83
+ const rawResponse = modelResponse.content;
84
+ yield {
85
+ type: "metrics",
86
+ metrics: modelResponse.telemetry
87
+ };
88
+ let parsedResponse;
89
+ try {
90
+ parsedResponse = parseAgentResponse(rawResponse);
91
+ }
92
+ catch (error) {
93
+ repairs += 1;
94
+ yield {
95
+ type: "status",
96
+ message: `repairing model protocol: ${formatParseError(error)}`
97
+ };
98
+ messages.push({
99
+ role: "assistant",
100
+ content: rawResponse
101
+ });
102
+ messages.push({
103
+ role: "user",
104
+ content: "Your previous response was invalid. Return exactly one JSON object now. Do not explain. Use either {\"action\":\"tools\",\"message\":\"...\",\"tool_calls\":[...]} or {\"action\":\"final\",\"message\":\"...\"}. For simple file edits, call write_file with a workspace-relative path."
105
+ });
106
+ if (repairs >= 3) {
107
+ yield {
108
+ type: "final",
109
+ message: "The model kept returning invalid tool protocol. Try a stronger coding model or switch advisors off for this task."
110
+ };
111
+ return;
112
+ }
113
+ continue;
114
+ }
115
+ repairs = 0;
116
+ if (parsedResponse.action === "final") {
117
+ yield {
118
+ type: "final",
119
+ message: parsedResponse.message
120
+ };
121
+ return;
122
+ }
123
+ if (looksLikeClarification(parsedResponse.message)) {
124
+ yield {
125
+ type: "final",
126
+ message: parsedResponse.message
127
+ };
128
+ return;
129
+ }
130
+ yield {
131
+ type: "assistant",
132
+ message: parsedResponse.message
133
+ };
134
+ const toolCalls = parsedResponse.tool_calls.map(normalizeToolCall);
135
+ const toolResults = toolCalls.every(isReadOnlyToolCall)
136
+ ? await Promise.all(toolCalls.map((toolCall) => executeToolSafely(this.tools, toolCall)))
137
+ : await executeToolCallsSequentially(this.tools, toolCalls);
138
+ for (const toolResult of toolResults) {
139
+ yield {
140
+ type: "tool",
141
+ name: toolResult.tool,
142
+ summary: toolResult.summary,
143
+ ok: toolResult.ok
144
+ };
145
+ }
146
+ messages.push({
147
+ role: "assistant",
148
+ content: rawResponse
149
+ });
150
+ messages.push({
151
+ role: "user",
152
+ content: formatToolResultsForPrompt(toolResults)
153
+ });
154
+ stepIndex += 1;
155
+ if (this.options.thinkingMode === "adaptive" && stepIndex >= maxSteps && shouldExtendAdaptiveRun(task, toolResults, maxSteps)) {
156
+ const nextMaxSteps = Math.min(32, maxSteps + 4);
157
+ if (nextMaxSteps > maxSteps) {
158
+ maxSteps = nextMaxSteps;
159
+ yield {
160
+ type: "status",
161
+ message: `expanded adaptive thinking budget to ${maxSteps} steps`
162
+ };
163
+ }
164
+ }
165
+ }
166
+ yield {
167
+ type: "final",
168
+ message: "Stopped after the thinking budget. The task is not finished yet."
169
+ };
170
+ }
171
+ }
172
+ function shouldUseSubagents(task) {
173
+ const normalizedTask = task.toLowerCase();
174
+ if (normalizedTask.trim().split(/\s+/).filter(Boolean).length < 2) {
175
+ return false;
176
+ }
177
+ return /\b(repo|repository|projekt|project|code|file|datei|test|build|fix|debug|implement|refactor|review|analyze|analyse|analysiere|prüf|pruef|bewerte|architektur|erklär|erklaer|such|find|install|commit|diff|patch|src|readme|sprache|programmiersprache|stack|framework|dependencies|abhängigkeiten|abhaengigkeiten|typescript|javascript|node|swift|python|c)\b/.test(normalizedTask);
178
+ }
179
+ function buildSystemPrompt(workspaceRoot, subagentContext, workspaceSummary) {
180
+ const workspaceLabel = path.basename(workspaceRoot) || "workspace";
181
+ return [
182
+ "You are PatchPilot, a local coding agent running inside a terminal TUI.",
183
+ "You help inspect, edit, test, and explain code inside one workspace.",
184
+ `Runtime OS: ${type()} ${release()} (${platform()}). Use OS-appropriate shell commands and paths.`,
185
+ `Workspace root: ${workspaceRoot}`,
186
+ `Workspace label: ${workspaceLabel}`,
187
+ `All tool paths are relative to the workspace root. If the workspace is named "${workspaceLabel}", do not prefix paths with "${workspaceLabel}/". Use "." for the workspace root.`,
188
+ "Treat short questions about this project, its language, stack, quality, architecture, dependencies, tests, or files as workspace questions.",
189
+ "For greetings, small talk, or clearly non-workspace chat, answer normally without tool calls.",
190
+ "For ambiguous pronouns like this project or it, assume the current workspace unless the user points elsewhere.",
191
+ "If you ask the user a question, use a final response and do not call tools.",
192
+ "Do not invent repository facts. If you have not read a file, say you have not verified it.",
193
+ "Never pass placeholder examples like relative/path, path/to/file, or <path> as tool arguments.",
194
+ "For repository summaries, inspect README.md, package.json, tests, docs, and top-level source files before answering.",
195
+ "For implementation tasks, first inspect the narrowest relevant files, then edit only what is needed.",
196
+ "When diagnosing a failure, form a concrete hypothesis, gather targeted evidence with tools, then fix the smallest cause.",
197
+ workspaceSummary ? ["", "Workspace context:", workspaceSummary].join("\n") : "",
198
+ subagentContext
199
+ ? [
200
+ "",
201
+ "Advisory subagent context:",
202
+ subagentContext,
203
+ "",
204
+ "Use this guidance as a starting point, but verify with tools before changing code."
205
+ ].join("\n")
206
+ : "",
207
+ "",
208
+ "Return only JSON. Do not use Markdown outside JSON.",
209
+ "Return exactly one JSON object. Never return a JSON array.",
210
+ "",
211
+ "When you need context or want to act, return:",
212
+ "{\"action\":\"tools\",\"message\":\"short reason\",\"tool_calls\":[{\"name\":\"list_files\",\"arguments\":{\"path\":\".\"}}]}",
213
+ "",
214
+ "When the task is complete, return:",
215
+ "{\"action\":\"final\",\"message\":\"short useful answer\"}",
216
+ "",
217
+ "Available tools:",
218
+ "- list_files: {\"path\":\".\"}",
219
+ "- read_file: {\"path\":\"src/index.ts\"}",
220
+ "- search_text: {\"query\":\"functionName\"}",
221
+ "- inspect_document: {\"path\":\"docs/spec.pdf\"} for pdf, docx, and text/code files",
222
+ "- write_file: {\"path\":\"test2/test.txt\",\"content\":\"full file content\"}",
223
+ "- run_shell: {\"command\":\"command to run in the workspace\"}",
224
+ "",
225
+ "Act like a coding agent. For simple create/edit/run requests, use tools directly instead of over-warning.",
226
+ "Do not call search_text with an empty query. Use list_files {\"path\":\".\"} to inspect a directory.",
227
+ "Prefer reading before risky edits; for explicit simple writes, write the requested file.",
228
+ "Batch independent read-only tool calls in one response when it helps avoid extra thinking steps.",
229
+ "Prefer parallel read-only context gathering over one file per step.",
230
+ "In final answers, separate verified facts from remaining risks.",
231
+ "Keep tool requests and final answers compact."
232
+ ].join("\n");
233
+ }
234
+ function looksLikeClarification(message) {
235
+ const normalizedMessage = message.trim().toLowerCase();
236
+ return (normalizedMessage.endsWith("?") &&
237
+ /\b(what|which|please provide|would you like|do you want|can you specify|welche|was genau|bitte)\b/.test(normalizedMessage));
238
+ }
239
+ function isReadOnlyToolCall(toolCall) {
240
+ return toolCall.name === "list_files" || toolCall.name === "read_file" || toolCall.name === "search_text" || toolCall.name === "inspect_document";
241
+ }
242
+ function normalizeToolCall(toolCall) {
243
+ if (toolCall.name === "search_text") {
244
+ const query = typeof toolCall.arguments.query === "string" ? toolCall.arguments.query.trim() : "";
245
+ if (!query) {
246
+ return {
247
+ name: "list_files",
248
+ arguments: {
249
+ path: "."
250
+ }
251
+ };
252
+ }
253
+ }
254
+ return toolCall;
255
+ }
256
+ async function executeToolCallsSequentially(tools, toolCalls) {
257
+ const results = [];
258
+ for (const toolCall of toolCalls) {
259
+ results.push(await executeToolSafely(tools, toolCall));
260
+ }
261
+ return results;
262
+ }
263
+ async function executeToolSafely(tools, toolCall) {
264
+ const toolResult = await tools.execute(toolCall).catch((error) => ({
265
+ ok: false,
266
+ summary: error instanceof Error ? error.message : String(error),
267
+ content: error instanceof Error ? error.stack ?? error.message : String(error)
268
+ }));
269
+ return {
270
+ tool: toolCall.name,
271
+ ok: toolResult.ok,
272
+ summary: toolResult.summary,
273
+ content: toolResult.content
274
+ };
275
+ }
276
+ function formatToolResultsForPrompt(toolResults) {
277
+ return [
278
+ "Tool results:",
279
+ ...toolResults.map((toolResult, index) => [
280
+ `${index + 1}. ${toolResult.tool} (${toolResult.ok ? "ok" : "error"})`,
281
+ `summary: ${toolResult.summary}`,
282
+ `content: ${clipPromptValue(toolResult.content, toolResult.tool === "read_file" ? 12_000 : 6000)}`
283
+ ].join("\n"))
284
+ ].join("\n\n");
285
+ }
286
+ async function buildWorkspaceSummary(workspaceRoot) {
287
+ const [packageJson, tsconfig, readme] = await Promise.all([
288
+ readWorkspaceFile(workspaceRoot, "package.json", 4000),
289
+ readWorkspaceFile(workspaceRoot, "tsconfig.json", 1600),
290
+ readWorkspaceFile(workspaceRoot, "README.md", 3000)
291
+ ]);
292
+ return [
293
+ packageJson ? `package.json:\n${packageJson}` : "",
294
+ tsconfig ? `tsconfig.json:\n${tsconfig}` : "",
295
+ readme ? `README excerpt:\n${readme}` : ""
296
+ ]
297
+ .filter(Boolean)
298
+ .join("\n\n");
299
+ }
300
+ async function readWorkspaceFile(workspaceRoot, relativePath, maxLength) {
301
+ const { readFile } = await import("node:fs/promises");
302
+ const normalizedRoot = path.resolve(workspaceRoot);
303
+ const normalizedFile = path.resolve(workspaceRoot, relativePath);
304
+ if (!normalizedFile.startsWith(`${normalizedRoot}${path.sep}`)) {
305
+ return "";
306
+ }
307
+ const content = await readFile(normalizedFile, "utf8").catch(() => "");
308
+ return clipPromptValue(content.trim(), maxLength);
309
+ }
310
+ function resolveMaxSteps(task, configuredMaxSteps, thinkingMode) {
311
+ if (thinkingMode !== "adaptive") {
312
+ return configuredMaxSteps;
313
+ }
314
+ const words = task.trim().split(/\s+/).filter(Boolean).length;
315
+ const looksComplex = shouldUseSubagents(task) || words > 18 || /\b(implement|refactor|debug|fix|review|architektur|performance|pipeline|context|memory|provider)\b/i.test(task);
316
+ const adaptiveSteps = looksComplex ? Math.max(configuredMaxSteps, 12) : Math.min(configuredMaxSteps, 5);
317
+ return Math.max(3, Math.min(20, adaptiveSteps));
318
+ }
319
+ function shouldExtendAdaptiveRun(task, toolResults, currentMaxSteps) {
320
+ if (currentMaxSteps >= 32) {
321
+ return false;
322
+ }
323
+ const hasUsefulProgress = toolResults.some((result) => result.ok);
324
+ const hasRecoverableFailure = toolResults.some((result) => !result.ok && /not found|missing|requires|denied|failed|unreadable/i.test(result.summary));
325
+ return hasUsefulProgress || hasRecoverableFailure || shouldUseSubagents(task);
326
+ }
327
+ function resolveReasoningEffort(task, effort) {
328
+ if (effort !== "adaptive") {
329
+ return effort;
330
+ }
331
+ const wordCount = task.trim().split(/\s+/).filter(Boolean).length;
332
+ if (wordCount > 40 || /\b(large|complex|refactor|architecture|architektur|debug|provider|pipeline|performance|security|release)\b/i.test(task)) {
333
+ return "high";
334
+ }
335
+ if (wordCount < 8 && !shouldUseSubagents(task)) {
336
+ return "low";
337
+ }
338
+ return "medium";
339
+ }
340
+ function clipPromptValue(value, maxLength) {
341
+ if (value.length <= maxLength) {
342
+ return value;
343
+ }
344
+ return `${value.slice(0, maxLength)}\n...[clipped ${value.length - maxLength} chars]`;
345
+ }
346
+ //# sourceMappingURL=agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/core/agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAE5E,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAgBhD,MAAM,OAAO,WAAW;IACL,MAAM,CAAc;IACpB,KAAK,CAAiB;IACtB,OAAO,CAAqB;IAE7C,YAAY,OAA2B;QACrC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,MAAM,GAAG,iBAAiB,CAAC;YAC9B,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,SAAS,EAAE,OAAO,CAAC,SAAS;SAC7B,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,GAAG,IAAI,cAAc,CAAC;YAC9B,IAAI,EAAE,OAAO,CAAC,SAAS;YACvB,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,CAAC,GAAG,CAAC,IAAY;QACrB,MAAM,gBAAgB,GAAG,MAAM,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACtE,IAAI,QAAQ,GAAG,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QACvF,MAAM,eAAe,GAAG,sBAAsB,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QACnF,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,IAAI,eAAe,GAAG,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;YACvD,MAAM;gBACJ,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,2CAA2C;aACrD,CAAC;YAEF,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC;gBACvC,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK;gBACzB,IAAI;gBACJ,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;gBAC9B,gBAAgB;aACjB,CAAC,CAAC;YACH,eAAe,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;YAEhD,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;gBAC1B,MAAM;oBACJ,IAAI,EAAE,UAAU;oBAChB,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,OAAO,EAAE,IAAI,CAAC,SAAS;iBACxB,CAAC;YACJ,CAAC;QACH,CAAC;QAED,MAAM,QAAQ,GAAkB;YAC9B;gBACE,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,eAAe,EAAE,gBAAgB,CAAC;aAC/E;YACD;gBACE,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,IAAI;aACd;SACF,CAAC;QAEF,OAAO,SAAS,GAAG,QAAQ,EAAE,CAAC;YAC5B,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;gBACjC,MAAM;oBACJ,IAAI,EAAE,OAAO;oBACb,OAAO,EAAE,UAAU;iBACpB,CAAC;gBACF,OAAO;YACT,CAAC;YAED,MAAM;gBACJ,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,iBAAiB,SAAS,GAAG,CAAC,IAAI,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,KAAK,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE;aACpH,CAAC;YAEF,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;gBAC3C,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK;gBACzB,QAAQ;gBACR,UAAU,EAAE,IAAI;gBAChB,eAAe;gBACf,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM;aAC5B,CAAC,CAAC;YACH,MAAM,WAAW,GAAG,aAAa,CAAC,OAAO,CAAC;YAE1C,MAAM;gBACJ,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE,aAAa,CAAC,SAAS;aACjC,CAAC;YAEF,IAAI,cAAc,CAAC;YACnB,IAAI,CAAC;gBACH,cAAc,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;YACnD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,IAAI,CAAC,CAAC;gBACb,MAAM;oBACJ,IAAI,EAAE,QAAQ;oBACd,OAAO,EAAE,6BAA6B,gBAAgB,CAAC,KAAK,CAAC,EAAE;iBAChE,CAAC;gBACF,QAAQ,CAAC,IAAI,CAAC;oBACZ,IAAI,EAAE,WAAW;oBACjB,OAAO,EAAE,WAAW;iBACrB,CAAC,CAAC;gBACH,QAAQ,CAAC,IAAI,CAAC;oBACZ,IAAI,EAAE,MAAM;oBACZ,OAAO,EACL,0RAA0R;iBAC7R,CAAC,CAAC;gBACH,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC;oBACjB,MAAM;wBACJ,IAAI,EAAE,OAAO;wBACb,OAAO,EAAE,mHAAmH;qBAC7H,CAAC;oBACF,OAAO;gBACT,CAAC;gBACD,SAAS;YACX,CAAC;YAED,OAAO,GAAG,CAAC,CAAC;YACZ,IAAI,cAAc,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;gBACtC,MAAM;oBACJ,IAAI,EAAE,OAAO;oBACb,OAAO,EAAE,cAAc,CAAC,OAAO;iBAChC,CAAC;gBACF,OAAO;YACT,CAAC;YAED,IAAI,sBAAsB,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC;gBACnD,MAAM;oBACJ,IAAI,EAAE,OAAO;oBACb,OAAO,EAAE,cAAc,CAAC,OAAO;iBAChC,CAAC;gBACF,OAAO;YACT,CAAC;YAED,MAAM;gBACJ,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,cAAc,CAAC,OAAO;aAChC,CAAC;YAEF,MAAM,SAAS,GAAG,cAAc,CAAC,UAAU,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;YACnE,MAAM,WAAW,GAAG,SAAS,CAAC,KAAK,CAAC,kBAAkB,CAAC;gBACrD,CAAC,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;gBACzF,CAAC,CAAC,MAAM,4BAA4B,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;YAE9D,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;gBACrC,MAAM;oBACJ,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,UAAU,CAAC,IAAI;oBACrB,OAAO,EAAE,UAAU,CAAC,OAAO;oBAC3B,EAAE,EAAE,UAAU,CAAC,EAAE;iBAClB,CAAC;YACJ,CAAC;YAED,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,WAAW;aACrB,CAAC,CAAC;YACH,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,0BAA0B,CAAC,WAAW,CAAC;aACjD,CAAC,CAAC;YAEH,SAAS,IAAI,CAAC,CAAC;YACf,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,KAAK,UAAU,IAAI,SAAS,IAAI,QAAQ,IAAI,uBAAuB,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE,CAAC;gBAC9H,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC;gBAChD,IAAI,YAAY,GAAG,QAAQ,EAAE,CAAC;oBAC5B,QAAQ,GAAG,YAAY,CAAC;oBACxB,MAAM;wBACJ,IAAI,EAAE,QAAQ;wBACd,OAAO,EAAE,wCAAwC,QAAQ,QAAQ;qBAClE,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM;YACJ,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,kEAAkE;SAC5E,CAAC;IACJ,CAAC;CACF;AAED,SAAS,kBAAkB,CAAC,IAAY;IACtC,MAAM,cAAc,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IAC1C,IAAI,cAAc,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClE,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,+VAA+V,CAAC,IAAI,CACzW,cAAc,CACf,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,aAAqB,EAAE,eAAuB,EAAE,gBAAwB;IACjG,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC;IACnE,OAAO;QACL,yEAAyE;QACzE,sEAAsE;QACtE,eAAe,IAAI,EAAE,IAAI,OAAO,EAAE,KAAK,QAAQ,EAAE,iDAAiD;QAClG,mBAAmB,aAAa,EAAE;QAClC,oBAAoB,cAAc,EAAE;QACpC,iFAAiF,cAAc,gCAAgC,cAAc,qCAAqC;QAClL,6IAA6I;QAC7I,+FAA+F;QAC/F,gHAAgH;QAChH,6EAA6E;QAC7E,4FAA4F;QAC5F,gGAAgG;QAChG,sHAAsH;QACtH,sGAAsG;QACtG,0HAA0H;QAC1H,gBAAgB,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,oBAAoB,EAAE,gBAAgB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE;QAC/E,eAAe;YACb,CAAC,CAAC;gBACE,EAAE;gBACF,4BAA4B;gBAC5B,eAAe;gBACf,EAAE;gBACF,oFAAoF;aACrF,CAAC,IAAI,CAAC,IAAI,CAAC;YACd,CAAC,CAAC,EAAE;QACN,EAAE;QACF,qDAAqD;QACrD,4DAA4D;QAC5D,EAAE;QACF,+CAA+C;QAC/C,+HAA+H;QAC/H,EAAE;QACF,oCAAoC;QACpC,4DAA4D;QAC5D,EAAE;QACF,kBAAkB;QAClB,gCAAgC;QAChC,0CAA0C;QAC1C,6CAA6C;QAC7C,qFAAqF;QACrF,+EAA+E;QAC/E,gEAAgE;QAChE,EAAE;QACF,2GAA2G;QAC3G,sGAAsG;QACtG,0FAA0F;QAC1F,kGAAkG;QAClG,qEAAqE;QACrE,iEAAiE;QACjE,+CAA+C;KAChD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,SAAS,sBAAsB,CAAC,OAAe;IAC7C,MAAM,iBAAiB,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACvD,OAAO,CACL,iBAAiB,CAAC,QAAQ,CAAC,GAAG,CAAC;QAC/B,mGAAmG,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAC5H,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,QAA0B;IACpD,OAAO,QAAQ,CAAC,IAAI,KAAK,YAAY,IAAI,QAAQ,CAAC,IAAI,KAAK,WAAW,IAAI,QAAQ,CAAC,IAAI,KAAK,aAAa,IAAI,QAAQ,CAAC,IAAI,KAAK,kBAAkB,CAAC;AACpJ,CAAC;AAED,SAAS,iBAAiB,CAAC,QAAkD;IAC3E,IAAI,QAAQ,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;QACpC,MAAM,KAAK,GAAG,OAAO,QAAQ,CAAC,SAAS,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClG,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO;gBACL,IAAI,EAAE,YAAY;gBAClB,SAAS,EAAE;oBACT,IAAI,EAAE,GAAG;iBACV;aACF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,4BAA4B,CAAC,KAAqB,EAAE,SAAqD;IACtH,MAAM,OAAO,GAAG,EAAE,CAAC;IACnB,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,OAAO,CAAC,IAAI,CAAC,MAAM,iBAAiB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;IACzD,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,KAAqB,EAAE,QAAkD;IACxG,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE,CAAC,CAAC;QAC1E,EAAE,EAAE,KAAK;QACT,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;QAC/D,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;KAC/E,CAAC,CAAC,CAAC;IAEJ,OAAO;QACL,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,EAAE,EAAE,UAAU,CAAC,EAAE;QACjB,OAAO,EAAE,UAAU,CAAC,OAAO;QAC3B,OAAO,EAAE,UAAU,CAAC,OAAO;KAC5B,CAAC;AACJ,CAAC;AAED,SAAS,0BAA0B,CACjC,WAKE;IAEF,OAAO;QACL,eAAe;QACf,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,KAAK,EAAE,EAAE,CACvC;YACE,GAAG,KAAK,GAAG,CAAC,KAAK,UAAU,CAAC,IAAI,KAAK,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,GAAG;YACtE,YAAY,UAAU,CAAC,OAAO,EAAE;YAChC,YAAY,eAAe,CAAC,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE;SACnG,CAAC,IAAI,CAAC,IAAI,CAAC,CACb;KACF,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACjB,CAAC;AAED,KAAK,UAAU,qBAAqB,CAAC,aAAqB;IACxD,MAAM,CAAC,WAAW,EAAE,QAAQ,EAAE,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACxD,iBAAiB,CAAC,aAAa,EAAE,cAAc,EAAE,IAAI,CAAC;QACtD,iBAAiB,CAAC,aAAa,EAAE,eAAe,EAAE,IAAI,CAAC;QACvD,iBAAiB,CAAC,aAAa,EAAE,WAAW,EAAE,IAAI,CAAC;KACpD,CAAC,CAAC;IAEH,OAAO;QACL,WAAW,CAAC,CAAC,CAAC,kBAAkB,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE;QAClD,QAAQ,CAAC,CAAC,CAAC,mBAAmB,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE;QAC7C,MAAM,CAAC,CAAC,CAAC,oBAAoB,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE;KAC3C;SACE,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,MAAM,CAAC,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,aAAqB,EAAE,YAAoB,EAAE,SAAiB;IAC7F,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;IACtD,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IACnD,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;IACjE,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,GAAG,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;QAC/D,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;IACvE,OAAO,eAAe,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,SAAS,CAAC,CAAC;AACpD,CAAC;AAED,SAAS,eAAe,CAAC,IAAY,EAAE,kBAA0B,EAAE,YAAgD;IACjH,IAAI,YAAY,KAAK,UAAU,EAAE,CAAC;QAChC,OAAO,kBAAkB,CAAC;IAC5B,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;IAC9D,MAAM,YAAY,GAAG,kBAAkB,CAAC,IAAI,CAAC,IAAI,KAAK,GAAG,EAAE,IAAI,qGAAqG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChL,MAAM,aAAa,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC;IACxG,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,uBAAuB,CAC9B,IAAY,EACZ,WAGE,EACF,eAAuB;IAEvB,IAAI,eAAe,IAAI,EAAE,EAAE,CAAC;QAC1B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,iBAAiB,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAClE,MAAM,qBAAqB,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,sDAAsD,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IACtJ,OAAO,iBAAiB,IAAI,qBAAqB,IAAI,kBAAkB,CAAC,IAAI,CAAC,CAAC;AAChF,CAAC;AAED,SAAS,sBAAsB,CAAC,IAAY,EAAE,MAA6C;IACzF,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;QAC1B,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;IAClE,IAAI,SAAS,GAAG,EAAE,IAAI,6GAA6G,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/I,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,SAAS,GAAG,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/C,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,eAAe,CAAC,KAAa,EAAE,SAAiB;IACvD,IAAI,KAAK,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,iBAAiB,KAAK,CAAC,MAAM,GAAG,SAAS,SAAS,CAAC;AACxF,CAAC"}
@@ -0,0 +1,22 @@
1
+ import type { ModelChatOptions, ModelChatResult } from "./types.js";
2
+ export declare const defaultCodexModel = "gpt-5.5";
3
+ export declare const codexOAuthModels: string[];
4
+ export declare class CodexCliClient {
5
+ private readonly workspace;
6
+ private readonly timeoutMs;
7
+ constructor(options: {
8
+ workspace: string;
9
+ timeoutMs?: number;
10
+ });
11
+ chat(options: ModelChatOptions): Promise<ModelChatResult>;
12
+ listModels(): Promise<string[]>;
13
+ }
14
+ export declare function listCodexModels(): Promise<string[]>;
15
+ export declare function hasCodexCliOAuth(codexAuthPath?: string): boolean;
16
+ type CodexUsage = {
17
+ input_tokens: number;
18
+ cached_input_tokens?: number;
19
+ output_tokens: number;
20
+ };
21
+ export declare function parseCodexUsageFromJsonl(value: string): CodexUsage | null;
22
+ export {};
@@ -0,0 +1,242 @@
1
+ import { execFile, spawn } from "node:child_process";
2
+ import { mkdtemp, readFile, rm } from "node:fs/promises";
3
+ import { existsSync, readFileSync } from "node:fs";
4
+ import { homedir, tmpdir } from "node:os";
5
+ import path from "node:path";
6
+ import { promisify } from "node:util";
7
+ import { attachTokenCost, estimateTokens } from "./tokenAccounting.js";
8
+ const execFileAsync = promisify(execFile);
9
+ export const defaultCodexModel = "gpt-5.5";
10
+ export const codexOAuthModels = [
11
+ "gpt-5.5",
12
+ "gpt-5.4",
13
+ "gpt-5.2-codex",
14
+ "gpt-5.1-codex-max",
15
+ "gpt-5.4-mini",
16
+ "gpt-5.3-codex",
17
+ "gpt-5.2",
18
+ "gpt-5.1-codex-mini"
19
+ ];
20
+ export class CodexCliClient {
21
+ workspace;
22
+ timeoutMs;
23
+ constructor(options) {
24
+ this.workspace = options.workspace;
25
+ this.timeoutMs = options.timeoutMs ?? 120_000;
26
+ }
27
+ async chat(options) {
28
+ const startedAt = Date.now();
29
+ const tempRoot = await mkdtemp(path.join(tmpdir(), "patchpilot-codex-"));
30
+ const outputPath = path.join(tempRoot, "last-message.txt");
31
+ try {
32
+ const prompt = buildCodexPrompt(options);
33
+ const usage = await runCodexExec({
34
+ model: options.model,
35
+ reasoningEffort: options.reasoningEffort,
36
+ workspace: this.workspace,
37
+ prompt,
38
+ outputPath,
39
+ timeoutMs: this.timeoutMs,
40
+ signal: options.signal
41
+ });
42
+ const content = (await readFile(outputPath, "utf8")).trim();
43
+ if (!content) {
44
+ throw new Error("Codex CLI returned an empty response.");
45
+ }
46
+ const durationMs = Date.now() - startedAt;
47
+ return {
48
+ content,
49
+ telemetry: usage
50
+ ? toTelemetryFromUsage(usage, durationMs, options.model)
51
+ : estimateTelemetry(prompt, content, durationMs, options.model)
52
+ };
53
+ }
54
+ finally {
55
+ await rm(tempRoot, {
56
+ recursive: true,
57
+ force: true
58
+ });
59
+ }
60
+ }
61
+ async listModels() {
62
+ return listCodexModels();
63
+ }
64
+ }
65
+ export async function listCodexModels() {
66
+ try {
67
+ const { stdout } = await execFileAsync("codex", ["debug", "models", "--bundled"], {
68
+ timeout: 2500,
69
+ maxBuffer: 4_000_000,
70
+ windowsHide: true
71
+ });
72
+ const catalog = JSON.parse(stdout);
73
+ const models = catalog.models
74
+ ?.filter((model) => model.visibility === "list" && typeof model.slug === "string")
75
+ .map((model) => String(model.slug))
76
+ .filter(Boolean) ?? [];
77
+ return models.length > 0 ? models : codexOAuthModels;
78
+ }
79
+ catch {
80
+ return codexOAuthModels;
81
+ }
82
+ }
83
+ export function hasCodexCliOAuth(codexAuthPath = defaultCodexAuthPath()) {
84
+ const auth = readCodexAuth(codexAuthPath);
85
+ return Boolean(auth && isRecord(auth.tokens) && typeof auth.tokens.access_token === "string");
86
+ }
87
+ function buildCodexPrompt(options) {
88
+ const modeInstruction = options.formatJson
89
+ ? "Return exactly one JSON object and no Markdown. Do not wrap it in code fences."
90
+ : "Return plain text.";
91
+ const transcript = options.messages.map((message) => `${message.role.toUpperCase()}:\n${message.content}`).join("\n\n");
92
+ return [
93
+ "You are acting as PatchPilot's model backend.",
94
+ "Do not edit files or run shell commands yourself.",
95
+ "If repository context is needed, ask PatchPilot for tools by returning the required JSON tool_calls.",
96
+ modeInstruction,
97
+ "",
98
+ transcript
99
+ ].join("\n");
100
+ }
101
+ function runCodexExec(options) {
102
+ return new Promise((resolve, reject) => {
103
+ const child = spawn("codex", [
104
+ "exec",
105
+ "--json",
106
+ "--model",
107
+ options.model,
108
+ ...(options.reasoningEffort ? ["-c", `model_reasoning_effort="${options.reasoningEffort}"`] : []),
109
+ "--sandbox",
110
+ "read-only",
111
+ "--cd",
112
+ options.workspace,
113
+ "--output-last-message",
114
+ options.outputPath,
115
+ "-"
116
+ ], {
117
+ cwd: options.workspace,
118
+ stdio: ["pipe", "pipe", "pipe"],
119
+ signal: options.signal,
120
+ windowsHide: true
121
+ });
122
+ let stdout = "";
123
+ let stderr = "";
124
+ const timeout = setTimeout(() => {
125
+ child.kill();
126
+ reject(new Error(`Codex CLI timed out after ${options.timeoutMs}ms.`));
127
+ }, options.timeoutMs);
128
+ child.stdout.on("data", (chunk) => {
129
+ stdout += chunk.toString("utf8");
130
+ });
131
+ child.stderr.on("data", (chunk) => {
132
+ stderr += chunk.toString("utf8");
133
+ });
134
+ child.on("error", (error) => {
135
+ clearTimeout(timeout);
136
+ reject(error.name === "AbortError"
137
+ ? new Error("Codex CLI run aborted.")
138
+ : new Error(`Cannot run Codex CLI. Install it and run codex login. ${error.message}`));
139
+ });
140
+ child.on("close", (exitCode) => {
141
+ clearTimeout(timeout);
142
+ if (exitCode === 0) {
143
+ resolve(parseCodexUsageFromJsonl(stdout));
144
+ return;
145
+ }
146
+ const output = `${stdout}\n${stderr}`.trim();
147
+ reject(new Error(`Codex CLI exited ${exitCode}. ${clip(output.trim(), 1200)}`));
148
+ });
149
+ child.stdin.end(options.prompt);
150
+ });
151
+ }
152
+ export function parseCodexUsageFromJsonl(value) {
153
+ let usage = null;
154
+ for (const line of value.split(/\r?\n/)) {
155
+ const trimmedLine = line.trim();
156
+ if (!trimmedLine.startsWith("{")) {
157
+ continue;
158
+ }
159
+ const parsed = parseJsonObject(trimmedLine);
160
+ if (!parsed || parsed.type !== "turn.completed" || !isRecord(parsed.usage)) {
161
+ continue;
162
+ }
163
+ const inputTokens = readNonNegativeNumber(parsed.usage.input_tokens);
164
+ const outputTokens = readNonNegativeNumber(parsed.usage.output_tokens);
165
+ if (inputTokens === null || outputTokens === null) {
166
+ continue;
167
+ }
168
+ usage = {
169
+ input_tokens: inputTokens,
170
+ cached_input_tokens: readNonNegativeNumber(parsed.usage.cached_input_tokens) ?? 0,
171
+ output_tokens: outputTokens
172
+ };
173
+ }
174
+ return usage;
175
+ }
176
+ function toTelemetryFromUsage(usage, durationMs, model) {
177
+ return attachTokenCost({
178
+ promptTokens: usage.input_tokens,
179
+ cachedPromptTokens: usage.cached_input_tokens ?? 0,
180
+ cacheWriteTokens: 0,
181
+ responseTokens: usage.output_tokens,
182
+ totalTokens: usage.input_tokens + usage.output_tokens,
183
+ evalTokensPerSecond: usage.output_tokens > 0 && durationMs > 0 ? usage.output_tokens / (durationMs / 1000) : null,
184
+ promptDurationMs: 0,
185
+ responseDurationMs: durationMs,
186
+ totalDurationMs: durationMs,
187
+ tokenSource: "provider"
188
+ }, "codex", model);
189
+ }
190
+ function estimateTelemetry(prompt, content, durationMs, model) {
191
+ const promptTokens = estimateTokens(prompt);
192
+ const responseTokens = estimateTokens(content);
193
+ return attachTokenCost({
194
+ promptTokens,
195
+ cachedPromptTokens: 0,
196
+ cacheWriteTokens: 0,
197
+ responseTokens,
198
+ totalTokens: promptTokens + responseTokens,
199
+ evalTokensPerSecond: responseTokens > 0 && durationMs > 0 ? responseTokens / (durationMs / 1000) : null,
200
+ promptDurationMs: 0,
201
+ responseDurationMs: durationMs,
202
+ totalDurationMs: durationMs,
203
+ tokenSource: "estimated"
204
+ }, "codex", model);
205
+ }
206
+ function readCodexAuth(codexAuthPath) {
207
+ if (!existsSync(codexAuthPath)) {
208
+ return null;
209
+ }
210
+ try {
211
+ const parsed = JSON.parse(readFileSync(codexAuthPath, "utf8"));
212
+ return isRecord(parsed) ? parsed : null;
213
+ }
214
+ catch {
215
+ return null;
216
+ }
217
+ }
218
+ function defaultCodexAuthPath() {
219
+ return path.join(homedir(), ".codex", "auth.json");
220
+ }
221
+ function isRecord(value) {
222
+ return typeof value === "object" && value !== null;
223
+ }
224
+ function parseJsonObject(value) {
225
+ try {
226
+ const parsed = JSON.parse(value);
227
+ return isRecord(parsed) ? parsed : null;
228
+ }
229
+ catch {
230
+ return null;
231
+ }
232
+ }
233
+ function readNonNegativeNumber(value) {
234
+ return typeof value === "number" && Number.isFinite(value) && value >= 0 ? value : null;
235
+ }
236
+ function clip(value, maxLength) {
237
+ if (value.length <= maxLength) {
238
+ return value;
239
+ }
240
+ return `${value.slice(0, maxLength)}...[clipped ${value.length - maxLength} chars]`;
241
+ }
242
+ //# sourceMappingURL=codex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/core/codex.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export type ComputeTargetKind = "local" | "remote";
2
+ export type ComputeTarget = {
3
+ kind: ComputeTargetKind;
4
+ url: string;
5
+ host: string;
6
+ label: string;
7
+ };
8
+ export declare function describeComputeTarget(value: string): ComputeTarget;
9
+ export declare function isLocalComputeTarget(value: string): boolean;