@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.
- package/README.md +54 -0
- package/dist/claude-process.d.ts +108 -0
- package/dist/claude-process.js +471 -0
- package/dist/claude-process.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +42 -0
- package/dist/cli.js.map +1 -0
- package/dist/codex-process.d.ts +46 -0
- package/dist/codex-process.js +420 -0
- package/dist/codex-process.js.map +1 -0
- package/dist/debug-trace-store.d.ts +15 -0
- package/dist/debug-trace-store.js +78 -0
- package/dist/debug-trace-store.js.map +1 -0
- package/dist/firebase-auth.d.ts +35 -0
- package/dist/firebase-auth.js +132 -0
- package/dist/firebase-auth.js.map +1 -0
- package/dist/gallery-store.d.ts +66 -0
- package/dist/gallery-store.js +310 -0
- package/dist/gallery-store.js.map +1 -0
- package/dist/image-store.d.ts +22 -0
- package/dist/image-store.js +113 -0
- package/dist/image-store.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +153 -0
- package/dist/index.js.map +1 -0
- package/dist/mdns.d.ts +6 -0
- package/dist/mdns.js +42 -0
- package/dist/mdns.js.map +1 -0
- package/dist/parser.d.ts +381 -0
- package/dist/parser.js +218 -0
- package/dist/parser.js.map +1 -0
- package/dist/project-history.d.ts +10 -0
- package/dist/project-history.js +73 -0
- package/dist/project-history.js.map +1 -0
- package/dist/prompt-history-backup.d.ts +15 -0
- package/dist/prompt-history-backup.js +46 -0
- package/dist/prompt-history-backup.js.map +1 -0
- package/dist/push-relay.d.ts +27 -0
- package/dist/push-relay.js +69 -0
- package/dist/push-relay.js.map +1 -0
- package/dist/recording-store.d.ts +51 -0
- package/dist/recording-store.js +158 -0
- package/dist/recording-store.js.map +1 -0
- package/dist/screenshot.d.ts +28 -0
- package/dist/screenshot.js +98 -0
- package/dist/screenshot.js.map +1 -0
- package/dist/sdk-process.d.ts +151 -0
- package/dist/sdk-process.js +740 -0
- package/dist/sdk-process.js.map +1 -0
- package/dist/session.d.ts +126 -0
- package/dist/session.js +550 -0
- package/dist/session.js.map +1 -0
- package/dist/sessions-index.d.ts +86 -0
- package/dist/sessions-index.js +1027 -0
- package/dist/sessions-index.js.map +1 -0
- package/dist/setup-launchd.d.ts +8 -0
- package/dist/setup-launchd.js +109 -0
- package/dist/setup-launchd.js.map +1 -0
- package/dist/startup-info.d.ts +8 -0
- package/dist/startup-info.js +78 -0
- package/dist/startup-info.js.map +1 -0
- package/dist/usage.d.ts +17 -0
- package/dist/usage.js +236 -0
- package/dist/usage.js.map +1 -0
- package/dist/version.d.ts +11 -0
- package/dist/version.js +39 -0
- package/dist/version.js.map +1 -0
- package/dist/websocket.d.ts +71 -0
- package/dist/websocket.js +1487 -0
- package/dist/websocket.js.map +1 -0
- package/dist/worktree-store.d.ts +25 -0
- package/dist/worktree-store.js +59 -0
- package/dist/worktree-store.js.map +1 -0
- package/dist/worktree.d.ts +43 -0
- package/dist/worktree.js +295 -0
- package/dist/worktree.js.map +1 -0
- 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