contextos-mcp 0.4.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 (223) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +260 -0
  3. package/bin/mcp.mjs +61 -0
  4. package/bin/swarm.mjs +45 -0
  5. package/dist/agents/aider.d.ts +12 -0
  6. package/dist/agents/aider.js +192 -0
  7. package/dist/agents/aider.js.map +1 -0
  8. package/dist/agents/claude-code.d.ts +9 -0
  9. package/dist/agents/claude-code.js +236 -0
  10. package/dist/agents/claude-code.js.map +1 -0
  11. package/dist/agents/codex.d.ts +14 -0
  12. package/dist/agents/codex.js +203 -0
  13. package/dist/agents/codex.js.map +1 -0
  14. package/dist/agents/direct-llm.d.ts +22 -0
  15. package/dist/agents/direct-llm.js +254 -0
  16. package/dist/agents/direct-llm.js.map +1 -0
  17. package/dist/agents/mock.d.ts +10 -0
  18. package/dist/agents/mock.js +170 -0
  19. package/dist/agents/mock.js.map +1 -0
  20. package/dist/agents/opencode.d.ts +23 -0
  21. package/dist/agents/opencode.js +631 -0
  22. package/dist/agents/opencode.js.map +1 -0
  23. package/dist/agents/provider.d.ts +11 -0
  24. package/dist/agents/provider.js +31 -0
  25. package/dist/agents/provider.js.map +1 -0
  26. package/dist/compression/compressor.d.ts +28 -0
  27. package/dist/compression/compressor.js +268 -0
  28. package/dist/compression/compressor.js.map +1 -0
  29. package/dist/config.d.ts +43 -0
  30. package/dist/config.js +172 -0
  31. package/dist/config.js.map +1 -0
  32. package/dist/contextos/loader.d.ts +46 -0
  33. package/dist/contextos/loader.js +120 -0
  34. package/dist/contextos/loader.js.map +1 -0
  35. package/dist/contextos/selector.d.ts +46 -0
  36. package/dist/contextos/selector.js +80 -0
  37. package/dist/contextos/selector.js.map +1 -0
  38. package/dist/core/action-dispatcher.d.ts +15 -0
  39. package/dist/core/action-dispatcher.js +28 -0
  40. package/dist/core/action-dispatcher.js.map +1 -0
  41. package/dist/core/action-schema.d.ts +72 -0
  42. package/dist/core/action-schema.js +86 -0
  43. package/dist/core/action-schema.js.map +1 -0
  44. package/dist/core/repl-interface.d.ts +48 -0
  45. package/dist/core/repl-interface.js +5 -0
  46. package/dist/core/repl-interface.js.map +1 -0
  47. package/dist/core/repl.d.ts +59 -0
  48. package/dist/core/repl.js +353 -0
  49. package/dist/core/repl.js.map +1 -0
  50. package/dist/core/rlm.d.ts +65 -0
  51. package/dist/core/rlm.js +564 -0
  52. package/dist/core/rlm.js.map +1 -0
  53. package/dist/core/runtime.py +470 -0
  54. package/dist/core/types.d.ts +265 -0
  55. package/dist/core/types.js +19 -0
  56. package/dist/core/types.js.map +1 -0
  57. package/dist/env.d.ts +10 -0
  58. package/dist/env.js +75 -0
  59. package/dist/env.js.map +1 -0
  60. package/dist/hooks/runner.d.ts +43 -0
  61. package/dist/hooks/runner.js +173 -0
  62. package/dist/hooks/runner.js.map +1 -0
  63. package/dist/labs/cli.d.ts +15 -0
  64. package/dist/labs/cli.js +295 -0
  65. package/dist/labs/cli.js.map +1 -0
  66. package/dist/labs/episodic-memory.d.ts +132 -0
  67. package/dist/labs/episodic-memory.js +391 -0
  68. package/dist/labs/episodic-memory.js.map +1 -0
  69. package/dist/labs/interactive-swarm.d.ts +20 -0
  70. package/dist/labs/interactive-swarm.js +1173 -0
  71. package/dist/labs/interactive-swarm.js.map +1 -0
  72. package/dist/labs/interactive.d.ts +10 -0
  73. package/dist/labs/interactive.js +2099 -0
  74. package/dist/labs/interactive.js.map +1 -0
  75. package/dist/labs/ts-analyzer.d.ts +74 -0
  76. package/dist/labs/ts-analyzer.js +379 -0
  77. package/dist/labs/ts-analyzer.js.map +1 -0
  78. package/dist/labs/viewer.d.ts +12 -0
  79. package/dist/labs/viewer.js +1284 -0
  80. package/dist/labs/viewer.js.map +1 -0
  81. package/dist/main.d.ts +15 -0
  82. package/dist/main.js +247 -0
  83. package/dist/main.js.map +1 -0
  84. package/dist/mcp/server.d.ts +16 -0
  85. package/dist/mcp/server.js +192775 -0
  86. package/dist/mcp/server.js.map +1 -0
  87. package/dist/mcp/session.d.ts +117 -0
  88. package/dist/mcp/session.js +450 -0
  89. package/dist/mcp/session.js.map +1 -0
  90. package/dist/mcp/state.d.ts +42 -0
  91. package/dist/mcp/state.js +537 -0
  92. package/dist/mcp/state.js.map +1 -0
  93. package/dist/mcp/tools/contextos.d.ts +17 -0
  94. package/dist/mcp/tools/contextos.js +583 -0
  95. package/dist/mcp/tools/contextos.js.map +1 -0
  96. package/dist/mcp/tools.d.ts +15 -0
  97. package/dist/mcp/tools.js +393 -0
  98. package/dist/mcp/tools.js.map +1 -0
  99. package/dist/orchestration/reviewer-gate.d.ts +43 -0
  100. package/dist/orchestration/reviewer-gate.js +280 -0
  101. package/dist/orchestration/reviewer-gate.js.map +1 -0
  102. package/dist/orchestration/reviewer-prompt.d.ts +18 -0
  103. package/dist/orchestration/reviewer-prompt.js +67 -0
  104. package/dist/orchestration/reviewer-prompt.js.map +1 -0
  105. package/dist/orchestration/verification-runner.d.ts +53 -0
  106. package/dist/orchestration/verification-runner.js +352 -0
  107. package/dist/orchestration/verification-runner.js.map +1 -0
  108. package/dist/plugins/adapter.d.ts +11 -0
  109. package/dist/plugins/adapter.js +11 -0
  110. package/dist/plugins/adapter.js.map +1 -0
  111. package/dist/plugins/core/archive.d.ts +9 -0
  112. package/dist/plugins/core/archive.js +128 -0
  113. package/dist/plugins/core/archive.js.map +1 -0
  114. package/dist/plugins/core/digest.d.ts +11 -0
  115. package/dist/plugins/core/digest.js +70 -0
  116. package/dist/plugins/core/digest.js.map +1 -0
  117. package/dist/plugins/core/grants.d.ts +22 -0
  118. package/dist/plugins/core/grants.js +90 -0
  119. package/dist/plugins/core/grants.js.map +1 -0
  120. package/dist/plugins/core/index.d.ts +10 -0
  121. package/dist/plugins/core/index.js +11 -0
  122. package/dist/plugins/core/index.js.map +1 -0
  123. package/dist/plugins/core/pinning.d.ts +15 -0
  124. package/dist/plugins/core/pinning.js +86 -0
  125. package/dist/plugins/core/pinning.js.map +1 -0
  126. package/dist/plugins/core/types.d.ts +105 -0
  127. package/dist/plugins/core/types.js +22 -0
  128. package/dist/plugins/core/types.js.map +1 -0
  129. package/dist/plugins/core/updater.d.ts +16 -0
  130. package/dist/plugins/core/updater.js +64 -0
  131. package/dist/plugins/core/updater.js.map +1 -0
  132. package/dist/plugins/loader.d.ts +65 -0
  133. package/dist/plugins/loader.js +110 -0
  134. package/dist/plugins/loader.js.map +1 -0
  135. package/dist/prompts/orchestrator.d.ts +6 -0
  136. package/dist/prompts/orchestrator.js +114 -0
  137. package/dist/prompts/orchestrator.js.map +1 -0
  138. package/dist/routing/model-resolver.d.ts +27 -0
  139. package/dist/routing/model-resolver.js +265 -0
  140. package/dist/routing/model-resolver.js.map +1 -0
  141. package/dist/routing/model-router.d.ts +130 -0
  142. package/dist/routing/model-router.js +515 -0
  143. package/dist/routing/model-router.js.map +1 -0
  144. package/dist/runtime/attestations.cjs +260 -0
  145. package/dist/runtime/reviewer-pipeline.cjs +319 -0
  146. package/dist/runtime/sandbox.cjs +468 -0
  147. package/dist/runtime/state-machine.cjs +885 -0
  148. package/dist/runtime/thread-store.cjs +175 -0
  149. package/dist/runtime/transactional-git.cjs +315 -0
  150. package/dist/runtime/verification-pipeline.cjs +435 -0
  151. package/dist/sandbox/execution.d.ts +165 -0
  152. package/dist/sandbox/execution.js +497 -0
  153. package/dist/sandbox/execution.js.map +1 -0
  154. package/dist/security/file-policy.d.ts +22 -0
  155. package/dist/security/file-policy.js +53 -0
  156. package/dist/security/file-policy.js.map +1 -0
  157. package/dist/security/repository-boundary.d.ts +21 -0
  158. package/dist/security/repository-boundary.js +119 -0
  159. package/dist/security/repository-boundary.js.map +1 -0
  160. package/dist/security/secret-filter.d.ts +36 -0
  161. package/dist/security/secret-filter.js +149 -0
  162. package/dist/security/secret-filter.js.map +1 -0
  163. package/dist/swarm.d.ts +14 -0
  164. package/dist/swarm.js +624 -0
  165. package/dist/swarm.js.map +1 -0
  166. package/dist/threads/cache.d.ts +64 -0
  167. package/dist/threads/cache.js +241 -0
  168. package/dist/threads/cache.js.map +1 -0
  169. package/dist/threads/manager.d.ts +94 -0
  170. package/dist/threads/manager.js +914 -0
  171. package/dist/threads/manager.js.map +1 -0
  172. package/dist/ui/banner.d.ts +14 -0
  173. package/dist/ui/banner.js +42 -0
  174. package/dist/ui/banner.js.map +1 -0
  175. package/dist/ui/dashboard.d.ts +33 -0
  176. package/dist/ui/dashboard.js +135 -0
  177. package/dist/ui/dashboard.js.map +1 -0
  178. package/dist/ui/index.d.ts +11 -0
  179. package/dist/ui/index.js +12 -0
  180. package/dist/ui/index.js.map +1 -0
  181. package/dist/ui/log.d.ts +39 -0
  182. package/dist/ui/log.js +126 -0
  183. package/dist/ui/log.js.map +1 -0
  184. package/dist/ui/onboarding.d.ts +14 -0
  185. package/dist/ui/onboarding.js +755 -0
  186. package/dist/ui/onboarding.js.map +1 -0
  187. package/dist/ui/run-log.d.ts +50 -0
  188. package/dist/ui/run-log.js +60 -0
  189. package/dist/ui/run-log.js.map +1 -0
  190. package/dist/ui/spinner.d.ts +41 -0
  191. package/dist/ui/spinner.js +172 -0
  192. package/dist/ui/spinner.js.map +1 -0
  193. package/dist/ui/streaming-feed.d.ts +72 -0
  194. package/dist/ui/streaming-feed.js +386 -0
  195. package/dist/ui/streaming-feed.js.map +1 -0
  196. package/dist/ui/summary.d.ts +18 -0
  197. package/dist/ui/summary.js +113 -0
  198. package/dist/ui/summary.js.map +1 -0
  199. package/dist/ui/text-input.d.ts +19 -0
  200. package/dist/ui/text-input.js +266 -0
  201. package/dist/ui/text-input.js.map +1 -0
  202. package/dist/ui/theme.d.ts +63 -0
  203. package/dist/ui/theme.js +97 -0
  204. package/dist/ui/theme.js.map +1 -0
  205. package/dist/utils/command-exists.d.ts +11 -0
  206. package/dist/utils/command-exists.js +41 -0
  207. package/dist/utils/command-exists.js.map +1 -0
  208. package/dist/utils/process-security.d.ts +19 -0
  209. package/dist/utils/process-security.js +90 -0
  210. package/dist/utils/process-security.js.map +1 -0
  211. package/dist/utils/rolling-buffer.d.ts +16 -0
  212. package/dist/utils/rolling-buffer.js +30 -0
  213. package/dist/utils/rolling-buffer.js.map +1 -0
  214. package/dist/utils/safe-spawn.d.ts +13 -0
  215. package/dist/utils/safe-spawn.js +49 -0
  216. package/dist/utils/safe-spawn.js.map +1 -0
  217. package/dist/worktree/manager.d.ts +69 -0
  218. package/dist/worktree/manager.js +593 -0
  219. package/dist/worktree/manager.js.map +1 -0
  220. package/dist/worktree/merge.d.ts +58 -0
  221. package/dist/worktree/merge.js +389 -0
  222. package/dist/worktree/merge.js.map +1 -0
  223. package/package.json +63 -0
@@ -0,0 +1,236 @@
1
+ /**
2
+ * Claude Code agent backend.
3
+ *
4
+ * Runs tasks via `claude -p --output-format json "prompt"` subprocess.
5
+ * Parses structured JSON output for results, cost, and file changes.
6
+ */
7
+ import * as os from "node:os";
8
+ import { commandExists } from "../utils/command-exists.js";
9
+ import { RollingBuffer } from "../utils/rolling-buffer.js";
10
+ import { safeSpawn } from "../utils/safe-spawn.js";
11
+ import { registerAgent } from "./provider.js";
12
+ /** Extract JSON result from output (may contain non-JSON lines from debug/stderr bleed). */
13
+ function extractJson(raw) {
14
+ // Try direct parse first
15
+ try {
16
+ return JSON.parse(raw);
17
+ }
18
+ catch {
19
+ /* mixed output */
20
+ }
21
+ // Try last line (claude outputs JSON as final line)
22
+ const lines = raw.trim().split("\n");
23
+ for (let i = lines.length - 1; i >= 0; i--) {
24
+ const line = lines[i].trim();
25
+ if (line.startsWith("{")) {
26
+ try {
27
+ const parsed = JSON.parse(line);
28
+ if (parsed.type === "result")
29
+ return parsed;
30
+ }
31
+ catch { }
32
+ }
33
+ }
34
+ // Fallback: find first { to last }
35
+ const firstBrace = raw.indexOf("{");
36
+ const lastBrace = raw.lastIndexOf("}");
37
+ if (firstBrace !== -1 && lastBrace > firstBrace) {
38
+ try {
39
+ return JSON.parse(raw.slice(firstBrace, lastBrace + 1));
40
+ }
41
+ catch {
42
+ /* give up */
43
+ }
44
+ }
45
+ return null;
46
+ }
47
+ /** Whitelist of env vars safe to pass to agent subprocess. */
48
+ function buildAgentEnv() {
49
+ const homeDir = os.homedir();
50
+ return {
51
+ PATH: process.env.PATH,
52
+ HOME: homeDir,
53
+ USERPROFILE: homeDir,
54
+ SHELL: process.env.SHELL,
55
+ TERM: process.env.TERM,
56
+ LANG: process.env.LANG,
57
+ // Claude Code uses ANTHROPIC_API_KEY
58
+ ANTHROPIC_API_KEY: process.env.ANTHROPIC_API_KEY,
59
+ // Git config
60
+ GIT_AUTHOR_NAME: process.env.GIT_AUTHOR_NAME,
61
+ GIT_AUTHOR_EMAIL: process.env.GIT_AUTHOR_EMAIL,
62
+ GIT_COMMITTER_NAME: process.env.GIT_COMMITTER_NAME,
63
+ GIT_COMMITTER_EMAIL: process.env.GIT_COMMITTER_EMAIL,
64
+ // XDG dirs (claude may use for config)
65
+ XDG_CONFIG_HOME: process.env.XDG_CONFIG_HOME,
66
+ XDG_DATA_HOME: process.env.XDG_DATA_HOME,
67
+ // Windows
68
+ ...(process.env.SystemRoot ? { SystemRoot: process.env.SystemRoot } : {}),
69
+ ...(process.env.SYSTEMROOT ? { SYSTEMROOT: process.env.SYSTEMROOT } : {}),
70
+ };
71
+ }
72
+ /** Map provider/model format to claude model flag. */
73
+ function resolveModel(model) {
74
+ // Strip provider prefix if present (e.g., "anthropic/claude-sonnet-4-6" → "claude-sonnet-4-6")
75
+ const modelName = model.includes("/") ? model.split("/").pop() : model;
76
+ // Claude Code accepts short aliases
77
+ const aliases = {
78
+ "claude-sonnet-4-6": "sonnet",
79
+ "claude-opus-4-6": "opus",
80
+ "claude-haiku-4-5": "haiku",
81
+ };
82
+ return aliases[modelName] || modelName;
83
+ }
84
+ const claudeCodeProvider = {
85
+ name: "claude-code",
86
+ async isAvailable() {
87
+ return commandExists("claude");
88
+ },
89
+ async run(options) {
90
+ const { task, workDir, model, files, signal } = options;
91
+ const startTime = Date.now();
92
+ // SECURITY NOTICE & TRUST BOUNDARY:
93
+ // --dangerously-skip-permissions is REQUIRED for non-interactive/headless Claude Code execution.
94
+ // Trust model & isolation boundaries:
95
+ // 1. Git Worktree Isolation: Agent runs in a dedicated git worktree branch, preventing concurrent
96
+ // edits or corruption in the user's primary working directory.
97
+ // 2. Pre-Commit Filtering: Changed files are filtered before commit (isBlockedPath, isPathAllowed).
98
+ // 3. Environment Sanitization: Child process environment is stripped of sensitive tokens via buildAgentEnv.
99
+ // 4. OS Sandbox Notice: The child process runs with host OS user privileges and is NOT sandboxed
100
+ // at the kernel/syscall level. For untrusted code execution or multi-tenant hosting, ContextOS
101
+ // must be wrapped in an OS-level container (Docker, Podman) or OS sandbox (e.g. bubblewrap).
102
+ const args = ["-p", "--output-format", "json", "--dangerously-skip-permissions", "--no-session-persistence"];
103
+ if (model) {
104
+ args.push("--model", resolveModel(model));
105
+ }
106
+ // Build the prompt — include file hints if provided
107
+ let prompt = task;
108
+ if (files && files.length > 0) {
109
+ prompt += `\n\nRelevant files to focus on:\n${files.map((f) => `- ${f}`).join("\n")}`;
110
+ }
111
+ args.push(prompt);
112
+ let proc;
113
+ try {
114
+ proc = await safeSpawn("claude", args, {
115
+ cwd: workDir,
116
+ stdio: ["ignore", "pipe", "pipe"],
117
+ env: buildAgentEnv(),
118
+ });
119
+ }
120
+ catch (err) {
121
+ return {
122
+ success: false,
123
+ output: "",
124
+ filesChanged: [],
125
+ diff: "",
126
+ error: `Failed to spawn claude: ${err instanceof Error ? err.message : String(err)}`,
127
+ durationMs: 0,
128
+ };
129
+ }
130
+ return new Promise((resolve) => {
131
+ const stdoutBuf = new RollingBuffer(2 * 1024 * 1024); // 2MB
132
+ const stderrBuf = new RollingBuffer(512 * 1024); // 512KB
133
+ let resolved = false;
134
+ const doResolve = (result) => {
135
+ if (resolved)
136
+ return;
137
+ resolved = true;
138
+ resolve(result);
139
+ };
140
+ proc.stdout?.on("data", (chunk) => {
141
+ const text = chunk.toString();
142
+ stdoutBuf.append(text);
143
+ options.onOutput?.(text);
144
+ });
145
+ proc.stderr?.on("data", (chunk) => {
146
+ stderrBuf.append(chunk.toString());
147
+ });
148
+ if (signal) {
149
+ const onAbort = () => {
150
+ proc.kill("SIGTERM");
151
+ const killTimer = setTimeout(() => {
152
+ try {
153
+ if (proc.exitCode === null)
154
+ proc.kill("SIGKILL");
155
+ }
156
+ catch {
157
+ /* already dead */
158
+ }
159
+ }, 3000);
160
+ proc.on("exit", () => clearTimeout(killTimer));
161
+ };
162
+ if (signal.aborted) {
163
+ onAbort();
164
+ }
165
+ else {
166
+ signal.addEventListener("abort", onAbort, { once: true });
167
+ proc.on("exit", () => signal.removeEventListener("abort", onAbort));
168
+ }
169
+ }
170
+ proc.on("close", (code) => {
171
+ const stdout = stdoutBuf.toString();
172
+ const stderr = stderrBuf.toString();
173
+ const durationMs = Date.now() - startTime;
174
+ const parsed = extractJson(stdout);
175
+ if (parsed) {
176
+ // Extract token usage from Claude Code's structured output
177
+ let usage;
178
+ if (parsed.usage) {
179
+ const inputTokens = parsed.usage.input_tokens ?? 0;
180
+ const outputTokens = parsed.usage.output_tokens ?? 0;
181
+ if (inputTokens > 0 || outputTokens > 0) {
182
+ usage = {
183
+ inputTokens,
184
+ outputTokens,
185
+ totalTokens: inputTokens + outputTokens,
186
+ };
187
+ }
188
+ }
189
+ if (parsed.is_error) {
190
+ doResolve({
191
+ success: false,
192
+ output: parsed.result || stderr,
193
+ filesChanged: [],
194
+ diff: "",
195
+ durationMs: parsed.duration_ms || durationMs,
196
+ error: parsed.result || `Claude Code error: ${parsed.subtype}`,
197
+ usage,
198
+ });
199
+ return;
200
+ }
201
+ doResolve({
202
+ success: true,
203
+ output: parsed.result || "",
204
+ filesChanged: [], // Diff is captured separately by worktree manager
205
+ diff: "",
206
+ durationMs: parsed.duration_ms || durationMs,
207
+ usage,
208
+ });
209
+ return;
210
+ }
211
+ // Fallback: no JSON parsed — use raw output
212
+ doResolve({
213
+ success: code === 0,
214
+ output: stdout || stderr,
215
+ filesChanged: [],
216
+ diff: "",
217
+ durationMs,
218
+ error: code !== 0 ? `claude exited with code ${code}${stderr ? `: ${stderr.slice(0, 500)}` : ""}` : undefined,
219
+ });
220
+ });
221
+ proc.on("error", (err) => {
222
+ doResolve({
223
+ success: false,
224
+ output: "",
225
+ filesChanged: [],
226
+ diff: "",
227
+ durationMs: Date.now() - startTime,
228
+ error: `Failed to spawn claude: ${err.message}`,
229
+ });
230
+ });
231
+ });
232
+ },
233
+ };
234
+ registerAgent(claudeCodeProvider);
235
+ export default claudeCodeProvider;
236
+ //# sourceMappingURL=claude-code.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../src/agents/claude-code.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAE9B,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAsB9C,4FAA4F;AAC5F,SAAS,WAAW,CAAC,GAAW;IAC/B,yBAAyB;IACzB,IAAI,CAAC;QACJ,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAyB,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACR,kBAAkB;IACnB,CAAC;IAED,oDAAoD;IACpD,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACrC,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5C,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC7B,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,IAAI,CAAC;gBACJ,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAyB,CAAC;gBACxD,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ;oBAAE,OAAO,MAAM,CAAC;YAC7C,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;QACX,CAAC;IACF,CAAC;IAED,mCAAmC;IACnC,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACpC,MAAM,SAAS,GAAG,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACvC,IAAI,UAAU,KAAK,CAAC,CAAC,IAAI,SAAS,GAAG,UAAU,EAAE,CAAC;QACjD,IAAI,CAAC;YACJ,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,SAAS,GAAG,CAAC,CAAC,CAAyB,CAAC;QACjF,CAAC;QAAC,MAAM,CAAC;YACR,aAAa;QACd,CAAC;IACF,CAAC;IAED,OAAO,IAAI,CAAC;AACb,CAAC;AAED,8DAA8D;AAC9D,SAAS,aAAa;IACrB,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;IAC7B,OAAO;QACN,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI;QACtB,IAAI,EAAE,OAAO;QACb,WAAW,EAAE,OAAO;QACpB,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,KAAK;QACxB,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI;QACtB,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI;QACtB,qCAAqC;QACrC,iBAAiB,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB;QAChD,aAAa;QACb,eAAe,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe;QAC5C,gBAAgB,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB;QAC9C,kBAAkB,EAAE,OAAO,CAAC,GAAG,CAAC,kBAAkB;QAClD,mBAAmB,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB;QACpD,uCAAuC;QACvC,eAAe,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe;QAC5C,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa;QACxC,UAAU;QACV,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzE,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACzE,CAAC;AACH,CAAC;AAED,sDAAsD;AACtD,SAAS,YAAY,CAAC,KAAa;IAClC,+FAA+F;IAC/F,MAAM,SAAS,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAG,CAAC,CAAC,CAAC,KAAK,CAAC;IAExE,oCAAoC;IACpC,MAAM,OAAO,GAA2B;QACvC,mBAAmB,EAAE,QAAQ;QAC7B,iBAAiB,EAAE,MAAM;QACzB,kBAAkB,EAAE,OAAO;KAC3B,CAAC;IAEF,OAAO,OAAO,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC;AACxC,CAAC;AAED,MAAM,kBAAkB,GAAkB;IACzC,IAAI,EAAE,aAAa;IAEnB,KAAK,CAAC,WAAW;QAChB,OAAO,aAAa,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,OAAwB;QACjC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;QACxD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,oCAAoC;QACpC,iGAAiG;QACjG,sCAAsC;QACtC,oGAAoG;QACpG,oEAAoE;QACpE,sGAAsG;QACtG,8GAA8G;QAC9G,mGAAmG;QACnG,oGAAoG;QACpG,kGAAkG;QAClG,MAAM,IAAI,GAAG,CAAC,IAAI,EAAE,iBAAiB,EAAE,MAAM,EAAE,gCAAgC,EAAE,0BAA0B,CAAC,CAAC;QAE7G,IAAI,KAAK,EAAE,CAAC;YACX,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;QAC3C,CAAC;QAED,oDAAoD;QACpD,IAAI,MAAM,GAAG,IAAI,CAAC;QAClB,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,oCAAoC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACvF,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAElB,IAAI,IAAI,CAAC;QACT,IAAI,CAAC;YACJ,IAAI,GAAG,MAAM,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE;gBACtC,GAAG,EAAE,OAAO;gBACZ,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;gBACjC,GAAG,EAAE,aAAa,EAAE;aACpB,CAAC,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,OAAO;gBACN,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,EAAE;gBACV,YAAY,EAAE,EAAE;gBAChB,IAAI,EAAE,EAAE;gBACR,KAAK,EAAE,2BAA2B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;gBACpF,UAAU,EAAE,CAAC;aACb,CAAC;QACH,CAAC;QAED,OAAO,IAAI,OAAO,CAAc,CAAC,OAAO,EAAE,EAAE;YAC3C,MAAM,SAAS,GAAG,IAAI,aAAa,CAAC,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM;YAC5D,MAAM,SAAS,GAAG,IAAI,aAAa,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,QAAQ;YACzD,IAAI,QAAQ,GAAG,KAAK,CAAC;YAErB,MAAM,SAAS,GAAG,CAAC,MAAmB,EAAE,EAAE;gBACzC,IAAI,QAAQ;oBAAE,OAAO;gBACrB,QAAQ,GAAG,IAAI,CAAC;gBAChB,OAAO,CAAC,MAAM,CAAC,CAAC;YACjB,CAAC,CAAC;YAEF,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;gBACzC,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;gBAC9B,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBACvB,OAAO,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC;YAC1B,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;gBACzC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;YACpC,CAAC,CAAC,CAAC;YAEH,IAAI,MAAM,EAAE,CAAC;gBACZ,MAAM,OAAO,GAAG,GAAG,EAAE;oBACpB,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;oBACrB,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;wBACjC,IAAI,CAAC;4BACJ,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI;gCAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;wBAClD,CAAC;wBAAC,MAAM,CAAC;4BACR,kBAAkB;wBACnB,CAAC;oBACF,CAAC,EAAE,IAAI,CAAC,CAAC;oBACT,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC;gBAChD,CAAC,CAAC;gBACF,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;oBACpB,OAAO,EAAE,CAAC;gBACX,CAAC;qBAAM,CAAC;oBACP,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;oBAC1D,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;gBACrE,CAAC;YACF,CAAC;YAED,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;gBACzB,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC;gBACpC,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC;gBACpC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;gBAE1C,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;gBACnC,IAAI,MAAM,EAAE,CAAC;oBACZ,2DAA2D;oBAC3D,IAAI,KAAwD,CAAC;oBAC7D,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;wBAClB,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,YAAY,IAAI,CAAC,CAAC;wBACnD,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,aAAa,IAAI,CAAC,CAAC;wBACrD,IAAI,WAAW,GAAG,CAAC,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;4BACzC,KAAK,GAAG;gCACP,WAAW;gCACX,YAAY;gCACZ,WAAW,EAAE,WAAW,GAAG,YAAY;6BACvC,CAAC;wBACH,CAAC;oBACF,CAAC;oBAED,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;wBACrB,SAAS,CAAC;4BACT,OAAO,EAAE,KAAK;4BACd,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,MAAM;4BAC/B,YAAY,EAAE,EAAE;4BAChB,IAAI,EAAE,EAAE;4BACR,UAAU,EAAE,MAAM,CAAC,WAAW,IAAI,UAAU;4BAC5C,KAAK,EAAE,MAAM,CAAC,MAAM,IAAI,sBAAsB,MAAM,CAAC,OAAO,EAAE;4BAC9D,KAAK;yBACL,CAAC,CAAC;wBACH,OAAO;oBACR,CAAC;oBAED,SAAS,CAAC;wBACT,OAAO,EAAE,IAAI;wBACb,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,EAAE;wBAC3B,YAAY,EAAE,EAAE,EAAE,kDAAkD;wBACpE,IAAI,EAAE,EAAE;wBACR,UAAU,EAAE,MAAM,CAAC,WAAW,IAAI,UAAU;wBAC5C,KAAK;qBACL,CAAC,CAAC;oBACH,OAAO;gBACR,CAAC;gBAED,4CAA4C;gBAC5C,SAAS,CAAC;oBACT,OAAO,EAAE,IAAI,KAAK,CAAC;oBACnB,MAAM,EAAE,MAAM,IAAI,MAAM;oBACxB,YAAY,EAAE,EAAE;oBAChB,IAAI,EAAE,EAAE;oBACR,UAAU;oBACV,KAAK,EAAE,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,2BAA2B,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS;iBAC7G,CAAC,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;gBACxB,SAAS,CAAC;oBACT,OAAO,EAAE,KAAK;oBACd,MAAM,EAAE,EAAE;oBACV,YAAY,EAAE,EAAE;oBAChB,IAAI,EAAE,EAAE;oBACR,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;oBAClC,KAAK,EAAE,2BAA2B,GAAG,CAAC,OAAO,EAAE;iBAC/C,CAAC,CAAC;YACJ,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;IACJ,CAAC;CACD,CAAC;AAEF,aAAa,CAAC,kBAAkB,CAAC,CAAC;AAClC,eAAe,kBAAkB,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Codex CLI agent backend (OpenAI).
3
+ *
4
+ * Runs tasks via `codex exec --json --full-auto "prompt"` subprocess.
5
+ * Codex CLI is OpenAI's open-source coding agent.
6
+ *
7
+ * Output format: JSONL events streamed to stdout, with event types:
8
+ * - thread.started, turn.started, turn.completed, turn.failed
9
+ * - item.started, item.updated, item.completed
10
+ * Item types: assistant_message, command_execution, file_change, etc.
11
+ */
12
+ import type { AgentProvider } from "../core/types.js";
13
+ declare const codexProvider: AgentProvider;
14
+ export default codexProvider;
@@ -0,0 +1,203 @@
1
+ /**
2
+ * Codex CLI agent backend (OpenAI).
3
+ *
4
+ * Runs tasks via `codex exec --json --full-auto "prompt"` subprocess.
5
+ * Codex CLI is OpenAI's open-source coding agent.
6
+ *
7
+ * Output format: JSONL events streamed to stdout, with event types:
8
+ * - thread.started, turn.started, turn.completed, turn.failed
9
+ * - item.started, item.updated, item.completed
10
+ * Item types: assistant_message, command_execution, file_change, etc.
11
+ */
12
+ import * as os from "node:os";
13
+ import { commandExists } from "../utils/command-exists.js";
14
+ import { RollingBuffer } from "../utils/rolling-buffer.js";
15
+ import { safeSpawn } from "../utils/safe-spawn.js";
16
+ import { registerAgent } from "./provider.js";
17
+ /** Whitelist of env vars safe to pass to agent subprocess. */
18
+ function buildAgentEnv() {
19
+ const homeDir = os.homedir();
20
+ return {
21
+ PATH: process.env.PATH,
22
+ HOME: homeDir,
23
+ USERPROFILE: homeDir,
24
+ SHELL: process.env.SHELL,
25
+ TERM: process.env.TERM,
26
+ LANG: process.env.LANG,
27
+ // Codex uses CODEX_API_KEY or OPENAI_API_KEY
28
+ CODEX_API_KEY: process.env.CODEX_API_KEY || process.env.OPENAI_API_KEY,
29
+ OPENAI_API_KEY: process.env.OPENAI_API_KEY,
30
+ OPENAI_BASE_URL: process.env.OPENAI_BASE_URL,
31
+ // Codex config home
32
+ CODEX_HOME: process.env.CODEX_HOME,
33
+ // Git config
34
+ GIT_AUTHOR_NAME: process.env.GIT_AUTHOR_NAME,
35
+ GIT_AUTHOR_EMAIL: process.env.GIT_AUTHOR_EMAIL,
36
+ GIT_COMMITTER_NAME: process.env.GIT_COMMITTER_NAME,
37
+ GIT_COMMITTER_EMAIL: process.env.GIT_COMMITTER_EMAIL,
38
+ // Windows
39
+ ...(process.env.SystemRoot ? { SystemRoot: process.env.SystemRoot } : {}),
40
+ ...(process.env.SYSTEMROOT ? { SYSTEMROOT: process.env.SYSTEMROOT } : {}),
41
+ };
42
+ }
43
+ /** Map provider/model format to codex model flag. */
44
+ function resolveModel(model) {
45
+ // Strip provider prefix (e.g., "openai/o3" → "o3")
46
+ return model.includes("/") ? model.split("/").pop() : model;
47
+ }
48
+ /** Parse JSONL output to extract result, file changes, and token usage. */
49
+ function parseCodexJsonl(stdout) {
50
+ const lines = stdout.trim().split("\n").filter(Boolean);
51
+ let output = "";
52
+ const filesChanged = [];
53
+ let success = true;
54
+ let error;
55
+ let totalInput = 0;
56
+ let totalOutput = 0;
57
+ for (const line of lines) {
58
+ try {
59
+ const event = JSON.parse(line);
60
+ if (event.type === "turn.failed") {
61
+ success = false;
62
+ error = event.error || "Turn failed";
63
+ }
64
+ if (event.type === "item.completed") {
65
+ if (event.item_type === "assistant_message") {
66
+ // Capture assistant messages
67
+ const content = event.message?.content || event.content || "";
68
+ if (content)
69
+ output += (output ? "\n" : "") + content;
70
+ }
71
+ if (event.item_type === "file_change" && event.file_path) {
72
+ filesChanged.push(event.file_path);
73
+ }
74
+ }
75
+ // Accumulate token usage from events
76
+ if (event.usage) {
77
+ totalInput += event.usage.input_tokens ?? 0;
78
+ totalOutput += event.usage.output_tokens ?? 0;
79
+ }
80
+ }
81
+ catch {
82
+ // Non-JSON line — ignore
83
+ }
84
+ }
85
+ let usage;
86
+ if (totalInput > 0 || totalOutput > 0) {
87
+ usage = {
88
+ inputTokens: totalInput,
89
+ outputTokens: totalOutput,
90
+ totalTokens: totalInput + totalOutput,
91
+ };
92
+ }
93
+ return { output, filesChanged: [...new Set(filesChanged)], success, error, usage };
94
+ }
95
+ const codexProvider = {
96
+ name: "codex",
97
+ async isAvailable() {
98
+ return commandExists("codex");
99
+ },
100
+ async run(options) {
101
+ const { task, workDir, model, files, signal } = options;
102
+ const startTime = Date.now();
103
+ const args = ["exec", "--json", "--full-auto", "--ephemeral", "--skip-git-repo-check", "--cd", workDir];
104
+ if (model) {
105
+ args.push("--model", resolveModel(model));
106
+ }
107
+ // Build the prompt — include file hints if provided
108
+ let prompt = task;
109
+ if (files && files.length > 0) {
110
+ prompt += `\n\nRelevant files to focus on:\n${files.map((f) => `- ${f}`).join("\n")}`;
111
+ }
112
+ args.push(prompt);
113
+ let proc;
114
+ try {
115
+ proc = await safeSpawn("codex", args, {
116
+ cwd: workDir,
117
+ stdio: ["ignore", "pipe", "pipe"],
118
+ env: buildAgentEnv(),
119
+ });
120
+ }
121
+ catch (err) {
122
+ return {
123
+ success: false,
124
+ output: "",
125
+ filesChanged: [],
126
+ diff: "",
127
+ error: `Failed to spawn codex: ${err instanceof Error ? err.message : String(err)}`,
128
+ durationMs: 0,
129
+ };
130
+ }
131
+ return new Promise((resolve) => {
132
+ const stdoutBuf = new RollingBuffer(2 * 1024 * 1024); // 2MB
133
+ const stderrBuf = new RollingBuffer(512 * 1024); // 512KB
134
+ let resolved = false;
135
+ const doResolve = (result) => {
136
+ if (resolved)
137
+ return;
138
+ resolved = true;
139
+ resolve(result);
140
+ };
141
+ proc.stdout?.on("data", (chunk) => {
142
+ const text = chunk.toString();
143
+ stdoutBuf.append(text);
144
+ options.onOutput?.(text);
145
+ });
146
+ proc.stderr?.on("data", (chunk) => {
147
+ stderrBuf.append(chunk.toString());
148
+ });
149
+ if (signal) {
150
+ const onAbort = () => {
151
+ proc.kill("SIGTERM");
152
+ const killTimer = setTimeout(() => {
153
+ try {
154
+ if (proc.exitCode === null)
155
+ proc.kill("SIGKILL");
156
+ }
157
+ catch {
158
+ /* already dead */
159
+ }
160
+ }, 3000);
161
+ proc.on("exit", () => clearTimeout(killTimer));
162
+ };
163
+ if (signal.aborted) {
164
+ onAbort();
165
+ }
166
+ else {
167
+ signal.addEventListener("abort", onAbort, { once: true });
168
+ proc.on("exit", () => signal.removeEventListener("abort", onAbort));
169
+ }
170
+ }
171
+ proc.on("close", (code) => {
172
+ const stdout = stdoutBuf.toString();
173
+ const stderr = stderrBuf.toString();
174
+ const durationMs = Date.now() - startTime;
175
+ // Parse JSONL events
176
+ const parsed = parseCodexJsonl(stdout);
177
+ doResolve({
178
+ success: code === 0 && parsed.success,
179
+ output: parsed.output || stdout || stderr,
180
+ filesChanged: parsed.filesChanged,
181
+ diff: "", // Diff is captured separately by worktree manager
182
+ durationMs,
183
+ error: parsed.error ||
184
+ (code !== 0 ? `codex exited with code ${code}${stderr ? `: ${stderr.slice(0, 500)}` : ""}` : undefined),
185
+ usage: parsed.usage,
186
+ });
187
+ });
188
+ proc.on("error", (err) => {
189
+ doResolve({
190
+ success: false,
191
+ output: "",
192
+ filesChanged: [],
193
+ diff: "",
194
+ durationMs: Date.now() - startTime,
195
+ error: `Failed to spawn codex: ${err.message}`,
196
+ });
197
+ });
198
+ });
199
+ },
200
+ };
201
+ registerAgent(codexProvider);
202
+ export default codexProvider;
203
+ //# sourceMappingURL=codex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/agents/codex.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * ContextOS Direct LLM agent backend.
3
+ *
4
+ * Enhanced version of the original direct-llm provider.
5
+ * Key improvements:
6
+ * 1. Accepts a ContextOS system prompt (project rules/standards)
7
+ * 2. Parses code blocks from LLM responses and writes them to the worktree
8
+ * 3. Builds a coding-oriented prompt that instructs the LLM to produce file edits
9
+ * 4. Reports files changed based on parsed code blocks
10
+ *
11
+ * Uses @mariozechner/pi-ai for unified access to OpenAI, Anthropic, and Gemini.
12
+ */
13
+ import type { AgentProvider, AgentRunOptions } from "../core/types.js";
14
+ /**
15
+ * Extended run options that include ContextOS system prompt.
16
+ */
17
+ export interface ContextosAgentRunOptions extends AgentRunOptions {
18
+ /** ContextOS system prompt assembled from .agents/ rules and skills. */
19
+ contextosPrompt?: string;
20
+ }
21
+ declare const contextosDirectLlm: AgentProvider;
22
+ export default contextosDirectLlm;