bridge mode
่ฎพ่ฎก็ๅฟต
้ฎ้ข
่งฃๅณๆนๆก
VS Code / Web UI
โ (WebSocket/SSE)
Claude Code (Bridge)
โ (Anthropic API)
Claude AIVS Code / Web UI
โ (WebSocket/SSE)
Claude Code (Bridge)
โ (Anthropic API)
Claude AIโโโโโโโโโโโโโโโโโโโ
โ IDE Client โ
โ (VS Code Ext) โ
โโโโโโโโโโฌโโโโโโโโโ
โ WebSocket
โโโโโโโโโโผโโโโโโโโโ
โ Bridge Server โ
โ (Claude Code) โ
โโโโโโโโโโฌโโโโโโโโโ
โ API
โโโโโโโโโโผโโโโโโโโโ
โ Anthropic API โ
โโโโโโโโโโโโโโโโโโโtype BridgeMessage =
| { type: 'query'; messages: Message[]; tools: Tool[] }
| { type: 'query_event'; event: QueryEvent }
| { type: 'state_update'; state: Partial<AppState> }
| { type: 'tool_approval'; approved: boolean };class BridgeServer {
private wss: WebSocketServer;
private clients = new Set<WebSocket>();
constructor(port: number) {
this.wss = new WebSocketServer({ port });
this.wss.on('connection', ws => {
this.handleConnection(ws);
});
}
private handleConnection(ws: WebSocket): void {
this.clients.add(ws);
ws.on('message', data => {
this.handleMessage(ws, JSON.parse(data));
});
ws.on('close', () => {
this.clients.delete(ws);
});
}
private async handleMessage(
ws: WebSocket,
message: BridgeMessage
): Promise<void> {
if (message.type === 'query') {
// ๆง่กๆฅ่ฏข๏ผๆตๅผ่ฟๅ็ปๆ
for await (const event of query(message.messages, message.tools)) {
ws.send(JSON.stringify({
type: 'query_event',
event: event,
}));
}
}
}
}class BridgeClient {
private ws: WebSocket;
constructor(url: string) {
this.ws = new WebSocket(url);
}
async query(
messages: Message[],
tools: Tool[]
): AsyncGenerator<QueryEvent> {
// ๅ้ๆฅ่ฏข่ฏทๆฑ
this.ws.send(JSON.stringify({
type: 'query',
messages: messages,
tools: tools,
}));
// ๆฅๆถๆตๅผๅๅบ
for await (const data of this.receive()) {
const message = JSON.parse(data);
if (message.type === 'query_event') {
yield message.event;
}
}
}
private async *receive(): AsyncGenerator<string> {
const queue = [];
this.ws.on('message', data => {
queue.push(data.toString());
});
while (true) {
if (queue.length > 0) {
yield queue.shift();
} else {
await sleep(10);
}
}
}
}function generateToken(deviceId: string): string {
return jwt.sign(
{
deviceId: deviceId,
timestamp: Date.now(),
},
SECRET_KEY,
{ expiresIn: '7d' }
);
}
function verifyToken(token: string): boolean {
try {
jwt.verify(token, SECRET_KEY);
return true;
} catch {
return false;
}
}const trustedDevices = new Set<string>();
function trustDevice(deviceId: string): void {
trustedDevices.add(deviceId);
saveTrustedDevices();
}
function isTrusted(deviceId: string): boolean {
return trustedDevices.has(deviceId);
}function syncState(state: AppState): void {
// ๅนฟๆญ็ปๆๆ่ฟๆฅ็ๅฎขๆท็ซฏ
for (const client of clients) {
client.send(JSON.stringify({
type: 'state_update',
state: state,
}));
}
}// ๅฎขๆท็ซฏๆฅๆถ็ถๆๆดๆฐ
ws.on('message', data => {
const message = JSON.parse(data);
if (message.type === 'state_update') {
updateLocalState(message.state);
}
});