@tutti-os/agent-acp-kit 0.1.10

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 (252) hide show
  1. package/AGENTS.md +176 -0
  2. package/README.md +428 -0
  3. package/assets/agent-acp-kit-architecture.png +0 -0
  4. package/dist/core/capabilities.d.ts +23 -0
  5. package/dist/core/capabilities.d.ts.map +1 -0
  6. package/dist/core/capabilities.js +2 -0
  7. package/dist/core/capabilities.js.map +1 -0
  8. package/dist/core/detection.d.ts +8 -0
  9. package/dist/core/detection.d.ts.map +1 -0
  10. package/dist/core/detection.js +2 -0
  11. package/dist/core/detection.js.map +1 -0
  12. package/dist/core/errors.d.ts +6 -0
  13. package/dist/core/errors.d.ts.map +1 -0
  14. package/dist/core/errors.js +9 -0
  15. package/dist/core/errors.js.map +1 -0
  16. package/dist/core/events.d.ts +51 -0
  17. package/dist/core/events.d.ts.map +1 -0
  18. package/dist/core/events.js +2 -0
  19. package/dist/core/events.js.map +1 -0
  20. package/dist/core/index.d.ts +14 -0
  21. package/dist/core/index.d.ts.map +1 -0
  22. package/dist/core/index.js +4 -0
  23. package/dist/core/index.js.map +1 -0
  24. package/dist/core/launch-plan.d.ts +22 -0
  25. package/dist/core/launch-plan.d.ts.map +1 -0
  26. package/dist/core/launch-plan.js +2 -0
  27. package/dist/core/launch-plan.js.map +1 -0
  28. package/dist/core/mcp.d.ts +31 -0
  29. package/dist/core/mcp.d.ts.map +1 -0
  30. package/dist/core/mcp.js +37 -0
  31. package/dist/core/mcp.js.map +1 -0
  32. package/dist/core/provider-plugin.d.ts +84 -0
  33. package/dist/core/provider-plugin.d.ts.map +1 -0
  34. package/dist/core/provider-plugin.js +2 -0
  35. package/dist/core/provider-plugin.js.map +1 -0
  36. package/dist/core/redaction.d.ts +2 -0
  37. package/dist/core/redaction.d.ts.map +1 -0
  38. package/dist/core/redaction.js +9 -0
  39. package/dist/core/redaction.js.map +1 -0
  40. package/dist/core/registry.d.ts +4 -0
  41. package/dist/core/registry.d.ts.map +1 -0
  42. package/dist/core/registry.js +10 -0
  43. package/dist/core/registry.js.map +1 -0
  44. package/dist/core/run-input.d.ts +30 -0
  45. package/dist/core/run-input.d.ts.map +1 -0
  46. package/dist/core/run-input.js +2 -0
  47. package/dist/core/run-input.js.map +1 -0
  48. package/dist/core/skills.d.ts +13 -0
  49. package/dist/core/skills.d.ts.map +1 -0
  50. package/dist/core/skills.js +2 -0
  51. package/dist/core/skills.js.map +1 -0
  52. package/dist/core/transport.d.ts +17 -0
  53. package/dist/core/transport.d.ts.map +1 -0
  54. package/dist/core/transport.js +2 -0
  55. package/dist/core/transport.js.map +1 -0
  56. package/dist/index.d.ts +13 -0
  57. package/dist/index.d.ts.map +1 -0
  58. package/dist/index.js +9 -0
  59. package/dist/index.js.map +1 -0
  60. package/dist/process/cancellation.d.ts +7 -0
  61. package/dist/process/cancellation.d.ts.map +1 -0
  62. package/dist/process/cancellation.js +36 -0
  63. package/dist/process/cancellation.js.map +1 -0
  64. package/dist/process/command-resolver.d.ts +13 -0
  65. package/dist/process/command-resolver.d.ts.map +1 -0
  66. package/dist/process/command-resolver.js +63 -0
  67. package/dist/process/command-resolver.js.map +1 -0
  68. package/dist/process/env.d.ts +2 -0
  69. package/dist/process/env.d.ts.map +1 -0
  70. package/dist/process/env.js +7 -0
  71. package/dist/process/env.js.map +1 -0
  72. package/dist/process/stderr-buffer.d.ts +11 -0
  73. package/dist/process/stderr-buffer.d.ts.map +1 -0
  74. package/dist/process/stderr-buffer.js +23 -0
  75. package/dist/process/stderr-buffer.js.map +1 -0
  76. package/dist/process/supervisor.d.ts +27 -0
  77. package/dist/process/supervisor.d.ts.map +1 -0
  78. package/dist/process/supervisor.js +76 -0
  79. package/dist/process/supervisor.js.map +1 -0
  80. package/dist/providers/acp-presets/index.d.ts +3 -0
  81. package/dist/providers/acp-presets/index.d.ts.map +1 -0
  82. package/dist/providers/acp-presets/index.js +2 -0
  83. package/dist/providers/acp-presets/index.js.map +1 -0
  84. package/dist/providers/acp-presets/provider.d.ts +114 -0
  85. package/dist/providers/acp-presets/provider.d.ts.map +1 -0
  86. package/dist/providers/acp-presets/provider.js +172 -0
  87. package/dist/providers/acp-presets/provider.js.map +1 -0
  88. package/dist/providers/claude/detect.d.ts +35 -0
  89. package/dist/providers/claude/detect.d.ts.map +1 -0
  90. package/dist/providers/claude/detect.js +159 -0
  91. package/dist/providers/claude/detect.js.map +1 -0
  92. package/dist/providers/claude/index.d.ts +4 -0
  93. package/dist/providers/claude/index.d.ts.map +1 -0
  94. package/dist/providers/claude/index.js +206 -0
  95. package/dist/providers/claude/index.js.map +1 -0
  96. package/dist/providers/claude/launch-plan.d.ts +5 -0
  97. package/dist/providers/claude/launch-plan.d.ts.map +1 -0
  98. package/dist/providers/claude/launch-plan.js +38 -0
  99. package/dist/providers/claude/launch-plan.js.map +1 -0
  100. package/dist/providers/claude/parser.d.ts +3 -0
  101. package/dist/providers/claude/parser.d.ts.map +1 -0
  102. package/dist/providers/claude/parser.js +41 -0
  103. package/dist/providers/claude/parser.js.map +1 -0
  104. package/dist/providers/codex/detect.d.ts +31 -0
  105. package/dist/providers/codex/detect.d.ts.map +1 -0
  106. package/dist/providers/codex/detect.js +280 -0
  107. package/dist/providers/codex/detect.js.map +1 -0
  108. package/dist/providers/codex/index.d.ts +4 -0
  109. package/dist/providers/codex/index.d.ts.map +1 -0
  110. package/dist/providers/codex/index.js +383 -0
  111. package/dist/providers/codex/index.js.map +1 -0
  112. package/dist/providers/codex/launch-plan.d.ts +3 -0
  113. package/dist/providers/codex/launch-plan.d.ts.map +1 -0
  114. package/dist/providers/codex/launch-plan.js +40 -0
  115. package/dist/providers/codex/launch-plan.js.map +1 -0
  116. package/dist/providers/codex/parser.d.ts +32 -0
  117. package/dist/providers/codex/parser.d.ts.map +1 -0
  118. package/dist/providers/codex/parser.js +187 -0
  119. package/dist/providers/codex/parser.js.map +1 -0
  120. package/dist/providers/codex/reasoning.d.ts +2 -0
  121. package/dist/providers/codex/reasoning.d.ts.map +1 -0
  122. package/dist/providers/codex/reasoning.js +12 -0
  123. package/dist/providers/codex/reasoning.js.map +1 -0
  124. package/dist/providers/fake/index.d.ts +2 -0
  125. package/dist/providers/fake/index.d.ts.map +1 -0
  126. package/dist/providers/fake/index.js +2 -0
  127. package/dist/providers/fake/index.js.map +1 -0
  128. package/dist/providers/fake/provider.d.ts +8 -0
  129. package/dist/providers/fake/provider.d.ts.map +1 -0
  130. package/dist/providers/fake/provider.js +73 -0
  131. package/dist/providers/fake/provider.js.map +1 -0
  132. package/dist/providers/generic-acp/index.d.ts +2 -0
  133. package/dist/providers/generic-acp/index.d.ts.map +1 -0
  134. package/dist/providers/generic-acp/index.js +2 -0
  135. package/dist/providers/generic-acp/index.js.map +1 -0
  136. package/dist/providers/generic-acp/provider.d.ts +8 -0
  137. package/dist/providers/generic-acp/provider.d.ts.map +1 -0
  138. package/dist/providers/generic-acp/provider.js +93 -0
  139. package/dist/providers/generic-acp/provider.js.map +1 -0
  140. package/dist/providers/hermes/index.d.ts +2 -0
  141. package/dist/providers/hermes/index.d.ts.map +1 -0
  142. package/dist/providers/hermes/index.js +2 -0
  143. package/dist/providers/hermes/index.js.map +1 -0
  144. package/dist/providers/hermes/provider.d.ts +2 -0
  145. package/dist/providers/hermes/provider.d.ts.map +1 -0
  146. package/dist/providers/hermes/provider.js +2 -0
  147. package/dist/providers/hermes/provider.js.map +1 -0
  148. package/dist/providers/install.d.ts +87 -0
  149. package/dist/providers/install.d.ts.map +1 -0
  150. package/dist/providers/install.js +289 -0
  151. package/dist/providers/install.js.map +1 -0
  152. package/dist/providers/kimi/index.d.ts +2 -0
  153. package/dist/providers/kimi/index.d.ts.map +1 -0
  154. package/dist/providers/kimi/index.js +2 -0
  155. package/dist/providers/kimi/index.js.map +1 -0
  156. package/dist/providers/kimi/provider.d.ts +2 -0
  157. package/dist/providers/kimi/provider.d.ts.map +1 -0
  158. package/dist/providers/kimi/provider.js +2 -0
  159. package/dist/providers/kimi/provider.js.map +1 -0
  160. package/dist/providers/kiro/index.d.ts +2 -0
  161. package/dist/providers/kiro/index.d.ts.map +1 -0
  162. package/dist/providers/kiro/index.js +2 -0
  163. package/dist/providers/kiro/index.js.map +1 -0
  164. package/dist/providers/kiro/provider.d.ts +2 -0
  165. package/dist/providers/kiro/provider.d.ts.map +1 -0
  166. package/dist/providers/kiro/provider.js +2 -0
  167. package/dist/providers/kiro/provider.js.map +1 -0
  168. package/dist/runtime/control-plane.d.ts +4 -0
  169. package/dist/runtime/control-plane.d.ts.map +1 -0
  170. package/dist/runtime/control-plane.js +2 -0
  171. package/dist/runtime/control-plane.js.map +1 -0
  172. package/dist/runtime/create-runtime.d.ts +44 -0
  173. package/dist/runtime/create-runtime.d.ts.map +1 -0
  174. package/dist/runtime/create-runtime.js +445 -0
  175. package/dist/runtime/create-runtime.js.map +1 -0
  176. package/dist/runtime/detection-cache.d.ts +6 -0
  177. package/dist/runtime/detection-cache.d.ts.map +1 -0
  178. package/dist/runtime/detection-cache.js +15 -0
  179. package/dist/runtime/detection-cache.js.map +1 -0
  180. package/dist/runtime/provider-registry.d.ts +7 -0
  181. package/dist/runtime/provider-registry.d.ts.map +1 -0
  182. package/dist/runtime/provider-registry.js +19 -0
  183. package/dist/runtime/provider-registry.js.map +1 -0
  184. package/dist/skills/cleanup.d.ts +2 -0
  185. package/dist/skills/cleanup.d.ts.map +1 -0
  186. package/dist/skills/cleanup.js +5 -0
  187. package/dist/skills/cleanup.js.map +1 -0
  188. package/dist/skills/materialize.d.ts +3 -0
  189. package/dist/skills/materialize.d.ts.map +1 -0
  190. package/dist/skills/materialize.js +38 -0
  191. package/dist/skills/materialize.js.map +1 -0
  192. package/dist/skills/prompt-injection.d.ts +13 -0
  193. package/dist/skills/prompt-injection.d.ts.map +1 -0
  194. package/dist/skills/prompt-injection.js +34 -0
  195. package/dist/skills/prompt-injection.js.map +1 -0
  196. package/dist/testing/conformance.d.ts +12 -0
  197. package/dist/testing/conformance.d.ts.map +1 -0
  198. package/dist/testing/conformance.js +55 -0
  199. package/dist/testing/conformance.js.map +1 -0
  200. package/dist/testing/fake-acp-peer.d.ts +13 -0
  201. package/dist/testing/fake-acp-peer.d.ts.map +1 -0
  202. package/dist/testing/fake-acp-peer.js +72 -0
  203. package/dist/testing/fake-acp-peer.js.map +1 -0
  204. package/dist/testing/fake-provider.d.ts +8 -0
  205. package/dist/testing/fake-provider.d.ts.map +1 -0
  206. package/dist/testing/fake-provider.js +12 -0
  207. package/dist/testing/fake-provider.js.map +1 -0
  208. package/dist/testing/fixtures.d.ts +3 -0
  209. package/dist/testing/fixtures.d.ts.map +1 -0
  210. package/dist/testing/fixtures.js +6 -0
  211. package/dist/testing/fixtures.js.map +1 -0
  212. package/dist/testing/index.d.ts +6 -0
  213. package/dist/testing/index.d.ts.map +1 -0
  214. package/dist/testing/index.js +5 -0
  215. package/dist/testing/index.js.map +1 -0
  216. package/dist/transports/acp/acp-client.d.ts +4 -0
  217. package/dist/transports/acp/acp-client.d.ts.map +1 -0
  218. package/dist/transports/acp/acp-client.js +283 -0
  219. package/dist/transports/acp/acp-client.js.map +1 -0
  220. package/dist/transports/acp/acp-jsonrpc.d.ts +7 -0
  221. package/dist/transports/acp/acp-jsonrpc.d.ts.map +1 -0
  222. package/dist/transports/acp/acp-jsonrpc.js +27 -0
  223. package/dist/transports/acp/acp-jsonrpc.js.map +1 -0
  224. package/dist/transports/acp/acp-models.d.ts +11 -0
  225. package/dist/transports/acp/acp-models.d.ts.map +1 -0
  226. package/dist/transports/acp/acp-models.js +95 -0
  227. package/dist/transports/acp/acp-models.js.map +1 -0
  228. package/dist/transports/acp/acp-permissions.d.ts +5 -0
  229. package/dist/transports/acp/acp-permissions.d.ts.map +1 -0
  230. package/dist/transports/acp/acp-permissions.js +7 -0
  231. package/dist/transports/acp/acp-permissions.js.map +1 -0
  232. package/dist/transports/acp/acp-session.d.ts +7 -0
  233. package/dist/transports/acp/acp-session.d.ts.map +1 -0
  234. package/dist/transports/acp/acp-session.js +27 -0
  235. package/dist/transports/acp/acp-session.js.map +1 -0
  236. package/dist/transports/acp/acp-types.d.ts +28 -0
  237. package/dist/transports/acp/acp-types.d.ts.map +1 -0
  238. package/dist/transports/acp/acp-types.js +2 -0
  239. package/dist/transports/acp/acp-types.js.map +1 -0
  240. package/dist/transports/jsonl/jsonl-parser.d.ts +5 -0
  241. package/dist/transports/jsonl/jsonl-parser.d.ts.map +1 -0
  242. package/dist/transports/jsonl/jsonl-parser.js +27 -0
  243. package/dist/transports/jsonl/jsonl-parser.js.map +1 -0
  244. package/dist/transports/jsonl/jsonl-transport.d.ts +4 -0
  245. package/dist/transports/jsonl/jsonl-transport.d.ts.map +1 -0
  246. package/dist/transports/jsonl/jsonl-transport.js +81 -0
  247. package/dist/transports/jsonl/jsonl-transport.js.map +1 -0
  248. package/dist/transports/plain/plain-transport.d.ts +4 -0
  249. package/dist/transports/plain/plain-transport.d.ts.map +1 -0
  250. package/dist/transports/plain/plain-transport.js +52 -0
  251. package/dist/transports/plain/plain-transport.js.map +1 -0
  252. package/package.json +47 -0
@@ -0,0 +1,280 @@
1
+ import { execFile, spawn } from "node:child_process";
2
+ import { homedir } from "node:os";
3
+ import path from "node:path";
4
+ import readline from "node:readline";
5
+ import { promisify } from "node:util";
6
+ import { resolveCommandExecutable } from "../../process/command-resolver.js";
7
+ const execFileAsync = promisify(execFile);
8
+ const CODEX_MODEL_DISCOVERY_TIMEOUT_MS = 5_000;
9
+ const CODEX_MODEL_DISCOVERY_MAX_BUFFER = 8 * 1024 * 1024;
10
+ const CODEX_DEFAULT_MODELS = [
11
+ { id: "default", label: "Default (CLI config)" },
12
+ ];
13
+ function parseSemver(version) {
14
+ const match = version.match(/(\d+)\.(\d+)\.(\d+)/);
15
+ if (!match) {
16
+ return null;
17
+ }
18
+ return match.slice(1).map((part) => Number.parseInt(part, 10));
19
+ }
20
+ function isVersionAtLeast(version, minimumVersion) {
21
+ if (!minimumVersion) {
22
+ return true;
23
+ }
24
+ const current = parseSemver(version);
25
+ const minimum = parseSemver(minimumVersion);
26
+ if (!current || !minimum) {
27
+ return true;
28
+ }
29
+ for (let index = 0; index < minimum.length; index += 1) {
30
+ const currentPart = current[index] ?? 0;
31
+ const minimumPart = minimum[index] ?? 0;
32
+ if (currentPart > minimumPart)
33
+ return true;
34
+ if (currentPart < minimumPart)
35
+ return false;
36
+ }
37
+ return true;
38
+ }
39
+ function toRecord(value) {
40
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
41
+ return undefined;
42
+ }
43
+ return value;
44
+ }
45
+ function getString(record, key) {
46
+ const value = record[key];
47
+ return typeof value === "string" && value.trim() ? value.trim() : undefined;
48
+ }
49
+ function isSupersededCodexModel(record) {
50
+ return Boolean(getString(record, "upgrade"));
51
+ }
52
+ function normalizeCodexCatalog(payload) {
53
+ const payloadRecord = toRecord(payload);
54
+ const rawModels = Array.isArray(payloadRecord?.data)
55
+ ? payloadRecord.data
56
+ : Array.isArray(payloadRecord?.models)
57
+ ? payloadRecord.models
58
+ : [];
59
+ const seen = new Set();
60
+ const models = [
61
+ { id: "default", label: "Default (CLI config)" },
62
+ ];
63
+ seen.add("default");
64
+ const upgradeModels = [];
65
+ function appendModel(id, label, description) {
66
+ if (!id || seen.has(id))
67
+ return;
68
+ seen.add(id);
69
+ models.push({
70
+ id,
71
+ label: label || id,
72
+ ...(description ? { description } : {}),
73
+ });
74
+ }
75
+ for (const entry of rawModels) {
76
+ const record = toRecord(entry);
77
+ if (!record)
78
+ continue;
79
+ if (record.hidden === true || record.visibility === "hide")
80
+ continue;
81
+ if (isSupersededCodexModel(record))
82
+ continue;
83
+ const id = getString(record, "id") ?? getString(record, "model") ?? getString(record, "slug");
84
+ if (!id)
85
+ continue;
86
+ const label = getString(record, "displayName") ?? getString(record, "display_name") ?? id;
87
+ appendModel(id, label, getString(record, "description"));
88
+ const upgrade = getString(record, "upgrade");
89
+ const upgradeInfo = toRecord(record.upgradeInfo);
90
+ const upgradeLabel = (upgradeInfo ? getString(upgradeInfo, "model") : undefined) ?? upgrade;
91
+ if (upgrade && upgradeLabel) {
92
+ upgradeModels.push({ id: upgrade, label: upgradeLabel });
93
+ }
94
+ }
95
+ for (const upgradeModel of upgradeModels) {
96
+ appendModel(upgradeModel.id, upgradeModel.label);
97
+ }
98
+ return models;
99
+ }
100
+ async function loadCodexAppServerModelCatalog(executablePath, env) {
101
+ const child = spawn(executablePath, ["app-server"], {
102
+ ...(env ? { env } : {}),
103
+ stdio: ["pipe", "pipe", "pipe"],
104
+ });
105
+ const rl = readline.createInterface({ input: child.stdout });
106
+ const pending = new Map();
107
+ let nextId = 1;
108
+ function rejectPending(error) {
109
+ for (const [id, waiter] of pending) {
110
+ pending.delete(id);
111
+ clearTimeout(waiter.timer);
112
+ waiter.reject(error);
113
+ }
114
+ }
115
+ function request(method, params) {
116
+ const id = nextId;
117
+ nextId += 1;
118
+ return new Promise((resolve, reject) => {
119
+ const timer = setTimeout(() => {
120
+ pending.delete(id);
121
+ reject(new Error(`Codex app-server ${method} timed out.`));
122
+ }, CODEX_MODEL_DISCOVERY_TIMEOUT_MS);
123
+ pending.set(id, { reject, resolve, timer });
124
+ child.stdin.write(`${JSON.stringify({ id, method, params })}\n`, (error) => {
125
+ if (!error)
126
+ return;
127
+ const waiter = pending.get(id);
128
+ if (!waiter)
129
+ return;
130
+ pending.delete(id);
131
+ clearTimeout(waiter.timer);
132
+ waiter.reject(error);
133
+ });
134
+ });
135
+ }
136
+ rl.on("line", (line) => {
137
+ let message;
138
+ try {
139
+ message = JSON.parse(line);
140
+ }
141
+ catch {
142
+ return;
143
+ }
144
+ const id = typeof message.id === "number" ? message.id : undefined;
145
+ if (id === undefined)
146
+ return;
147
+ const waiter = pending.get(id);
148
+ if (!waiter)
149
+ return;
150
+ pending.delete(id);
151
+ clearTimeout(waiter.timer);
152
+ const error = toRecord(message.error);
153
+ if (error) {
154
+ waiter.reject(new Error(getString(error, "message") ?? `Codex app-server request ${id} failed.`));
155
+ return;
156
+ }
157
+ waiter.resolve(message.result);
158
+ });
159
+ child.on("error", (error) => {
160
+ rejectPending(error);
161
+ });
162
+ child.stdin.on("error", (error) => {
163
+ rejectPending(error);
164
+ });
165
+ child.on("close", (code, signal) => {
166
+ rejectPending(new Error(`Codex app-server exited before model discovery completed: ${signal ? `signal ${signal}` : `code ${code ?? 1}`}.`));
167
+ });
168
+ try {
169
+ await request("initialize", {
170
+ clientInfo: {
171
+ name: "agent_acp_kit",
172
+ title: "Agent ACP Kit",
173
+ version: "0",
174
+ },
175
+ capabilities: { experimentalApi: true },
176
+ });
177
+ child.stdin.write(`${JSON.stringify({ method: "initialized", params: {} })}\n`);
178
+ return normalizeCodexCatalog(await request("model/list", { includeHidden: false }));
179
+ }
180
+ finally {
181
+ for (const waiter of pending.values()) {
182
+ clearTimeout(waiter.timer);
183
+ }
184
+ pending.clear();
185
+ rl.close();
186
+ if (!child.killed) {
187
+ child.kill();
188
+ }
189
+ }
190
+ }
191
+ async function loadCodexDebugModelCatalog(executablePath, env) {
192
+ const { stdout } = await execFileAsync(executablePath, ["debug", "models"], {
193
+ ...(env ? { env } : {}),
194
+ maxBuffer: CODEX_MODEL_DISCOVERY_MAX_BUFFER,
195
+ timeout: CODEX_MODEL_DISCOVERY_TIMEOUT_MS,
196
+ });
197
+ return normalizeCodexCatalog(JSON.parse(stdout));
198
+ }
199
+ export async function discoverCodexModels(options) {
200
+ try {
201
+ return await loadCodexAppServerModelCatalog(options.executablePath, options.env);
202
+ }
203
+ catch {
204
+ try {
205
+ return await loadCodexDebugModelCatalog(options.executablePath, options.env);
206
+ }
207
+ catch {
208
+ return CODEX_DEFAULT_MODELS;
209
+ }
210
+ }
211
+ }
212
+ export async function detectCodex(options) {
213
+ const command = options?.command ?? "codex";
214
+ const configDir = (options?.env?.CODEX_HOME || process.env.CODEX_HOME || "").trim()
215
+ || path.join(homedir(), ".codex");
216
+ let executablePath;
217
+ try {
218
+ executablePath = await resolveCommandExecutable({
219
+ command,
220
+ ...(options?.env ? { env: options.env } : {}),
221
+ ...(options?.overridePath ? { overridePath: options.overridePath } : {}),
222
+ });
223
+ }
224
+ catch (error) {
225
+ return {
226
+ authState: "missing",
227
+ configDir,
228
+ executablePath: command,
229
+ models: CODEX_DEFAULT_MODELS,
230
+ skillsDir: path.join(configDir, "skills"),
231
+ supported: false,
232
+ unsupportedReason: error instanceof Error ? error.message : `Executable not found: ${command}`,
233
+ version: "not-installed",
234
+ };
235
+ }
236
+ let stdout;
237
+ try {
238
+ ({ stdout } = await execFileAsync(executablePath, ["--version"], {
239
+ env: options?.env,
240
+ }));
241
+ }
242
+ catch (error) {
243
+ return {
244
+ authState: "unknown",
245
+ configDir,
246
+ executablePath,
247
+ models: CODEX_DEFAULT_MODELS,
248
+ skillsDir: path.join(configDir, "skills"),
249
+ supported: false,
250
+ unsupportedReason: error instanceof Error
251
+ ? `Unable to run ${command} --version: ${error.message}`
252
+ : `Unable to run ${command} --version`,
253
+ version: "unknown",
254
+ };
255
+ }
256
+ const version = stdout.trim() || "unknown";
257
+ const supported = isVersionAtLeast(version, options?.minimumVersion);
258
+ const models = await discoverCodexModels({
259
+ ...(options?.env ? { env: options.env } : {}),
260
+ executablePath,
261
+ });
262
+ return {
263
+ authState: "unknown",
264
+ configDir,
265
+ executablePath,
266
+ models,
267
+ skillsDir: path.join(configDir, "skills"),
268
+ supported,
269
+ ...(options?.minimumVersion
270
+ ? { minimumVersion: options.minimumVersion }
271
+ : {}),
272
+ ...(supported
273
+ ? {}
274
+ : {
275
+ unsupportedReason: `Codex ${version} is older than the required ${options?.minimumVersion}`,
276
+ }),
277
+ version,
278
+ };
279
+ }
280
+ //# sourceMappingURL=detect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.js","sourceRoot":"","sources":["../../../src/providers/codex/detect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { LocalAgentProviderPlugin } from "../../core/provider-plugin.js";
2
+ export declare function createCodexProvider(): LocalAgentProviderPlugin<"local-agent", "codex">;
3
+ export declare const codexProvider: LocalAgentProviderPlugin<"local-agent", "codex">;
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/codex/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAsU9E,wBAAgB,mBAAmB,IAAI,wBAAwB,CAC7D,aAAa,EACb,OAAO,CACR,CA8HA;AAED,eAAO,MAAM,aAAa,kDAAwB,CAAC"}
@@ -0,0 +1,383 @@
1
+ import { copyFile, mkdir, mkdtemp, readFile, writeFile } from "node:fs/promises";
2
+ import { homedir, tmpdir } from "node:os";
3
+ import { dirname, join } from "node:path";
4
+ import { normalizeMcpServerConfigs } from "../../core/mcp.js";
5
+ import { materializeSkills } from "../../skills/materialize.js";
6
+ import { cleanupPaths } from "../../skills/cleanup.js";
7
+ import { runJsonlTransport } from "../../transports/jsonl/jsonl-transport.js";
8
+ import { detectCodex } from "./detect.js";
9
+ import { buildCodexLaunchPlan } from "./launch-plan.js";
10
+ import { parseCodexItem } from "./parser.js";
11
+ function escapeTomlString(value) {
12
+ return value.replaceAll("\\", "\\\\").replaceAll('"', '\\"');
13
+ }
14
+ function normalizeCodexModel(model) {
15
+ if (model === "codex:gpt-5")
16
+ return "gpt-5.4";
17
+ if (model === "codex:gpt-5-mini")
18
+ return "gpt-5.4-mini";
19
+ if (model?.startsWith("codex:"))
20
+ return model.slice("codex:".length);
21
+ return model;
22
+ }
23
+ async function* parseCodexRawEvents(stream) {
24
+ let sessionId;
25
+ for await (const item of stream) {
26
+ const record = item && typeof item === "object" && !Array.isArray(item)
27
+ ? item
28
+ : undefined;
29
+ if (record?.type === "thread.started") {
30
+ const thread = record.thread && typeof record.thread === "object" && !Array.isArray(record.thread)
31
+ ? record.thread
32
+ : undefined;
33
+ const candidate = record.threadId ??
34
+ record.thread_id ??
35
+ record.sessionId ??
36
+ record.session_id ??
37
+ thread?.id;
38
+ if (typeof candidate === "string" && candidate.trim()) {
39
+ sessionId = candidate;
40
+ }
41
+ }
42
+ if (item && typeof item === "object" && "type" in item) {
43
+ const candidate = item;
44
+ if (candidate.type === "done" && sessionId && !candidate.sessionId) {
45
+ yield { ...candidate, sessionId };
46
+ continue;
47
+ }
48
+ if (candidate.type === "done" ||
49
+ candidate.type === "error" ||
50
+ candidate.type === "status" ||
51
+ candidate.type === "text_delta" ||
52
+ candidate.type === "thinking_delta" ||
53
+ candidate.type === "tool_call" ||
54
+ candidate.type === "tool_result") {
55
+ yield candidate;
56
+ continue;
57
+ }
58
+ }
59
+ yield* parseCodexItem(item);
60
+ }
61
+ }
62
+ function buildCodexPrompt(input) {
63
+ const materializedSkills = input.skills.filter((skill) => skill.deliveryMode === "materialized-files" && skill.materializedPath);
64
+ const injectedSkills = input.skills.filter((skill) => skill.deliveryMode === "prompt-injection" ||
65
+ skill.deliveryMode === "project-instructions");
66
+ const historyTranscript = (input.history ?? [])
67
+ .filter((message) => message.role === "user" || message.role === "assistant")
68
+ .map((message) => `${message.role === "user" ? "User" : "Assistant"}:\n${message.content}`)
69
+ .join("\n\n");
70
+ const materializedSkillSection = materializedSkills.length > 0
71
+ ? `Workspace skills are materialized under the current run directory. Read the referenced SKILL.md before following a skill.\n${materializedSkills
72
+ .map((skill) => `- ${skill.slug}: ${skill.materializedPath}/SKILL.md`)
73
+ .join("\n")}`
74
+ : "";
75
+ const injectedSkillSection = injectedSkills.length > 0
76
+ ? `Injected skills:\n${injectedSkills
77
+ .map((skill) => {
78
+ const base = `- ${skill.slug}`;
79
+ if (skill.content?.trim()) {
80
+ return `${base}\n${skill.content.trim()}`;
81
+ }
82
+ return base;
83
+ })
84
+ .join("\n")}`
85
+ : "";
86
+ const historySection = historyTranscript
87
+ ? `Conversation history:\n${historyTranscript}`
88
+ : "";
89
+ return [
90
+ input.systemPrompt?.trim(),
91
+ "You are a local Codex runtime.",
92
+ "Prefer available MCP tools instead of faking external side effects.",
93
+ "Do not claim a tool action happened unless the tool actually succeeded.",
94
+ materializedSkillSection,
95
+ injectedSkillSection,
96
+ historySection,
97
+ "Current request:",
98
+ input.prompt,
99
+ ]
100
+ .filter(Boolean)
101
+ .join("\n\n");
102
+ }
103
+ async function ensureParentDirectory(path) {
104
+ await mkdir(dirname(path), { recursive: true });
105
+ }
106
+ async function copyOptionalFile(source, target) {
107
+ try {
108
+ await ensureParentDirectory(target);
109
+ await copyFile(source, target);
110
+ return true;
111
+ }
112
+ catch {
113
+ return false;
114
+ }
115
+ }
116
+ function buildMcpConfigBlock(servers) {
117
+ const lines = [];
118
+ for (const server of servers) {
119
+ lines.push("", `[mcp_servers.${server.name}]`);
120
+ if (server.type === "http") {
121
+ lines.push('type = "http"');
122
+ lines.push(`url = "${escapeTomlString(server.url)}"`);
123
+ if (server.headers && Object.keys(server.headers).length > 0) {
124
+ lines.push("", `[mcp_servers.${server.name}.headers]`);
125
+ for (const [key, value] of Object.entries(server.headers)) {
126
+ lines.push(`${key} = "${escapeTomlString(value)}"`);
127
+ }
128
+ }
129
+ }
130
+ else {
131
+ lines.push('type = "stdio"');
132
+ lines.push(`command = "${escapeTomlString(server.command)}"`);
133
+ if (server.args && server.args.length > 0) {
134
+ lines.push(`args = [${server.args.map((arg) => `"${escapeTomlString(arg)}"`).join(", ")}]`);
135
+ }
136
+ }
137
+ if (server.env.length > 0) {
138
+ lines.push("", `[mcp_servers.${server.name}.env]`);
139
+ for (const entry of server.env) {
140
+ lines.push(`${entry.key} = "${escapeTomlString(entry.value)}"`);
141
+ }
142
+ }
143
+ }
144
+ return lines.join("\n");
145
+ }
146
+ function collectMcpRedactionSecrets(servers) {
147
+ const secrets = [];
148
+ for (const server of servers) {
149
+ for (const entry of server.env) {
150
+ secrets.push(entry.value);
151
+ }
152
+ if (server.type === "http" && server.headers) {
153
+ secrets.push(...Object.values(server.headers));
154
+ }
155
+ }
156
+ return secrets.filter((secret) => secret.length > 0);
157
+ }
158
+ async function readOptionalFile(path) {
159
+ try {
160
+ return await readFile(path, "utf8");
161
+ }
162
+ catch {
163
+ return undefined;
164
+ }
165
+ }
166
+ function getTomlTableName(line) {
167
+ const match = line.trim().match(/^\[([^\]]+)\]\s*(?:#.*)?$/);
168
+ return match?.[1]?.trim();
169
+ }
170
+ function isTomlTableHeader(line) {
171
+ return Boolean(getTomlTableName(line));
172
+ }
173
+ function isRootTomlKey(line, key) {
174
+ const escapedKey = key.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
175
+ return new RegExp(`^\\s*${escapedKey}\\s*=`).test(line);
176
+ }
177
+ function isUnsupportedCodexServiceTierLine(line) {
178
+ if (!isRootTomlKey(line, "service_tier"))
179
+ return false;
180
+ const match = line.match(/^\s*service_tier\s*=\s*(?:"([^"]*)"|'([^']*)'|([^#\s]+))/);
181
+ const value = match?.[1] ?? match?.[2] ?? match?.[3];
182
+ return value !== "fast" && value !== "flex";
183
+ }
184
+ function isMcpServerTable(tableName, serverNames) {
185
+ if (!tableName)
186
+ return false;
187
+ for (const serverName of serverNames) {
188
+ const prefix = `mcp_servers.${serverName}`;
189
+ if (tableName === prefix || tableName.startsWith(`${prefix}.`)) {
190
+ return true;
191
+ }
192
+ }
193
+ return false;
194
+ }
195
+ function mergeCodexConfigToml(params) {
196
+ const mcpConfigBlock = buildMcpConfigBlock(params.mcpServers).trim();
197
+ if (!params.sourceConfig) {
198
+ const lines = [
199
+ params.model && params.model !== "default"
200
+ ? `model = "${escapeTomlString(params.model)}"`
201
+ : undefined,
202
+ mcpConfigBlock,
203
+ ].filter(Boolean);
204
+ return `${lines.join("\n\n")}\n`;
205
+ }
206
+ const serverNames = new Set(params.mcpServers.map((server) => server.name));
207
+ const sourceLines = params.sourceConfig.split(/\r?\n/);
208
+ const rootLines = [];
209
+ const tableBlocks = [];
210
+ let currentTable;
211
+ for (const line of sourceLines) {
212
+ if (isTomlTableHeader(line)) {
213
+ currentTable = [line];
214
+ tableBlocks.push(currentTable);
215
+ continue;
216
+ }
217
+ if (currentTable) {
218
+ currentTable.push(line);
219
+ }
220
+ else {
221
+ rootLines.push(line);
222
+ }
223
+ }
224
+ const mergedRootLines = rootLines.filter((line) => {
225
+ if (params.model && params.model !== "default" && isRootTomlKey(line, "model")) {
226
+ return false;
227
+ }
228
+ return !isUnsupportedCodexServiceTierLine(line);
229
+ });
230
+ while (mergedRootLines.length > 0 && !mergedRootLines[mergedRootLines.length - 1]?.trim()) {
231
+ mergedRootLines.pop();
232
+ }
233
+ if (params.model && params.model !== "default") {
234
+ mergedRootLines.push(`model = "${escapeTomlString(params.model)}"`);
235
+ }
236
+ const mergedTableBlocks = tableBlocks.filter((block) => {
237
+ const tableName = getTomlTableName(block[0] ?? "");
238
+ return !isMcpServerTable(tableName, serverNames);
239
+ });
240
+ const sections = [
241
+ mergedRootLines.join("\n").trim(),
242
+ ...mergedTableBlocks.map((block) => block.join("\n").trim()).filter(Boolean),
243
+ mcpConfigBlock,
244
+ ].filter(Boolean);
245
+ return `${sections.join("\n\n")}\n`;
246
+ }
247
+ async function materializeCodexHome(params) {
248
+ const normalizedServers = normalizeMcpServerConfigs(params.mcpServers ?? []);
249
+ const sourceHome = params.env?.CODEX_HOME ??
250
+ process.env.CODEX_HOME ??
251
+ join(homedir(), ".codex");
252
+ const runHome = await mkdtemp(join(tmpdir(), "agent-acp-kit-codex-home-"));
253
+ const authCopied = await copyOptionalFile(join(sourceHome, "auth.json"), join(runHome, "auth.json"));
254
+ if (!authCopied) {
255
+ throw new Error(`Codex auth is unavailable for local-agent runs. Expected auth.json under ${sourceHome}.`);
256
+ }
257
+ const sourceConfig = await readOptionalFile(join(sourceHome, "config.toml"));
258
+ await writeFile(join(runHome, "config.toml"), mergeCodexConfigToml({
259
+ sourceConfig,
260
+ ...(params.model ? { model: params.model } : {}),
261
+ mcpServers: normalizedServers,
262
+ }), "utf8");
263
+ return runHome;
264
+ }
265
+ export function createCodexProvider() {
266
+ const cleanupByRunId = new Map();
267
+ async function prepareLaunchPlan(params) {
268
+ const materialized = await materializeSkills(params.cwd, params.skillManifest ?? []);
269
+ const prompt = buildCodexPrompt({
270
+ prompt: params.prompt,
271
+ ...(params.history ? { history: params.history } : {}),
272
+ skills: materialized,
273
+ ...(params.systemPrompt ? { systemPrompt: params.systemPrompt } : {}),
274
+ });
275
+ const normalizedModel = normalizeCodexModel(params.model);
276
+ const redactionSecrets = collectMcpRedactionSecrets(normalizeMcpServerConfigs(params.mcpServers ?? []));
277
+ const codexHome = await materializeCodexHome({
278
+ ...(params.env ? { env: params.env } : {}),
279
+ ...(params.mcpServers ? { mcpServers: params.mcpServers } : {}),
280
+ ...(normalizedModel ? { model: normalizedModel } : {}),
281
+ });
282
+ const cleanupTargets = [
283
+ ...materialized
284
+ .map((skill) => skill.materializedPath)
285
+ .filter((path) => Boolean(path)),
286
+ ...(codexHome ? [codexHome] : []),
287
+ ];
288
+ if (cleanupTargets.length > 0) {
289
+ cleanupByRunId.set(params.runId, cleanupTargets);
290
+ }
291
+ return {
292
+ ...buildCodexLaunchPlan({
293
+ ...params,
294
+ ...(codexHome
295
+ ? {
296
+ env: {
297
+ ...(params.env ?? {}),
298
+ CODEX_HOME: codexHome,
299
+ },
300
+ }
301
+ : {}),
302
+ ...(normalizedModel ? { model: normalizedModel } : {}),
303
+ prompt,
304
+ }),
305
+ ...(redactionSecrets.length > 0 ? { redactionSecrets } : {}),
306
+ };
307
+ }
308
+ async function cleanupRun(runId) {
309
+ const cleanupTargets = cleanupByRunId.get(runId) ?? [];
310
+ cleanupByRunId.delete(runId);
311
+ await cleanupPaths(cleanupTargets);
312
+ }
313
+ const plugin = {
314
+ id: "codex",
315
+ displayName: "Codex CLI",
316
+ kind: "local-agent",
317
+ async detect() {
318
+ return detectCodex();
319
+ },
320
+ capabilities() {
321
+ return {
322
+ cancel: true,
323
+ nativeResume: true,
324
+ streaming: true,
325
+ toolGateway: true,
326
+ maxConcurrentRuns: Number.MAX_SAFE_INTEGER,
327
+ };
328
+ },
329
+ async buildLaunchPlan(params) {
330
+ return {
331
+ ...(await prepareLaunchPlan(params)),
332
+ ...(params.mcpServers ? { mcpServers: params.mcpServers } : {}),
333
+ ...(params.model ? { model: params.model } : {}),
334
+ runId: params.runId,
335
+ transport: "jsonl",
336
+ };
337
+ },
338
+ createAdapter() {
339
+ let adapterRunId;
340
+ return {
341
+ buildLaunchPlan: async (params) => {
342
+ adapterRunId = params.runId;
343
+ return {
344
+ ...(await prepareLaunchPlan(params)),
345
+ ...(params.mcpServers ? { mcpServers: params.mcpServers } : {}),
346
+ runId: params.runId,
347
+ transport: "jsonl",
348
+ };
349
+ },
350
+ capabilities: () => plugin.capabilities(),
351
+ parseEvents: async function* (stream) {
352
+ try {
353
+ for await (const event of parseCodexRawEvents(stream)) {
354
+ yield event;
355
+ }
356
+ }
357
+ finally {
358
+ if (adapterRunId) {
359
+ await cleanupRun(adapterRunId);
360
+ }
361
+ }
362
+ },
363
+ };
364
+ },
365
+ async *run(params) {
366
+ const plan = {
367
+ ...(await prepareLaunchPlan(params)),
368
+ ...(params.mcpServers ? { mcpServers: params.mcpServers } : {}),
369
+ runId: params.runId,
370
+ transport: "jsonl",
371
+ };
372
+ try {
373
+ yield* runJsonlTransport(plan, parseCodexItem, params.signal);
374
+ }
375
+ finally {
376
+ await cleanupRun(params.runId);
377
+ }
378
+ },
379
+ };
380
+ return plugin;
381
+ }
382
+ export const codexProvider = createCodexProvider();
383
+ //# sourceMappingURL=index.js.map