@ccpocket/bridge 0.1.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 (77) hide show
  1. package/README.md +54 -0
  2. package/dist/claude-process.d.ts +108 -0
  3. package/dist/claude-process.js +471 -0
  4. package/dist/claude-process.js.map +1 -0
  5. package/dist/cli.d.ts +2 -0
  6. package/dist/cli.js +42 -0
  7. package/dist/cli.js.map +1 -0
  8. package/dist/codex-process.d.ts +46 -0
  9. package/dist/codex-process.js +420 -0
  10. package/dist/codex-process.js.map +1 -0
  11. package/dist/debug-trace-store.d.ts +15 -0
  12. package/dist/debug-trace-store.js +78 -0
  13. package/dist/debug-trace-store.js.map +1 -0
  14. package/dist/firebase-auth.d.ts +35 -0
  15. package/dist/firebase-auth.js +132 -0
  16. package/dist/firebase-auth.js.map +1 -0
  17. package/dist/gallery-store.d.ts +66 -0
  18. package/dist/gallery-store.js +310 -0
  19. package/dist/gallery-store.js.map +1 -0
  20. package/dist/image-store.d.ts +22 -0
  21. package/dist/image-store.js +113 -0
  22. package/dist/image-store.js.map +1 -0
  23. package/dist/index.d.ts +1 -0
  24. package/dist/index.js +153 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/mdns.d.ts +6 -0
  27. package/dist/mdns.js +42 -0
  28. package/dist/mdns.js.map +1 -0
  29. package/dist/parser.d.ts +381 -0
  30. package/dist/parser.js +218 -0
  31. package/dist/parser.js.map +1 -0
  32. package/dist/project-history.d.ts +10 -0
  33. package/dist/project-history.js +73 -0
  34. package/dist/project-history.js.map +1 -0
  35. package/dist/prompt-history-backup.d.ts +15 -0
  36. package/dist/prompt-history-backup.js +46 -0
  37. package/dist/prompt-history-backup.js.map +1 -0
  38. package/dist/push-relay.d.ts +27 -0
  39. package/dist/push-relay.js +69 -0
  40. package/dist/push-relay.js.map +1 -0
  41. package/dist/recording-store.d.ts +51 -0
  42. package/dist/recording-store.js +158 -0
  43. package/dist/recording-store.js.map +1 -0
  44. package/dist/screenshot.d.ts +28 -0
  45. package/dist/screenshot.js +98 -0
  46. package/dist/screenshot.js.map +1 -0
  47. package/dist/sdk-process.d.ts +151 -0
  48. package/dist/sdk-process.js +740 -0
  49. package/dist/sdk-process.js.map +1 -0
  50. package/dist/session.d.ts +126 -0
  51. package/dist/session.js +550 -0
  52. package/dist/session.js.map +1 -0
  53. package/dist/sessions-index.d.ts +86 -0
  54. package/dist/sessions-index.js +1027 -0
  55. package/dist/sessions-index.js.map +1 -0
  56. package/dist/setup-launchd.d.ts +8 -0
  57. package/dist/setup-launchd.js +109 -0
  58. package/dist/setup-launchd.js.map +1 -0
  59. package/dist/startup-info.d.ts +8 -0
  60. package/dist/startup-info.js +78 -0
  61. package/dist/startup-info.js.map +1 -0
  62. package/dist/usage.d.ts +17 -0
  63. package/dist/usage.js +236 -0
  64. package/dist/usage.js.map +1 -0
  65. package/dist/version.d.ts +11 -0
  66. package/dist/version.js +39 -0
  67. package/dist/version.js.map +1 -0
  68. package/dist/websocket.d.ts +71 -0
  69. package/dist/websocket.js +1487 -0
  70. package/dist/websocket.js.map +1 -0
  71. package/dist/worktree-store.d.ts +25 -0
  72. package/dist/worktree-store.js +59 -0
  73. package/dist/worktree-store.js.map +1 -0
  74. package/dist/worktree.d.ts +43 -0
  75. package/dist/worktree.js +295 -0
  76. package/dist/worktree.js.map +1 -0
  77. package/package.json +63 -0
package/README.md ADDED
@@ -0,0 +1,54 @@
1
+ # @ccpocket/bridge
2
+
3
+ Bridge server that connects [Claude Code CLI](https://docs.anthropic.com/en/docs/claude-code) and [Codex CLI](https://github.com/openai/codex) to mobile devices via WebSocket.
4
+
5
+ This is the server component of [ccpocket](https://github.com/K9i-0/ccpocket) — a mobile client for Claude Code and Codex.
6
+
7
+ ## Quick Start
8
+
9
+ ```bash
10
+ npx @ccpocket/bridge
11
+ ```
12
+
13
+ A QR code will appear in your terminal. Scan it with the ccpocket mobile app to connect.
14
+
15
+ ## Installation
16
+
17
+ ```bash
18
+ # Run directly (no install needed)
19
+ npx @ccpocket/bridge
20
+
21
+ # Or install globally
22
+ npm install -g @ccpocket/bridge
23
+ ccpocket-bridge
24
+ ```
25
+
26
+ ## Configuration
27
+
28
+ | Environment Variable | Default | Description |
29
+ |---------------------|---------|-------------|
30
+ | `BRIDGE_PORT` | `8765` | WebSocket port |
31
+ | `BRIDGE_HOST` | `0.0.0.0` | Bind address |
32
+ | `BRIDGE_API_KEY` | (none) | API key authentication (enabled when set) |
33
+
34
+ ```bash
35
+ # Example: custom port with API key
36
+ BRIDGE_PORT=9000 BRIDGE_API_KEY=my-secret npx @ccpocket/bridge
37
+ ```
38
+
39
+ ## Requirements
40
+
41
+ - Node.js v18+
42
+ - [Claude Code CLI](https://docs.anthropic.com/en/docs/claude-code) and/or [Codex CLI](https://github.com/openai/codex)
43
+
44
+ ## Architecture
45
+
46
+ ```
47
+ Mobile App ←WebSocket→ Bridge Server ←stdio→ Claude Code CLI
48
+ ```
49
+
50
+ The bridge server spawns and manages Claude Code CLI processes, translating WebSocket messages to/from the CLI's stdio interface. It supports multiple concurrent sessions.
51
+
52
+ ## License
53
+
54
+ [MIT](../../LICENSE)
@@ -0,0 +1,108 @@
1
+ import { EventEmitter } from "node:events";
2
+ import { type ServerMessage, type ProcessStatus, type PermissionMode } from "./parser.js";
3
+ export declare const ACCEPT_EDITS_AUTO_APPROVE: Set<string>;
4
+ /**
5
+ * Parse a permission rule in ToolName(ruleContent) format.
6
+ * Matches the CLI's internal pzT() function: /^([^(]+)\(([^)]+)\)$/
7
+ */
8
+ export declare function parseRule(rule: string): {
9
+ toolName: string;
10
+ ruleContent?: string;
11
+ };
12
+ /**
13
+ * Check if a tool invocation matches any session allow rule.
14
+ */
15
+ export declare function matchesSessionRule(toolName: string, input: Record<string, unknown>, rules: Set<string>): boolean;
16
+ /**
17
+ * Build a session allow rule string from a tool name and input.
18
+ * Bash: uses first word as prefix (e.g., "Bash(npm:*)")
19
+ * Others: tool name only (e.g., "Edit")
20
+ */
21
+ export declare function buildSessionRule(toolName: string, input: Record<string, unknown>): string;
22
+ /**
23
+ * Determine whether a tool needs user approval given the current permission mode.
24
+ */
25
+ export declare function toolNeedsApproval(toolName: string, mode: PermissionMode | undefined): boolean;
26
+ export interface StartOptions {
27
+ sessionId?: string;
28
+ continueMode?: boolean;
29
+ permissionMode?: PermissionMode;
30
+ }
31
+ export interface ClaudeProcessEvents {
32
+ message: [ServerMessage];
33
+ status: [ProcessStatus];
34
+ exit: [number | null];
35
+ permission_request: [PermissionRequest];
36
+ }
37
+ export interface PermissionRequest {
38
+ toolUseId: string;
39
+ toolName: string;
40
+ input: Record<string, unknown>;
41
+ resolve: (decision: PermissionDecision) => void;
42
+ }
43
+ export type PermissionDecision = {
44
+ behavior: "allow";
45
+ updatedInput?: Record<string, unknown>;
46
+ } | {
47
+ behavior: "deny";
48
+ message: string;
49
+ };
50
+ export declare class ClaudeProcess extends EventEmitter<ClaudeProcessEvents> {
51
+ private process;
52
+ private _status;
53
+ private stdoutBuffer;
54
+ private stderrBuffer;
55
+ private _sessionId;
56
+ private pendingPermissions;
57
+ private _permissionMode;
58
+ private sessionAllowRules;
59
+ private initTimeoutId;
60
+ get status(): ProcessStatus;
61
+ get sessionId(): string | null;
62
+ start(projectPath: string, options?: StartOptions): void;
63
+ stop(): void;
64
+ /**
65
+ * Interrupt the current Claude generation by sending SIGINT.
66
+ * This is the equivalent of pressing Escape/Ctrl+C in the CLI.
67
+ * Claude will stop the current turn and wait for new user input.
68
+ */
69
+ interrupt(): void;
70
+ writeStdin(text: string): void;
71
+ sendInput(text: string): void;
72
+ /**
73
+ * Send a tool_result back to Claude (for AskUserQuestion responses etc.)
74
+ */
75
+ sendToolResult(toolUseId: string, result: string): void;
76
+ /**
77
+ * Approve a pending permission request.
78
+ * In acceptEdits mode this is a no-op on the CLI side (tool runs automatically),
79
+ * but we still clear the pendingPermission tracking.
80
+ */
81
+ approve(toolUseId?: string): void;
82
+ /**
83
+ * Approve a pending permission request and add a session-scoped allow rule
84
+ * so the same tool+command pattern is auto-approved for the rest of the session.
85
+ */
86
+ approveAlways(toolUseId?: string): void;
87
+ /**
88
+ * Reject a pending permission request.
89
+ * Sends a tool_result with the rejection message to abort the tool.
90
+ */
91
+ reject(toolUseId?: string, message?: string): void;
92
+ private firstPendingId;
93
+ /**
94
+ * Resolve a pending permission. Returns true if a permission was found and resolved.
95
+ */
96
+ private resolvePendingPermission;
97
+ get isRunning(): boolean;
98
+ private handleStdout;
99
+ private processLine;
100
+ /**
101
+ * Check tool_use blocks in an assistant message and emit permission_request
102
+ * for tools that need approval based on the current permission mode.
103
+ */
104
+ private checkToolApprovals;
105
+ private updateStatusFromEvent;
106
+ private setStatus;
107
+ private emitMessage;
108
+ }
@@ -0,0 +1,471 @@
1
+ import { spawn, execSync } from "node:child_process";
2
+ import { existsSync, mkdirSync } from "node:fs";
3
+ import { EventEmitter } from "node:events";
4
+ import { parseClaudeEvent, claudeEventToServerMessage, normalizeToolResultContent, } from "./parser.js";
5
+ // Tools that are auto-approved in acceptEdits mode
6
+ export const ACCEPT_EDITS_AUTO_APPROVE = new Set([
7
+ "Read", "Glob", "Grep",
8
+ "Edit", "Write", "NotebookEdit",
9
+ "TaskCreate", "TaskUpdate", "TaskList", "TaskGet",
10
+ "EnterPlanMode", "AskUserQuestion",
11
+ "WebSearch", "WebFetch",
12
+ "Task", "Skill",
13
+ ]);
14
+ /**
15
+ * Parse a permission rule in ToolName(ruleContent) format.
16
+ * Matches the CLI's internal pzT() function: /^([^(]+)\(([^)]+)\)$/
17
+ */
18
+ export function parseRule(rule) {
19
+ const match = rule.match(/^([^(]+)\(([^)]+)\)$/);
20
+ if (!match || !match[1] || !match[2])
21
+ return { toolName: rule };
22
+ return { toolName: match[1], ruleContent: match[2] };
23
+ }
24
+ /**
25
+ * Check if a tool invocation matches any session allow rule.
26
+ */
27
+ export function matchesSessionRule(toolName, input, rules) {
28
+ for (const rule of rules) {
29
+ const parsed = parseRule(rule);
30
+ if (parsed.toolName !== toolName)
31
+ continue;
32
+ // No ruleContent → matches any invocation of this tool
33
+ if (!parsed.ruleContent)
34
+ return true;
35
+ // Bash: prefix matching with ":*" suffix
36
+ if (toolName === "Bash" && typeof input.command === "string") {
37
+ if (parsed.ruleContent.endsWith(":*")) {
38
+ const prefix = parsed.ruleContent.slice(0, -2);
39
+ const firstWord = input.command.trim().split(/\s+/)[0] ?? "";
40
+ if (firstWord === prefix)
41
+ return true;
42
+ }
43
+ else {
44
+ if (input.command === parsed.ruleContent)
45
+ return true;
46
+ }
47
+ }
48
+ }
49
+ return false;
50
+ }
51
+ /**
52
+ * Build a session allow rule string from a tool name and input.
53
+ * Bash: uses first word as prefix (e.g., "Bash(npm:*)")
54
+ * Others: tool name only (e.g., "Edit")
55
+ */
56
+ export function buildSessionRule(toolName, input) {
57
+ if (toolName === "Bash" && typeof input.command === "string") {
58
+ const firstWord = input.command.trim().split(/\s+/)[0] ?? "";
59
+ if (firstWord)
60
+ return `${toolName}(${firstWord}:*)`;
61
+ }
62
+ return toolName;
63
+ }
64
+ /**
65
+ * Determine whether a tool needs user approval given the current permission mode.
66
+ */
67
+ export function toolNeedsApproval(toolName, mode) {
68
+ if (!mode)
69
+ return true; // default: ask for everything
70
+ switch (mode) {
71
+ case "bypassPermissions":
72
+ case "dontAsk":
73
+ return false; // auto-approve everything
74
+ case "acceptEdits":
75
+ // ExitPlanMode always needs approval (plan review)
76
+ if (toolName === "ExitPlanMode")
77
+ return true;
78
+ // Known safe tools are auto-approved
79
+ if (ACCEPT_EDITS_AUTO_APPROVE.has(toolName))
80
+ return false;
81
+ // MCP tools and unknown tools need approval
82
+ return true;
83
+ case "default":
84
+ case "plan":
85
+ case "delegate":
86
+ default:
87
+ return true; // ask for everything
88
+ }
89
+ }
90
+ export class ClaudeProcess extends EventEmitter {
91
+ process = null;
92
+ _status = "idle";
93
+ stdoutBuffer = "";
94
+ stderrBuffer = "";
95
+ _sessionId = null;
96
+ pendingPermissions = new Map();
97
+ _permissionMode;
98
+ sessionAllowRules = new Set();
99
+ initTimeoutId = null;
100
+ get status() {
101
+ return this._status;
102
+ }
103
+ get sessionId() {
104
+ return this._sessionId;
105
+ }
106
+ start(projectPath, options) {
107
+ if (this.process) {
108
+ this.stop();
109
+ }
110
+ if (!existsSync(projectPath)) {
111
+ mkdirSync(projectPath, { recursive: true });
112
+ }
113
+ let claudePath = "claude";
114
+ try {
115
+ claudePath = execSync("which claude", { encoding: "utf-8" }).trim();
116
+ }
117
+ catch {
118
+ console.warn("[claude-process] Could not resolve claude path, using 'claude'");
119
+ }
120
+ const args = [
121
+ "-p",
122
+ "--output-format",
123
+ "stream-json",
124
+ "--input-format",
125
+ "stream-json",
126
+ "--verbose",
127
+ "--include-partial-messages",
128
+ ];
129
+ // Permission mode
130
+ if (options?.permissionMode) {
131
+ args.push("--permission-mode", options.permissionMode);
132
+ }
133
+ // Session resume
134
+ if (options?.sessionId) {
135
+ args.push("--resume", options.sessionId);
136
+ }
137
+ else if (options?.continueMode) {
138
+ args.push("--continue");
139
+ }
140
+ console.log(`[claude-process] Starting: ${claudePath} ${args.join(" ")} (cwd: ${projectPath})`);
141
+ this.process = spawn(claudePath, args, {
142
+ stdio: ["pipe", "pipe", "pipe"],
143
+ cwd: projectPath,
144
+ env: { ...process.env },
145
+ });
146
+ this.setStatus("starting");
147
+ this.stdoutBuffer = "";
148
+ this.stderrBuffer = "";
149
+ this._sessionId = null;
150
+ this.pendingPermissions.clear();
151
+ this._permissionMode = options?.permissionMode;
152
+ this.sessionAllowRules.clear();
153
+ // In -p mode with --input-format stream-json, Claude CLI won't emit
154
+ // system/init until the first user input. Set a fallback timeout to
155
+ // transition to "idle" if init hasn't arrived, since the process IS
156
+ // ready to accept input at that point.
157
+ if (this.initTimeoutId)
158
+ clearTimeout(this.initTimeoutId);
159
+ this.initTimeoutId = setTimeout(() => {
160
+ if (this._status === "starting" && this.process === currentProcess) {
161
+ console.log("[claude-process] Init timeout: setting status to idle (process ready for input)");
162
+ this.setStatus("idle");
163
+ }
164
+ this.initTimeoutId = null;
165
+ }, 3000);
166
+ const currentProcess = this.process;
167
+ currentProcess.stdout?.on("data", (chunk) => {
168
+ if (this.process !== currentProcess)
169
+ return;
170
+ this.handleStdout(chunk.toString());
171
+ });
172
+ currentProcess.stderr?.on("data", (chunk) => {
173
+ if (this.process !== currentProcess)
174
+ return;
175
+ const text = chunk.toString();
176
+ // Log non-empty stderr for debugging
177
+ const trimmed = text.trim();
178
+ if (trimmed) {
179
+ console.error(`[claude-process] stderr: ${trimmed.slice(0, 500)}`);
180
+ }
181
+ });
182
+ currentProcess.on("exit", (code) => {
183
+ console.log(`[claude-process] Process exited with code ${code}`);
184
+ if (this.process === currentProcess) {
185
+ // If process exits while still "starting", Claude CLI failed to initialize
186
+ if (this._status === "starting") {
187
+ this.emitMessage({
188
+ type: "error",
189
+ message: `Claude process exited before initialization (code ${code})`,
190
+ });
191
+ }
192
+ this.process = null;
193
+ this.setStatus("idle");
194
+ this.emit("exit", code);
195
+ }
196
+ });
197
+ currentProcess.on("error", (err) => {
198
+ console.error(`[claude-process] Process error:`, err.message);
199
+ if (this.process === currentProcess) {
200
+ this.emitMessage({ type: "error", message: `Process error: ${err.message}` });
201
+ this.process = null;
202
+ this.setStatus("idle");
203
+ }
204
+ });
205
+ }
206
+ stop() {
207
+ if (this.initTimeoutId) {
208
+ clearTimeout(this.initTimeoutId);
209
+ this.initTimeoutId = null;
210
+ }
211
+ if (this.process) {
212
+ console.log("[claude-process] Stopping process");
213
+ this.process.kill("SIGTERM");
214
+ this.process = null;
215
+ this.setStatus("idle");
216
+ this.pendingPermissions.clear();
217
+ }
218
+ }
219
+ /**
220
+ * Interrupt the current Claude generation by sending SIGINT.
221
+ * This is the equivalent of pressing Escape/Ctrl+C in the CLI.
222
+ * Claude will stop the current turn and wait for new user input.
223
+ */
224
+ interrupt() {
225
+ if (this.process) {
226
+ console.log("[claude-process] Sending SIGINT to interrupt");
227
+ this.process.kill("SIGINT");
228
+ this.pendingPermissions.clear();
229
+ }
230
+ }
231
+ writeStdin(text) {
232
+ if (!this.process?.stdin?.writable) {
233
+ console.error("[claude-process] Cannot write: stdin not writable");
234
+ return;
235
+ }
236
+ this.process.stdin.write(text);
237
+ }
238
+ sendInput(text) {
239
+ const msg = JSON.stringify({
240
+ type: "user",
241
+ message: {
242
+ role: "user",
243
+ content: [{ type: "text", text }],
244
+ },
245
+ });
246
+ this.writeStdin(msg + "\n");
247
+ }
248
+ /**
249
+ * Send a tool_result back to Claude (for AskUserQuestion responses etc.)
250
+ */
251
+ sendToolResult(toolUseId, result) {
252
+ const msg = JSON.stringify({
253
+ type: "user",
254
+ message: {
255
+ role: "user",
256
+ content: [{ type: "tool_result", tool_use_id: toolUseId, content: result }],
257
+ },
258
+ });
259
+ this.writeStdin(msg + "\n");
260
+ }
261
+ /**
262
+ * Approve a pending permission request.
263
+ * In acceptEdits mode this is a no-op on the CLI side (tool runs automatically),
264
+ * but we still clear the pendingPermission tracking.
265
+ */
266
+ approve(toolUseId) {
267
+ const resolved = this.resolvePendingPermission(toolUseId, { behavior: "allow" });
268
+ if (resolved && this.pendingPermissions.size === 0) {
269
+ this.setStatus("running");
270
+ }
271
+ }
272
+ /**
273
+ * Approve a pending permission request and add a session-scoped allow rule
274
+ * so the same tool+command pattern is auto-approved for the rest of the session.
275
+ */
276
+ approveAlways(toolUseId) {
277
+ const id = toolUseId ?? this.firstPendingId();
278
+ const pending = id ? this.pendingPermissions.get(id) : undefined;
279
+ if (pending) {
280
+ const rule = buildSessionRule(pending.toolName, pending.input);
281
+ this.sessionAllowRules.add(rule);
282
+ console.log(`[claude-process] Added session allow rule: ${rule}`);
283
+ }
284
+ const resolved = this.resolvePendingPermission(toolUseId, { behavior: "allow" });
285
+ if (resolved && this.pendingPermissions.size === 0) {
286
+ this.setStatus("running");
287
+ }
288
+ }
289
+ /**
290
+ * Reject a pending permission request.
291
+ * Sends a tool_result with the rejection message to abort the tool.
292
+ */
293
+ reject(toolUseId, message) {
294
+ const id = toolUseId ?? this.firstPendingId();
295
+ const rejectMsg = message ?? "User rejected this action";
296
+ const resolved = this.resolvePendingPermission(toolUseId, {
297
+ behavior: "deny",
298
+ message: rejectMsg,
299
+ });
300
+ // Send tool_result to CLI so it knows the tool was rejected
301
+ if (resolved && id) {
302
+ this.sendToolResult(id, `User rejected: ${rejectMsg}`);
303
+ }
304
+ if (this.pendingPermissions.size === 0) {
305
+ this.setStatus("running");
306
+ }
307
+ }
308
+ firstPendingId() {
309
+ const first = this.pendingPermissions.values().next();
310
+ return first.done ? undefined : first.value.toolUseId;
311
+ }
312
+ /**
313
+ * Resolve a pending permission. Returns true if a permission was found and resolved.
314
+ */
315
+ resolvePendingPermission(toolUseId, decision) {
316
+ if (toolUseId) {
317
+ const pending = this.pendingPermissions.get(toolUseId);
318
+ if (pending) {
319
+ pending.resolve(decision);
320
+ this.pendingPermissions.delete(toolUseId);
321
+ return true;
322
+ }
323
+ }
324
+ // If no specific ID, resolve the first pending request
325
+ const first = this.pendingPermissions.values().next();
326
+ if (!first.done) {
327
+ first.value.resolve(decision);
328
+ this.pendingPermissions.delete(first.value.toolUseId);
329
+ return true;
330
+ }
331
+ const action = decision.behavior === "allow" ? "approve" : "reject";
332
+ console.log(`[claude-process] ${action}() called but no pending permission requests`);
333
+ return false;
334
+ }
335
+ get isRunning() {
336
+ return this.process !== null;
337
+ }
338
+ handleStdout(data) {
339
+ this.stdoutBuffer += data;
340
+ const lines = this.stdoutBuffer.split("\n");
341
+ this.stdoutBuffer = lines.pop() ?? "";
342
+ for (const line of lines) {
343
+ this.processLine(line);
344
+ }
345
+ }
346
+ processLine(line) {
347
+ const event = parseClaudeEvent(line);
348
+ if (!event)
349
+ return;
350
+ // Capture session_id from system/init and result events
351
+ if (event.type === "system" && event.subtype === "init") {
352
+ this._sessionId = event.session_id;
353
+ }
354
+ else if (event.type === "result" && "session_id" in event) {
355
+ this._sessionId = event.session_id;
356
+ }
357
+ this.updateStatusFromEvent(event);
358
+ const serverMsg = claudeEventToServerMessage(event);
359
+ if (serverMsg) {
360
+ this.emitMessage(serverMsg);
361
+ }
362
+ // After assistant message, check if any tool_use blocks need approval
363
+ if (event.type === "assistant") {
364
+ this.checkToolApprovals(event);
365
+ }
366
+ // Handle multiple tool results in a single user event
367
+ if (event.type === "user") {
368
+ const toolResults = event.message.content.filter((c) => c.type === "tool_result");
369
+ for (let i = 1; i < toolResults.length; i++) {
370
+ const tr = toolResults[i];
371
+ if (tr.type === "tool_result") {
372
+ this.emitMessage({
373
+ type: "tool_result",
374
+ toolUseId: tr.tool_use_id,
375
+ content: normalizeToolResultContent(tr.content),
376
+ });
377
+ }
378
+ }
379
+ // Clear pending permissions for tool_results that came back from CLI
380
+ // (tool was auto-executed by CLI, so no approval needed)
381
+ for (const tr of toolResults) {
382
+ if (tr.type === "tool_result") {
383
+ this.pendingPermissions.delete(tr.tool_use_id);
384
+ }
385
+ }
386
+ if (this.pendingPermissions.size === 0 && this._status === "waiting_approval") {
387
+ this.setStatus("running");
388
+ }
389
+ }
390
+ }
391
+ /**
392
+ * Check tool_use blocks in an assistant message and emit permission_request
393
+ * for tools that need approval based on the current permission mode.
394
+ */
395
+ checkToolApprovals(event) {
396
+ for (const content of event.message.content) {
397
+ if (content.type !== "tool_use")
398
+ continue;
399
+ const toolUse = content;
400
+ // AskUserQuestion is handled by a separate UI flow — skip
401
+ if (toolUse.name === "AskUserQuestion")
402
+ continue;
403
+ if (!toolNeedsApproval(toolUse.name, this._permissionMode))
404
+ continue;
405
+ // Check session allow rules
406
+ if (matchesSessionRule(toolUse.name, toolUse.input, this.sessionAllowRules))
407
+ continue;
408
+ // Already pending (e.g. from a duplicate event)
409
+ if (this.pendingPermissions.has(toolUse.id))
410
+ continue;
411
+ const permReq = {
412
+ toolUseId: toolUse.id,
413
+ toolName: toolUse.name,
414
+ input: toolUse.input,
415
+ resolve: () => { }, // placeholder — replaced by caller
416
+ };
417
+ this.pendingPermissions.set(toolUse.id, permReq);
418
+ this.emitMessage({
419
+ type: "permission_request",
420
+ toolUseId: toolUse.id,
421
+ toolName: toolUse.name,
422
+ input: toolUse.input,
423
+ });
424
+ this.setStatus("waiting_approval");
425
+ }
426
+ }
427
+ updateStatusFromEvent(event) {
428
+ switch (event.type) {
429
+ case "system":
430
+ // After init, Claude CLI is idle and waiting for user input
431
+ if (event.subtype === "init") {
432
+ if (this.initTimeoutId) {
433
+ clearTimeout(this.initTimeoutId);
434
+ this.initTimeoutId = null;
435
+ }
436
+ this.setStatus("idle");
437
+ }
438
+ break;
439
+ case "assistant": {
440
+ // Don't override waiting_approval if we have pending permissions
441
+ if (this.pendingPermissions.size > 0)
442
+ break;
443
+ this.setStatus("running");
444
+ break;
445
+ }
446
+ case "user":
447
+ // Don't override waiting_approval if we have pending permissions
448
+ if (this.pendingPermissions.size > 0)
449
+ break;
450
+ this.setStatus("running");
451
+ break;
452
+ case "result":
453
+ // Result always clears pending state
454
+ this.pendingPermissions.clear();
455
+ this.setStatus("idle");
456
+ break;
457
+ // stream_event doesn't change status
458
+ }
459
+ }
460
+ setStatus(status) {
461
+ if (this._status !== status) {
462
+ this._status = status;
463
+ this.emit("status", status);
464
+ this.emitMessage({ type: "status", status });
465
+ }
466
+ }
467
+ emitMessage(msg) {
468
+ this.emit("message", msg);
469
+ }
470
+ }
471
+ //# sourceMappingURL=claude-process.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-process.js","sourceRoot":"","sources":["../src/claude-process.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};