@cmdctrl/claude-code 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 (83) hide show
  1. package/dist/adapter/claude-cli.d.ts +41 -0
  2. package/dist/adapter/claude-cli.d.ts.map +1 -0
  3. package/dist/adapter/claude-cli.js +525 -0
  4. package/dist/adapter/claude-cli.js.map +1 -0
  5. package/dist/adapter/events.d.ts +52 -0
  6. package/dist/adapter/events.d.ts.map +1 -0
  7. package/dist/adapter/events.js +134 -0
  8. package/dist/adapter/events.js.map +1 -0
  9. package/dist/client/messages.d.ts +140 -0
  10. package/dist/client/messages.d.ts.map +1 -0
  11. package/dist/client/messages.js +6 -0
  12. package/dist/client/messages.js.map +1 -0
  13. package/dist/client/websocket.d.ts +115 -0
  14. package/dist/client/websocket.d.ts.map +1 -0
  15. package/dist/client/websocket.js +434 -0
  16. package/dist/client/websocket.js.map +1 -0
  17. package/dist/commands/register.d.ts +10 -0
  18. package/dist/commands/register.d.ts.map +1 -0
  19. package/dist/commands/register.js +175 -0
  20. package/dist/commands/register.js.map +1 -0
  21. package/dist/commands/start.d.ts +9 -0
  22. package/dist/commands/start.d.ts.map +1 -0
  23. package/dist/commands/start.js +54 -0
  24. package/dist/commands/start.js.map +1 -0
  25. package/dist/commands/status.d.ts +5 -0
  26. package/dist/commands/status.d.ts.map +1 -0
  27. package/dist/commands/status.js +38 -0
  28. package/dist/commands/status.js.map +1 -0
  29. package/dist/commands/stop.d.ts +5 -0
  30. package/dist/commands/stop.d.ts.map +1 -0
  31. package/dist/commands/stop.js +59 -0
  32. package/dist/commands/stop.js.map +1 -0
  33. package/dist/commands/unregister.d.ts +5 -0
  34. package/dist/commands/unregister.d.ts.map +1 -0
  35. package/dist/commands/unregister.js +28 -0
  36. package/dist/commands/unregister.js.map +1 -0
  37. package/dist/config/config.d.ts +68 -0
  38. package/dist/config/config.d.ts.map +1 -0
  39. package/dist/config/config.js +193 -0
  40. package/dist/config/config.js.map +1 -0
  41. package/dist/handlers/context-handler.d.ts +37 -0
  42. package/dist/handlers/context-handler.d.ts.map +1 -0
  43. package/dist/handlers/context-handler.js +303 -0
  44. package/dist/handlers/context-handler.js.map +1 -0
  45. package/dist/index.d.ts +3 -0
  46. package/dist/index.d.ts.map +1 -0
  47. package/dist/index.js +39 -0
  48. package/dist/index.js.map +1 -0
  49. package/dist/message-reader.d.ts +25 -0
  50. package/dist/message-reader.d.ts.map +1 -0
  51. package/dist/message-reader.js +454 -0
  52. package/dist/message-reader.js.map +1 -0
  53. package/dist/session-discovery.d.ts +48 -0
  54. package/dist/session-discovery.d.ts.map +1 -0
  55. package/dist/session-discovery.js +496 -0
  56. package/dist/session-discovery.js.map +1 -0
  57. package/dist/session-watcher.d.ts +92 -0
  58. package/dist/session-watcher.d.ts.map +1 -0
  59. package/dist/session-watcher.js +494 -0
  60. package/dist/session-watcher.js.map +1 -0
  61. package/dist/session-watcher.test.d.ts +9 -0
  62. package/dist/session-watcher.test.d.ts.map +1 -0
  63. package/dist/session-watcher.test.js +149 -0
  64. package/dist/session-watcher.test.js.map +1 -0
  65. package/jest.config.js +8 -0
  66. package/package.json +42 -0
  67. package/src/adapter/claude-cli.ts +591 -0
  68. package/src/adapter/events.ts +186 -0
  69. package/src/client/messages.ts +193 -0
  70. package/src/client/websocket.ts +509 -0
  71. package/src/commands/register.ts +201 -0
  72. package/src/commands/start.ts +70 -0
  73. package/src/commands/status.ts +47 -0
  74. package/src/commands/stop.ts +58 -0
  75. package/src/commands/unregister.ts +30 -0
  76. package/src/config/config.ts +163 -0
  77. package/src/handlers/context-handler.ts +337 -0
  78. package/src/index.ts +45 -0
  79. package/src/message-reader.ts +485 -0
  80. package/src/session-discovery.ts +557 -0
  81. package/src/session-watcher.test.ts +141 -0
  82. package/src/session-watcher.ts +560 -0
  83. package/tsconfig.json +19 -0
@@ -0,0 +1,41 @@
1
+ type EventCallback = (taskId: string, eventType: string, data: Record<string, unknown>) => void;
2
+ export declare class ClaudeAdapter {
3
+ private running;
4
+ private onEvent;
5
+ constructor(onEvent: EventCallback);
6
+ /**
7
+ * Start a new task
8
+ */
9
+ startTask(taskId: string, instruction: string, projectPath?: string): Promise<void>;
10
+ /**
11
+ * Resume a task with user's reply
12
+ * Falls back to startTask if session doesn't exist
13
+ */
14
+ resumeTask(taskId: string, sessionId: string, message: string, projectPath?: string): Promise<void>;
15
+ /**
16
+ * Cancel a running task
17
+ */
18
+ cancelTask(taskId: string): Promise<void>;
19
+ /**
20
+ * Stop all running tasks
21
+ */
22
+ stopAll(): Promise<void>;
23
+ /**
24
+ * Get list of running task IDs
25
+ */
26
+ getRunningTasks(): string[];
27
+ /**
28
+ * Handle process stdout/stderr and emit events
29
+ */
30
+ private handleProcessOutput;
31
+ /**
32
+ * Handle process stdout and emit events (without close handler - for resumeTask fallback)
33
+ */
34
+ private handleProcessOutputWithoutClose;
35
+ /**
36
+ * Handle a parsed stream event from Claude CLI
37
+ */
38
+ private handleStreamEvent;
39
+ }
40
+ export {};
41
+ //# sourceMappingURL=claude-cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-cli.d.ts","sourceRoot":"","sources":["../../src/adapter/claude-cli.ts"],"names":[],"mappings":"AA8HA,KAAK,aAAa,GAAG,CACnB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC1B,IAAI,CAAC;AAEV,qBAAa,aAAa;IACxB,OAAO,CAAC,OAAO,CAAuC;IACtD,OAAO,CAAC,OAAO,CAAgB;gBAEnB,OAAO,EAAE,aAAa;IAIlC;;OAEG;IACG,SAAS,CACb,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC;IA0DhB;;;OAGG;IACG,UAAU,CACd,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC;IA+FhB;;OAEG;IACG,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkB/C;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAa9B;;OAEG;IACH,eAAe,IAAI,MAAM,EAAE;IAI3B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAiD3B;;OAEG;IACH,OAAO,CAAC,+BAA+B;IAqCvC;;OAEG;IACH,OAAO,CAAC,iBAAiB;CA8I1B"}
@@ -0,0 +1,525 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.ClaudeAdapter = void 0;
37
+ const child_process_1 = require("child_process");
38
+ const readline = __importStar(require("readline"));
39
+ const fs = __importStar(require("fs"));
40
+ const os = __importStar(require("os"));
41
+ const path = __importStar(require("path"));
42
+ const events_1 = require("./events");
43
+ const message_reader_1 = require("../message-reader");
44
+ const DEFAULT_TIMEOUT = 10 * 60 * 1000; // 10 minutes
45
+ // Find claude CLI in common locations
46
+ function findClaudeCli() {
47
+ if (process.env.CLAUDE_CODE_CLI_PATH) {
48
+ return process.env.CLAUDE_CODE_CLI_PATH;
49
+ }
50
+ const home = os.homedir();
51
+ const commonPaths = [
52
+ path.join(home, '.npm-global', 'bin', 'claude'),
53
+ path.join(home, '.nvm', 'versions', 'node', 'v20.18.0', 'bin', 'claude'),
54
+ '/usr/local/bin/claude',
55
+ '/opt/homebrew/bin/claude',
56
+ 'claude' // Fall back to PATH
57
+ ];
58
+ for (const p of commonPaths) {
59
+ if (p === 'claude')
60
+ return p; // PATH fallback
61
+ try {
62
+ if (fs.existsSync(p)) {
63
+ return p;
64
+ }
65
+ }
66
+ catch {
67
+ continue;
68
+ }
69
+ }
70
+ return 'claude'; // Fall back to PATH
71
+ }
72
+ const CLI_PATH = findClaudeCli();
73
+ console.log(`[ClaudeAdapter] Using CLI path: ${CLI_PATH}`);
74
+ /**
75
+ * Read the last user message UUID from a session JSONL file
76
+ * Used for associating verbose output with the triggering user message
77
+ */
78
+ function getLastUserMessageUuid(sessionId) {
79
+ const filePath = (0, message_reader_1.findSessionFile)(sessionId);
80
+ if (!filePath) {
81
+ console.log(`[getLastUserMessageUuid] File not found for session ${sessionId}`);
82
+ return undefined;
83
+ }
84
+ try {
85
+ const content = fs.readFileSync(filePath, 'utf-8');
86
+ const lines = content.split('\n').filter(l => l.trim());
87
+ // Count user messages for debugging
88
+ let userMessageCount = 0;
89
+ let lastUserUuid;
90
+ let lastUserContent;
91
+ // Find the last user message UUID (iterate backwards)
92
+ for (let i = lines.length - 1; i >= 0; i--) {
93
+ try {
94
+ const entry = JSON.parse(lines[i]);
95
+ if (entry.type === 'user' && entry.uuid) {
96
+ userMessageCount++;
97
+ if (!lastUserUuid) {
98
+ lastUserUuid = entry.uuid;
99
+ // Get first 50 chars of message content for debugging
100
+ if (entry.message?.content) {
101
+ const msgContent = typeof entry.message.content === 'string'
102
+ ? entry.message.content
103
+ : JSON.stringify(entry.message.content);
104
+ lastUserContent = msgContent.substring(0, 50);
105
+ }
106
+ }
107
+ }
108
+ }
109
+ catch {
110
+ continue;
111
+ }
112
+ }
113
+ console.log(`[getLastUserMessageUuid] Found ${userMessageCount} user messages, last UUID: ${lastUserUuid}, content: "${lastUserContent}"`);
114
+ return lastUserUuid;
115
+ }
116
+ catch (err) {
117
+ console.log(`[getLastUserMessageUuid] File read error:`, err);
118
+ }
119
+ return undefined;
120
+ }
121
+ // Allowed tools for Claude CLI
122
+ const ALLOWED_TOOLS = [
123
+ 'Read',
124
+ 'Glob',
125
+ 'Grep',
126
+ 'WebSearch',
127
+ 'WebFetch',
128
+ 'LSP',
129
+ 'Task',
130
+ 'TodoWrite',
131
+ 'Bash',
132
+ 'Edit',
133
+ 'Write',
134
+ 'NotebookEdit',
135
+ 'AskUserQuestion' // Required for pause/resume workflow
136
+ ].join(',');
137
+ class ClaudeAdapter {
138
+ running = new Map();
139
+ onEvent;
140
+ constructor(onEvent) {
141
+ this.onEvent = onEvent;
142
+ }
143
+ /**
144
+ * Start a new task
145
+ */
146
+ async startTask(taskId, instruction, projectPath) {
147
+ console.log(`[${taskId}] Starting task: ${instruction.substring(0, 50)}...`);
148
+ const rt = {
149
+ taskId,
150
+ sessionId: '',
151
+ question: '',
152
+ options: [],
153
+ context: '',
154
+ process: null,
155
+ timeoutHandle: null
156
+ };
157
+ this.running.set(taskId, rt);
158
+ // Validate cwd exists
159
+ let cwd = undefined;
160
+ if (projectPath && fs.existsSync(projectPath)) {
161
+ cwd = projectPath;
162
+ }
163
+ else if (projectPath) {
164
+ console.log(`[${taskId}] Warning: project path does not exist: ${projectPath}, using home dir`);
165
+ cwd = os.homedir();
166
+ // Notify user that the path doesn't exist
167
+ this.onEvent(taskId, 'WARNING', {
168
+ warning: `Project path "${projectPath}" does not exist. Running in home directory instead.`
169
+ });
170
+ }
171
+ // Build command arguments
172
+ const args = [
173
+ '-p', instruction,
174
+ '--output-format', 'stream-json',
175
+ '--verbose',
176
+ '--permission-mode', 'acceptEdits',
177
+ '--allowedTools', ALLOWED_TOOLS
178
+ ];
179
+ console.log(`[${taskId}] Spawning: ${CLI_PATH} with cwd: ${cwd || 'default'}`);
180
+ // Spawn Claude CLI (no shell - direct execution preserves arguments correctly)
181
+ const proc = (0, child_process_1.spawn)(CLI_PATH, args, {
182
+ cwd,
183
+ stdio: ['ignore', 'pipe', 'pipe']
184
+ });
185
+ rt.process = proc;
186
+ // Set timeout
187
+ rt.timeoutHandle = setTimeout(() => {
188
+ console.log(`[${taskId}] Task timed out`);
189
+ proc.kill('SIGKILL');
190
+ this.onEvent(taskId, 'ERROR', { error: 'execution timeout' });
191
+ }, DEFAULT_TIMEOUT);
192
+ // Handle process events
193
+ this.handleProcessOutput(taskId, proc, rt);
194
+ }
195
+ /**
196
+ * Resume a task with user's reply
197
+ * Falls back to startTask if session doesn't exist
198
+ */
199
+ async resumeTask(taskId, sessionId, message, projectPath) {
200
+ console.log(`[${taskId}] ===== RESUME TASK START =====`);
201
+ console.log(`[${taskId}] Session: ${sessionId.slice(-8)}, Message: "${message.slice(0, 50)}..."`);
202
+ const rt = {
203
+ taskId,
204
+ sessionId,
205
+ question: '',
206
+ options: [],
207
+ context: '',
208
+ process: null,
209
+ timeoutHandle: null,
210
+ userMessageUuid: undefined
211
+ };
212
+ // Note: userMessageUuid starts as undefined - will be read from JSONL on first assistant event
213
+ console.log(`[${taskId}] Initial state: sessionId=${sessionId.slice(-8)}, userMessageUuid=none`);
214
+ this.running.set(taskId, rt);
215
+ // Validate cwd exists (same logic as startTask)
216
+ let cwd = undefined;
217
+ if (projectPath && fs.existsSync(projectPath)) {
218
+ cwd = projectPath;
219
+ }
220
+ else if (projectPath) {
221
+ console.log(`[${taskId}] Warning: project path does not exist: ${projectPath}, using home dir`);
222
+ cwd = os.homedir();
223
+ }
224
+ // Build command arguments with --resume
225
+ const args = [
226
+ '-p', message,
227
+ '--resume', sessionId,
228
+ '--output-format', 'stream-json',
229
+ '--verbose',
230
+ '--permission-mode', 'acceptEdits',
231
+ '--allowedTools', ALLOWED_TOOLS
232
+ ];
233
+ console.log(`[${taskId}] Spawning resume: ${CLI_PATH} --resume ${sessionId} with cwd: ${cwd || 'default'}`);
234
+ // Spawn Claude CLI with same cwd as original task (no shell - direct execution)
235
+ const proc = (0, child_process_1.spawn)(CLI_PATH, args, {
236
+ cwd,
237
+ stdio: ['ignore', 'pipe', 'pipe']
238
+ });
239
+ rt.process = proc;
240
+ // Track if we've seen the "no conversation found" error
241
+ let sessionNotFound = false;
242
+ let stderrBuffer = '';
243
+ // Check stderr for session not found error
244
+ proc.stderr?.on('data', (data) => {
245
+ const text = data.toString();
246
+ stderrBuffer += text;
247
+ console.log(`[${taskId}] stderr: ${text}`);
248
+ if (text.includes('No conversation found')) {
249
+ sessionNotFound = true;
250
+ }
251
+ });
252
+ // Handle quick exit with session not found - fall back to new session
253
+ proc.on('close', (code) => {
254
+ if (code !== 0 && sessionNotFound) {
255
+ console.log(`[${taskId}] Session ${sessionId} not found, falling back to new session`);
256
+ // Clean up this attempt
257
+ if (rt.timeoutHandle) {
258
+ clearTimeout(rt.timeoutHandle);
259
+ }
260
+ this.running.delete(taskId);
261
+ // Start fresh instead
262
+ this.startTask(taskId, message, projectPath);
263
+ return;
264
+ }
265
+ // Normal exit handling
266
+ console.log(`[${taskId}] Process exited with code ${code}`);
267
+ if (rt.timeoutHandle) {
268
+ clearTimeout(rt.timeoutHandle);
269
+ }
270
+ this.running.delete(taskId);
271
+ });
272
+ // Set timeout
273
+ rt.timeoutHandle = setTimeout(() => {
274
+ console.log(`[${taskId}] Task timed out`);
275
+ proc.kill('SIGKILL');
276
+ this.onEvent(taskId, 'ERROR', { error: 'execution timeout' });
277
+ }, DEFAULT_TIMEOUT);
278
+ // Handle process events (but skip the close handler since we handle it above)
279
+ this.handleProcessOutputWithoutClose(taskId, proc, rt);
280
+ }
281
+ /**
282
+ * Cancel a running task
283
+ */
284
+ async cancelTask(taskId) {
285
+ const rt = this.running.get(taskId);
286
+ if (!rt) {
287
+ console.log(`[${taskId}] Task not found for cancellation`);
288
+ return;
289
+ }
290
+ if (rt.process) {
291
+ rt.process.kill('SIGTERM');
292
+ }
293
+ if (rt.timeoutHandle) {
294
+ clearTimeout(rt.timeoutHandle);
295
+ }
296
+ this.running.delete(taskId);
297
+ console.log(`[${taskId}] Task cancelled`);
298
+ }
299
+ /**
300
+ * Stop all running tasks
301
+ */
302
+ async stopAll() {
303
+ for (const [taskId, rt] of this.running) {
304
+ console.log(`[${taskId}] Stopping task`);
305
+ if (rt.process) {
306
+ rt.process.kill('SIGTERM');
307
+ }
308
+ if (rt.timeoutHandle) {
309
+ clearTimeout(rt.timeoutHandle);
310
+ }
311
+ }
312
+ this.running.clear();
313
+ }
314
+ /**
315
+ * Get list of running task IDs
316
+ */
317
+ getRunningTasks() {
318
+ return Array.from(this.running.keys());
319
+ }
320
+ /**
321
+ * Handle process stdout/stderr and emit events
322
+ */
323
+ handleProcessOutput(taskId, proc, rt) {
324
+ // Create readline interface for NDJSON parsing
325
+ const rl = readline.createInterface({
326
+ input: proc.stdout,
327
+ crlfDelay: Infinity
328
+ });
329
+ // Parse each line as JSON to track state (userMessageUuid)
330
+ // NOTE: Verbose output is now handled by SessionWatcher via JSONL-based VERBOSE events
331
+ // We still parse stream events here to track userMessageUuid for TASK_COMPLETE
332
+ rl.on('line', (line) => {
333
+ try {
334
+ const event = JSON.parse(line);
335
+ this.handleStreamEvent(taskId, event, rt);
336
+ }
337
+ catch {
338
+ // Not valid JSON, skip
339
+ }
340
+ });
341
+ // Log stderr
342
+ proc.stderr?.on('data', (data) => {
343
+ console.log(`[${taskId}] stderr: ${data.toString()}`);
344
+ });
345
+ // Handle process exit
346
+ proc.on('close', (code) => {
347
+ console.log(`[${taskId}] Process exited with code ${code}`);
348
+ if (rt.timeoutHandle) {
349
+ clearTimeout(rt.timeoutHandle);
350
+ }
351
+ this.running.delete(taskId);
352
+ });
353
+ proc.on('error', (err) => {
354
+ console.error(`[${taskId}] Process error:`, err);
355
+ this.onEvent(taskId, 'ERROR', { error: err.message });
356
+ if (rt.timeoutHandle) {
357
+ clearTimeout(rt.timeoutHandle);
358
+ }
359
+ this.running.delete(taskId);
360
+ });
361
+ }
362
+ /**
363
+ * Handle process stdout and emit events (without close handler - for resumeTask fallback)
364
+ */
365
+ handleProcessOutputWithoutClose(taskId, proc, rt) {
366
+ // Create readline interface for NDJSON parsing
367
+ const rl = readline.createInterface({
368
+ input: proc.stdout,
369
+ crlfDelay: Infinity
370
+ });
371
+ // Parse each line as JSON to track state (userMessageUuid)
372
+ // NOTE: Verbose output is now handled by SessionWatcher via JSONL-based VERBOSE events
373
+ // We still parse stream events here to track userMessageUuid for TASK_COMPLETE
374
+ rl.on('line', (line) => {
375
+ try {
376
+ const event = JSON.parse(line);
377
+ this.handleStreamEvent(taskId, event, rt);
378
+ }
379
+ catch {
380
+ // Not valid JSON, skip
381
+ }
382
+ });
383
+ // Note: stderr is handled by resumeTask caller
384
+ // Note: close is handled by resumeTask caller
385
+ proc.on('error', (err) => {
386
+ console.error(`[${taskId}] Process error:`, err);
387
+ this.onEvent(taskId, 'ERROR', { error: err.message });
388
+ if (rt.timeoutHandle) {
389
+ clearTimeout(rt.timeoutHandle);
390
+ }
391
+ this.running.delete(taskId);
392
+ });
393
+ }
394
+ /**
395
+ * Handle a parsed stream event from Claude CLI
396
+ */
397
+ handleStreamEvent(taskId, event, rt) {
398
+ // Debug logging for all events
399
+ console.log(`[${taskId}] Event: type=${event.type}, subtype=${event.subtype || 'none'}`);
400
+ if (event.permission_denials?.length) {
401
+ console.log(`[${taskId}] Permission denials:`, JSON.stringify(event.permission_denials));
402
+ }
403
+ switch (event.type) {
404
+ case 'system':
405
+ if (event.subtype === 'init' && event.session_id) {
406
+ rt.sessionId = event.session_id;
407
+ console.log(`[${taskId}] Session initialized: ${event.session_id}`);
408
+ // DON'T read UUID here - Claude CLI hasn't written the new user message yet
409
+ // The frontend has the correct UUID from when the user sent the message
410
+ // By not setting UUID here, frontend will use its verboseOutputUserUuid fallback
411
+ // Emit SESSION_STARTED to trigger file watching for unified notifications
412
+ this.onEvent(taskId, 'SESSION_STARTED', {
413
+ session_id: event.session_id
414
+ });
415
+ }
416
+ break;
417
+ case 'assistant':
418
+ // DON'T read UUID here - Claude may not have written the new user message to JSONL yet
419
+ // Reading now would get the PREVIOUS message's UUID, causing wrong positioning
420
+ // The frontend has the correct UUID from when the user sent the message
421
+ // We only read UUID at TASK_COMPLETE where we need it for the final message
422
+ console.log(`[${taskId}] assistant event: currentUuid=${rt.userMessageUuid?.slice(-8) || 'none'}, sessionId=${rt.sessionId?.slice(-8) || 'none'}`);
423
+ if (event.message?.content) {
424
+ for (const block of event.message.content) {
425
+ // Skip thinking blocks if they come as separate type
426
+ if (block.type === 'thinking') {
427
+ continue;
428
+ }
429
+ // Accumulate text for context
430
+ if (block.type === 'text' && block.text) {
431
+ // Strip <thinking>...</thinking> tags (may be embedded in text)
432
+ const text = block.text.replace(/<thinking>[\s\S]*?<\/thinking>\s*/g, '').trim();
433
+ if (text) {
434
+ if (rt.context) {
435
+ rt.context += '\n\n';
436
+ }
437
+ rt.context += text;
438
+ }
439
+ }
440
+ // Track tool use for progress
441
+ if (block.type === 'tool_use' && block.name) {
442
+ const progress = (0, events_1.extractProgressFromToolUse)(block.name, block.input);
443
+ if (progress) {
444
+ this.onEvent(taskId, 'PROGRESS', {
445
+ action: progress.action,
446
+ target: progress.target
447
+ });
448
+ }
449
+ // Check for AskUserQuestion
450
+ if (block.name === 'AskUserQuestion' && block.input) {
451
+ const input = block.input;
452
+ if (input.questions?.length > 0) {
453
+ const q = input.questions[0];
454
+ rt.question = q.question;
455
+ rt.options = q.options || [];
456
+ console.log(`[${taskId}] Question detected: ${q.question}`);
457
+ }
458
+ }
459
+ }
460
+ }
461
+ }
462
+ break;
463
+ case 'result':
464
+ // Check for permission denials (user input needed)
465
+ if (event.permission_denials?.length) {
466
+ // Any permission denial means the task is waiting for user input
467
+ const denials = event.permission_denials;
468
+ const firstDenial = denials[0];
469
+ // Build a descriptive prompt based on the denied tool
470
+ let prompt = rt.question; // Use AskUserQuestion prompt if available
471
+ let options = rt.options;
472
+ if (!prompt) {
473
+ // Construct prompt from permission denial info
474
+ const toolName = firstDenial.tool_name;
475
+ if (toolName === 'AskUserQuestion') {
476
+ prompt = 'Agent is asking a question';
477
+ }
478
+ else {
479
+ // Permission request for file/bash operations
480
+ prompt = `Permission required for: ${toolName}`;
481
+ if (denials.length > 1) {
482
+ prompt += ` (and ${denials.length - 1} more)`;
483
+ }
484
+ }
485
+ }
486
+ console.log(`[${taskId}] Task waiting for user input - tool: ${firstDenial.tool_name}, prompt: ${prompt}`);
487
+ this.onEvent(taskId, 'WAIT_FOR_USER', {
488
+ session_id: rt.sessionId,
489
+ prompt: prompt,
490
+ options: options,
491
+ context: rt.context,
492
+ user_message_uuid: rt.userMessageUuid,
493
+ permission_tool: firstDenial.tool_name
494
+ });
495
+ return;
496
+ }
497
+ // Task completed - re-read the UUID to ensure we have the correct one
498
+ // (the first assistant event may arrive before the JSONL is fully written)
499
+ console.log(`[${taskId}] TASK_COMPLETE: checking UUID. Current=${rt.userMessageUuid?.slice(-8) || 'none'}`);
500
+ if (rt.sessionId) {
501
+ console.log(`[${taskId}] Re-reading UUID from JSONL at completion...`);
502
+ const freshUuid = getLastUserMessageUuid(rt.sessionId);
503
+ console.log(`[${taskId}] Fresh UUID from JSONL: ${freshUuid?.slice(-8) || 'none'}`);
504
+ if (freshUuid && freshUuid !== rt.userMessageUuid) {
505
+ console.log(`[${taskId}] UUID UPDATED at completion: ${rt.userMessageUuid?.slice(-8) || 'none'} -> ${freshUuid.slice(-8)}`);
506
+ rt.userMessageUuid = freshUuid;
507
+ }
508
+ else if (freshUuid === rt.userMessageUuid) {
509
+ console.log(`[${taskId}] UUID unchanged at completion: ${freshUuid?.slice(-8) || 'none'}`);
510
+ }
511
+ }
512
+ console.log(`[${taskId}] EMITTING TASK_COMPLETE with uuid=${rt.userMessageUuid?.slice(-8) || 'none'}`);
513
+ // Use accumulated context as result, fall back to event.result
514
+ const finalResult = rt.context || event.result || '';
515
+ this.onEvent(taskId, 'TASK_COMPLETE', {
516
+ session_id: rt.sessionId,
517
+ result: finalResult,
518
+ user_message_uuid: rt.userMessageUuid
519
+ });
520
+ break;
521
+ }
522
+ }
523
+ }
524
+ exports.ClaudeAdapter = ClaudeAdapter;
525
+ //# sourceMappingURL=claude-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-cli.js","sourceRoot":"","sources":["../../src/adapter/claude-cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Types for Claude CLI stream-json output
3
+ */
4
+ export interface StreamEvent {
5
+ type: 'system' | 'assistant' | 'result' | 'user';
6
+ subtype?: string;
7
+ session_id?: string;
8
+ message?: MessageContent;
9
+ result?: string;
10
+ permission_denials?: PermissionDenial[];
11
+ }
12
+ export interface MessageContent {
13
+ content: ContentBlock[];
14
+ }
15
+ export interface ContentBlock {
16
+ type: 'text' | 'tool_use' | 'tool_result' | 'thinking';
17
+ text?: string;
18
+ name?: string;
19
+ input?: unknown;
20
+ id?: string;
21
+ }
22
+ export interface PermissionDenial {
23
+ tool_name: string;
24
+ id: string;
25
+ }
26
+ export interface AskUserInput {
27
+ questions: Question[];
28
+ }
29
+ export interface Question {
30
+ question: string;
31
+ header?: string;
32
+ options: QuestionOption[];
33
+ multiSelect?: boolean;
34
+ }
35
+ export interface QuestionOption {
36
+ label: string;
37
+ description?: string;
38
+ }
39
+ export interface ProgressInfo {
40
+ action: string;
41
+ target: string;
42
+ }
43
+ /**
44
+ * Format raw stream output into human-readable string for verbose display
45
+ * Returns null if the event should be skipped
46
+ */
47
+ export declare function formatVerboseOutput(line: string): string | null;
48
+ /**
49
+ * Extract progress info from tool use
50
+ */
51
+ export declare function extractProgressFromToolUse(toolName: string, input: unknown): ProgressInfo | null;
52
+ //# sourceMappingURL=events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/adapter/events.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,QAAQ,GAAG,WAAW,GAAG,QAAQ,GAAG,MAAM,CAAC;IACjD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kBAAkB,CAAC,EAAE,gBAAgB,EAAE,CAAC;CACzC;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,YAAY,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,aAAa,GAAG,UAAU,CAAC;IACvD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,QAAQ,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAqE/D;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,OAAO,GACb,YAAY,GAAG,IAAI,CAqDrB"}