@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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-store.js","sourceRoot":"","sources":["../src/image-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function startServer(): Promise<void>;
package/dist/index.js ADDED
@@ -0,0 +1,153 @@
1
+ import { createServer } from "node:http";
2
+ import { fileURLToPath } from "node:url";
3
+ import { BridgeWebSocketServer } from "./websocket.js";
4
+ import { ImageStore } from "./image-store.js";
5
+ import { GalleryStore } from "./gallery-store.js";
6
+ import { printStartupInfo } from "./startup-info.js";
7
+ import { MdnsAdvertiser } from "./mdns.js";
8
+ import { ProjectHistory } from "./project-history.js";
9
+ import { getVersionInfo } from "./version.js";
10
+ import { DebugTraceStore } from "./debug-trace-store.js";
11
+ import { RecordingStore } from "./recording-store.js";
12
+ import { FirebaseAuthClient } from "./firebase-auth.js";
13
+ import { PromptHistoryBackupStore } from "./prompt-history-backup.js";
14
+ export async function startServer() {
15
+ const PORT = parseInt(process.env.BRIDGE_PORT ?? "8765", 10);
16
+ const HOST = process.env.BRIDGE_HOST ?? "0.0.0.0";
17
+ const API_KEY = process.env.BRIDGE_API_KEY;
18
+ console.log("[bridge] Starting ccpocket bridge server...");
19
+ if (API_KEY) {
20
+ console.log("[bridge] API key authentication enabled");
21
+ }
22
+ else {
23
+ console.log("[bridge] WARNING: No BRIDGE_API_KEY set - authentication disabled");
24
+ }
25
+ // Initialize Firebase Anonymous Auth for push notifications
26
+ let firebaseAuth;
27
+ try {
28
+ firebaseAuth = new FirebaseAuthClient();
29
+ await firebaseAuth.initialize();
30
+ console.log("[bridge] Push relay enabled (Firebase Anonymous Auth)");
31
+ }
32
+ catch (err) {
33
+ console.warn("[bridge] Push relay disabled: Firebase auth failed:", err);
34
+ firebaseAuth = undefined;
35
+ }
36
+ const imageStore = new ImageStore();
37
+ const galleryStore = new GalleryStore();
38
+ const projectHistory = new ProjectHistory();
39
+ const debugTraceStore = new DebugTraceStore();
40
+ const recordingStore = new RecordingStore();
41
+ const promptHistoryBackup = new PromptHistoryBackupStore();
42
+ const mdns = new MdnsAdvertiser();
43
+ // Initialize stores (async)
44
+ galleryStore.init().then(() => {
45
+ console.log("[bridge] Gallery store initialized");
46
+ }).catch((err) => {
47
+ console.error("[bridge] Failed to initialize gallery store:", err);
48
+ });
49
+ projectHistory.init().then(() => {
50
+ console.log("[bridge] Project history initialized");
51
+ }).catch((err) => {
52
+ console.error("[bridge] Failed to initialize project history:", err);
53
+ });
54
+ debugTraceStore.init().then(() => {
55
+ console.log("[bridge] Debug trace store initialized");
56
+ }).catch((err) => {
57
+ console.error("[bridge] Failed to initialize debug trace store:", err);
58
+ });
59
+ recordingStore.init().then(() => {
60
+ console.log("[bridge] Recording store initialized");
61
+ }).catch((err) => {
62
+ console.error("[bridge] Failed to initialize recording store:", err);
63
+ });
64
+ promptHistoryBackup.init().then(() => {
65
+ console.log("[bridge] Prompt history backup store initialized");
66
+ }).catch((err) => {
67
+ console.error("[bridge] Failed to initialize prompt history backup store:", err);
68
+ });
69
+ const startedAt = Date.now();
70
+ let wsServer = null;
71
+ const httpServer = createServer((req, res) => {
72
+ // CORS headers for Flutter Web clients
73
+ res.setHeader("Access-Control-Allow-Origin", "*");
74
+ res.setHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, OPTIONS");
75
+ res.setHeader("Access-Control-Allow-Headers", "Content-Type");
76
+ if (req.method === "OPTIONS") {
77
+ res.writeHead(204);
78
+ res.end();
79
+ return;
80
+ }
81
+ // Health check endpoint
82
+ if (req.url === "/health" && req.method === "GET") {
83
+ const body = JSON.stringify({
84
+ status: "ok",
85
+ uptime: Math.floor((Date.now() - startedAt) / 1000),
86
+ sessions: wsServer?.sessionCount ?? 0,
87
+ clients: wsServer?.clientCount ?? 0,
88
+ });
89
+ res.writeHead(200, { "Content-Type": "application/json" });
90
+ res.end(body);
91
+ return;
92
+ }
93
+ // Version info endpoint
94
+ if (req.url === "/version" && req.method === "GET") {
95
+ const body = JSON.stringify(getVersionInfo(startedAt));
96
+ res.writeHead(200, { "Content-Type": "application/json" });
97
+ res.end(body);
98
+ return;
99
+ }
100
+ // Serve images via ImageStore (in-memory, session-scoped)
101
+ if (imageStore.handleRequest(req, res))
102
+ return;
103
+ // Serve gallery images via GalleryStore (disk-persistent)
104
+ if (galleryStore.handleRequest(req, res))
105
+ return;
106
+ // Upload images via POST /api/gallery/upload
107
+ if (galleryStore.handleUploadRequest(req, res, (meta) => {
108
+ if (wsServer) {
109
+ const info = galleryStore.metaToInfo(meta);
110
+ wsServer.broadcastGalleryNewImage(info);
111
+ }
112
+ }))
113
+ return;
114
+ // Default 404 for unknown HTTP requests
115
+ res.writeHead(404, { "Content-Type": "text/plain" });
116
+ res.end("Not Found");
117
+ });
118
+ wsServer = new BridgeWebSocketServer({
119
+ server: httpServer,
120
+ apiKey: API_KEY,
121
+ imageStore,
122
+ galleryStore,
123
+ projectHistory,
124
+ debugTraceStore,
125
+ recordingStore,
126
+ firebaseAuth,
127
+ promptHistoryBackup,
128
+ });
129
+ httpServer.listen(PORT, HOST, () => {
130
+ console.log(`[bridge] Ready. Listening on http://${HOST}:${PORT} (HTTP + WebSocket)`);
131
+ mdns.start(PORT, API_KEY);
132
+ printStartupInfo(PORT, HOST, API_KEY);
133
+ });
134
+ function shutdown() {
135
+ console.log("\n[bridge] Shutting down gracefully...");
136
+ mdns.stop();
137
+ wsServer?.close();
138
+ httpServer.close();
139
+ process.exit(0);
140
+ }
141
+ process.on("SIGINT", shutdown);
142
+ process.on("SIGTERM", shutdown);
143
+ }
144
+ // Auto-start when executed directly (node dist/index.js, tsx src/index.ts)
145
+ const isDirectExecution = process.argv[1] &&
146
+ fileURLToPath(import.meta.url) === process.argv[1];
147
+ if (isDirectExecution) {
148
+ startServer().catch((err) => {
149
+ console.error("[bridge] Failed to start:", err);
150
+ process.exit(1);
151
+ });
152
+ }
153
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/mdns.d.ts ADDED
@@ -0,0 +1,6 @@
1
+ export declare class MdnsAdvertiser {
2
+ private bonjour;
3
+ private service;
4
+ start(port: number, apiKey?: string): void;
5
+ stop(): void;
6
+ }
package/dist/mdns.js ADDED
@@ -0,0 +1,42 @@
1
+ import { Bonjour } from "bonjour-service";
2
+ export class MdnsAdvertiser {
3
+ bonjour = null;
4
+ service = null;
5
+ start(port, apiKey) {
6
+ try {
7
+ this.bonjour = new Bonjour();
8
+ this.service = this.bonjour.publish({
9
+ name: "ccpocket-bridge",
10
+ type: "ccpocket",
11
+ protocol: "tcp",
12
+ port,
13
+ probe: false, // Skip name collision check (same bridge restarting)
14
+ txt: {
15
+ version: "1",
16
+ auth: apiKey ? "required" : "none",
17
+ },
18
+ });
19
+ // Handle async errors (e.g. name already in use from a stale process)
20
+ this.service.on("error", (err) => {
21
+ console.warn(`[bridge] mDNS: service error (non-fatal): ${err.message}`);
22
+ });
23
+ console.log(`[bridge] mDNS: advertising _ccpocket._tcp on port ${port}`);
24
+ }
25
+ catch (err) {
26
+ console.warn(`[bridge] mDNS: failed to advertise (non-fatal): ${err instanceof Error ? err.message : err}`);
27
+ this.stop();
28
+ }
29
+ }
30
+ stop() {
31
+ if (this.service) {
32
+ this.service.stop?.();
33
+ this.service = null;
34
+ }
35
+ if (this.bonjour) {
36
+ this.bonjour.destroy();
37
+ this.bonjour = null;
38
+ }
39
+ console.log("[bridge] mDNS: stopped advertising");
40
+ }
41
+ }
42
+ //# sourceMappingURL=mdns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mdns.js","sourceRoot":"","sources":["../src/mdns.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAgB,MAAM,iBAAiB,CAAC;AAExD,MAAM,OAAO,cAAc;IACjB,OAAO,GAAmB,IAAI,CAAC;IAC/B,OAAO,GAAmB,IAAI,CAAC;IAEvC,KAAK,CAAC,IAAY,EAAE,MAAe;QACjC,IAAI,CAAC;YACH,IAAI,CAAC,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;gBAClC,IAAI,EAAE,iBAAiB;gBACvB,IAAI,EAAE,UAAU;gBAChB,QAAQ,EAAE,KAAK;gBACf,IAAI;gBACJ,KAAK,EAAE,KAAK,EAAE,qDAAqD;gBACnE,GAAG,EAAE;oBACH,OAAO,EAAE,GAAG;oBACZ,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM;iBACnC;aACF,CAAC,CAAC;YACH,sEAAsE;YACtE,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAU,EAAE,EAAE;gBACtC,OAAO,CAAC,IAAI,CAAC,6CAA6C,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YAC3E,CAAC,CAAC,CAAC;YACH,OAAO,CAAC,GAAG,CACT,qDAAqD,IAAI,EAAE,CAC5D,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,mDAAmD,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;YAC5G,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,CAAC;IACH,CAAC;IAED,IAAI;QACF,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;YACtB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACtB,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACvB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACtB,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;IACpD,CAAC;CACF"}
@@ -0,0 +1,381 @@
1
+ import type { GalleryImageInfo } from "./gallery-store.js";
2
+ import type { ImageRef } from "./image-store.js";
3
+ import type { WindowInfo } from "./screenshot.js";
4
+ import type { WorktreeInfo } from "./worktree.js";
5
+ export type { ImageRef } from "./image-store.js";
6
+ export interface AssistantTextContent {
7
+ type: "text";
8
+ text: string;
9
+ }
10
+ export interface AssistantToolUseContent {
11
+ type: "tool_use";
12
+ id: string;
13
+ name: string;
14
+ input: Record<string, unknown>;
15
+ }
16
+ export interface AssistantThinkingContent {
17
+ type: "thinking";
18
+ thinking: string;
19
+ }
20
+ export type AssistantContent = AssistantTextContent | AssistantToolUseContent | AssistantThinkingContent;
21
+ /** Shape of the assistant message object within ServerMessage. */
22
+ export interface AssistantMessage {
23
+ id: string;
24
+ role: "assistant";
25
+ content: AssistantContent[];
26
+ model: string;
27
+ }
28
+ export type PermissionMode = "default" | "acceptEdits" | "bypassPermissions" | "plan";
29
+ export type Provider = "claude" | "codex";
30
+ export type ClientMessage = {
31
+ type: "start";
32
+ projectPath: string;
33
+ provider?: Provider;
34
+ sessionId?: string;
35
+ continue?: boolean;
36
+ permissionMode?: PermissionMode;
37
+ approvalPolicy?: string;
38
+ sandboxMode?: string;
39
+ model?: string;
40
+ effort?: "low" | "medium" | "high" | "max";
41
+ maxTurns?: number;
42
+ maxBudgetUsd?: number;
43
+ fallbackModel?: string;
44
+ forkSession?: boolean;
45
+ persistSession?: boolean;
46
+ modelReasoningEffort?: string;
47
+ networkAccessEnabled?: boolean;
48
+ webSearchMode?: string;
49
+ useWorktree?: boolean;
50
+ worktreeBranch?: string;
51
+ existingWorktreePath?: string;
52
+ } | {
53
+ type: "input";
54
+ text: string;
55
+ sessionId?: string;
56
+ imageId?: string;
57
+ imageBase64?: string;
58
+ mimeType?: string;
59
+ } | {
60
+ type: "push_register";
61
+ token: string;
62
+ platform: "ios" | "android" | "web";
63
+ } | {
64
+ type: "push_unregister";
65
+ token: string;
66
+ } | {
67
+ type: "set_permission_mode";
68
+ mode: PermissionMode;
69
+ sessionId?: string;
70
+ } | {
71
+ type: "set_sandbox_mode";
72
+ sandboxMode: string;
73
+ sessionId?: string;
74
+ } | {
75
+ type: "approve";
76
+ id: string;
77
+ updatedInput?: Record<string, unknown>;
78
+ clearContext?: boolean;
79
+ sessionId?: string;
80
+ } | {
81
+ type: "approve_always";
82
+ id: string;
83
+ sessionId?: string;
84
+ } | {
85
+ type: "reject";
86
+ id: string;
87
+ message?: string;
88
+ sessionId?: string;
89
+ } | {
90
+ type: "answer";
91
+ toolUseId: string;
92
+ result: string;
93
+ sessionId?: string;
94
+ } | {
95
+ type: "list_sessions";
96
+ } | {
97
+ type: "stop_session";
98
+ sessionId: string;
99
+ } | {
100
+ type: "get_history";
101
+ sessionId: string;
102
+ } | {
103
+ type: "list_recent_sessions";
104
+ limit?: number;
105
+ offset?: number;
106
+ projectPath?: string;
107
+ } | {
108
+ type: "resume_session";
109
+ sessionId: string;
110
+ projectPath: string;
111
+ permissionMode?: PermissionMode;
112
+ provider?: Provider;
113
+ approvalPolicy?: string;
114
+ sandboxMode?: string;
115
+ model?: string;
116
+ effort?: "low" | "medium" | "high" | "max";
117
+ maxTurns?: number;
118
+ maxBudgetUsd?: number;
119
+ fallbackModel?: string;
120
+ forkSession?: boolean;
121
+ persistSession?: boolean;
122
+ modelReasoningEffort?: string;
123
+ networkAccessEnabled?: boolean;
124
+ webSearchMode?: string;
125
+ } | {
126
+ type: "list_gallery";
127
+ project?: string;
128
+ sessionId?: string;
129
+ } | {
130
+ type: "list_files";
131
+ projectPath: string;
132
+ } | {
133
+ type: "get_diff";
134
+ projectPath: string;
135
+ } | {
136
+ type: "interrupt";
137
+ sessionId?: string;
138
+ } | {
139
+ type: "list_project_history";
140
+ } | {
141
+ type: "remove_project_history";
142
+ projectPath: string;
143
+ } | {
144
+ type: "list_worktrees";
145
+ projectPath: string;
146
+ } | {
147
+ type: "remove_worktree";
148
+ projectPath: string;
149
+ worktreePath: string;
150
+ } | {
151
+ type: "rewind";
152
+ sessionId: string;
153
+ targetUuid: string;
154
+ mode: "conversation" | "code" | "both";
155
+ } | {
156
+ type: "rewind_dry_run";
157
+ sessionId: string;
158
+ targetUuid: string;
159
+ } | {
160
+ type: "list_windows";
161
+ } | {
162
+ type: "take_screenshot";
163
+ mode: "fullscreen" | "window";
164
+ windowId?: number;
165
+ projectPath: string;
166
+ sessionId?: string;
167
+ } | {
168
+ type: "get_debug_bundle";
169
+ sessionId: string;
170
+ traceLimit?: number;
171
+ includeDiff?: boolean;
172
+ } | {
173
+ type: "get_usage";
174
+ } | {
175
+ type: "list_recordings";
176
+ } | {
177
+ type: "get_recording";
178
+ sessionId: string;
179
+ } | {
180
+ type: "get_message_images";
181
+ claudeSessionId: string;
182
+ messageUuid: string;
183
+ } | {
184
+ type: "backup_prompt_history";
185
+ data: string;
186
+ appVersion: string;
187
+ dbVersion: number;
188
+ } | {
189
+ type: "restore_prompt_history";
190
+ } | {
191
+ type: "get_prompt_history_backup_info";
192
+ };
193
+ export interface DebugTraceEvent {
194
+ ts: string;
195
+ sessionId: string;
196
+ direction: "incoming" | "outgoing" | "internal";
197
+ channel: "ws" | "session" | "bridge";
198
+ type: string;
199
+ detail?: string;
200
+ }
201
+ export type ServerMessage = {
202
+ type: "system";
203
+ subtype: string;
204
+ sessionId?: string;
205
+ claudeSessionId?: string;
206
+ model?: string;
207
+ provider?: Provider;
208
+ projectPath?: string;
209
+ slashCommands?: string[];
210
+ skills?: string[];
211
+ worktreePath?: string;
212
+ worktreeBranch?: string;
213
+ permissionMode?: PermissionMode;
214
+ sandboxMode?: string;
215
+ clearContext?: boolean;
216
+ } | {
217
+ type: "assistant";
218
+ message: AssistantMessage;
219
+ messageUuid?: string;
220
+ } | {
221
+ type: "tool_result";
222
+ toolUseId: string;
223
+ content: string;
224
+ toolName?: string;
225
+ images?: ImageRef[];
226
+ userMessageUuid?: string;
227
+ rawContentBlocks?: unknown[];
228
+ } | {
229
+ type: "result";
230
+ subtype: string;
231
+ result?: string;
232
+ error?: string;
233
+ cost?: number;
234
+ duration?: number;
235
+ sessionId?: string;
236
+ stopReason?: string;
237
+ inputTokens?: number;
238
+ cachedInputTokens?: number;
239
+ outputTokens?: number;
240
+ toolCalls?: number;
241
+ fileEdits?: number;
242
+ } | {
243
+ type: "error";
244
+ message: string;
245
+ } | {
246
+ type: "status";
247
+ status: ProcessStatus;
248
+ } | {
249
+ type: "history";
250
+ messages: ServerMessage[];
251
+ } | {
252
+ type: "permission_request";
253
+ toolUseId: string;
254
+ toolName: string;
255
+ input: Record<string, unknown>;
256
+ } | {
257
+ type: "stream_delta";
258
+ text: string;
259
+ } | {
260
+ type: "thinking_delta";
261
+ text: string;
262
+ } | {
263
+ type: "file_list";
264
+ files: string[];
265
+ } | {
266
+ type: "project_history";
267
+ projects: string[];
268
+ } | {
269
+ type: "diff_result";
270
+ diff: string;
271
+ error?: string;
272
+ } | {
273
+ type: "worktree_list";
274
+ worktrees: WorktreeInfo[];
275
+ } | {
276
+ type: "worktree_removed";
277
+ worktreePath: string;
278
+ } | {
279
+ type: "tool_use_summary";
280
+ summary: string;
281
+ precedingToolUseIds: string[];
282
+ } | {
283
+ type: "rewind_preview";
284
+ canRewind: boolean;
285
+ filesChanged?: string[];
286
+ insertions?: number;
287
+ deletions?: number;
288
+ error?: string;
289
+ } | {
290
+ type: "rewind_result";
291
+ success: boolean;
292
+ mode: "conversation" | "code" | "both";
293
+ error?: string;
294
+ } | {
295
+ type: "user_input";
296
+ text: string;
297
+ userMessageUuid?: string;
298
+ isSynthetic?: boolean;
299
+ isMeta?: boolean;
300
+ imageCount?: number;
301
+ } | {
302
+ type: "window_list";
303
+ windows: WindowInfo[];
304
+ } | {
305
+ type: "screenshot_result";
306
+ success: boolean;
307
+ image?: GalleryImageInfo;
308
+ error?: string;
309
+ } | {
310
+ type: "debug_bundle";
311
+ sessionId: string;
312
+ generatedAt: string;
313
+ session: {
314
+ id: string;
315
+ provider: Provider;
316
+ status: ProcessStatus;
317
+ projectPath: string;
318
+ worktreePath?: string;
319
+ worktreeBranch?: string;
320
+ claudeSessionId?: string;
321
+ createdAt: string;
322
+ lastActivityAt: string;
323
+ };
324
+ pastMessageCount: number;
325
+ historySummary: string[];
326
+ debugTrace: DebugTraceEvent[];
327
+ traceFilePath: string;
328
+ reproRecipe: {
329
+ wsUrlHint: string;
330
+ startBridgeCommand: string;
331
+ resumeSessionMessage: Record<string, unknown>;
332
+ getHistoryMessage: Record<string, unknown>;
333
+ getDebugBundleMessage: Record<string, unknown>;
334
+ notes: string[];
335
+ };
336
+ agentPrompt: string;
337
+ diff: string;
338
+ diffError?: string;
339
+ savedBundlePath?: string;
340
+ } | {
341
+ type: "usage_result";
342
+ providers: UsageInfoPayload[];
343
+ } | {
344
+ type: "message_images_result";
345
+ messageUuid: string;
346
+ images: ImageRef[];
347
+ } | {
348
+ type: "prompt_history_backup_result";
349
+ success: boolean;
350
+ backedUpAt?: string;
351
+ error?: string;
352
+ } | {
353
+ type: "prompt_history_restore_result";
354
+ success: boolean;
355
+ data?: string;
356
+ appVersion?: string;
357
+ dbVersion?: number;
358
+ backedUpAt?: string;
359
+ error?: string;
360
+ } | {
361
+ type: "prompt_history_backup_info";
362
+ exists: boolean;
363
+ appVersion?: string;
364
+ dbVersion?: number;
365
+ backedUpAt?: string;
366
+ sizeBytes?: number;
367
+ };
368
+ export interface UsageWindowPayload {
369
+ utilization: number;
370
+ resetsAt: string;
371
+ }
372
+ export interface UsageInfoPayload {
373
+ provider: "claude" | "codex";
374
+ fiveHour: UsageWindowPayload | null;
375
+ sevenDay: UsageWindowPayload | null;
376
+ error?: string;
377
+ }
378
+ export type ProcessStatus = "starting" | "idle" | "running" | "waiting_approval";
379
+ /** Normalize tool_result content: may be string or array of content blocks. */
380
+ export declare function normalizeToolResultContent(content: string | unknown[]): string;
381
+ export declare function parseClientMessage(data: string): ClientMessage | null;