@warlock.js/ai-cli 0.0.0-stage → 5.32.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 (139) hide show
  1. package/CHANGELOG.md +37 -0
  2. package/LICENSE +21 -0
  3. package/README.md +69 -2
  4. package/cjs/index.cjs +4568 -0
  5. package/cjs/index.cjs.map +1 -0
  6. package/esm/adapters/aider.d.mts +41 -0
  7. package/esm/adapters/aider.d.mts.map +1 -0
  8. package/esm/adapters/aider.mjs +294 -0
  9. package/esm/adapters/aider.mjs.map +1 -0
  10. package/esm/adapters/amp.d.mts +33 -0
  11. package/esm/adapters/amp.d.mts.map +1 -0
  12. package/esm/adapters/amp.mjs +119 -0
  13. package/esm/adapters/amp.mjs.map +1 -0
  14. package/esm/adapters/antigravity.d.mts +37 -0
  15. package/esm/adapters/antigravity.d.mts.map +1 -0
  16. package/esm/adapters/antigravity.mjs +235 -0
  17. package/esm/adapters/antigravity.mjs.map +1 -0
  18. package/esm/adapters/claude-code.d.mts +30 -0
  19. package/esm/adapters/claude-code.d.mts.map +1 -0
  20. package/esm/adapters/claude-code.mjs +121 -0
  21. package/esm/adapters/claude-code.mjs.map +1 -0
  22. package/esm/adapters/claude-stream.d.mts +32 -0
  23. package/esm/adapters/claude-stream.d.mts.map +1 -0
  24. package/esm/adapters/claude-stream.mjs +140 -0
  25. package/esm/adapters/claude-stream.mjs.map +1 -0
  26. package/esm/adapters/codex.d.mts +37 -0
  27. package/esm/adapters/codex.d.mts.map +1 -0
  28. package/esm/adapters/codex.mjs +322 -0
  29. package/esm/adapters/codex.mjs.map +1 -0
  30. package/esm/adapters/copilot.d.mts +35 -0
  31. package/esm/adapters/copilot.d.mts.map +1 -0
  32. package/esm/adapters/copilot.mjs +242 -0
  33. package/esm/adapters/copilot.mjs.map +1 -0
  34. package/esm/adapters/cursor.d.mts +35 -0
  35. package/esm/adapters/cursor.d.mts.map +1 -0
  36. package/esm/adapters/cursor.mjs +203 -0
  37. package/esm/adapters/cursor.mjs.map +1 -0
  38. package/esm/adapters/droid.d.mts +32 -0
  39. package/esm/adapters/droid.d.mts.map +1 -0
  40. package/esm/adapters/droid.mjs +183 -0
  41. package/esm/adapters/droid.mjs.map +1 -0
  42. package/esm/adapters/grok.d.mts +32 -0
  43. package/esm/adapters/grok.d.mts.map +1 -0
  44. package/esm/adapters/grok.mjs +197 -0
  45. package/esm/adapters/grok.mjs.map +1 -0
  46. package/esm/adapters/index.d.mts +17 -0
  47. package/esm/adapters/index.mjs +18 -0
  48. package/esm/adapters/kimi.d.mts +34 -0
  49. package/esm/adapters/kimi.d.mts.map +1 -0
  50. package/esm/adapters/kimi.mjs +162 -0
  51. package/esm/adapters/kimi.mjs.map +1 -0
  52. package/esm/adapters/mistral-vibe.d.mts +32 -0
  53. package/esm/adapters/mistral-vibe.d.mts.map +1 -0
  54. package/esm/adapters/mistral-vibe.mjs +250 -0
  55. package/esm/adapters/mistral-vibe.mjs.map +1 -0
  56. package/esm/adapters/opencode.d.mts +36 -0
  57. package/esm/adapters/opencode.d.mts.map +1 -0
  58. package/esm/adapters/opencode.mjs +219 -0
  59. package/esm/adapters/opencode.mjs.map +1 -0
  60. package/esm/adapters/qwen-code.d.mts +30 -0
  61. package/esm/adapters/qwen-code.d.mts.map +1 -0
  62. package/esm/adapters/qwen-code.mjs +94 -0
  63. package/esm/adapters/qwen-code.mjs.map +1 -0
  64. package/esm/adapters/reasonix.d.mts +31 -0
  65. package/esm/adapters/reasonix.d.mts.map +1 -0
  66. package/esm/adapters/reasonix.mjs +248 -0
  67. package/esm/adapters/reasonix.mjs.map +1 -0
  68. package/esm/adapters/shared.d.mts +81 -0
  69. package/esm/adapters/shared.d.mts.map +1 -0
  70. package/esm/adapters/shared.mjs +161 -0
  71. package/esm/adapters/shared.mjs.map +1 -0
  72. package/esm/cli-agent.d.mts +41 -0
  73. package/esm/cli-agent.d.mts.map +1 -0
  74. package/esm/cli-agent.mjs +207 -0
  75. package/esm/cli-agent.mjs.map +1 -0
  76. package/esm/cli.d.mts +56 -0
  77. package/esm/cli.d.mts.map +1 -0
  78. package/esm/cli.mjs +61 -0
  79. package/esm/cli.mjs.map +1 -0
  80. package/esm/contracts/adapter.contract.d.mts +175 -0
  81. package/esm/contracts/adapter.contract.d.mts.map +1 -0
  82. package/esm/contracts/events.type.d.mts +123 -0
  83. package/esm/contracts/events.type.d.mts.map +1 -0
  84. package/esm/contracts/index.d.mts +5 -0
  85. package/esm/contracts/mcp.type.d.mts +28 -0
  86. package/esm/contracts/mcp.type.d.mts.map +1 -0
  87. package/esm/contracts/options.type.d.mts +112 -0
  88. package/esm/contracts/options.type.d.mts.map +1 -0
  89. package/esm/errors.d.mts +48 -0
  90. package/esm/errors.d.mts.map +1 -0
  91. package/esm/errors.mjs +32 -0
  92. package/esm/errors.mjs.map +1 -0
  93. package/esm/index.d.mts +33 -0
  94. package/esm/index.mjs +28 -0
  95. package/esm/model/cli-model.d.mts +49 -0
  96. package/esm/model/cli-model.d.mts.map +1 -0
  97. package/esm/model/cli-model.mjs +133 -0
  98. package/esm/model/cli-model.mjs.map +1 -0
  99. package/esm/probe/probe.d.mts +18 -0
  100. package/esm/probe/probe.d.mts.map +1 -0
  101. package/esm/probe/probe.mjs +148 -0
  102. package/esm/probe/probe.mjs.map +1 -0
  103. package/esm/session/aggregate.mjs +84 -0
  104. package/esm/session/aggregate.mjs.map +1 -0
  105. package/esm/session/environment.mjs +71 -0
  106. package/esm/session/environment.mjs.map +1 -0
  107. package/esm/session/run-directory.mjs +74 -0
  108. package/esm/session/run-directory.mjs.map +1 -0
  109. package/esm/session/session.mjs +188 -0
  110. package/esm/session/session.mjs.map +1 -0
  111. package/esm/spawn/invocation.d.mts +34 -0
  112. package/esm/spawn/invocation.d.mts.map +1 -0
  113. package/esm/spawn/invocation.mjs +76 -0
  114. package/esm/spawn/invocation.mjs.map +1 -0
  115. package/esm/spawn/process-tree.mjs +57 -0
  116. package/esm/spawn/process-tree.mjs.map +1 -0
  117. package/esm/spawn/resolve-command.d.mts +75 -0
  118. package/esm/spawn/resolve-command.d.mts.map +1 -0
  119. package/esm/spawn/resolve-command.mjs +109 -0
  120. package/esm/spawn/resolve-command.mjs.map +1 -0
  121. package/esm/stream/event-log.mjs +52 -0
  122. package/esm/stream/event-log.mjs.map +1 -0
  123. package/esm/stream/json-lines.d.mts +33 -0
  124. package/esm/stream/json-lines.d.mts.map +1 -0
  125. package/esm/stream/json-lines.mjs +65 -0
  126. package/esm/stream/json-lines.mjs.map +1 -0
  127. package/esm/stream/line-splitter.mjs +53 -0
  128. package/esm/stream/line-splitter.mjs.map +1 -0
  129. package/esm/utils/toml.d.mts +21 -0
  130. package/esm/utils/toml.d.mts.map +1 -0
  131. package/esm/utils/toml.mjs +53 -0
  132. package/esm/utils/toml.mjs.map +1 -0
  133. package/llms-full.txt +373 -0
  134. package/llms.txt +10 -0
  135. package/package.json +39 -4
  136. package/skills/README.md +13 -0
  137. package/skills/index.md +22 -0
  138. package/skills/run-cli-agents/SKILL.md +186 -0
  139. package/skills/write-a-cli-adapter/SKILL.md +173 -0
@@ -0,0 +1,37 @@
1
+ import { CliAdapter, CliStreamParser } from "../contracts/adapter.contract.mjs";
2
+ import "../contracts/index.mjs";
3
+ //#region ../../packages/ai-cli/src/adapters/codex.d.ts
4
+ /**
5
+ * OpenAI Codex CLI (`codex`, npm `@openai/codex`).
6
+ *
7
+ * Verified against the real `codex exec --help` / `codex exec resume
8
+ * --help` of 0.163.0, the source at tag `rust-v0.163.0` (`exec_events.rs`,
9
+ * the JSONL event processor, `cli.rs`) and the docs (non-interactive mode,
10
+ * config reference), 2026-10-17.
11
+ *
12
+ * - Headless: `codex exec --json --skip-git-repo-check <prompt>` (`-` reads
13
+ * the prompt from stdin); resume is `codex exec resume … <thread_id>
14
+ * <prompt>`.
15
+ * - Stream: `thread.started` (`thread_id`), `item.started`/`item.completed`
16
+ * with `item.type` `agent_message`, `reasoning`, `command_execution`,
17
+ * `file_change`, `mcp_tool_call`, `web_search`, `error`; `turn.completed`
18
+ * with the thread's cumulative `usage` (`input_tokens` includes
19
+ * `cached_input_tokens`); `turn.failed` and `error` on failure. No text
20
+ * deltas and no cost field.
21
+ * - Permissions: exec never asks (approval policy "never"); `standard` keeps
22
+ * Codex's default **read-only** sandbox — allow edits with
23
+ * `args: ["-c", "sandbox_mode=workspace-write"]`. Bypass is
24
+ * `--dangerously-bypass-approvals-and-sandbox`.
25
+ * - Effort: `-c model_reasoning_effort=<level>`.
26
+ * - MCP: no flag. With a private home the servers go into
27
+ * `$CODEX_HOME/config.toml` (0600). With a caller-owned or inherited home
28
+ * they are passed as `-c mcp_servers.<name>.…` overrides that carry only
29
+ * the command, args and URL; secret `env` values and headers travel in the
30
+ * process environment, named through `env_vars` / `env_http_headers`.
31
+ * - Home `CODEX_HOME`; auth `CODEX_API_KEY`.
32
+ */
33
+ export declare const codexAdapter: CliAdapter;
34
+ /** Parser for `codex exec --json`. */
35
+ export declare function createCodexParser(): CliStreamParser;
36
+ //#endregion
37
+ //# sourceMappingURL=codex.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.d.mts","names":[],"sources":["../../../../../../../../packages/ai-cli/src/adapters/codex.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBA+Ca,cAAc;;wBA0OX,qBAAqB"}
@@ -0,0 +1,322 @@
1
+ import { jsonLinesParser, numberField, outputText, recordField, stringField } from "../stream/json-lines.mjs";
2
+ import { toToml, tomlKey } from "../utils/toml.mjs";
3
+ import { argvPrompt, mapEffort, unsupportedOption, usageOf } from "./shared.mjs";
4
+ import path from "node:path";
5
+
6
+ //#region ../../packages/ai-cli/src/adapters/codex.ts
7
+ /**
8
+ * OpenAI Codex CLI (`codex`, npm `@openai/codex`).
9
+ *
10
+ * Verified against the real `codex exec --help` / `codex exec resume
11
+ * --help` of 0.163.0, the source at tag `rust-v0.163.0` (`exec_events.rs`,
12
+ * the JSONL event processor, `cli.rs`) and the docs (non-interactive mode,
13
+ * config reference), 2026-10-17.
14
+ *
15
+ * - Headless: `codex exec --json --skip-git-repo-check <prompt>` (`-` reads
16
+ * the prompt from stdin); resume is `codex exec resume … <thread_id>
17
+ * <prompt>`.
18
+ * - Stream: `thread.started` (`thread_id`), `item.started`/`item.completed`
19
+ * with `item.type` `agent_message`, `reasoning`, `command_execution`,
20
+ * `file_change`, `mcp_tool_call`, `web_search`, `error`; `turn.completed`
21
+ * with the thread's cumulative `usage` (`input_tokens` includes
22
+ * `cached_input_tokens`); `turn.failed` and `error` on failure. No text
23
+ * deltas and no cost field.
24
+ * - Permissions: exec never asks (approval policy "never"); `standard` keeps
25
+ * Codex's default **read-only** sandbox — allow edits with
26
+ * `args: ["-c", "sandbox_mode=workspace-write"]`. Bypass is
27
+ * `--dangerously-bypass-approvals-and-sandbox`.
28
+ * - Effort: `-c model_reasoning_effort=<level>`.
29
+ * - MCP: no flag. With a private home the servers go into
30
+ * `$CODEX_HOME/config.toml` (0600). With a caller-owned or inherited home
31
+ * they are passed as `-c mcp_servers.<name>.…` overrides that carry only
32
+ * the command, args and URL; secret `env` values and headers travel in the
33
+ * process environment, named through `env_vars` / `env_http_headers`.
34
+ * - Home `CODEX_HOME`; auth `CODEX_API_KEY`.
35
+ */
36
+ const codexAdapter = {
37
+ name: "codex",
38
+ title: "Codex CLI",
39
+ command: "codex",
40
+ apiKeyEnv: ["CODEX_API_KEY"],
41
+ homeEnv: ["CODEX_HOME"],
42
+ transports: ["argv", "stdin"],
43
+ effort: true,
44
+ mcp: true,
45
+ probe: {
46
+ help: [["exec", "--help"], [
47
+ "exec",
48
+ "resume",
49
+ "--help"
50
+ ]],
51
+ version: ["--version"]
52
+ },
53
+ verification: {
54
+ version: "0.163.0",
55
+ verifiedBy: "help",
56
+ sources: [
57
+ "https://developers.openai.com/codex/noninteractive",
58
+ "https://developers.openai.com/codex/config-reference",
59
+ "https://github.com/openai/codex/blob/rust-v0.163.0/codex-rs/exec/src/exec_events.rs"
60
+ ],
61
+ checkedAt: "2026-10-17"
62
+ },
63
+ plan(context) {
64
+ const args = ["exec"];
65
+ const requires = [
66
+ "exec",
67
+ "--json",
68
+ "--skip-git-repo-check"
69
+ ];
70
+ const files = [];
71
+ const env = {};
72
+ if (context.resume !== void 0) {
73
+ args.push("resume");
74
+ requires.push("resume");
75
+ }
76
+ args.push("--json", "--skip-git-repo-check", "-c", "check_for_update_on_startup=false");
77
+ if (context.model !== void 0) {
78
+ args.push("--model", context.model);
79
+ requires.push("--model");
80
+ }
81
+ if (context.effort !== void 0) {
82
+ const effort = mapEffort(context.effort, {
83
+ low: "low",
84
+ medium: "medium",
85
+ high: "high",
86
+ xhigh: "xhigh",
87
+ max: "max"
88
+ });
89
+ args.push("-c", `model_reasoning_effort=${effort}`);
90
+ requires.push("--config");
91
+ }
92
+ if (context.permission === "bypass") {
93
+ args.push("--dangerously-bypass-approvals-and-sandbox");
94
+ requires.push("--dangerously-bypass-approvals-and-sandbox");
95
+ }
96
+ if (context.mcp !== void 0) {
97
+ if (context.home !== void 0 && context.homeIsPrivate) files.push({
98
+ path: path.join(context.home, "config.toml"),
99
+ content: toToml({ mcp_servers: codexMcpTable(context.mcp) })
100
+ });
101
+ else {
102
+ args.push(...codexMcpOverrides(context.mcp, env));
103
+ requires.push("--config");
104
+ }
105
+ }
106
+ if (context.home !== void 0) env.CODEX_HOME = context.home;
107
+ const prompt = context.transport === "argv" ? argvPrompt(context.prompt) : "-";
108
+ return {
109
+ args,
110
+ tail: context.resume !== void 0 ? [context.resume, prompt] : [prompt],
111
+ stdin: context.transport === "stdin" ? context.prompt : void 0,
112
+ env,
113
+ files,
114
+ requires
115
+ };
116
+ },
117
+ parser: createCodexParser
118
+ };
119
+ /** `[mcp_servers.<name>]` tables for a private `config.toml`. */
120
+ function codexMcpTable(servers) {
121
+ const table = {};
122
+ for (const [name, server] of Object.entries(servers)) {
123
+ if (server.type === "sse") throw unsupportedOption(codexAdapter, `MCP server "${name}" uses SSE; Codex supports stdio and streamable HTTP.`);
124
+ table[name] = server.type === "stdio" ? {
125
+ command: server.command,
126
+ args: server.args ?? [],
127
+ env: server.env
128
+ } : {
129
+ url: server.url,
130
+ http_headers: server.headers
131
+ };
132
+ }
133
+ return table;
134
+ }
135
+ /** A TOML string for a `-c key=value` override. */
136
+ function tomlString(value) {
137
+ return JSON.stringify(value);
138
+ }
139
+ /**
140
+ * `-c` overrides that carry no secret: env values and header values are put
141
+ * in `env` (the Codex process environment) and only their names go to argv.
142
+ */
143
+ function codexMcpOverrides(servers, env) {
144
+ const overrides = [];
145
+ const claim = (name, value) => {
146
+ if (env[name] !== void 0 && env[name] !== value) throw unsupportedOption(codexAdapter, `two MCP servers set ${name} to different values; with a shared home they share one environment.`);
147
+ env[name] = value;
148
+ };
149
+ for (const [name, server] of Object.entries(servers)) {
150
+ const prefix = `mcp_servers.${tomlKey(name)}`;
151
+ if (server.type === "sse") throw unsupportedOption(codexAdapter, `MCP server "${name}" uses SSE; Codex supports stdio and streamable HTTP.`);
152
+ if (server.type === "stdio") {
153
+ overrides.push("-c", `${prefix}.command=${tomlString(server.command)}`);
154
+ overrides.push("-c", `${prefix}.args=[${(server.args ?? []).map(tomlString).join(",")}]`);
155
+ const names = Object.keys(server.env ?? {});
156
+ for (const [key, value] of Object.entries(server.env ?? {})) claim(key, value);
157
+ if (names.length > 0) overrides.push("-c", `${prefix}.env_vars=[${names.map(tomlString).join(",")}]`);
158
+ continue;
159
+ }
160
+ overrides.push("-c", `${prefix}.url=${tomlString(server.url)}`);
161
+ const headers = Object.entries(server.headers ?? {});
162
+ if (headers.length > 0) {
163
+ const mapping = headers.map(([header, value], index) => {
164
+ const variable = `WARLOCK_MCP_${name.replace(/\W/g, "_").toUpperCase()}_HEADER_${index}`;
165
+ claim(variable, value);
166
+ return `${tomlString(header)}=${tomlString(variable)}`;
167
+ });
168
+ overrides.push("-c", `${prefix}.env_http_headers={${mapping.join(",")}}`);
169
+ }
170
+ }
171
+ return overrides;
172
+ }
173
+ const TOOL_ITEMS = /* @__PURE__ */ new Set([
174
+ "command_execution",
175
+ "file_change",
176
+ "mcp_tool_call",
177
+ "web_search",
178
+ "collab_tool_call"
179
+ ]);
180
+ function toolCall(item) {
181
+ switch (stringField(item, "type")) {
182
+ case "command_execution": return {
183
+ name: "shell",
184
+ input: { command: item.command }
185
+ };
186
+ case "file_change": return {
187
+ name: "apply_patch",
188
+ input: { changes: item.changes }
189
+ };
190
+ case "mcp_tool_call": return {
191
+ name: `${stringField(item, "server") ?? "mcp"}.${stringField(item, "tool") ?? "tool"}`,
192
+ input: item.arguments
193
+ };
194
+ case "web_search": return {
195
+ name: "web_search",
196
+ input: { query: item.query }
197
+ };
198
+ default: return {
199
+ name: stringField(item, "type") ?? "tool",
200
+ input: item
201
+ };
202
+ }
203
+ }
204
+ function toolResult(item) {
205
+ const status = stringField(item, "status");
206
+ const failed = status === "failed" || status === "declined";
207
+ switch (stringField(item, "type")) {
208
+ case "command_execution": {
209
+ const exitCode = numberField(item, "exit_code");
210
+ return {
211
+ output: stringField(item, "aggregated_output") ?? "",
212
+ isError: failed || exitCode !== void 0 && exitCode !== 0
213
+ };
214
+ }
215
+ case "mcp_tool_call": {
216
+ const error = stringField(recordField(item, "error"), "message");
217
+ return error !== void 0 ? {
218
+ output: error,
219
+ isError: true
220
+ } : {
221
+ output: outputText(recordField(item, "result")?.content),
222
+ isError: failed
223
+ };
224
+ }
225
+ default: return {
226
+ output: outputText(item.changes ?? item.result ?? ""),
227
+ isError: failed
228
+ };
229
+ }
230
+ }
231
+ /** Parser for `codex exec --json`. */
232
+ function createCodexParser() {
233
+ const announced = /* @__PURE__ */ new Set();
234
+ return jsonLinesParser((record) => {
235
+ const type = stringField(record, "type");
236
+ const item = recordField(record, "item");
237
+ const itemType = stringField(item, "type");
238
+ const id = stringField(item, "id") ?? "";
239
+ if (type === "thread.started") return [{
240
+ type: "session.started",
241
+ sessionRef: stringField(record, "thread_id"),
242
+ raw: record
243
+ }];
244
+ if (type === "item.started" && item !== void 0 && itemType !== void 0 && TOOL_ITEMS.has(itemType)) {
245
+ announced.add(id);
246
+ return [{
247
+ type: "tool.call",
248
+ id,
249
+ ...toolCall(item),
250
+ raw: record
251
+ }];
252
+ }
253
+ if (type === "item.completed" && item !== void 0) {
254
+ if (itemType === "agent_message") {
255
+ const text = stringField(item, "text") ?? "";
256
+ return text.length > 0 ? [{
257
+ type: "message",
258
+ text,
259
+ delta: false,
260
+ raw: record
261
+ }] : [];
262
+ }
263
+ if (itemType === "error") return [{
264
+ type: "error",
265
+ message: stringField(item, "message") ?? "error",
266
+ raw: record
267
+ }];
268
+ if (itemType !== void 0 && TOOL_ITEMS.has(itemType)) {
269
+ const events = [];
270
+ if (!announced.has(id)) events.push({
271
+ type: "tool.call",
272
+ id,
273
+ ...toolCall(item),
274
+ raw: record
275
+ });
276
+ events.push({
277
+ type: "tool.result",
278
+ id,
279
+ ...toolResult(item),
280
+ raw: record
281
+ });
282
+ return events;
283
+ }
284
+ return [];
285
+ }
286
+ if (type === "turn.completed") {
287
+ const usage = recordField(record, "usage");
288
+ if (usage === void 0) return [];
289
+ const cached = numberField(usage, "cached_input_tokens");
290
+ const written = numberField(usage, "cache_write_input_tokens");
291
+ return [{
292
+ type: "usage",
293
+ cumulative: true,
294
+ usage: usageOf({
295
+ input: numberField(usage, "input_tokens"),
296
+ output: numberField(usage, "output_tokens"),
297
+ cachedTokens: cached !== void 0 && cached > 0 ? cached : void 0,
298
+ cacheWriteTokens: written !== void 0 && written > 0 ? written : void 0,
299
+ reasoningTokens: numberField(usage, "reasoning_output_tokens") || void 0
300
+ }),
301
+ raw: record
302
+ }];
303
+ }
304
+ if (type === "turn.failed") return [{
305
+ type: "error",
306
+ message: stringField(recordField(record, "error"), "message") ?? "Codex turn failed",
307
+ fatal: true,
308
+ raw: record
309
+ }];
310
+ if (type === "error") return [{
311
+ type: "error",
312
+ message: stringField(record, "message") ?? "Codex error",
313
+ fatal: true,
314
+ raw: record
315
+ }];
316
+ return [];
317
+ });
318
+ }
319
+
320
+ //#endregion
321
+ export { codexAdapter, createCodexParser };
322
+ //# sourceMappingURL=codex.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.mjs","names":[],"sources":["../../../../../../../../packages/ai-cli/src/adapters/codex.ts"],"sourcesContent":["import path from \"node:path\";\nimport type {\n CliAdapter,\n CliLaunchFile,\n CliMcpServers,\n CliParsedEvent,\n CliStreamParser,\n} from \"../contracts\";\nimport {\n jsonLinesParser,\n numberField,\n outputText,\n recordField,\n stringField,\n} from \"../stream/json-lines\";\nimport { type TomlTable, tomlKey, toToml } from \"../utils/toml\";\nimport { argvPrompt, mapEffort, unsupportedOption, usageOf } from \"./shared\";\n\n/**\n * OpenAI Codex CLI (`codex`, npm `@openai/codex`).\n *\n * Verified against the real `codex exec --help` / `codex exec resume\n * --help` of 0.163.0, the source at tag `rust-v0.163.0` (`exec_events.rs`,\n * the JSONL event processor, `cli.rs`) and the docs (non-interactive mode,\n * config reference), 2026-10-17.\n *\n * - Headless: `codex exec --json --skip-git-repo-check <prompt>` (`-` reads\n * the prompt from stdin); resume is `codex exec resume … <thread_id>\n * <prompt>`.\n * - Stream: `thread.started` (`thread_id`), `item.started`/`item.completed`\n * with `item.type` `agent_message`, `reasoning`, `command_execution`,\n * `file_change`, `mcp_tool_call`, `web_search`, `error`; `turn.completed`\n * with the thread's cumulative `usage` (`input_tokens` includes\n * `cached_input_tokens`); `turn.failed` and `error` on failure. No text\n * deltas and no cost field.\n * - Permissions: exec never asks (approval policy \"never\"); `standard` keeps\n * Codex's default **read-only** sandbox — allow edits with\n * `args: [\"-c\", \"sandbox_mode=workspace-write\"]`. Bypass is\n * `--dangerously-bypass-approvals-and-sandbox`.\n * - Effort: `-c model_reasoning_effort=<level>`.\n * - MCP: no flag. With a private home the servers go into\n * `$CODEX_HOME/config.toml` (0600). With a caller-owned or inherited home\n * they are passed as `-c mcp_servers.<name>.…` overrides that carry only\n * the command, args and URL; secret `env` values and headers travel in the\n * process environment, named through `env_vars` / `env_http_headers`.\n * - Home `CODEX_HOME`; auth `CODEX_API_KEY`.\n */\nexport const codexAdapter: CliAdapter = {\n name: \"codex\",\n title: \"Codex CLI\",\n command: \"codex\",\n apiKeyEnv: [\"CODEX_API_KEY\"],\n homeEnv: [\"CODEX_HOME\"],\n transports: [\"argv\", \"stdin\"],\n effort: true,\n mcp: true,\n probe: {\n help: [\n [\"exec\", \"--help\"],\n [\"exec\", \"resume\", \"--help\"],\n ],\n version: [\"--version\"],\n },\n verification: {\n version: \"0.163.0\",\n verifiedBy: \"help\",\n sources: [\n \"https://developers.openai.com/codex/noninteractive\",\n \"https://developers.openai.com/codex/config-reference\",\n \"https://github.com/openai/codex/blob/rust-v0.163.0/codex-rs/exec/src/exec_events.rs\",\n ],\n checkedAt: \"2026-10-17\",\n },\n plan(context) {\n const args = [\"exec\"];\n const requires = [\"exec\", \"--json\", \"--skip-git-repo-check\"];\n const files: CliLaunchFile[] = [];\n const env: Record<string, string> = {};\n\n if (context.resume !== undefined) {\n args.push(\"resume\");\n requires.push(\"resume\");\n }\n\n args.push(\"--json\", \"--skip-git-repo-check\", \"-c\", \"check_for_update_on_startup=false\");\n\n if (context.model !== undefined) {\n args.push(\"--model\", context.model);\n requires.push(\"--model\");\n }\n\n if (context.effort !== undefined) {\n const effort = mapEffort(context.effort, {\n low: \"low\",\n medium: \"medium\",\n high: \"high\",\n xhigh: \"xhigh\",\n max: \"max\",\n });\n\n args.push(\"-c\", `model_reasoning_effort=${effort}`);\n requires.push(\"--config\");\n }\n\n if (context.permission === \"bypass\") {\n args.push(\"--dangerously-bypass-approvals-and-sandbox\");\n requires.push(\"--dangerously-bypass-approvals-and-sandbox\");\n }\n\n if (context.mcp !== undefined) {\n if (context.home !== undefined && context.homeIsPrivate) {\n files.push({\n path: path.join(context.home, \"config.toml\"),\n content: toToml({ mcp_servers: codexMcpTable(context.mcp) }),\n });\n } else {\n args.push(...codexMcpOverrides(context.mcp, env));\n requires.push(\"--config\");\n }\n }\n\n if (context.home !== undefined) {\n env.CODEX_HOME = context.home;\n }\n\n const prompt = context.transport === \"argv\" ? argvPrompt(context.prompt) : \"-\";\n\n return {\n args,\n tail: context.resume !== undefined ? [context.resume, prompt] : [prompt],\n stdin: context.transport === \"stdin\" ? context.prompt : undefined,\n env,\n files,\n requires,\n };\n },\n parser: createCodexParser,\n};\n\n/** `[mcp_servers.<name>]` tables for a private `config.toml`. */\nfunction codexMcpTable(servers: CliMcpServers): TomlTable {\n const table: TomlTable = {};\n\n for (const [name, server] of Object.entries(servers)) {\n if (server.type === \"sse\") {\n throw unsupportedOption(\n codexAdapter,\n `MCP server \"${name}\" uses SSE; Codex supports stdio and streamable HTTP.`,\n );\n }\n\n table[name] =\n server.type === \"stdio\"\n ? { command: server.command, args: server.args ?? [], env: server.env }\n : { url: server.url, http_headers: server.headers };\n }\n\n return table;\n}\n\n/** A TOML string for a `-c key=value` override. */\nfunction tomlString(value: string): string {\n return JSON.stringify(value);\n}\n\n/**\n * `-c` overrides that carry no secret: env values and header values are put\n * in `env` (the Codex process environment) and only their names go to argv.\n */\nfunction codexMcpOverrides(servers: CliMcpServers, env: Record<string, string>): string[] {\n const overrides: string[] = [];\n const claim = (name: string, value: string): void => {\n if (env[name] !== undefined && env[name] !== value) {\n throw unsupportedOption(\n codexAdapter,\n `two MCP servers set ${name} to different values; with a shared home they share one environment.`,\n );\n }\n\n env[name] = value;\n };\n\n for (const [name, server] of Object.entries(servers)) {\n const prefix = `mcp_servers.${tomlKey(name)}`;\n\n if (server.type === \"sse\") {\n throw unsupportedOption(\n codexAdapter,\n `MCP server \"${name}\" uses SSE; Codex supports stdio and streamable HTTP.`,\n );\n }\n\n if (server.type === \"stdio\") {\n overrides.push(\"-c\", `${prefix}.command=${tomlString(server.command)}`);\n overrides.push(\"-c\", `${prefix}.args=[${(server.args ?? []).map(tomlString).join(\",\")}]`);\n\n const names = Object.keys(server.env ?? {});\n\n for (const [key, value] of Object.entries(server.env ?? {})) {\n claim(key, value);\n }\n\n if (names.length > 0) {\n overrides.push(\"-c\", `${prefix}.env_vars=[${names.map(tomlString).join(\",\")}]`);\n }\n\n continue;\n }\n\n overrides.push(\"-c\", `${prefix}.url=${tomlString(server.url)}`);\n\n const headers = Object.entries(server.headers ?? {});\n\n if (headers.length > 0) {\n const mapping = headers.map(([header, value], index) => {\n const variable = `WARLOCK_MCP_${name.replace(/\\W/g, \"_\").toUpperCase()}_HEADER_${index}`;\n\n claim(variable, value);\n\n return `${tomlString(header)}=${tomlString(variable)}`;\n });\n\n overrides.push(\"-c\", `${prefix}.env_http_headers={${mapping.join(\",\")}}`);\n }\n }\n\n return overrides;\n}\n\nconst TOOL_ITEMS = new Set([\n \"command_execution\",\n \"file_change\",\n \"mcp_tool_call\",\n \"web_search\",\n \"collab_tool_call\",\n]);\n\nfunction toolCall(item: Record<string, unknown>): { name: string; input: unknown } {\n switch (stringField(item, \"type\")) {\n case \"command_execution\":\n return { name: \"shell\", input: { command: item.command } };\n case \"file_change\":\n return { name: \"apply_patch\", input: { changes: item.changes } };\n case \"mcp_tool_call\":\n return {\n name: `${stringField(item, \"server\") ?? \"mcp\"}.${stringField(item, \"tool\") ?? \"tool\"}`,\n input: item.arguments,\n };\n case \"web_search\":\n return { name: \"web_search\", input: { query: item.query } };\n default:\n return { name: stringField(item, \"type\") ?? \"tool\", input: item };\n }\n}\n\nfunction toolResult(item: Record<string, unknown>): { output: string; isError: boolean } {\n const status = stringField(item, \"status\");\n const failed = status === \"failed\" || status === \"declined\";\n\n switch (stringField(item, \"type\")) {\n case \"command_execution\": {\n const exitCode = numberField(item, \"exit_code\");\n\n return {\n output: stringField(item, \"aggregated_output\") ?? \"\",\n isError: failed || (exitCode !== undefined && exitCode !== 0),\n };\n }\n case \"mcp_tool_call\": {\n const error = stringField(recordField(item, \"error\"), \"message\");\n\n return error !== undefined\n ? { output: error, isError: true }\n : { output: outputText(recordField(item, \"result\")?.content), isError: failed };\n }\n default:\n return { output: outputText(item.changes ?? item.result ?? \"\"), isError: failed };\n }\n}\n\n/** Parser for `codex exec --json`. */\nexport function createCodexParser(): CliStreamParser {\n const announced = new Set<string>();\n\n return jsonLinesParser((record): CliParsedEvent[] => {\n const type = stringField(record, \"type\");\n const item = recordField(record, \"item\");\n const itemType = stringField(item, \"type\");\n const id = stringField(item, \"id\") ?? \"\";\n\n if (type === \"thread.started\") {\n return [\n { type: \"session.started\", sessionRef: stringField(record, \"thread_id\"), raw: record },\n ];\n }\n\n if (\n type === \"item.started\" &&\n item !== undefined &&\n itemType !== undefined &&\n TOOL_ITEMS.has(itemType)\n ) {\n announced.add(id);\n\n return [{ type: \"tool.call\", id, ...toolCall(item), raw: record }];\n }\n\n if (type === \"item.completed\" && item !== undefined) {\n if (itemType === \"agent_message\") {\n const text = stringField(item, \"text\") ?? \"\";\n\n return text.length > 0 ? [{ type: \"message\", text, delta: false, raw: record }] : [];\n }\n\n if (itemType === \"error\") {\n return [{ type: \"error\", message: stringField(item, \"message\") ?? \"error\", raw: record }];\n }\n\n if (itemType !== undefined && TOOL_ITEMS.has(itemType)) {\n const events: CliParsedEvent[] = [];\n\n if (!announced.has(id)) {\n events.push({ type: \"tool.call\", id, ...toolCall(item), raw: record });\n }\n\n events.push({ type: \"tool.result\", id, ...toolResult(item), raw: record });\n\n return events;\n }\n\n return [];\n }\n\n if (type === \"turn.completed\") {\n const usage = recordField(record, \"usage\");\n\n if (usage === undefined) {\n return [];\n }\n\n const cached = numberField(usage, \"cached_input_tokens\");\n const written = numberField(usage, \"cache_write_input_tokens\");\n\n return [\n {\n type: \"usage\",\n cumulative: true,\n usage: usageOf({\n input: numberField(usage, \"input_tokens\"),\n output: numberField(usage, \"output_tokens\"),\n cachedTokens: cached !== undefined && cached > 0 ? cached : undefined,\n cacheWriteTokens: written !== undefined && written > 0 ? written : undefined,\n reasoningTokens: numberField(usage, \"reasoning_output_tokens\") || undefined,\n }),\n raw: record,\n },\n ];\n }\n\n if (type === \"turn.failed\") {\n return [\n {\n type: \"error\",\n message: stringField(recordField(record, \"error\"), \"message\") ?? \"Codex turn failed\",\n fatal: true,\n raw: record,\n },\n ];\n }\n\n if (type === \"error\") {\n return [\n {\n type: \"error\",\n message: stringField(record, \"message\") ?? \"Codex error\",\n fatal: true,\n raw: record,\n },\n ];\n }\n\n return [];\n });\n}\n"],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import { CliAdapter, CliLaunchContext, CliStreamParser } from "../contracts/adapter.contract.mjs";
2
+ import "../contracts/index.mjs";
3
+ //#region ../../packages/ai-cli/src/adapters/copilot.d.ts
4
+ /**
5
+ * GitHub Copilot CLI (`copilot`, npm `@github/copilot`).
6
+ *
7
+ * Verified against the real `copilot --help` of 1.0.98, the JSONL writer in
8
+ * the shipped CLI, the event types of `@github/copilot-sdk` 1.0.22 and the
9
+ * docs (`docs.github.com/copilot/how-tos/copilot-cli/…`, programmatic and
10
+ * command references), 2026-10-17.
11
+ *
12
+ * - Headless: `copilot -p <prompt> --output-format json --stream on`
13
+ * (piped stdin is the prompt when `-p` is absent). Stream lines are
14
+ * session events `{type,data,id,timestamp}`: `assistant.message_delta`
15
+ * (`deltaContent`), `assistant.message` (`content`),
16
+ * `tool.execution_start` (`toolCallId`, `toolName`, `arguments`),
17
+ * `tool.execution_complete` (`success`, `result.content`,
18
+ * `error.message`), `session.error`, and a final CLI-built `result`
19
+ * (`sessionId`, `exitCode`, premium-request usage).
20
+ * - Tokens are not in the stream; the adapter passes `--usage-output-file`
21
+ * and reads `modelMetrics.*.usage` from it when the stream ends. Billing
22
+ * is in premium requests, so no USD cost is reported.
23
+ * - Permissions: unapproved tool requests are auto-denied in `-p` mode;
24
+ * bypass is `--allow-all` (tools, paths and URLs). `--no-ask-user` and
25
+ * `--no-auto-update` are always passed.
26
+ * - MCP: `--additional-mcp-config @<file>` (`mcpServers`, `type`
27
+ * `local`/`http`/`sse`, `tools: ["*"]`), written to the run directory.
28
+ * - Home `COPILOT_HOME`; auth `COPILOT_GITHUB_TOKEN`. Resume with
29
+ * `--session-id <id>`.
30
+ */
31
+ export declare const copilotAdapter: CliAdapter;
32
+ /** Parser for `copilot -p … --output-format json` (plus its usage file). */
33
+ export declare function createCopilotParser(context?: CliLaunchContext): CliStreamParser;
34
+ //#endregion
35
+ //# sourceMappingURL=copilot.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copilot.d.mts","names":[],"sources":["../../../../../../../../packages/ai-cli/src/adapters/copilot.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAkDa,gBAAgB;;wBA2Ib,oBAAoB,UAAU,mBAAmB"}