@agentex/agent 0.0.1 → 0.0.3

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 (198) hide show
  1. package/README.md +358 -78
  2. package/dist/index.d.ts +16 -1
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +10 -0
  5. package/dist/index.js.map +1 -1
  6. package/dist/providers/claude/execute.d.ts +1 -1
  7. package/dist/providers/claude/execute.d.ts.map +1 -1
  8. package/dist/providers/claude/execute.js +53 -20
  9. package/dist/providers/claude/execute.js.map +1 -1
  10. package/dist/providers/claude/index.d.ts +1 -1
  11. package/dist/providers/claude/index.d.ts.map +1 -1
  12. package/dist/providers/claude/index.js +40 -9
  13. package/dist/providers/claude/index.js.map +1 -1
  14. package/dist/providers/claude/parse.d.ts.map +1 -1
  15. package/dist/providers/claude/parse.js +2 -1
  16. package/dist/providers/claude/parse.js.map +1 -1
  17. package/dist/providers/claude/session.d.ts +10 -0
  18. package/dist/providers/claude/session.d.ts.map +1 -0
  19. package/dist/providers/claude/session.js +549 -0
  20. package/dist/providers/claude/session.js.map +1 -0
  21. package/dist/providers/claude/test.d.ts.map +1 -1
  22. package/dist/providers/claude/test.js +38 -11
  23. package/dist/providers/claude/test.js.map +1 -1
  24. package/dist/providers/codex/execute.d.ts +1 -1
  25. package/dist/providers/codex/execute.d.ts.map +1 -1
  26. package/dist/providers/codex/execute.js +114 -75
  27. package/dist/providers/codex/execute.js.map +1 -1
  28. package/dist/providers/codex/index.d.ts +1 -1
  29. package/dist/providers/codex/index.d.ts.map +1 -1
  30. package/dist/providers/codex/index.js +59 -3
  31. package/dist/providers/codex/index.js.map +1 -1
  32. package/dist/providers/codex/parse.d.ts.map +1 -1
  33. package/dist/providers/codex/parse.js +25 -3
  34. package/dist/providers/codex/parse.js.map +1 -1
  35. package/dist/providers/codex/session.d.ts +3 -0
  36. package/dist/providers/codex/session.d.ts.map +1 -0
  37. package/dist/providers/codex/session.js +553 -0
  38. package/dist/providers/codex/session.js.map +1 -0
  39. package/dist/providers/codex/test.d.ts.map +1 -1
  40. package/dist/providers/codex/test.js +28 -12
  41. package/dist/providers/codex/test.js.map +1 -1
  42. package/dist/providers/codex/usage-scanner.d.ts +18 -0
  43. package/dist/providers/codex/usage-scanner.d.ts.map +1 -0
  44. package/dist/providers/codex/usage-scanner.js +148 -0
  45. package/dist/providers/codex/usage-scanner.js.map +1 -0
  46. package/dist/providers/cursor/codec.d.ts +3 -0
  47. package/dist/providers/cursor/codec.d.ts.map +1 -0
  48. package/dist/providers/cursor/codec.js +43 -0
  49. package/dist/providers/cursor/codec.js.map +1 -0
  50. package/dist/providers/cursor/execute.d.ts +3 -0
  51. package/dist/providers/cursor/execute.d.ts.map +1 -0
  52. package/dist/providers/cursor/execute.js +248 -0
  53. package/dist/providers/cursor/execute.js.map +1 -0
  54. package/dist/providers/cursor/index.d.ts +3 -0
  55. package/dist/providers/cursor/index.d.ts.map +1 -0
  56. package/dist/providers/cursor/index.js +30 -0
  57. package/dist/providers/cursor/index.js.map +1 -0
  58. package/dist/providers/cursor/parse.d.ts +26 -0
  59. package/dist/providers/cursor/parse.d.ts.map +1 -0
  60. package/dist/providers/cursor/parse.js +224 -0
  61. package/dist/providers/cursor/parse.js.map +1 -0
  62. package/dist/providers/cursor/test.d.ts +3 -0
  63. package/dist/providers/cursor/test.d.ts.map +1 -0
  64. package/dist/providers/cursor/test.js +58 -0
  65. package/dist/providers/cursor/test.js.map +1 -0
  66. package/dist/providers/gemini/codec.d.ts +3 -0
  67. package/dist/providers/gemini/codec.d.ts.map +1 -0
  68. package/dist/providers/gemini/codec.js +47 -0
  69. package/dist/providers/gemini/codec.js.map +1 -0
  70. package/dist/providers/gemini/execute.d.ts +3 -0
  71. package/dist/providers/gemini/execute.d.ts.map +1 -0
  72. package/dist/providers/gemini/execute.js +236 -0
  73. package/dist/providers/gemini/execute.js.map +1 -0
  74. package/dist/providers/gemini/index.d.ts +3 -0
  75. package/dist/providers/gemini/index.d.ts.map +1 -0
  76. package/dist/providers/gemini/index.js +64 -0
  77. package/dist/providers/gemini/index.js.map +1 -0
  78. package/dist/providers/gemini/parse.d.ts +20 -0
  79. package/dist/providers/gemini/parse.d.ts.map +1 -0
  80. package/dist/providers/gemini/parse.js +207 -0
  81. package/dist/providers/gemini/parse.js.map +1 -0
  82. package/dist/providers/gemini/test.d.ts +3 -0
  83. package/dist/providers/gemini/test.d.ts.map +1 -0
  84. package/dist/providers/gemini/test.js +67 -0
  85. package/dist/providers/gemini/test.js.map +1 -0
  86. package/dist/providers/openclaw/execute.d.ts +1 -1
  87. package/dist/providers/openclaw/execute.d.ts.map +1 -1
  88. package/dist/providers/openclaw/execute.js +11 -6
  89. package/dist/providers/openclaw/execute.js.map +1 -1
  90. package/dist/providers/openclaw/index.d.ts +1 -1
  91. package/dist/providers/openclaw/index.d.ts.map +1 -1
  92. package/dist/providers/openclaw/index.js +13 -3
  93. package/dist/providers/openclaw/index.js.map +1 -1
  94. package/dist/providers/openclaw/test.d.ts.map +1 -1
  95. package/dist/providers/openclaw/test.js +4 -0
  96. package/dist/providers/openclaw/test.js.map +1 -1
  97. package/dist/providers/opencode/codec.d.ts +3 -0
  98. package/dist/providers/opencode/codec.d.ts.map +1 -0
  99. package/dist/providers/opencode/codec.js +47 -0
  100. package/dist/providers/opencode/codec.js.map +1 -0
  101. package/dist/providers/opencode/execute.d.ts +3 -0
  102. package/dist/providers/opencode/execute.d.ts.map +1 -0
  103. package/dist/providers/opencode/execute.js +225 -0
  104. package/dist/providers/opencode/execute.js.map +1 -0
  105. package/dist/providers/opencode/index.d.ts +3 -0
  106. package/dist/providers/opencode/index.d.ts.map +1 -0
  107. package/dist/providers/opencode/index.js +64 -0
  108. package/dist/providers/opencode/index.js.map +1 -0
  109. package/dist/providers/opencode/parse.d.ts +19 -0
  110. package/dist/providers/opencode/parse.d.ts.map +1 -0
  111. package/dist/providers/opencode/parse.js +145 -0
  112. package/dist/providers/opencode/parse.js.map +1 -0
  113. package/dist/providers/opencode/test.d.ts +3 -0
  114. package/dist/providers/opencode/test.d.ts.map +1 -0
  115. package/dist/providers/opencode/test.js +60 -0
  116. package/dist/providers/opencode/test.js.map +1 -0
  117. package/dist/providers/pi/codec.d.ts +7 -0
  118. package/dist/providers/pi/codec.d.ts.map +1 -0
  119. package/dist/providers/pi/codec.js +45 -0
  120. package/dist/providers/pi/codec.js.map +1 -0
  121. package/dist/providers/pi/execute.d.ts +3 -0
  122. package/dist/providers/pi/execute.d.ts.map +1 -0
  123. package/dist/providers/pi/execute.js +300 -0
  124. package/dist/providers/pi/execute.js.map +1 -0
  125. package/dist/providers/pi/index.d.ts +3 -0
  126. package/dist/providers/pi/index.d.ts.map +1 -0
  127. package/dist/providers/pi/index.js +66 -0
  128. package/dist/providers/pi/index.js.map +1 -0
  129. package/dist/providers/pi/parse.d.ts +18 -0
  130. package/dist/providers/pi/parse.d.ts.map +1 -0
  131. package/dist/providers/pi/parse.js +182 -0
  132. package/dist/providers/pi/parse.js.map +1 -0
  133. package/dist/providers/pi/test.d.ts +3 -0
  134. package/dist/providers/pi/test.d.ts.map +1 -0
  135. package/dist/providers/pi/test.js +60 -0
  136. package/dist/providers/pi/test.js.map +1 -0
  137. package/dist/providers/process/execute.d.ts +1 -1
  138. package/dist/providers/process/execute.d.ts.map +1 -1
  139. package/dist/providers/process/execute.js +46 -8
  140. package/dist/providers/process/execute.js.map +1 -1
  141. package/dist/providers/process/index.d.ts +1 -1
  142. package/dist/providers/process/index.d.ts.map +1 -1
  143. package/dist/providers/process/index.js +18 -4
  144. package/dist/providers/process/index.js.map +1 -1
  145. package/dist/registry.d.ts.map +1 -1
  146. package/dist/registry.js +16 -8
  147. package/dist/registry.js.map +1 -1
  148. package/dist/types.d.ts +325 -8
  149. package/dist/types.d.ts.map +1 -1
  150. package/dist/types.js +23 -1
  151. package/dist/types.js.map +1 -1
  152. package/dist/utils/ask-user-question.d.ts +50 -0
  153. package/dist/utils/ask-user-question.d.ts.map +1 -0
  154. package/dist/utils/ask-user-question.js +32 -0
  155. package/dist/utils/ask-user-question.js.map +1 -0
  156. package/dist/utils/auth.d.ts +29 -0
  157. package/dist/utils/auth.d.ts.map +1 -0
  158. package/dist/utils/auth.js +243 -0
  159. package/dist/utils/auth.js.map +1 -0
  160. package/dist/utils/binary.d.ts.map +1 -1
  161. package/dist/utils/binary.js +29 -6
  162. package/dist/utils/binary.js.map +1 -1
  163. package/dist/utils/env.d.ts.map +1 -1
  164. package/dist/utils/env.js +18 -0
  165. package/dist/utils/env.js.map +1 -1
  166. package/dist/utils/execute-all.d.ts +20 -0
  167. package/dist/utils/execute-all.d.ts.map +1 -0
  168. package/dist/utils/execute-all.js +46 -0
  169. package/dist/utils/execute-all.js.map +1 -0
  170. package/dist/utils/instructions.d.ts +7 -0
  171. package/dist/utils/instructions.d.ts.map +1 -0
  172. package/dist/utils/instructions.js +21 -0
  173. package/dist/utils/instructions.js.map +1 -0
  174. package/dist/utils/model-cache.d.ts +11 -0
  175. package/dist/utils/model-cache.d.ts.map +1 -0
  176. package/dist/utils/model-cache.js +17 -0
  177. package/dist/utils/model-cache.js.map +1 -0
  178. package/dist/utils/process.d.ts +4 -0
  179. package/dist/utils/process.d.ts.map +1 -1
  180. package/dist/utils/process.js +46 -5
  181. package/dist/utils/process.js.map +1 -1
  182. package/dist/utils/runtime-config.d.ts +34 -0
  183. package/dist/utils/runtime-config.d.ts.map +1 -0
  184. package/dist/utils/runtime-config.js +71 -0
  185. package/dist/utils/runtime-config.js.map +1 -0
  186. package/dist/utils/runtime-homes.d.ts +13 -0
  187. package/dist/utils/runtime-homes.d.ts.map +1 -0
  188. package/dist/utils/runtime-homes.js +41 -0
  189. package/dist/utils/runtime-homes.js.map +1 -0
  190. package/dist/utils/skills.d.ts +152 -1
  191. package/dist/utils/skills.d.ts.map +1 -1
  192. package/dist/utils/skills.js +352 -0
  193. package/dist/utils/skills.js.map +1 -1
  194. package/dist/utils/workspace.d.ts +55 -0
  195. package/dist/utils/workspace.d.ts.map +1 -0
  196. package/dist/utils/workspace.js +89 -0
  197. package/dist/utils/workspace.js.map +1 -0
  198. package/package.json +5 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/providers/codex/session.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,YAAY,EACZ,cAAc,EAGf,MAAM,gBAAgB,CAAC;AAqFxB,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,YAAY,CAAC,CAmDnF"}
@@ -0,0 +1,553 @@
1
+ import { spawn } from "node:child_process";
2
+ import { findBinary } from "../../utils/binary.js";
3
+ import { buildEnv, ensurePathInEnv } from "../../utils/env.js";
4
+ import { injectWorkspaceSkills } from "../../utils/skills.js";
5
+ import { resolveInstructions } from "../../utils/instructions.js";
6
+ import { parseCodexStreamLine } from "./parse.js";
7
+ import { scanCodexSessionUsage } from "./usage-scanner.js";
8
+ // ---------------------------------------------------------------------------
9
+ // JSON-RPC 2.0 helpers
10
+ // ---------------------------------------------------------------------------
11
+ function parseJson(line) {
12
+ try {
13
+ const parsed = JSON.parse(line);
14
+ if (typeof parsed === "object" && parsed !== null && !Array.isArray(parsed)) {
15
+ return parsed;
16
+ }
17
+ }
18
+ catch { /* skip */ }
19
+ return null;
20
+ }
21
+ function str(obj, key) {
22
+ const v = obj[key];
23
+ return typeof v === "string" ? v : "";
24
+ }
25
+ function num(obj, key) {
26
+ const v = obj[key];
27
+ return typeof v === "number" && Number.isFinite(v) ? v : 0;
28
+ }
29
+ function asObj(parent, key) {
30
+ const v = parent[key];
31
+ return typeof v === "object" && v !== null && !Array.isArray(v)
32
+ ? v
33
+ : {};
34
+ }
35
+ function classifyMessage(msg) {
36
+ const isRpc = msg["jsonrpc"] === "2.0";
37
+ if (isRpc) {
38
+ const hasId = "id" in msg && (typeof msg["id"] === "number" || typeof msg["id"] === "string");
39
+ const hasMethod = "method" in msg && typeof msg["method"] === "string";
40
+ const id = typeof msg["id"] === "number" ? msg["id"] : parseInt(String(msg["id"]), 10);
41
+ if (hasId && hasMethod) {
42
+ return { kind: "request", id, method: msg["method"], params: asObj(msg, "params") };
43
+ }
44
+ if (hasId && !hasMethod) {
45
+ const errRaw = msg["error"];
46
+ const error = typeof errRaw === "object" && errRaw !== null
47
+ ? { code: num(errRaw, "code"), message: str(errRaw, "message") }
48
+ : undefined;
49
+ const result = typeof msg["result"] === "object" && msg["result"] !== null
50
+ ? msg["result"]
51
+ : undefined;
52
+ return { kind: "response", id, result, error };
53
+ }
54
+ if (hasMethod) {
55
+ return { kind: "notification", method: msg["method"], params: asObj(msg, "params") };
56
+ }
57
+ return null;
58
+ }
59
+ // Legacy NDJSON events (from `codex exec --json` format) — have a `type` field
60
+ if (typeof msg["type"] === "string") {
61
+ return { kind: "legacy_event", event: msg };
62
+ }
63
+ return null;
64
+ }
65
+ // ---------------------------------------------------------------------------
66
+ // createCodexSession
67
+ // ---------------------------------------------------------------------------
68
+ export async function createCodexSession(ctx) {
69
+ const cwd = ctx.cwd ?? process.cwd();
70
+ const config = ctx.config ?? {};
71
+ // Resolve binary
72
+ const resolved = await findBinary("codex", config.command);
73
+ // Build env
74
+ const env = buildEnv(ctx.env);
75
+ ensurePathInEnv(env);
76
+ // Inject skills
77
+ if (config.skillDirs && config.skillDirs.length > 0) {
78
+ try {
79
+ await injectWorkspaceSkills(config.skillDirs, cwd);
80
+ }
81
+ catch { /* non-fatal */ }
82
+ }
83
+ // Resolve instructions
84
+ const instructions = await resolveInstructions(config.instructionsFile);
85
+ // Spawn Codex in interactive JSON-RPC mode
86
+ const args = [...resolved.prefixArgs, "--json"];
87
+ if (config.skipPermissions)
88
+ args.push("--dangerously-bypass-approvals-and-sandbox");
89
+ if (config.extraArgs)
90
+ args.push(...config.extraArgs);
91
+ const proc = spawn(resolved.bin, args, {
92
+ cwd,
93
+ env,
94
+ stdio: ["pipe", "pipe", "pipe"],
95
+ });
96
+ if (!proc.stdin || !proc.stdout || !proc.stderr) {
97
+ throw new Error("Failed to open stdio on Codex process");
98
+ }
99
+ const session = new CodexSessionImpl(proc, ctx, cwd, config.model ?? null, instructions);
100
+ // Perform JSON-RPC initialize handshake + thread/start
101
+ await session.handshake();
102
+ // Wire up AbortSignal
103
+ if (ctx.signal) {
104
+ if (ctx.signal.aborted) {
105
+ void session.close();
106
+ }
107
+ else {
108
+ ctx.signal.addEventListener("abort", () => void session.close(), { once: true });
109
+ }
110
+ }
111
+ return session;
112
+ }
113
+ // ---------------------------------------------------------------------------
114
+ // Implementation
115
+ // ---------------------------------------------------------------------------
116
+ class CodexSessionImpl {
117
+ proc;
118
+ ctx;
119
+ cwd;
120
+ model;
121
+ instructions;
122
+ _state = "idle";
123
+ _threadId = null;
124
+ _lineBuffer = "";
125
+ _nextId = 1;
126
+ // Pending outgoing RPC responses (keyed by request id)
127
+ _pendingRpc = new Map();
128
+ // Active turn state
129
+ _turnResolve = null;
130
+ _turnReject = null;
131
+ _turnSummary = null;
132
+ _turnUsage = null;
133
+ _turnModel = null;
134
+ _turnIsError = false;
135
+ _turnErrorMessage = null;
136
+ _turnStartedAt = null;
137
+ constructor(proc, ctx, cwd, model, instructions) {
138
+ this.proc = proc;
139
+ this.ctx = ctx;
140
+ this.cwd = cwd;
141
+ this.model = model;
142
+ this.instructions = instructions;
143
+ proc.stdout.setEncoding("utf-8");
144
+ proc.stdout.on("data", (chunk) => this.handleStdout(chunk));
145
+ proc.stderr.setEncoding("utf-8");
146
+ proc.stderr.on("data", (chunk) => {
147
+ if (this.ctx.onOutput) {
148
+ try {
149
+ void this.ctx.onOutput("stderr", chunk);
150
+ }
151
+ catch { /* swallow */ }
152
+ }
153
+ });
154
+ proc.on("exit", (code, signal) => {
155
+ if (this._state !== "closed") {
156
+ this._state = "closed";
157
+ const err = new Error(`Codex process exited unexpectedly (code=${code}, signal=${signal})`);
158
+ for (const [, pending] of this._pendingRpc)
159
+ pending.reject(err);
160
+ this._pendingRpc.clear();
161
+ if (this._turnReject) {
162
+ this._turnReject(err);
163
+ this._turnResolve = null;
164
+ this._turnReject = null;
165
+ }
166
+ }
167
+ });
168
+ proc.on("error", (err) => {
169
+ if (this._state !== "closed") {
170
+ this._state = "closed";
171
+ for (const [, pending] of this._pendingRpc)
172
+ pending.reject(err);
173
+ this._pendingRpc.clear();
174
+ if (this._turnReject) {
175
+ this._turnReject(err);
176
+ this._turnResolve = null;
177
+ this._turnReject = null;
178
+ }
179
+ }
180
+ });
181
+ }
182
+ get sessionId() { return this._threadId; }
183
+ get state() { return this._state; }
184
+ // -------------------------------------------------------------------------
185
+ // JSON-RPC send helpers
186
+ // -------------------------------------------------------------------------
187
+ rpcRequest(method, params) {
188
+ const id = this._nextId++;
189
+ const msg = { jsonrpc: "2.0", id, method };
190
+ if (params)
191
+ msg["params"] = params;
192
+ this.proc.stdin.write(JSON.stringify(msg) + "\n");
193
+ return new Promise((resolve, reject) => {
194
+ this._pendingRpc.set(id, { resolve, reject });
195
+ });
196
+ }
197
+ rpcResponse(id, result) {
198
+ this.proc.stdin.write(JSON.stringify({ jsonrpc: "2.0", id, result }) + "\n");
199
+ }
200
+ // -------------------------------------------------------------------------
201
+ // Handshake
202
+ // -------------------------------------------------------------------------
203
+ async handshake() {
204
+ // 1. initialize
205
+ await this.rpcRequest("initialize", {
206
+ clientInfo: { name: "agentex", version: "1.0.0" },
207
+ capabilities: {},
208
+ });
209
+ // 2. thread/start
210
+ const threadParams = { cwd: this.cwd };
211
+ if (this.model)
212
+ threadParams["model"] = this.model;
213
+ if (this.instructions)
214
+ threadParams["developerInstructions"] = this.instructions;
215
+ const res = await this.rpcRequest("thread/start", threadParams);
216
+ this._threadId = str(res, "threadId") || str(res, "thread_id") || null;
217
+ }
218
+ // -------------------------------------------------------------------------
219
+ // Public API
220
+ // -------------------------------------------------------------------------
221
+ async send(message) {
222
+ if (this._state === "closed")
223
+ throw new Error("Session is closed");
224
+ if (this._state !== "idle")
225
+ throw new Error("A turn is already in progress");
226
+ this._state = "thinking";
227
+ this._turnSummary = null;
228
+ this._turnUsage = null;
229
+ this._turnModel = null;
230
+ this._turnIsError = false;
231
+ this._turnErrorMessage = null;
232
+ this._turnStartedAt = new Date();
233
+ // Start a turn — the completion comes via notifications, not the RPC response
234
+ const turnParams = { input: message };
235
+ if (this._threadId)
236
+ turnParams["threadId"] = this._threadId;
237
+ this.rpcRequest("turn/start", turnParams).catch(() => {
238
+ // Turn-level errors arrive via turn.failed notifications
239
+ });
240
+ return new Promise((resolve, reject) => {
241
+ this._turnResolve = resolve;
242
+ this._turnReject = reject;
243
+ });
244
+ }
245
+ async interrupt() {
246
+ if (this._state === "idle" || this._state === "closed")
247
+ return;
248
+ try {
249
+ await this.rpcRequest("turn/cancel", {});
250
+ }
251
+ catch { /* best effort */ }
252
+ }
253
+ async close() {
254
+ if (this._state === "closed")
255
+ return;
256
+ this._state = "closed";
257
+ this.proc.stdin.end();
258
+ await new Promise((resolve) => {
259
+ const timeout = setTimeout(() => {
260
+ this.proc.kill("SIGKILL");
261
+ resolve();
262
+ }, 5000);
263
+ this.proc.on("exit", () => {
264
+ clearTimeout(timeout);
265
+ resolve();
266
+ });
267
+ this.proc.kill("SIGTERM");
268
+ });
269
+ }
270
+ // -------------------------------------------------------------------------
271
+ // Stdout parsing
272
+ // -------------------------------------------------------------------------
273
+ handleStdout(chunk) {
274
+ if (this.ctx.onOutput) {
275
+ try {
276
+ void this.ctx.onOutput("stdout", chunk);
277
+ }
278
+ catch { /* swallow */ }
279
+ }
280
+ this._lineBuffer += chunk;
281
+ const lines = this._lineBuffer.split("\n");
282
+ this._lineBuffer = lines.pop() ?? "";
283
+ for (const line of lines) {
284
+ const trimmed = line.trim();
285
+ if (!trimmed)
286
+ continue;
287
+ this.handleLine(trimmed);
288
+ }
289
+ }
290
+ handleLine(line) {
291
+ const raw = parseJson(line);
292
+ if (!raw)
293
+ return;
294
+ const msg = classifyMessage(raw);
295
+ if (!msg)
296
+ return;
297
+ switch (msg.kind) {
298
+ case "response":
299
+ this.handleRpcResponse(msg);
300
+ break;
301
+ case "request":
302
+ this.handleServerRequest(msg.id, msg.method, msg.params);
303
+ break;
304
+ case "notification":
305
+ this.handleNotification(msg.method, msg.params, line);
306
+ break;
307
+ case "legacy_event":
308
+ this.handleLegacyEvent(msg.event, line);
309
+ break;
310
+ }
311
+ }
312
+ // -------------------------------------------------------------------------
313
+ // RPC response dispatch
314
+ // -------------------------------------------------------------------------
315
+ handleRpcResponse(msg) {
316
+ const pending = this._pendingRpc.get(msg.id);
317
+ if (!pending)
318
+ return;
319
+ this._pendingRpc.delete(msg.id);
320
+ if (msg.error) {
321
+ pending.reject(new Error(`JSON-RPC error ${msg.error.code}: ${msg.error.message}`));
322
+ }
323
+ else {
324
+ pending.resolve(msg.result ?? {});
325
+ }
326
+ }
327
+ // -------------------------------------------------------------------------
328
+ // Server→client requests (tool approval)
329
+ // -------------------------------------------------------------------------
330
+ handleServerRequest(id, method, params) {
331
+ if (method === "item/commandExecution/requestApproval" ||
332
+ method === "item/fileChange/requestApproval") {
333
+ void this.handleApproval(id, method, params);
334
+ }
335
+ else {
336
+ // Unknown server request — ack to unblock
337
+ this.rpcResponse(id, {});
338
+ }
339
+ }
340
+ async handleApproval(id, method, params) {
341
+ this._state = "waiting_for_approval";
342
+ if (!this.ctx.onUserInputRequest) {
343
+ this.rpcResponse(id, { approved: true });
344
+ if (this._state === "waiting_for_approval")
345
+ this._state = "thinking";
346
+ return;
347
+ }
348
+ const toolName = method === "item/commandExecution/requestApproval"
349
+ ? "command_execution"
350
+ : "file_change";
351
+ try {
352
+ const resp = await this.ctx.onUserInputRequest({
353
+ toolName,
354
+ input: params,
355
+ toolUseId: str(params, "id"),
356
+ description: str(params, "command") || str(params, "path") || undefined,
357
+ });
358
+ this.rpcResponse(id, { approved: resp.allow });
359
+ }
360
+ catch {
361
+ this.rpcResponse(id, { approved: false });
362
+ }
363
+ if (this._state === "waiting_for_approval")
364
+ this._state = "thinking";
365
+ }
366
+ // -------------------------------------------------------------------------
367
+ // Notification handling (v2 format)
368
+ // -------------------------------------------------------------------------
369
+ handleNotification(method, params, rawLine) {
370
+ // codex/event — legacy wrapper
371
+ if (method === "codex/event") {
372
+ const innerMsg = str(params, "msg");
373
+ if (innerMsg) {
374
+ // Try to parse inner message
375
+ const inner = parseJson(innerMsg);
376
+ if (inner)
377
+ this.handleLegacyEvent(inner, innerMsg);
378
+ }
379
+ return;
380
+ }
381
+ // Map v2 notification methods to processing
382
+ if (method === "thread/started") {
383
+ this._threadId = str(params, "threadId") || str(params, "thread_id") || this._threadId;
384
+ this.emitStreamEvent(rawLine);
385
+ return;
386
+ }
387
+ if (method === "item/started") {
388
+ this._state = "tool_executing";
389
+ this.emitStreamEvent(rawLine);
390
+ return;
391
+ }
392
+ if (method === "item/completed") {
393
+ this._state = "thinking";
394
+ this.extractSummaryFromItem(params);
395
+ this.emitStreamEvent(rawLine);
396
+ return;
397
+ }
398
+ if (method === "turn/completed") {
399
+ this.handleTurnCompleted(params);
400
+ return;
401
+ }
402
+ if (method === "turn/failed") {
403
+ this._turnIsError = true;
404
+ this._turnErrorMessage = str(params, "message") || str(params, "error") || "Turn failed";
405
+ this.resolveTurn();
406
+ this.emitStreamEvent(rawLine);
407
+ return;
408
+ }
409
+ // Forward unrecognized notifications
410
+ this.emitStreamEvent(rawLine);
411
+ }
412
+ // -------------------------------------------------------------------------
413
+ // Legacy event handling (NDJSON events with `type` field)
414
+ // -------------------------------------------------------------------------
415
+ handleLegacyEvent(event, rawLine) {
416
+ const type = str(event, "type");
417
+ if (type === "thread.started") {
418
+ this._threadId = str(event, "thread_id") || this._threadId;
419
+ this.emitStreamEvent(rawLine);
420
+ return;
421
+ }
422
+ if (type === "item.started") {
423
+ this._state = "tool_executing";
424
+ this.emitStreamEvent(rawLine);
425
+ return;
426
+ }
427
+ if (type === "item.completed") {
428
+ this._state = "thinking";
429
+ this.extractSummaryFromItem(event);
430
+ this.emitStreamEvent(rawLine);
431
+ return;
432
+ }
433
+ if (type === "turn.completed") {
434
+ this.handleTurnCompleted(event);
435
+ return;
436
+ }
437
+ if (type === "turn.failed" || type === "error") {
438
+ this._turnIsError = true;
439
+ this._turnErrorMessage = str(event, "message") || str(event, "error") || "Turn failed";
440
+ this.resolveTurn();
441
+ this.emitStreamEvent(rawLine);
442
+ return;
443
+ }
444
+ this.emitStreamEvent(rawLine);
445
+ }
446
+ // -------------------------------------------------------------------------
447
+ // Shared helpers
448
+ // -------------------------------------------------------------------------
449
+ extractSummaryFromItem(params) {
450
+ const item = typeof params["item"] === "object" && params["item"] !== null
451
+ ? params["item"]
452
+ : params;
453
+ if (str(item, "type") !== "agent_message")
454
+ return;
455
+ // Direct text (Codex 0.30+)
456
+ const directText = str(item, "text");
457
+ if (directText) {
458
+ this._turnSummary = directText;
459
+ return;
460
+ }
461
+ // Fallback: content array
462
+ const content = Array.isArray(item["content"]) ? item["content"] : [];
463
+ for (const entry of content) {
464
+ if (typeof entry !== "object" || entry === null || Array.isArray(entry))
465
+ continue;
466
+ const block = entry;
467
+ if (str(block, "type") === "output_text") {
468
+ const text = str(block, "text");
469
+ if (text)
470
+ this._turnSummary = text;
471
+ }
472
+ }
473
+ }
474
+ handleTurnCompleted(params) {
475
+ const usage = typeof params["usage"] === "object" && params["usage"] !== null
476
+ ? params["usage"]
477
+ : null;
478
+ if (usage) {
479
+ const inputTokens = num(usage, "input_tokens");
480
+ const outputTokens = num(usage, "output_tokens");
481
+ if (inputTokens > 0 || outputTokens > 0) {
482
+ this._turnUsage = { inputTokens, outputTokens };
483
+ }
484
+ }
485
+ const model = str(params, "model");
486
+ if (model)
487
+ this._turnModel = model;
488
+ this.resolveTurn();
489
+ // Also emit as stream event for the raw line
490
+ if (this.ctx.onEvent) {
491
+ try {
492
+ void this.ctx.onEvent({
493
+ type: "result",
494
+ text: this._turnSummary ?? "",
495
+ cost: null,
496
+ isError: this._turnIsError,
497
+ timestamp: new Date().toISOString(),
498
+ });
499
+ }
500
+ catch { /* swallow */ }
501
+ }
502
+ }
503
+ resolveTurn() {
504
+ const resolvedModel = this._turnModel ?? this.model;
505
+ let usage = this._turnUsage && resolvedModel
506
+ ? { [resolvedModel]: { inputTokens: this._turnUsage.inputTokens, outputTokens: this._turnUsage.outputTokens } }
507
+ : undefined;
508
+ // If no usage from the stream, try scanning session logs
509
+ if (!usage && this._turnStartedAt) {
510
+ const startedAt = this._turnStartedAt;
511
+ const threadId = this._threadId ?? undefined;
512
+ // Fire-and-forget: scan logs then deliver result
513
+ void scanCodexSessionUsage({ startedAfter: startedAt, threadId }).then((scanned) => {
514
+ usage = scanned;
515
+ }).catch(() => {
516
+ // Non-fatal — usage stays undefined
517
+ }).finally(() => {
518
+ this.deliverTurnResult(usage);
519
+ });
520
+ return;
521
+ }
522
+ this.deliverTurnResult(usage);
523
+ }
524
+ deliverTurnResult(usage) {
525
+ const result = {
526
+ summary: this._turnSummary,
527
+ usage,
528
+ costUsd: null,
529
+ status: this._turnIsError ? "failed" : "completed",
530
+ errorCode: this._turnIsError ? "execution_error" : null,
531
+ errorMessage: this._turnErrorMessage,
532
+ };
533
+ this._state = "idle";
534
+ if (this._turnResolve) {
535
+ const resolve = this._turnResolve;
536
+ this._turnResolve = null;
537
+ this._turnReject = null;
538
+ resolve(result);
539
+ }
540
+ }
541
+ emitStreamEvent(rawLine) {
542
+ if (!this.ctx.onEvent)
543
+ return;
544
+ const event = parseCodexStreamLine(rawLine);
545
+ if (event) {
546
+ try {
547
+ void this.ctx.onEvent(event);
548
+ }
549
+ catch { /* swallow */ }
550
+ }
551
+ }
552
+ }
553
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/providers/codex/session.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../../src/providers/codex/test.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,qBAAqB,EAAoB,MAAM,gBAAgB,CAAC;AAUtG,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,sBAAsB,GAC1B,OAAO,CAAC,qBAAqB,CAAC,CAkDhC"}
1
+ {"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../../src/providers/codex/test.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,qBAAqB,EAAoB,MAAM,gBAAgB,CAAC;AAUtG,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,sBAAsB,GAC1B,OAAO,CAAC,qBAAqB,CAAC,CA0EhC"}
@@ -1,5 +1,5 @@
1
1
  import { findBinary } from "../../utils/binary.js";
2
- import { buildEnv } from "../../utils/env.js";
2
+ import { resolveAuthForProvider } from "../../utils/auth.js";
3
3
  function summarizeStatus(checks) {
4
4
  if (checks.some((c) => c.level === "error"))
5
5
  return "fail";
@@ -11,7 +11,6 @@ export async function testCodexEnvironment(ctx) {
11
11
  const checks = [];
12
12
  const config = (ctx.config ?? {});
13
13
  const command = typeof config["command"] === "string" ? config["command"] : undefined;
14
- // Check binary resolvable
15
14
  try {
16
15
  await findBinary("codex", command);
17
16
  checks.push({
@@ -28,29 +27,46 @@ export async function testCodexEnvironment(ctx) {
28
27
  hint: "Install Codex: npm install -g @openai/codex",
29
28
  });
30
29
  }
31
- // Check OPENAI_API_KEY
32
- const env = buildEnv(typeof config["env"] === "object" && config["env"] !== null
30
+ const callerEnv = typeof config["env"] === "object" && config["env"] !== null
33
31
  ? config["env"]
34
- : undefined);
35
- const hasApiKey = typeof env["OPENAI_API_KEY"] === "string" && env["OPENAI_API_KEY"].trim().length > 0;
36
- if (hasApiKey) {
32
+ : undefined;
33
+ const auth = await resolveAuthForProvider("codex", { env: callerEnv });
34
+ const apiKey = auth.options.find((o) => o.method === "api_key" && o.source.kind === "env");
35
+ const subscription = auth.options.find((o) => o.method === "subscription");
36
+ if (apiKey?.present === true) {
37
37
  checks.push({
38
38
  code: "codex_openai_api_key_present",
39
39
  level: "info",
40
- message: "OPENAI_API_KEY is set.",
40
+ message: "OPENAI_API_KEY is set; Codex will use API-key billing.",
41
41
  });
42
42
  }
43
- else {
43
+ if (subscription?.present === true) {
44
44
  checks.push({
45
- code: "codex_openai_api_key_missing",
45
+ code: "codex_subscription_credentials_present",
46
+ level: "info",
47
+ message: "Codex login credentials detected on disk.",
48
+ });
49
+ }
50
+ if (apiKey?.present !== true && subscription?.present !== true) {
51
+ checks.push({
52
+ code: "codex_no_auth_detected",
53
+ level: "warn",
54
+ message: "No Codex authentication detected.",
55
+ hint: "Run `codex login` for subscription auth, or set OPENAI_API_KEY for API-key billing.",
56
+ });
57
+ }
58
+ if (apiKey?.present === true && subscription?.present === true) {
59
+ checks.push({
60
+ code: "codex_api_key_overrides_subscription",
46
61
  level: "warn",
47
- message: "OPENAI_API_KEY is not set. Codex may require it for API auth.",
48
- hint: "Set OPENAI_API_KEY environment variable.",
62
+ message: "Both OPENAI_API_KEY and subscription credentials are present. Codex will use the API key (metered billing).",
63
+ hint: "Unset OPENAI_API_KEY if you intended to use subscription-based auth.",
49
64
  });
50
65
  }
51
66
  return {
52
67
  providerType: ctx.providerType,
53
68
  status: summarizeStatus(checks),
69
+ auth,
54
70
  checks,
55
71
  testedAt: new Date().toISOString(),
56
72
  };