@electric-agent/studio 1.1.0 → 1.3.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 (73) hide show
  1. package/dist/bridge/claude-code-docker.d.ts +27 -1
  2. package/dist/bridge/claude-code-docker.d.ts.map +1 -1
  3. package/dist/bridge/claude-code-docker.js +171 -43
  4. package/dist/bridge/claude-code-docker.js.map +1 -1
  5. package/dist/bridge/claude-code-sprites.d.ts +24 -0
  6. package/dist/bridge/claude-code-sprites.d.ts.map +1 -1
  7. package/dist/bridge/claude-code-sprites.js +177 -39
  8. package/dist/bridge/claude-code-sprites.js.map +1 -1
  9. package/dist/bridge/claude-md-generator.d.ts +1 -0
  10. package/dist/bridge/claude-md-generator.d.ts.map +1 -1
  11. package/dist/bridge/claude-md-generator.js +64 -7
  12. package/dist/bridge/claude-md-generator.js.map +1 -1
  13. package/dist/bridge/codex-docker.d.ts +65 -0
  14. package/dist/bridge/codex-docker.d.ts.map +1 -0
  15. package/dist/bridge/codex-docker.js +242 -0
  16. package/dist/bridge/codex-docker.js.map +1 -0
  17. package/dist/bridge/codex-json-parser.d.ts +31 -0
  18. package/dist/bridge/codex-json-parser.d.ts.map +1 -0
  19. package/dist/bridge/codex-json-parser.js +274 -0
  20. package/dist/bridge/codex-json-parser.js.map +1 -0
  21. package/dist/bridge/codex-md-generator.d.ts +14 -0
  22. package/dist/bridge/codex-md-generator.d.ts.map +1 -0
  23. package/dist/bridge/codex-md-generator.js +45 -0
  24. package/dist/bridge/codex-md-generator.js.map +1 -0
  25. package/dist/bridge/codex-sprites.d.ts +59 -0
  26. package/dist/bridge/codex-sprites.d.ts.map +1 -0
  27. package/dist/bridge/codex-sprites.js +237 -0
  28. package/dist/bridge/codex-sprites.js.map +1 -0
  29. package/dist/bridge/create-app-skill.d.ts +11 -0
  30. package/dist/bridge/create-app-skill.d.ts.map +1 -0
  31. package/dist/bridge/create-app-skill.js +39 -0
  32. package/dist/bridge/create-app-skill.js.map +1 -0
  33. package/dist/bridge/index.d.ts +0 -3
  34. package/dist/bridge/index.d.ts.map +1 -1
  35. package/dist/bridge/index.js +0 -3
  36. package/dist/bridge/index.js.map +1 -1
  37. package/dist/bridge/stream-json-parser.d.ts +0 -2
  38. package/dist/bridge/stream-json-parser.d.ts.map +1 -1
  39. package/dist/bridge/stream-json-parser.js +0 -18
  40. package/dist/bridge/stream-json-parser.js.map +1 -1
  41. package/dist/client/assets/index-Bq9zwhHj.css +1 -0
  42. package/dist/client/assets/index-Dgpqg5fv.js +234 -0
  43. package/dist/client/index.html +2 -2
  44. package/dist/index.d.ts +1 -0
  45. package/dist/index.d.ts.map +1 -1
  46. package/dist/index.js +1 -0
  47. package/dist/index.js.map +1 -1
  48. package/dist/sandbox/daytona.js +4 -4
  49. package/dist/sandbox/daytona.js.map +1 -1
  50. package/dist/sandbox/docker.d.ts +0 -1
  51. package/dist/sandbox/docker.d.ts.map +1 -1
  52. package/dist/sandbox/docker.js +10 -42
  53. package/dist/sandbox/docker.js.map +1 -1
  54. package/dist/sandbox/sprites.d.ts +0 -6
  55. package/dist/sandbox/sprites.d.ts.map +1 -1
  56. package/dist/sandbox/sprites.js +4 -36
  57. package/dist/sandbox/sprites.js.map +1 -1
  58. package/dist/sandbox/types.d.ts +0 -8
  59. package/dist/sandbox/types.d.ts.map +1 -1
  60. package/dist/server.d.ts +2 -5
  61. package/dist/server.d.ts.map +1 -1
  62. package/dist/server.js +195 -160
  63. package/dist/server.js.map +1 -1
  64. package/dist/session-auth.d.ts +3 -0
  65. package/dist/session-auth.d.ts.map +1 -0
  66. package/dist/session-auth.js +11 -0
  67. package/dist/session-auth.js.map +1 -0
  68. package/dist/sessions.d.ts +0 -2
  69. package/dist/sessions.d.ts.map +1 -1
  70. package/dist/sessions.js.map +1 -1
  71. package/package.json +2 -2
  72. package/dist/client/assets/index-BeZ6CTGd.css +0 -1
  73. package/dist/client/assets/index-DRLXdDNp.js +0 -241
@@ -0,0 +1,242 @@
1
+ /**
2
+ * SessionBridge implementation that runs Codex CLI inside a Docker
3
+ * container via `docker exec -i`, communicating via exec --json NDJSON.
4
+ *
5
+ * The bridge translates Codex's exec --json output into EngineEvents
6
+ * and writes them to the Durable Stream for the UI.
7
+ *
8
+ * Codex runs in one-shot mode (`codex exec --json`) and exits after completing.
9
+ * On iterate (follow-up message), the bridge respawns Codex with the new prompt.
10
+ */
11
+ import { spawn } from "node:child_process";
12
+ import * as readline from "node:readline";
13
+ import { DurableStream } from "@durable-streams/client";
14
+ import { ts } from "@electric-agent/protocol";
15
+ import { createCodexJsonParser } from "./codex-json-parser.js";
16
+ export class CodexDockerBridge {
17
+ sessionId;
18
+ streamUrl;
19
+ streamHeaders;
20
+ containerId;
21
+ config;
22
+ writer;
23
+ parser = createCodexJsonParser();
24
+ agentEventCallbacks = [];
25
+ completeCallbacks = [];
26
+ closed = false;
27
+ proc = null;
28
+ /** Codex thread ID captured from thread.started — used for resume */
29
+ codexThreadId = null;
30
+ /** Whether a Codex process is currently running */
31
+ running = false;
32
+ /** Whether the parser already emitted a session_end */
33
+ resultReceived = false;
34
+ constructor(sessionId, connection, containerId, config) {
35
+ this.sessionId = sessionId;
36
+ this.streamUrl = connection.url;
37
+ this.streamHeaders = connection.headers;
38
+ this.containerId = containerId;
39
+ this.config = config;
40
+ this.writer = new DurableStream({
41
+ url: connection.url,
42
+ headers: connection.headers,
43
+ contentType: "application/json",
44
+ });
45
+ }
46
+ async emit(event) {
47
+ if (this.closed)
48
+ return;
49
+ const msg = { source: "server", ...event };
50
+ await this.writer.append(JSON.stringify(msg));
51
+ }
52
+ /**
53
+ * Send a follow-up user message to Codex by respawning with a new prompt.
54
+ */
55
+ async sendCommand(cmd) {
56
+ if (this.closed)
57
+ return;
58
+ if (cmd.command === "iterate" && typeof cmd.request === "string") {
59
+ this.spawnCodex(cmd.request);
60
+ return;
61
+ }
62
+ console.log(`[codex-docker] Ignoring unsupported command: ${cmd.command}`);
63
+ }
64
+ /**
65
+ * Send a gate response. Codex exec mode doesn't support stdin interaction,
66
+ * so gate responses are limited.
67
+ */
68
+ async sendGateResponse(_gate, _value) {
69
+ // Codex exec --json doesn't support stdin user messages mid-run
70
+ }
71
+ onAgentEvent(cb) {
72
+ this.agentEventCallbacks.push(cb);
73
+ }
74
+ onComplete(cb) {
75
+ this.completeCallbacks.push(cb);
76
+ }
77
+ async start() {
78
+ if (this.closed)
79
+ return;
80
+ this.spawnCodex(this.config.prompt);
81
+ }
82
+ close() {
83
+ this.closed = true;
84
+ if (this.proc) {
85
+ try {
86
+ this.proc.stdin?.end();
87
+ this.proc.kill("SIGTERM");
88
+ }
89
+ catch {
90
+ // Process may already be dead
91
+ }
92
+ this.proc = null;
93
+ }
94
+ }
95
+ // -----------------------------------------------------------------------
96
+ // Private helpers
97
+ // -----------------------------------------------------------------------
98
+ /**
99
+ * Spawn a new Codex process. Called for both the initial prompt
100
+ * and follow-up iterate messages.
101
+ */
102
+ spawnCodex(prompt) {
103
+ // Kill any existing process
104
+ if (this.proc) {
105
+ try {
106
+ this.proc.stdin?.end();
107
+ this.proc.kill("SIGTERM");
108
+ }
109
+ catch {
110
+ // Already dead
111
+ }
112
+ this.proc = null;
113
+ }
114
+ // Reset parser state for the new process
115
+ this.parser = createCodexJsonParser();
116
+ this.resultReceived = false;
117
+ this.running = true;
118
+ const model = this.config.model ?? "o4-mini";
119
+ // Build the codex CLI command
120
+ const codexArgs = [
121
+ "exec",
122
+ "--json",
123
+ "--full-auto",
124
+ "--model",
125
+ model,
126
+ ...(this.config.extraFlags ?? []),
127
+ "-q",
128
+ prompt,
129
+ ];
130
+ // Escape for bash
131
+ const escapedArgs = codexArgs.map((a) => `'${a.replace(/'/g, "'\\''")}'`).join(" ");
132
+ const cmd = `cd '${this.config.cwd}' && codex ${escapedArgs}`;
133
+ this.proc = spawn("docker", ["exec", this.containerId, "bash", "-c", cmd], {
134
+ stdio: ["pipe", "pipe", "pipe"],
135
+ });
136
+ console.log(`[codex-docker] Started: session=${this.sessionId} container=${this.containerId} pid=${this.proc.pid}`);
137
+ console.log(`[codex-docker] cmd: ${cmd}`);
138
+ const currentProc = this.proc;
139
+ // Read stdout line by line (exec --json NDJSON)
140
+ if (currentProc.stdout) {
141
+ const rl = readline.createInterface({
142
+ input: currentProc.stdout,
143
+ terminal: false,
144
+ });
145
+ rl.on("line", (line) => {
146
+ if (this.closed)
147
+ return;
148
+ console.log(`[codex-docker:stdout] ${line.slice(0, 120)}...`);
149
+ this.handleLine(line);
150
+ });
151
+ }
152
+ // Log stderr
153
+ if (currentProc.stderr) {
154
+ const stderrRl = readline.createInterface({
155
+ input: currentProc.stderr,
156
+ terminal: false,
157
+ });
158
+ stderrRl.on("line", (line) => {
159
+ if (!this.closed) {
160
+ console.error(`[codex-docker:stderr] ${line}`);
161
+ }
162
+ });
163
+ }
164
+ // Handle process exit — defer to let pending readline events flush first
165
+ currentProc.on("exit", (code) => {
166
+ console.log(`[codex-docker] Process exited: code=${code} session=${this.sessionId}`);
167
+ setTimeout(() => {
168
+ // Capture thread ID from parser state before marking not running
169
+ if (this.parser.state.threadId) {
170
+ this.codexThreadId = this.parser.state.threadId;
171
+ }
172
+ this.running = false;
173
+ // Emit session_end if the parser didn't already
174
+ if (!this.closed && !this.resultReceived) {
175
+ const endEvent = {
176
+ type: "session_end",
177
+ success: code === 0,
178
+ ts: ts(),
179
+ };
180
+ this.dispatchEvent(endEvent);
181
+ }
182
+ }, 100);
183
+ });
184
+ }
185
+ handleLine(line) {
186
+ const trimmed = line.trim();
187
+ if (!trimmed)
188
+ return;
189
+ const events = this.parser.parse(trimmed);
190
+ for (const event of events) {
191
+ this.dispatchEvent(event);
192
+ }
193
+ }
194
+ dispatchEvent(event) {
195
+ // Write to Durable Stream for UI
196
+ const msg = { source: "agent", ...event };
197
+ this.writer.append(JSON.stringify(msg)).catch(() => { });
198
+ // Track session_end to prevent duplicates
199
+ if (event.type === "session_end") {
200
+ this.resultReceived = true;
201
+ }
202
+ // Detect dev:start in Bash tool_use → emit app_ready for the UI preview
203
+ if (event.type === "pre_tool_use" && event.tool_name === "Bash") {
204
+ const cmd = event.tool_input?.command;
205
+ if (typeof cmd === "string" && /\bdev:start\b/.test(cmd)) {
206
+ const appReady = { type: "app_ready", ts: ts() };
207
+ const appReadyMsg = { source: "agent", ...appReady };
208
+ this.writer.append(JSON.stringify(appReadyMsg)).catch(() => { });
209
+ for (const cb of this.agentEventCallbacks) {
210
+ try {
211
+ cb(appReady);
212
+ }
213
+ catch {
214
+ // Swallow
215
+ }
216
+ }
217
+ }
218
+ }
219
+ // Dispatch to callbacks
220
+ for (const cb of this.agentEventCallbacks) {
221
+ try {
222
+ cb(event);
223
+ }
224
+ catch {
225
+ // Swallow callback errors
226
+ }
227
+ }
228
+ // Detect session_end
229
+ if (event.type === "session_end" && "success" in event) {
230
+ const success = event.success;
231
+ for (const cb of this.completeCallbacks) {
232
+ try {
233
+ cb(success);
234
+ }
235
+ catch {
236
+ // Swallow callback errors
237
+ }
238
+ }
239
+ }
240
+ }
241
+ }
242
+ //# sourceMappingURL=codex-docker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-docker.js","sourceRoot":"","sources":["../../src/bridge/codex-docker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Translates Codex CLI `codex exec --json` NDJSON messages
3
+ * into EngineEvent arrays compatible with the existing bridge/UI pipeline.
4
+ *
5
+ * Codex exec --json emits lines like:
6
+ * {"type":"thread.started","thread_id":"..."}
7
+ * {"type":"item.started","item":{"type":"command_execution","id":"...","command":"..."}}
8
+ * {"type":"item.completed","item":{"type":"agent_message","id":"...","content":"..."}}
9
+ * {"type":"turn.completed","usage":{"input_tokens":100,"output_tokens":50}}
10
+ * {"type":"turn.failed","error":"..."}
11
+ *
12
+ * This parser converts each line into zero or more EngineEvent objects.
13
+ */
14
+ import type { EngineEvent } from "@electric-agent/protocol";
15
+ export interface CodexJsonParserState {
16
+ /** Map item ID → tool name for correlating started/completed events */
17
+ toolNames: Map<string, string>;
18
+ /** Accumulated cost from turn.completed messages */
19
+ totalCost: number;
20
+ /** Codex thread ID from thread.started */
21
+ threadId: string | null;
22
+ }
23
+ /**
24
+ * Create a new stateful parser. The returned `parse` function converts
25
+ * a single raw JSON line from Codex into zero or more EngineEvents.
26
+ */
27
+ export declare function createCodexJsonParser(): {
28
+ state: CodexJsonParserState;
29
+ parse(line: string): EngineEvent[];
30
+ };
31
+ //# sourceMappingURL=codex-json-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-json-parser.d.ts","sourceRoot":"","sources":["../../src/bridge/codex-json-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AA+F3D,MAAM,WAAW,oBAAoB;IACpC,uEAAuE;IACvE,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC9B,oDAAoD;IACpD,SAAS,EAAE,MAAM,CAAA;IACjB,0CAA0C;IAC1C,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CACvB;AAED;;;GAGG;AACH,wBAAgB,qBAAqB;;gBASvB,MAAM,GAAG,WAAW,EAAE;EAInC"}
@@ -0,0 +1,274 @@
1
+ /**
2
+ * Translates Codex CLI `codex exec --json` NDJSON messages
3
+ * into EngineEvent arrays compatible with the existing bridge/UI pipeline.
4
+ *
5
+ * Codex exec --json emits lines like:
6
+ * {"type":"thread.started","thread_id":"..."}
7
+ * {"type":"item.started","item":{"type":"command_execution","id":"...","command":"..."}}
8
+ * {"type":"item.completed","item":{"type":"agent_message","id":"...","content":"..."}}
9
+ * {"type":"turn.completed","usage":{"input_tokens":100,"output_tokens":50}}
10
+ * {"type":"turn.failed","error":"..."}
11
+ *
12
+ * This parser converts each line into zero or more EngineEvent objects.
13
+ */
14
+ import { ts } from "@electric-agent/protocol";
15
+ /**
16
+ * Create a new stateful parser. The returned `parse` function converts
17
+ * a single raw JSON line from Codex into zero or more EngineEvents.
18
+ */
19
+ export function createCodexJsonParser() {
20
+ const state = {
21
+ toolNames: new Map(),
22
+ totalCost: 0,
23
+ threadId: null,
24
+ };
25
+ return {
26
+ state,
27
+ parse(line) {
28
+ return parseLine(line, state);
29
+ },
30
+ };
31
+ }
32
+ function parseLine(line, state) {
33
+ const trimmed = line.trim();
34
+ if (!trimmed)
35
+ return [];
36
+ let msg;
37
+ try {
38
+ msg = JSON.parse(trimmed);
39
+ }
40
+ catch {
41
+ return [];
42
+ }
43
+ if (!msg.type)
44
+ return [];
45
+ switch (msg.type) {
46
+ case "thread.started":
47
+ return handleThreadStarted(msg, state);
48
+ case "item.started":
49
+ return handleItemStarted(msg, state);
50
+ case "item.completed":
51
+ return handleItemCompleted(msg, state);
52
+ case "turn.completed":
53
+ return handleTurnCompleted(msg, state);
54
+ case "turn.failed":
55
+ return handleTurnFailed(msg);
56
+ default:
57
+ return [];
58
+ }
59
+ }
60
+ function handleThreadStarted(msg, state) {
61
+ state.threadId = msg.thread_id ?? null;
62
+ return [
63
+ {
64
+ type: "session_start",
65
+ session_id: msg.thread_id ?? "",
66
+ ts: ts(),
67
+ },
68
+ ];
69
+ }
70
+ function handleItemStarted(msg, state) {
71
+ const item = msg.item;
72
+ if (!item?.type)
73
+ return [];
74
+ switch (item.type) {
75
+ case "command_execution": {
76
+ const ce = item;
77
+ const toolUseId = ce.id ?? `codex_${Date.now()}`;
78
+ state.toolNames.set(toolUseId, "Bash");
79
+ return [
80
+ {
81
+ type: "pre_tool_use",
82
+ tool_name: "Bash",
83
+ tool_use_id: toolUseId,
84
+ tool_input: { command: ce.command ?? "" },
85
+ ts: ts(),
86
+ },
87
+ ];
88
+ }
89
+ case "file_change": {
90
+ const fc = item;
91
+ const toolUseId = fc.id ?? `codex_${Date.now()}`;
92
+ const toolName = fc.action === "delete" ? "Delete" : "Write";
93
+ state.toolNames.set(toolUseId, toolName);
94
+ return [
95
+ {
96
+ type: "pre_tool_use",
97
+ tool_name: toolName,
98
+ tool_use_id: toolUseId,
99
+ tool_input: { file_path: fc.file_path ?? "", action: fc.action ?? "write" },
100
+ ts: ts(),
101
+ },
102
+ ];
103
+ }
104
+ case "mcp_tool_call": {
105
+ const mc = item;
106
+ const toolUseId = mc.id ?? `codex_${Date.now()}`;
107
+ const toolName = mc.tool_name
108
+ ? mc.server_name
109
+ ? `mcp__${mc.server_name}__${mc.tool_name}`
110
+ : mc.tool_name
111
+ : "mcp_tool";
112
+ state.toolNames.set(toolUseId, toolName);
113
+ return [
114
+ {
115
+ type: "pre_tool_use",
116
+ tool_name: toolName,
117
+ tool_use_id: toolUseId,
118
+ tool_input: mc.arguments ?? {},
119
+ ts: ts(),
120
+ },
121
+ ];
122
+ }
123
+ case "reasoning": {
124
+ const r = item;
125
+ if (r.content) {
126
+ return [
127
+ {
128
+ type: "assistant_thinking",
129
+ text: r.content,
130
+ ts: ts(),
131
+ },
132
+ ];
133
+ }
134
+ return [];
135
+ }
136
+ default:
137
+ return [];
138
+ }
139
+ }
140
+ function handleItemCompleted(msg, state) {
141
+ const item = msg.item;
142
+ if (!item?.type)
143
+ return [];
144
+ switch (item.type) {
145
+ case "agent_message": {
146
+ const am = item;
147
+ const text = extractMessageText(am.content);
148
+ if (text) {
149
+ return [
150
+ {
151
+ type: "assistant_message",
152
+ text,
153
+ ts: ts(),
154
+ },
155
+ ];
156
+ }
157
+ return [];
158
+ }
159
+ case "command_execution": {
160
+ const ce = item;
161
+ const toolUseId = ce.id ?? "";
162
+ const toolName = state.toolNames.get(toolUseId) ?? "Bash";
163
+ const isError = ce.exit_code != null && ce.exit_code !== 0;
164
+ const response = ce.output ?? "";
165
+ if (isError) {
166
+ return [
167
+ {
168
+ type: "post_tool_use",
169
+ tool_use_id: toolUseId,
170
+ tool_name: toolName,
171
+ tool_response: response,
172
+ error: response || `Exit code: ${ce.exit_code}`,
173
+ ts: ts(),
174
+ },
175
+ ];
176
+ }
177
+ return [
178
+ {
179
+ type: "post_tool_use",
180
+ tool_use_id: toolUseId,
181
+ tool_name: toolName,
182
+ tool_response: response,
183
+ ts: ts(),
184
+ },
185
+ ];
186
+ }
187
+ case "file_change": {
188
+ const fc = item;
189
+ const toolUseId = fc.id ?? "";
190
+ const toolName = state.toolNames.get(toolUseId) ?? "Write";
191
+ return [
192
+ {
193
+ type: "post_tool_use",
194
+ tool_use_id: toolUseId,
195
+ tool_name: toolName,
196
+ tool_response: fc.diff ?? fc.content ?? `File ${fc.action ?? "changed"}: ${fc.file_path ?? ""}`,
197
+ ts: ts(),
198
+ },
199
+ ];
200
+ }
201
+ case "mcp_tool_call": {
202
+ const mc = item;
203
+ const toolUseId = mc.id ?? "";
204
+ const toolName = state.toolNames.get(toolUseId) ?? "mcp_tool";
205
+ return [
206
+ {
207
+ type: "post_tool_use",
208
+ tool_use_id: toolUseId,
209
+ tool_name: toolName,
210
+ tool_response: mc.result ?? "",
211
+ ts: ts(),
212
+ },
213
+ ];
214
+ }
215
+ case "reasoning": {
216
+ const r = item;
217
+ if (r.content) {
218
+ return [
219
+ {
220
+ type: "assistant_thinking",
221
+ text: r.content,
222
+ ts: ts(),
223
+ },
224
+ ];
225
+ }
226
+ return [];
227
+ }
228
+ default:
229
+ return [];
230
+ }
231
+ }
232
+ function handleTurnCompleted(msg, state) {
233
+ const events = [];
234
+ if (msg.cost_usd != null) {
235
+ state.totalCost += msg.cost_usd;
236
+ events.push({
237
+ type: "cost_update",
238
+ totalCostUsd: state.totalCost,
239
+ ts: ts(),
240
+ });
241
+ }
242
+ return events;
243
+ }
244
+ function handleTurnFailed(msg) {
245
+ return [
246
+ {
247
+ type: "log",
248
+ level: "error",
249
+ message: msg.error ?? "Turn failed",
250
+ ts: ts(),
251
+ },
252
+ ];
253
+ }
254
+ // ---------------------------------------------------------------------------
255
+ // Helpers
256
+ // ---------------------------------------------------------------------------
257
+ function extractMessageText(content) {
258
+ if (content == null)
259
+ return "";
260
+ if (typeof content === "string")
261
+ return content;
262
+ if (Array.isArray(content)) {
263
+ return content
264
+ .map((block) => {
265
+ if (block.type === "text" && typeof block.text === "string")
266
+ return block.text;
267
+ return "";
268
+ })
269
+ .filter(Boolean)
270
+ .join("\n");
271
+ }
272
+ return String(content);
273
+ }
274
+ //# sourceMappingURL=codex-json-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-json-parser.js","sourceRoot":"","sources":["../../src/bridge/codex-json-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Generates AGENTS.md files for Codex CLI project workspaces.
3
+ *
4
+ * Reuses the same stack-specific content constants from claude-md-generator.ts
5
+ * since the instructions are framework-specific (Electric SQL + TanStack DB),
6
+ * not agent-specific.
7
+ */
8
+ import type { ClaudeMdOptions } from "./claude-md-generator.js";
9
+ /**
10
+ * Generate an AGENTS.md file for Codex CLI mode.
11
+ * Uses the same stack-specific content as Claude Code mode.
12
+ */
13
+ export declare function generateCodexMd(opts: ClaudeMdOptions): string;
14
+ //# sourceMappingURL=codex-md-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-md-generator.d.ts","sourceRoot":"","sources":["../../src/bridge/codex-md-generator.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAa/D;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,eAAe,GAAG,MAAM,CAoC7D"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Generates AGENTS.md files for Codex CLI project workspaces.
3
+ *
4
+ * Reuses the same stack-specific content constants from claude-md-generator.ts
5
+ * since the instructions are framework-specific (Electric SQL + TanStack DB),
6
+ * not agent-specific.
7
+ */
8
+ import { DRIZZLE_WORKFLOW, devServerInstructions, GUARDRAILS, INFRASTRUCTURE, PLAYBOOK_INSTRUCTIONS, PROJECT_CONTEXT, SCAFFOLD_STRUCTURE, SSR_RULES, sandboxEnvironment, } from "./claude-md-generator.js";
9
+ /**
10
+ * Generate an AGENTS.md file for Codex CLI mode.
11
+ * Uses the same stack-specific content as Claude Code mode.
12
+ */
13
+ export function generateCodexMd(opts) {
14
+ const sections = [];
15
+ sections.push(`# ${opts.projectName}`);
16
+ sections.push("");
17
+ sections.push(PROJECT_CONTEXT);
18
+ sections.push("");
19
+ const sandbox = sandboxEnvironment(opts.runtime);
20
+ if (sandbox) {
21
+ sections.push(sandbox);
22
+ sections.push("");
23
+ }
24
+ if (!opts.isIteration) {
25
+ sections.push("## Current Task");
26
+ sections.push(opts.description);
27
+ sections.push("");
28
+ }
29
+ sections.push(SCAFFOLD_STRUCTURE);
30
+ sections.push("");
31
+ sections.push(DRIZZLE_WORKFLOW);
32
+ sections.push("");
33
+ sections.push(GUARDRAILS);
34
+ sections.push("");
35
+ sections.push(PLAYBOOK_INSTRUCTIONS);
36
+ sections.push("");
37
+ sections.push(INFRASTRUCTURE);
38
+ sections.push("");
39
+ sections.push(devServerInstructions(opts.runtime));
40
+ sections.push("");
41
+ sections.push(SSR_RULES);
42
+ sections.push("");
43
+ return sections.join("\n");
44
+ }
45
+ //# sourceMappingURL=codex-md-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-md-generator.js","sourceRoot":"","sources":["../../src/bridge/codex-md-generator.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EACN,gBAAgB,EAChB,qBAAqB,EACrB,UAAU,EACV,cAAc,EACd,qBAAqB,EACrB,eAAe,EACf,kBAAkB,EAClB,SAAS,EACT,kBAAkB,GAClB,MAAM,0BAA0B,CAAA;AAEjC;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,IAAqB;IACpD,MAAM,QAAQ,GAAa,EAAE,CAAA;IAE7B,QAAQ,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC,CAAA;IACtC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACjB,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;IAC9B,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAEjB,MAAM,OAAO,GAAG,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAChD,IAAI,OAAO,EAAE,CAAC;QACb,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAClB,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QACvB,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;QAChC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QAC/B,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAClB,CAAC;IAED,QAAQ,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAA;IACjC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACjB,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;IAC/B,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACjB,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACjB,QAAQ,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAA;IACpC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACjB,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;IAC7B,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACjB,QAAQ,CAAC,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAA;IAClD,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACjB,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAEjB,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAC3B,CAAC"}