@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
@@ -5,6 +5,10 @@
5
5
  * The bridge translates Claude Code's stream-json output into EngineEvents
6
6
  * and writes them to the Durable Stream for the UI. User messages and
7
7
  * gate responses are sent to Claude Code's stdin.
8
+ *
9
+ * Claude Code runs in one-shot mode (`-p`) and exits after completing.
10
+ * On iterate (follow-up message), the bridge respawns Claude Code with
11
+ * `--resume <sessionId>` so it picks up the previous conversation context.
8
12
  */
9
13
  import type { EngineEvent } from "@electric-agent/protocol";
10
14
  import type { StreamConnectionInfo } from "../streams.js";
@@ -20,6 +24,8 @@ export interface ClaudeCodeDockerConfig {
20
24
  allowedTools?: string[];
21
25
  /** Additional CLI flags */
22
26
  extraFlags?: string[];
27
+ /** Studio server port — used to set up AskUserQuestion hooks inside the container */
28
+ studioPort?: number;
23
29
  }
24
30
  export declare class ClaudeCodeDockerBridge implements SessionBridge {
25
31
  readonly sessionId: string;
@@ -33,10 +39,18 @@ export declare class ClaudeCodeDockerBridge implements SessionBridge {
33
39
  private completeCallbacks;
34
40
  private closed;
35
41
  private proc;
42
+ /** Claude Code session ID captured from stream-json system.init — used for --resume */
43
+ private claudeSessionId;
44
+ /** Whether a Claude Code process is currently running */
45
+ private running;
46
+ /** Whether the parser already emitted a session_end (from a "result" message) */
47
+ private resultReceived;
48
+ /** Whether hooks have been installed in the container */
49
+ private hooksInstalled;
36
50
  constructor(sessionId: string, connection: StreamConnectionInfo, containerId: string, config: ClaudeCodeDockerConfig);
37
51
  emit(event: EngineEvent): Promise<void>;
38
52
  /**
39
- * Send a follow-up user message to Claude Code via stdin.
53
+ * Send a follow-up user message to Claude Code by respawning with --resume.
40
54
  * Used for iteration requests (the user types a new message in the UI).
41
55
  */
42
56
  sendCommand(cmd: Record<string, unknown>): Promise<void>;
@@ -49,6 +63,18 @@ export declare class ClaudeCodeDockerBridge implements SessionBridge {
49
63
  onComplete(cb: (success: boolean) => void): void;
50
64
  start(): Promise<void>;
51
65
  close(): void;
66
+ /**
67
+ * Install Claude Code hooks inside the container so that AskUserQuestion
68
+ * blocks until the user answers in the studio UI.
69
+ * The hook script forwards the PreToolUse event to the studio server via HTTP,
70
+ * which blocks the response until the gate is resolved.
71
+ */
72
+ private installHooks;
73
+ /**
74
+ * Spawn a new Claude Code process. Called for both the initial prompt
75
+ * and follow-up iterate messages (with --resume).
76
+ */
77
+ private spawnClaude;
52
78
  private handleLine;
53
79
  private dispatchEvent;
54
80
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"claude-code-docker.d.ts","sourceRoot":"","sources":["../../src/bridge/claude-code-docker.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAE3D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAA;AAEzD,OAAO,KAAK,EAAE,aAAa,EAAiB,MAAM,YAAY,CAAA;AAE9D,MAAM,WAAW,sBAAsB;IACtC,0DAA0D;IAC1D,MAAM,EAAE,MAAM,CAAA;IACd,6CAA6C;IAC7C,GAAG,EAAE,MAAM,CAAA;IACX,gDAAgD;IAChD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,kDAAkD;IAClD,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IACvB,2BAA2B;IAC3B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;CACrB;AAcD,qBAAa,sBAAuB,YAAW,aAAa;IAC3D,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAE9C,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,MAAM,CAAwB;IACtC,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,mBAAmB,CAA0C;IACrE,OAAO,CAAC,iBAAiB,CAAwC;IACjE,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,IAAI,CAA4B;gBAGvC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,oBAAoB,EAChC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,sBAAsB;IAezB,IAAI,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAM7C;;;OAGG;IACG,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAc9D;;;OAGG;IACG,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAiCnF,YAAY,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,GAAG,IAAI;IAIpD,UAAU,CAAC,EAAE,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI;IAI1C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA8E5B,KAAK,IAAI,IAAI;IAiBb,OAAO,CAAC,UAAU;IAUlB,OAAO,CAAC,aAAa;IA4CrB;;OAEG;IACH,OAAO,CAAC,gBAAgB;CAQxB"}
1
+ {"version":3,"file":"claude-code-docker.d.ts","sourceRoot":"","sources":["../../src/bridge/claude-code-docker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAE3D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAA;AAEzD,OAAO,KAAK,EAAE,aAAa,EAAiB,MAAM,YAAY,CAAA;AAE9D,MAAM,WAAW,sBAAsB;IACtC,0DAA0D;IAC1D,MAAM,EAAE,MAAM,CAAA;IACd,6CAA6C;IAC7C,GAAG,EAAE,MAAM,CAAA;IACX,gDAAgD;IAChD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,kDAAkD;IAClD,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IACvB,2BAA2B;IAC3B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;IACrB,qFAAqF;IACrF,UAAU,CAAC,EAAE,MAAM,CAAA;CACnB;AAeD,qBAAa,sBAAuB,YAAW,aAAa;IAC3D,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAE9C,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,MAAM,CAAwB;IACtC,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,mBAAmB,CAA0C;IACrE,OAAO,CAAC,iBAAiB,CAAwC;IACjE,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,IAAI,CAA4B;IAExC,uFAAuF;IACvF,OAAO,CAAC,eAAe,CAAsB;IAC7C,yDAAyD;IACzD,OAAO,CAAC,OAAO,CAAQ;IACvB,iFAAiF;IACjF,OAAO,CAAC,cAAc,CAAQ;IAC9B,yDAAyD;IACzD,OAAO,CAAC,cAAc,CAAQ;gBAG7B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,oBAAoB,EAChC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,sBAAsB;IAezB,IAAI,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAM7C;;;OAGG;IACG,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAc9D;;;OAGG;IACG,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAiCnF,YAAY,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,GAAG,IAAI;IAIpD,UAAU,CAAC,EAAE,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI;IAI1C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAK5B,KAAK,IAAI,IAAI;IAiBb;;;;;OAKG;IACH,OAAO,CAAC,YAAY;IAgEpB;;;OAGG;IACH,OAAO,CAAC,WAAW;IAuHnB,OAAO,CAAC,UAAU;IAUlB,OAAO,CAAC,aAAa;IAiDrB;;OAEG;IACH,OAAO,CAAC,gBAAgB;CAQxB"}
@@ -5,8 +5,12 @@
5
5
  * The bridge translates Claude Code's stream-json output into EngineEvents
6
6
  * and writes them to the Durable Stream for the UI. User messages and
7
7
  * gate responses are sent to Claude Code's stdin.
8
+ *
9
+ * Claude Code runs in one-shot mode (`-p`) and exits after completing.
10
+ * On iterate (follow-up message), the bridge respawns Claude Code with
11
+ * `--resume <sessionId>` so it picks up the previous conversation context.
8
12
  */
9
- import { spawn } from "node:child_process";
13
+ import { execFileSync, spawn } from "node:child_process";
10
14
  import * as readline from "node:readline";
11
15
  import { DurableStream } from "@durable-streams/client";
12
16
  import { ts } from "@electric-agent/protocol";
@@ -21,6 +25,7 @@ const DEFAULT_ALLOWED_TOOLS = [
21
25
  "WebSearch",
22
26
  "TodoWrite",
23
27
  "AskUserQuestion",
28
+ "Skill",
24
29
  ];
25
30
  export class ClaudeCodeDockerBridge {
26
31
  sessionId;
@@ -34,6 +39,14 @@ export class ClaudeCodeDockerBridge {
34
39
  completeCallbacks = [];
35
40
  closed = false;
36
41
  proc = null;
42
+ /** Claude Code session ID captured from stream-json system.init — used for --resume */
43
+ claudeSessionId = null;
44
+ /** Whether a Claude Code process is currently running */
45
+ running = false;
46
+ /** Whether the parser already emitted a session_end (from a "result" message) */
47
+ resultReceived = false;
48
+ /** Whether hooks have been installed in the container */
49
+ hooksInstalled = false;
37
50
  constructor(sessionId, connection, containerId, config) {
38
51
  this.sessionId = sessionId;
39
52
  this.streamUrl = connection.url;
@@ -53,15 +66,15 @@ export class ClaudeCodeDockerBridge {
53
66
  await this.writer.append(JSON.stringify(msg));
54
67
  }
55
68
  /**
56
- * Send a follow-up user message to Claude Code via stdin.
69
+ * Send a follow-up user message to Claude Code by respawning with --resume.
57
70
  * Used for iteration requests (the user types a new message in the UI).
58
71
  */
59
72
  async sendCommand(cmd) {
60
- if (this.closed || !this.proc?.stdin?.writable)
73
+ if (this.closed)
61
74
  return;
62
- // For iteration: send the request as a user message to Claude Code's stdin
75
+ // For iteration: respawn Claude Code with --resume
63
76
  if (cmd.command === "iterate" && typeof cmd.request === "string") {
64
- this.writeUserMessage(cmd.request);
77
+ this.spawnClaude(cmd.request, this.claudeSessionId ?? undefined);
65
78
  return;
66
79
  }
67
80
  // For initial "new" command: this is handled in start() via the prompt
@@ -109,22 +122,139 @@ export class ClaudeCodeDockerBridge {
109
122
  async start() {
110
123
  if (this.closed)
111
124
  return;
112
- const allowedTools = this.config.allowedTools ?? DEFAULT_ALLOWED_TOOLS;
125
+ this.spawnClaude(this.config.prompt);
126
+ }
127
+ close() {
128
+ this.closed = true;
129
+ if (this.proc) {
130
+ try {
131
+ this.proc.stdin?.end();
132
+ this.proc.kill("SIGTERM");
133
+ }
134
+ catch {
135
+ // Process may already be dead
136
+ }
137
+ this.proc = null;
138
+ }
139
+ }
140
+ // -----------------------------------------------------------------------
141
+ // Private helpers
142
+ // -----------------------------------------------------------------------
143
+ /**
144
+ * Install Claude Code hooks inside the container so that AskUserQuestion
145
+ * blocks until the user answers in the studio UI.
146
+ * The hook script forwards the PreToolUse event to the studio server via HTTP,
147
+ * which blocks the response until the gate is resolved.
148
+ */
149
+ installHooks() {
150
+ const port = this.config.studioPort;
151
+ if (!port)
152
+ return;
153
+ const hookDir = `${this.config.cwd}/.claude/hooks`;
154
+ const settingsFile = `${this.config.cwd}/.claude/settings.local.json`;
155
+ // Studio server is on the host — use host.docker.internal to reach it
156
+ const studioUrl = `http://host.docker.internal:${port}`;
157
+ const forwardScript = `#!/bin/bash
158
+ # Forward AskUserQuestion hook events to Electric Agent studio.
159
+ # Blocks until the user answers in the web UI.
160
+ BODY="$(cat)"
161
+ RESPONSE=$(curl -s -X POST "${studioUrl}/api/sessions/${this.sessionId}/hook-event" \\
162
+ -H "Content-Type: application/json" \\
163
+ -d "\${BODY}" \\
164
+ --max-time 360 \\
165
+ --connect-timeout 5 \\
166
+ 2>/dev/null)
167
+ if echo "\${RESPONSE}" | grep -q '"hookSpecificOutput"'; then
168
+ echo "\${RESPONSE}"
169
+ fi
170
+ exit 0`;
171
+ // Configure hooks in settings.local.json.
172
+ // Tool permissions come from --allowedTools CLI flag instead.
173
+ // Hook format: each event has matcher groups, each with a `hooks` array.
174
+ const settings = JSON.stringify({
175
+ hooks: {
176
+ PreToolUse: [
177
+ {
178
+ matcher: "AskUserQuestion",
179
+ hooks: [
180
+ {
181
+ type: "command",
182
+ command: `${hookDir}/forward.sh`,
183
+ },
184
+ ],
185
+ },
186
+ ],
187
+ },
188
+ });
189
+ try {
190
+ // Use base64 encoding to avoid heredoc delimiter issues in docker exec
191
+ const forwardB64 = Buffer.from(forwardScript).toString("base64");
192
+ const settingsB64 = Buffer.from(settings).toString("base64");
193
+ const setupCmd = [
194
+ `mkdir -p '${hookDir}'`,
195
+ `echo '${forwardB64}' | base64 -d > '${hookDir}/forward.sh'`,
196
+ `chmod +x '${hookDir}/forward.sh'`,
197
+ `echo '${settingsB64}' | base64 -d > '${settingsFile}'`,
198
+ ].join(" && ");
199
+ execFileSync("docker", ["exec", this.containerId, "bash", "-c", setupCmd], {
200
+ timeout: 10_000,
201
+ stdio: ["ignore", "pipe", "pipe"],
202
+ });
203
+ console.log(`[claude-code-docker] Installed AskUserQuestion hooks in container`);
204
+ }
205
+ catch (err) {
206
+ console.error(`[claude-code-docker] Failed to install hooks:`, err);
207
+ }
208
+ }
209
+ /**
210
+ * Spawn a new Claude Code process. Called for both the initial prompt
211
+ * and follow-up iterate messages (with --resume).
212
+ */
213
+ spawnClaude(prompt, resumeSessionId) {
214
+ // Kill any existing process
215
+ if (this.proc) {
216
+ try {
217
+ this.proc.stdin?.end();
218
+ this.proc.kill("SIGTERM");
219
+ }
220
+ catch {
221
+ // Already dead
222
+ }
223
+ this.proc = null;
224
+ }
225
+ // Install hooks on first spawn (they persist for resume spawns)
226
+ if (!this.hooksInstalled) {
227
+ this.installHooks();
228
+ this.hooksInstalled = true;
229
+ }
230
+ // Reset parser state for the new process
231
+ this.parser = createStreamJsonParser();
232
+ this.resultReceived = false;
233
+ this.running = true;
113
234
  const model = this.config.model ?? "claude-sonnet-4-6";
114
- // Build the claude CLI command
235
+ // Build the claude CLI command.
236
+ // Use --allowedTools to grant permissions (keeps hooks firing, unlike
237
+ // --dangerously-skip-permissions which bypasses hooks entirely).
238
+ // Use --settings to pass hook configuration directly (more reliable
239
+ // than settings.local.json which may not be loaded by all versions).
240
+ const allowedTools = this.config.allowedTools ?? DEFAULT_ALLOWED_TOOLS;
115
241
  const claudeArgs = [
116
242
  "-p",
117
- this.config.prompt,
243
+ prompt,
118
244
  "--output-format",
119
245
  "stream-json",
120
246
  "--verbose",
121
247
  "--model",
122
248
  model,
123
- "--dangerously-skip-permissions",
124
- "--allowedTools",
125
- allowedTools.join(","),
249
+ ...(this.hooksInstalled
250
+ ? ["--allowedTools", allowedTools.join(",")]
251
+ : ["--dangerously-skip-permissions"]),
126
252
  ...(this.config.extraFlags ?? []),
127
253
  ];
254
+ // Add --resume if we have a previous session ID
255
+ if (resumeSessionId) {
256
+ claudeArgs.push("--resume", resumeSessionId);
257
+ }
128
258
  // Escape for bash
129
259
  const escapedArgs = claudeArgs.map((a) => `'${a.replace(/'/g, "'\\''")}'`).join(" ");
130
260
  const cmd = `cd '${this.config.cwd}' && claude ${escapedArgs}`;
@@ -133,12 +263,13 @@ export class ClaudeCodeDockerBridge {
133
263
  this.proc = spawn("docker", ["exec", this.containerId, "bash", "-c", cmd], {
134
264
  stdio: ["pipe", "pipe", "pipe"],
135
265
  });
136
- console.log(`[claude-code-docker] Started: session=${this.sessionId} container=${this.containerId} pid=${this.proc.pid}`);
266
+ console.log(`[claude-code-docker] Started: session=${this.sessionId} container=${this.containerId} pid=${this.proc.pid} resume=${resumeSessionId ?? "none"}`);
137
267
  console.log(`[claude-code-docker] cmd: ${cmd}`);
268
+ const currentProc = this.proc;
138
269
  // Read stdout line by line (stream-json NDJSON)
139
- if (this.proc.stdout) {
270
+ if (currentProc.stdout) {
140
271
  const rl = readline.createInterface({
141
- input: this.proc.stdout,
272
+ input: currentProc.stdout,
142
273
  terminal: false,
143
274
  });
144
275
  rl.on("line", (line) => {
@@ -149,9 +280,9 @@ export class ClaudeCodeDockerBridge {
149
280
  });
150
281
  }
151
282
  // Log stderr
152
- if (this.proc.stderr) {
283
+ if (currentProc.stderr) {
153
284
  const stderrRl = readline.createInterface({
154
- input: this.proc.stderr,
285
+ input: currentProc.stderr,
155
286
  terminal: false,
156
287
  });
157
288
  stderrRl.on("line", (line) => {
@@ -160,36 +291,29 @@ export class ClaudeCodeDockerBridge {
160
291
  }
161
292
  });
162
293
  }
163
- // Handle process exit
164
- this.proc.on("exit", (code) => {
294
+ // Handle process exit — defer to let pending readline events flush first,
295
+ // which prevents duplicate session_end (the parser emits one from "result").
296
+ currentProc.on("exit", (code) => {
165
297
  console.log(`[claude-code-docker] Process exited: code=${code} session=${this.sessionId}`);
166
- // If process exits without a session_end event, emit one
167
- if (!this.closed) {
168
- const endEvent = {
169
- type: "session_end",
170
- success: code === 0,
171
- ts: ts(),
172
- };
173
- this.dispatchEvent(endEvent);
174
- }
298
+ setTimeout(() => {
299
+ // Capture session ID from parser state before marking not running
300
+ if (this.parser.state.sessionId) {
301
+ this.claudeSessionId = this.parser.state.sessionId;
302
+ }
303
+ this.running = false;
304
+ // Only emit session_end from exit handler if the parser didn't already
305
+ // emit one (via a "result" message). This prevents double session_end.
306
+ if (!this.closed && !this.resultReceived) {
307
+ const endEvent = {
308
+ type: "session_end",
309
+ success: code === 0,
310
+ ts: ts(),
311
+ };
312
+ this.dispatchEvent(endEvent);
313
+ }
314
+ }, 100);
175
315
  });
176
316
  }
177
- close() {
178
- this.closed = true;
179
- if (this.proc) {
180
- try {
181
- this.proc.stdin?.end();
182
- this.proc.kill("SIGTERM");
183
- }
184
- catch {
185
- // Process may already be dead
186
- }
187
- this.proc = null;
188
- }
189
- }
190
- // -----------------------------------------------------------------------
191
- // Private helpers
192
- // -----------------------------------------------------------------------
193
317
  handleLine(line) {
194
318
  const trimmed = line.trim();
195
319
  if (!trimmed)
@@ -203,6 +327,10 @@ export class ClaudeCodeDockerBridge {
203
327
  // Write to Durable Stream for UI
204
328
  const msg = { source: "agent", ...event };
205
329
  this.writer.append(JSON.stringify(msg)).catch(() => { });
330
+ // Track session_end from result messages to prevent duplicates
331
+ if (event.type === "session_end") {
332
+ this.resultReceived = true;
333
+ }
206
334
  // Detect dev:start in Bash tool_use → emit app_ready for the UI preview
207
335
  if (event.type === "pre_tool_use" && event.tool_name === "Bash") {
208
336
  const cmd = event.tool_input?.command;
@@ -1 +1 @@
1
- {"version":3,"file":"claude-code-docker.js","sourceRoot":"","sources":["../../src/bridge/claude-code-docker.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"claude-code-docker.js","sourceRoot":"","sources":["../../src/bridge/claude-code-docker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAqB,YAAY,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAC3E,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AAEvD,OAAO,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAA;AAE7C,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAA;AAkBhE,MAAM,qBAAqB,GAAG;IAC7B,MAAM;IACN,OAAO;IACP,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,WAAW;IACX,WAAW;IACX,iBAAiB;IACjB,OAAO;CACP,CAAA;AAED,MAAM,OAAO,sBAAsB;IACzB,SAAS,CAAQ;IACjB,SAAS,CAAQ;IACjB,aAAa,CAAwB;IAEtC,WAAW,CAAQ;IACnB,MAAM,CAAwB;IAC9B,MAAM,CAAe;IACrB,MAAM,GAAG,sBAAsB,EAAE,CAAA;IACjC,mBAAmB,GAAwC,EAAE,CAAA;IAC7D,iBAAiB,GAAsC,EAAE,CAAA;IACzD,MAAM,GAAG,KAAK,CAAA;IACd,IAAI,GAAwB,IAAI,CAAA;IAExC,uFAAuF;IAC/E,eAAe,GAAkB,IAAI,CAAA;IAC7C,yDAAyD;IACjD,OAAO,GAAG,KAAK,CAAA;IACvB,iFAAiF;IACzE,cAAc,GAAG,KAAK,CAAA;IAC9B,yDAAyD;IACjD,cAAc,GAAG,KAAK,CAAA;IAE9B,YACC,SAAiB,EACjB,UAAgC,EAChC,WAAmB,EACnB,MAA8B;QAE9B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;QAC1B,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC,GAAG,CAAA;QAC/B,IAAI,CAAC,aAAa,GAAG,UAAU,CAAC,OAAO,CAAA;QACvC,IAAI,CAAC,WAAW,GAAG,WAAW,CAAA;QAC9B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QAEpB,IAAI,CAAC,MAAM,GAAG,IAAI,aAAa,CAAC;YAC/B,GAAG,EAAE,UAAU,CAAC,GAAG;YACnB,OAAO,EAAE,UAAU,CAAC,OAAO;YAC3B,WAAW,EAAE,kBAAkB;SAC/B,CAAC,CAAA;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,KAAkB;QAC5B,IAAI,IAAI,CAAC,MAAM;YAAE,OAAM;QACvB,MAAM,GAAG,GAAkB,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,CAAA;QACzD,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAA;IAC9C,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,WAAW,CAAC,GAA4B;QAC7C,IAAI,IAAI,CAAC,MAAM;YAAE,OAAM;QAEvB,mDAAmD;QACnD,IAAI,GAAG,CAAC,OAAO,KAAK,SAAS,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YAClE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,eAAe,IAAI,SAAS,CAAC,CAAA;YAChE,OAAM;QACP,CAAC;QAED,uEAAuE;QACvE,mEAAmE;QACnE,OAAO,CAAC,GAAG,CAAC,sDAAsD,GAAG,CAAC,OAAO,EAAE,CAAC,CAAA;IACjF,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,gBAAgB,CAAC,IAAY,EAAE,KAA8B;QAClE,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ;YAAE,OAAM;QAEtD,IAAI,IAAI,KAAK,mBAAmB,IAAI,IAAI,CAAC,UAAU,CAAC,oBAAoB,CAAC,EAAE,CAAC;YAC3E,MAAM,MAAM,GAAI,KAAK,CAAC,MAAiB,IAAI,EAAE,CAAA;YAC7C,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAA;YAC7B,OAAM;QACP,CAAC;QAED,IAAI,IAAI,KAAK,eAAe,EAAE,CAAC;YAC9B,MAAM,OAAO,GAAG,KAAK,CAAC,OAA+B,CAAA;YACrD,IAAI,OAAO,EAAE,MAAM,EAAE,CAAC;gBACrB,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;YAC1C,CAAC;YACD,OAAM;QACP,CAAC;QAED,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;YACzB,MAAM,QAAQ,GAAI,KAAK,CAAC,QAAmB,IAAI,SAAS,CAAA;YACxD,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAA;YAC/B,OAAM;QACP,CAAC;QAED,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;YACzB,MAAM,OAAO,GAAG,KAAK,CAAC,OAAkB,CAAA;YACxC,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;YACpD,OAAM;QACP,CAAC;QAED,kCAAkC;QAClC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAA;IAC7C,CAAC;IAED,YAAY,CAAC,EAAgC;QAC5C,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAClC,CAAC;IAED,UAAU,CAAC,EAA8B;QACxC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAChC,CAAC;IAED,KAAK,CAAC,KAAK;QACV,IAAI,IAAI,CAAC,MAAM;YAAE,OAAM;QACvB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IACrC,CAAC;IAED,KAAK;QACJ,IAAI,CAAC,MAAM,GAAG,IAAI,CAAA;QAClB,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,IAAI,CAAC;gBACJ,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,CAAA;gBACtB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;YAC1B,CAAC;YAAC,MAAM,CAAC;gBACR,8BAA8B;YAC/B,CAAC;YACD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QACjB,CAAC;IACF,CAAC;IAED,0EAA0E;IAC1E,kBAAkB;IAClB,0EAA0E;IAE1E;;;;;OAKG;IACK,YAAY;QACnB,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAA;QACnC,IAAI,CAAC,IAAI;YAAE,OAAM;QAEjB,MAAM,OAAO,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,gBAAgB,CAAA;QAClD,MAAM,YAAY,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,8BAA8B,CAAA;QACrE,sEAAsE;QACtE,MAAM,SAAS,GAAG,+BAA+B,IAAI,EAAE,CAAA;QAEvD,MAAM,aAAa,GAAG;;;;8BAIM,SAAS,iBAAiB,IAAI,CAAC,SAAS;;;;;;;;;OAS/D,CAAA;QAEL,0CAA0C;QAC1C,8DAA8D;QAC9D,yEAAyE;QACzE,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC;YAC/B,KAAK,EAAE;gBACN,UAAU,EAAE;oBACX;wBACC,OAAO,EAAE,iBAAiB;wBAC1B,KAAK,EAAE;4BACN;gCACC,IAAI,EAAE,SAAS;gCACf,OAAO,EAAE,GAAG,OAAO,aAAa;6BAChC;yBACD;qBACD;iBACD;aACD;SACD,CAAC,CAAA;QAEF,IAAI,CAAC;YACJ,uEAAuE;YACvE,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;YAChE,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;YAC5D,MAAM,QAAQ,GAAG;gBAChB,aAAa,OAAO,GAAG;gBACvB,SAAS,UAAU,oBAAoB,OAAO,cAAc;gBAC5D,aAAa,OAAO,cAAc;gBAClC,SAAS,WAAW,oBAAoB,YAAY,GAAG;aACvD,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;YAEd,YAAY,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE;gBAC1E,OAAO,EAAE,MAAM;gBACf,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;aACjC,CAAC,CAAA;YACF,OAAO,CAAC,GAAG,CAAC,mEAAmE,CAAC,CAAA;QACjF,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,KAAK,CAAC,+CAA+C,EAAE,GAAG,CAAC,CAAA;QACpE,CAAC;IACF,CAAC;IAED;;;OAGG;IACK,WAAW,CAAC,MAAc,EAAE,eAAwB;QAC3D,4BAA4B;QAC5B,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,IAAI,CAAC;gBACJ,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,CAAA;gBACtB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;YAC1B,CAAC;YAAC,MAAM,CAAC;gBACR,eAAe;YAChB,CAAC;YACD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QACjB,CAAC;QAED,gEAAgE;QAChE,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YAC1B,IAAI,CAAC,YAAY,EAAE,CAAA;YACnB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAA;QAC3B,CAAC;QAED,yCAAyC;QACzC,IAAI,CAAC,MAAM,GAAG,sBAAsB,EAAE,CAAA;QACtC,IAAI,CAAC,cAAc,GAAG,KAAK,CAAA;QAC3B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAA;QAEnB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,mBAAmB,CAAA;QAEtD,gCAAgC;QAChC,sEAAsE;QACtE,iEAAiE;QACjE,oEAAoE;QACpE,qEAAqE;QACrE,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,IAAI,qBAAqB,CAAA;QACtE,MAAM,UAAU,GAAG;YAClB,IAAI;YACJ,MAAM;YACN,iBAAiB;YACjB,aAAa;YACb,WAAW;YACX,SAAS;YACT,KAAK;YACL,GAAG,CAAC,IAAI,CAAC,cAAc;gBACtB,CAAC,CAAC,CAAC,gBAAgB,EAAE,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAC5C,CAAC,CAAC,CAAC,gCAAgC,CAAC,CAAC;YACtC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC;SACjC,CAAA;QAED,gDAAgD;QAChD,IAAI,eAAe,EAAE,CAAC;YACrB,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,CAAA;QAC7C,CAAC;QAED,kBAAkB;QAClB,MAAM,WAAW,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACpF,MAAM,GAAG,GAAG,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,eAAe,WAAW,EAAE,CAAA;QAE9D,8EAA8E;QAC9E,iFAAiF;QACjF,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,EAAE;YAC1E,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;SAC/B,CAAC,CAAA;QAEF,OAAO,CAAC,GAAG,CACV,yCAAyC,IAAI,CAAC,SAAS,cAAc,IAAI,CAAC,WAAW,QAAQ,IAAI,CAAC,IAAI,CAAC,GAAG,WAAW,eAAe,IAAI,MAAM,EAAE,CAChJ,CAAA;QACD,OAAO,CAAC,GAAG,CAAC,6BAA6B,GAAG,EAAE,CAAC,CAAA;QAE/C,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAA;QAE7B,gDAAgD;QAChD,IAAI,WAAW,CAAC,MAAM,EAAE,CAAC;YACxB,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;gBACnC,KAAK,EAAE,WAAW,CAAC,MAAM;gBACzB,QAAQ,EAAE,KAAK;aACf,CAAC,CAAA;YAEF,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;gBACtB,IAAI,IAAI,CAAC,MAAM;oBAAE,OAAM;gBACvB,OAAO,CAAC,GAAG,CAAC,+BAA+B,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAA;gBACnE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;YACtB,CAAC,CAAC,CAAA;QACH,CAAC;QAED,aAAa;QACb,IAAI,WAAW,CAAC,MAAM,EAAE,CAAC;YACxB,MAAM,QAAQ,GAAG,QAAQ,CAAC,eAAe,CAAC;gBACzC,KAAK,EAAE,WAAW,CAAC,MAAM;gBACzB,QAAQ,EAAE,KAAK;aACf,CAAC,CAAA;YACF,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;gBAC5B,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;oBAClB,OAAO,CAAC,KAAK,CAAC,+BAA+B,IAAI,EAAE,CAAC,CAAA;gBACrD,CAAC;YACF,CAAC,CAAC,CAAA;QACH,CAAC;QAED,0EAA0E;QAC1E,6EAA6E;QAC7E,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YAC/B,OAAO,CAAC,GAAG,CAAC,6CAA6C,IAAI,YAAY,IAAI,CAAC,SAAS,EAAE,CAAC,CAAA;YAC1F,UAAU,CAAC,GAAG,EAAE;gBACf,kEAAkE;gBAClE,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;oBACjC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAA;gBACnD,CAAC;gBACD,IAAI,CAAC,OAAO,GAAG,KAAK,CAAA;gBAEpB,uEAAuE;gBACvE,uEAAuE;gBACvE,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;oBAC1C,MAAM,QAAQ,GAAgB;wBAC7B,IAAI,EAAE,aAAa;wBACnB,OAAO,EAAE,IAAI,KAAK,CAAC;wBACnB,EAAE,EAAE,EAAE,EAAE;qBACR,CAAA;oBACD,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAA;gBAC7B,CAAC;YACF,CAAC,EAAE,GAAG,CAAC,CAAA;QACR,CAAC,CAAC,CAAA;IACH,CAAC;IAEO,UAAU,CAAC,IAAY;QAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAA;QAC3B,IAAI,CAAC,OAAO;YAAE,OAAM;QAEpB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QACzC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC5B,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAA;QAC1B,CAAC;IACF,CAAC;IAEO,aAAa,CAAC,KAAkB;QACvC,iCAAiC;QACjC,MAAM,GAAG,GAAkB,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,EAAE,CAAA;QACxD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;QAEvD,+DAA+D;QAC/D,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;YAClC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAA;QAC3B,CAAC;QAED,wEAAwE;QACxE,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,IAAI,KAAK,CAAC,SAAS,KAAK,MAAM,EAAE,CAAC;YACjE,MAAM,GAAG,GAAI,KAAK,CAAC,UAAsC,EAAE,OAAO,CAAA;YAClE,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC1D,MAAM,QAAQ,GAAgB,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAA;gBAC7D,MAAM,WAAW,GAAkB,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,QAAQ,EAAE,CAAA;gBACnE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;gBAC/D,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;oBAC3C,IAAI,CAAC;wBACJ,EAAE,CAAC,QAAQ,CAAC,CAAA;oBACb,CAAC;oBAAC,MAAM,CAAC;wBACR,UAAU;oBACX,CAAC;gBACF,CAAC;YACF,CAAC;QACF,CAAC;QAED,wBAAwB;QACxB,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC3C,IAAI,CAAC;gBACJ,EAAE,CAAC,KAAK,CAAC,CAAA;YACV,CAAC;YAAC,MAAM,CAAC;gBACR,0BAA0B;YAC3B,CAAC;QACF,CAAC;QAED,qBAAqB;QACrB,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,IAAI,SAAS,IAAI,KAAK,EAAE,CAAC;YACxD,MAAM,OAAO,GAAI,KAA4C,CAAC,OAAO,CAAA;YACrE,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBACzC,IAAI,CAAC;oBACJ,EAAE,CAAC,OAAO,CAAC,CAAA;gBACZ,CAAC;gBAAC,MAAM,CAAC;oBACR,0BAA0B;gBAC3B,CAAC;YACF,CAAC;QACF,CAAC;IACF,CAAC;IAED;;OAEG;IACK,gBAAgB,CAAC,OAAe;QACvC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ;YAAE,OAAM;QACvC,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC;YAC1B,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE;SAClC,CAAC,CAAA;QACF,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,CAAA;IAClC,CAAC;CACD"}
@@ -5,6 +5,10 @@
5
5
  * The bridge translates Claude Code's stream-json output into EngineEvents
6
6
  * and writes them to the Durable Stream for the UI. User messages and
7
7
  * gate responses are sent to Claude Code's stdin.
8
+ *
9
+ * Claude Code runs in one-shot mode (`-p`) and exits after completing.
10
+ * On iterate (follow-up message), the bridge respawns Claude Code with
11
+ * `--resume <sessionId>` so it picks up the previous conversation context.
8
12
  */
9
13
  import type { EngineEvent } from "@electric-agent/protocol";
10
14
  import type { Sprite } from "@fly/sprites";
@@ -21,6 +25,8 @@ export interface ClaudeCodeSpritesConfig {
21
25
  allowedTools?: string[];
22
26
  /** Additional CLI flags */
23
27
  extraFlags?: string[];
28
+ /** Studio server URL — used to set up AskUserQuestion hooks inside the sprite */
29
+ studioUrl?: string;
24
30
  }
25
31
  export declare class ClaudeCodeSpritesBridge implements SessionBridge {
26
32
  readonly sessionId: string;
@@ -34,6 +40,14 @@ export declare class ClaudeCodeSpritesBridge implements SessionBridge {
34
40
  private completeCallbacks;
35
41
  private closed;
36
42
  private cmd;
43
+ /** Claude Code session ID captured from stream-json system.init — used for --resume */
44
+ private claudeSessionId;
45
+ /** Whether a Claude Code process is currently running */
46
+ private running;
47
+ /** Whether the parser already emitted a session_end (from a "result" message) */
48
+ private resultReceived;
49
+ /** Whether hooks have been installed in the sprite */
50
+ private hooksInstalled;
37
51
  constructor(sessionId: string, connection: StreamConnectionInfo, sprite: Sprite, config: ClaudeCodeSpritesConfig);
38
52
  emit(event: EngineEvent): Promise<void>;
39
53
  sendCommand(cmd: Record<string, unknown>): Promise<void>;
@@ -42,6 +56,16 @@ export declare class ClaudeCodeSpritesBridge implements SessionBridge {
42
56
  onComplete(cb: (success: boolean) => void): void;
43
57
  start(): Promise<void>;
44
58
  close(): void;
59
+ /**
60
+ * Install Claude Code hooks inside the sprite so that AskUserQuestion
61
+ * blocks until the user answers in the studio UI.
62
+ */
63
+ private installHooks;
64
+ /**
65
+ * Spawn a new Claude Code process. Called for both the initial prompt
66
+ * and follow-up iterate messages (with --resume).
67
+ */
68
+ private spawnClaudeAsync;
45
69
  private handleLine;
46
70
  private dispatchEvent;
47
71
  private writeUserMessage;
@@ -1 +1 @@
1
- {"version":3,"file":"claude-code-sprites.d.ts","sourceRoot":"","sources":["../../src/bridge/claude-code-sprites.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAE3D,OAAO,KAAK,EAAE,MAAM,EAAiB,MAAM,cAAc,CAAA;AACzD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAA;AAEzD,OAAO,KAAK,EAAE,aAAa,EAAiB,MAAM,YAAY,CAAA;AAI9D,MAAM,WAAW,uBAAuB;IACvC,0DAA0D;IAC1D,MAAM,EAAE,MAAM,CAAA;IACd,0CAA0C;IAC1C,GAAG,EAAE,MAAM,CAAA;IACX,gDAAgD;IAChD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,kDAAkD;IAClD,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IACvB,2BAA2B;IAC3B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;CACrB;AAcD,qBAAa,uBAAwB,YAAW,aAAa;IAC5D,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAE9C,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,mBAAmB,CAA0C;IACrE,OAAO,CAAC,iBAAiB,CAAwC;IACjE,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,GAAG,CAA6B;gBAGvC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,oBAAoB,EAChC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,uBAAuB;IAe1B,IAAI,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAMvC,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAWxD,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAgCnF,YAAY,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,GAAG,IAAI;IAIpD,UAAU,CAAC,EAAE,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI;IAI1C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAoE5B,KAAK,IAAI,IAAI;IAgBb,OAAO,CAAC,UAAU;IAUlB,OAAO,CAAC,aAAa;IAyCrB,OAAO,CAAC,gBAAgB;CAQxB"}
1
+ {"version":3,"file":"claude-code-sprites.d.ts","sourceRoot":"","sources":["../../src/bridge/claude-code-sprites.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAE3D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAE1C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAA;AAEzD,OAAO,KAAK,EAAE,aAAa,EAAiB,MAAM,YAAY,CAAA;AAI9D,MAAM,WAAW,uBAAuB;IACvC,0DAA0D;IAC1D,MAAM,EAAE,MAAM,CAAA;IACd,0CAA0C;IAC1C,GAAG,EAAE,MAAM,CAAA;IACX,gDAAgD;IAChD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,kDAAkD;IAClD,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IACvB,2BAA2B;IAC3B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;IACrB,iFAAiF;IACjF,SAAS,CAAC,EAAE,MAAM,CAAA;CAClB;AAeD,qBAAa,uBAAwB,YAAW,aAAa;IAC5D,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAE9C,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,mBAAmB,CAA0C;IACrE,OAAO,CAAC,iBAAiB,CAAwC;IACjE,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,GAAG,CAA6B;IAExC,uFAAuF;IACvF,OAAO,CAAC,eAAe,CAAsB;IAC7C,yDAAyD;IACzD,OAAO,CAAC,OAAO,CAAQ;IACvB,iFAAiF;IACjF,OAAO,CAAC,cAAc,CAAQ;IAC9B,sDAAsD;IACtD,OAAO,CAAC,cAAc,CAAQ;gBAG7B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,oBAAoB,EAChC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,uBAAuB;IAe1B,IAAI,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAMvC,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAYxD,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAgCnF,YAAY,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,GAAG,IAAI;IAIpD,UAAU,CAAC,EAAE,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI;IAI1C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAK5B,KAAK,IAAI,IAAI;IAgBb;;;OAGG;YACW,YAAY;IA0D1B;;;OAGG;YACW,gBAAgB;IAmI9B,OAAO,CAAC,UAAU;IAUlB,OAAO,CAAC,aAAa;IA8CrB,OAAO,CAAC,gBAAgB;CAQxB"}