@coralai/sps-cli 0.10.2 → 0.11.1

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 (62) hide show
  1. package/README.md +63 -23
  2. package/dist/commands/workerDashboard.d.ts.map +1 -1
  3. package/dist/commands/workerDashboard.js +39 -11
  4. package/dist/commands/workerDashboard.js.map +1 -1
  5. package/dist/core/config.d.ts +1 -0
  6. package/dist/core/config.d.ts.map +1 -1
  7. package/dist/core/config.js +1 -0
  8. package/dist/core/config.js.map +1 -1
  9. package/dist/core/state.d.ts +10 -0
  10. package/dist/core/state.d.ts.map +1 -1
  11. package/dist/core/state.js +5 -0
  12. package/dist/core/state.js.map +1 -1
  13. package/dist/engines/CloseoutEngine.d.ts.map +1 -1
  14. package/dist/engines/CloseoutEngine.js +79 -28
  15. package/dist/engines/CloseoutEngine.js.map +1 -1
  16. package/dist/engines/ExecutionEngine.d.ts +5 -0
  17. package/dist/engines/ExecutionEngine.d.ts.map +1 -1
  18. package/dist/engines/ExecutionEngine.js +80 -16
  19. package/dist/engines/ExecutionEngine.js.map +1 -1
  20. package/dist/engines/MonitorEngine.d.ts.map +1 -1
  21. package/dist/engines/MonitorEngine.js +6 -1
  22. package/dist/engines/MonitorEngine.js.map +1 -1
  23. package/dist/interfaces/WorkerProvider.d.ts +68 -15
  24. package/dist/interfaces/WorkerProvider.d.ts.map +1 -1
  25. package/dist/models/types.d.ts +3 -1
  26. package/dist/models/types.d.ts.map +1 -1
  27. package/dist/providers/ClaudePrintProvider.d.ts +54 -0
  28. package/dist/providers/ClaudePrintProvider.d.ts.map +1 -0
  29. package/dist/providers/ClaudePrintProvider.js +279 -0
  30. package/dist/providers/ClaudePrintProvider.js.map +1 -0
  31. package/dist/providers/ClaudeTmuxProvider.d.ts +94 -0
  32. package/dist/providers/ClaudeTmuxProvider.d.ts.map +1 -0
  33. package/dist/providers/ClaudeTmuxProvider.js +331 -0
  34. package/dist/providers/ClaudeTmuxProvider.js.map +1 -0
  35. package/dist/providers/ClaudeWorkerProvider.d.ts +5 -93
  36. package/dist/providers/ClaudeWorkerProvider.d.ts.map +1 -1
  37. package/dist/providers/ClaudeWorkerProvider.js +3 -303
  38. package/dist/providers/ClaudeWorkerProvider.js.map +1 -1
  39. package/dist/providers/CodexExecProvider.d.ts +36 -0
  40. package/dist/providers/CodexExecProvider.d.ts.map +1 -0
  41. package/dist/providers/CodexExecProvider.js +238 -0
  42. package/dist/providers/CodexExecProvider.js.map +1 -0
  43. package/dist/providers/CodexTmuxProvider.d.ts +71 -0
  44. package/dist/providers/CodexTmuxProvider.d.ts.map +1 -0
  45. package/dist/providers/CodexTmuxProvider.js +351 -0
  46. package/dist/providers/CodexTmuxProvider.js.map +1 -0
  47. package/dist/providers/CodexWorkerProvider.d.ts +5 -70
  48. package/dist/providers/CodexWorkerProvider.d.ts.map +1 -1
  49. package/dist/providers/CodexWorkerProvider.js +3 -328
  50. package/dist/providers/CodexWorkerProvider.js.map +1 -1
  51. package/dist/providers/outputParser.d.ts +50 -0
  52. package/dist/providers/outputParser.d.ts.map +1 -0
  53. package/dist/providers/outputParser.js +219 -0
  54. package/dist/providers/outputParser.js.map +1 -0
  55. package/dist/providers/registry.d.ts.map +1 -1
  56. package/dist/providers/registry.js +18 -6
  57. package/dist/providers/registry.js.map +1 -1
  58. package/dist/providers/streamRenderer.d.ts +13 -0
  59. package/dist/providers/streamRenderer.d.ts.map +1 -0
  60. package/dist/providers/streamRenderer.js +106 -0
  61. package/dist/providers/streamRenderer.js.map +1 -0
  62. package/package.json +1 -1
@@ -0,0 +1,331 @@
1
+ import { execFileSync } from 'node:child_process';
2
+ import { existsSync, readFileSync } from 'node:fs';
3
+ /** Completion keywords detected in pane text (priority 3). */
4
+ const COMPLETION_KEYWORDS = /\b(done|完成|全部完成|MR created|merge request|已提交|已推送)\b|🎉/i;
5
+ /** Confirmation prompt patterns (priority 2 / detectWaiting). */
6
+ const CONFIRMATION_PROMPT = /(Do you want to proceed|y\/n|press enter|confirm|approve)/i;
7
+ /** Destructive operation indicators. */
8
+ const DESTRUCTIVE_PATTERN = /(delete|remove|drop|rm -rf|truncate|destroy)/i;
9
+ /** Blocked indicators in pane text. */
10
+ const BLOCKED_PATTERN = /(error|fatal|panic|BLOCKED|stuck|cannot proceed|timed out|rate.?limit)/i;
11
+ /**
12
+ * Run a tmux command via execFileSync and return stdout.
13
+ * Returns null when the command fails (e.g. session does not exist).
14
+ * On "server exited unexpectedly", auto-cleans stale socket and retries once.
15
+ */
16
+ function tmux(args) {
17
+ try {
18
+ return execFileSync('tmux', args, {
19
+ encoding: 'utf-8',
20
+ timeout: 10_000,
21
+ stdio: ['ignore', 'pipe', 'pipe'],
22
+ });
23
+ }
24
+ catch (err) {
25
+ const stderr = err.stderr ?? '';
26
+ if (stderr.includes('server exited unexpectedly') || stderr.includes('no server running')) {
27
+ // Stale tmux socket — clean up and retry
28
+ try {
29
+ const uid = process.getuid?.() ?? 1000;
30
+ const { rmSync } = require('node:fs');
31
+ rmSync(`/tmp/tmux-${uid}`, { recursive: true, force: true });
32
+ process.stderr.write('[worker] Cleaned stale tmux socket, retrying\n');
33
+ return execFileSync('tmux', args, {
34
+ encoding: 'utf-8',
35
+ timeout: 10_000,
36
+ stdio: ['ignore', 'pipe', 'pipe'],
37
+ });
38
+ }
39
+ catch {
40
+ return null;
41
+ }
42
+ }
43
+ return null;
44
+ }
45
+ }
46
+ /** Check whether a tmux session exists. */
47
+ function sessionExists(session) {
48
+ return tmux(['has-session', '-t', session]) !== null;
49
+ }
50
+ /** Capture recent pane text from a tmux session. */
51
+ function capturePaneText(session, lines) {
52
+ return tmux(['capture-pane', '-t', session, '-p', '-S', `-${lines}`]) ?? '';
53
+ }
54
+ export class ClaudeTmuxProvider {
55
+ config;
56
+ constructor(config) {
57
+ this.config = config;
58
+ }
59
+ /**
60
+ * Ensure worktree directory exists and is clean.
61
+ * This is largely a no-op when the worktree is already prepared.
62
+ */
63
+ async prepareEnv(worktree, _seq) {
64
+ if (!existsSync(worktree)) {
65
+ throw new Error(`Worktree directory does not exist: ${worktree}`);
66
+ }
67
+ // Verify the directory is a git worktree / repo
68
+ try {
69
+ execFileSync('git', ['-C', worktree, 'rev-parse', '--is-inside-work-tree'], {
70
+ encoding: 'utf-8',
71
+ timeout: 5_000,
72
+ stdio: ['ignore', 'pipe', 'pipe'],
73
+ });
74
+ }
75
+ catch {
76
+ throw new Error(`Directory is not a git worktree: ${worktree}`);
77
+ }
78
+ }
79
+ /**
80
+ * Launch a Claude Code worker inside a tmux session.
81
+ *
82
+ * Session reuse strategy (WORKER_SESSION_REUSE=true):
83
+ * 1. Session exists + Claude running → reuse: /clear + cd worktree (keep context hot)
84
+ * 2. Session exists + Claude not running → reuse session: cd + start claude
85
+ * 3. No session → create new session + start claude
86
+ */
87
+ async launch(session, worktree, promptFile) {
88
+ const claudeCmd = 'claude --dangerously-skip-permissions';
89
+ if (sessionExists(session)) {
90
+ const pane = capturePaneText(session, 10);
91
+ const claudeAlive = /❯\s*$/m.test(pane) || /bypass permissions/i.test(pane) || /shortcuts/i.test(pane);
92
+ if (claudeAlive) {
93
+ this.log.info(`Reusing live Claude session ${session}`);
94
+ tmux(['send-keys', '-t', session, '/clear', 'Enter']);
95
+ await this.sleep(1_000);
96
+ tmux(['send-keys', '-t', session, `cd ${worktree}`, 'Enter']);
97
+ await this.sleep(500);
98
+ }
99
+ else {
100
+ this.log.info(`Reusing tmux session ${session} (Claude not running)`);
101
+ tmux(['send-keys', '-t', session, `cd ${worktree}`, 'Enter']);
102
+ await this.sleep(500);
103
+ tmux(['send-keys', '-t', session, claudeCmd, 'Enter']);
104
+ }
105
+ }
106
+ else {
107
+ const result = tmux(['new-session', '-d', '-s', session, '-c', worktree]);
108
+ if (result === null && !sessionExists(session)) {
109
+ throw new Error(`Failed to create tmux session: ${session}`);
110
+ }
111
+ tmux(['send-keys', '-t', session, claudeCmd, 'Enter']);
112
+ }
113
+ // Wait for ready + send task prompt (old three-step flow)
114
+ const ready = await this.waitReady(session, 90_000);
115
+ if (!ready) {
116
+ throw new Error('Worker did not become ready within timeout');
117
+ }
118
+ await this.sendTask(session, promptFile);
119
+ return { pid: 0, outputFile: '' };
120
+ }
121
+ log = { info: (msg) => process.stderr.write(`[worker] ${msg}\n`) };
122
+ /**
123
+ * Poll tmux pane text until Claude's ready prompt appears.
124
+ * Default timeout: 30 seconds, poll interval: 2 seconds.
125
+ */
126
+ async waitReady(session, timeoutMs = 30_000) {
127
+ const pollInterval = 2_000;
128
+ const deadline = Date.now() + timeoutMs;
129
+ // Wait at least 3s for Claude to start loading before polling
130
+ await this.sleep(3_000);
131
+ while (Date.now() < deadline) {
132
+ const text = capturePaneText(session, 15);
133
+ // Match Claude Code's actual ready state:
134
+ // - The ❯ prompt on its own line (Claude's input prompt)
135
+ // - "bypass permissions" indicator (only appears after Claude is fully loaded)
136
+ // - "? for shortcuts" (appears at bottom when ready)
137
+ if (/bypass permissions/i.test(text) ||
138
+ /\? for shortcuts/i.test(text) ||
139
+ /tips for shortcuts/i.test(text)) {
140
+ return true;
141
+ }
142
+ // Also match the ❯ prompt but only if Claude banner has appeared
143
+ if (/Claude Code/i.test(text) && /❯\s*$/m.test(text)) {
144
+ return true;
145
+ }
146
+ await this.sleep(pollInterval);
147
+ }
148
+ return false;
149
+ }
150
+ /**
151
+ * Send a task prompt file to the Claude session.
152
+ */
153
+ async sendTask(session, promptFile) {
154
+ if (!existsSync(promptFile)) {
155
+ throw new Error(`Prompt file does not exist: ${promptFile}`);
156
+ }
157
+ // Write prompt content to a temp file, load into tmux buffer, paste, then Enter.
158
+ const content = readFileSync(promptFile, 'utf-8').trim();
159
+ const bufferFile = `/tmp/sps-task-${Date.now()}.txt`;
160
+ const { writeFileSync: writeTmp, unlinkSync } = await import('node:fs');
161
+ writeTmp(bufferFile, content);
162
+ tmux(['load-buffer', bufferFile]);
163
+ tmux(['paste-buffer', '-t', session]);
164
+ try {
165
+ unlinkSync(bufferFile);
166
+ }
167
+ catch { /* cleanup */ }
168
+ // Wait for TUI to finish processing the paste (bracket paste mode).
169
+ // 500ms was too short for large prompts or loaded systems.
170
+ await this.sleep(1_500);
171
+ tmux(['send-keys', '-t', session, 'Enter']);
172
+ // Verify the prompt was submitted — if the ❯ prompt doesn't appear
173
+ // (meaning the worker started processing), retry Enter up to 3 times.
174
+ for (let attempt = 0; attempt < 3; attempt++) {
175
+ await this.sleep(2_000);
176
+ const pane = capturePaneText(session, 15);
177
+ // If we see activity indicators, the task was submitted successfully
178
+ if (/╭|─|●|⠋|⠙|⠹|thinking|running/i.test(pane)) {
179
+ return;
180
+ }
181
+ // If we still see the idle prompt with text in the input area,
182
+ // the Enter likely didn't register — retry
183
+ if (/❯\s*\S/m.test(pane) || /\? for shortcuts/i.test(pane)) {
184
+ this.log.info(`Enter may not have registered (attempt ${attempt + 1}/3), retrying...`);
185
+ tmux(['send-keys', '-t', session, 'Enter']);
186
+ }
187
+ }
188
+ }
189
+ /**
190
+ * Inspect a tmux session: check if alive and capture pane text.
191
+ */
192
+ async inspect(session) {
193
+ const alive = sessionExists(session);
194
+ const paneText = alive ? capturePaneText(session, 50) : '';
195
+ return { alive, paneText };
196
+ }
197
+ /**
198
+ * Multi-layer completion detection chain.
199
+ *
200
+ * Priority order:
201
+ * 1. task_completed marker file in logDir
202
+ * 2. Waiting for confirmation prompts (delegates to detectWaiting)
203
+ * 3. Completion keywords in pane text
204
+ * 4. MR exists on GitLab (skipped — returns ALIVE)
205
+ * 5. tmux session alive → ALIVE
206
+ * 6. Session dead + restart limit exceeded → DEAD_EXCEEDED
207
+ */
208
+ async detectCompleted(session, logDir, _branch) {
209
+ // Priority 1: task_completed marker file
210
+ const markerPath = `${logDir}/task_completed`;
211
+ if (existsSync(markerPath)) {
212
+ return 'COMPLETED';
213
+ }
214
+ // Priority 2: waiting for confirmation
215
+ const waitState = await this.detectWaiting(session);
216
+ if (waitState.waiting) {
217
+ return waitState.destructive ? 'NEEDS_INPUT' : 'AUTO_CONFIRM';
218
+ }
219
+ // Priority 3: completion keywords in pane text
220
+ // Use 200 lines — completion keywords can be pushed off-screen by post-task
221
+ // output (e.g. long-running commands the worker started after finishing).
222
+ const paneText = capturePaneText(session, 200);
223
+ if (COMPLETION_KEYWORDS.test(paneText)) {
224
+ return 'COMPLETED';
225
+ }
226
+ // Priority 4: MR exists (skipped for now)
227
+ // Priority 5: session alive
228
+ if (sessionExists(session)) {
229
+ return 'ALIVE';
230
+ }
231
+ // Priority 6: session dead — check restart limit
232
+ // The restart count is tracked externally by the engine via state.json.
233
+ // Here we simply report DEAD_EXCEEDED vs DEAD so the engine can decide.
234
+ // Without access to the restart counter, report DEAD and let the caller
235
+ // escalate to DEAD_EXCEEDED if the limit is reached.
236
+ return 'DEAD';
237
+ }
238
+ /**
239
+ * Detect whether the worker is waiting for user confirmation.
240
+ * Returns whether the prompt is destructive (delete/remove/drop etc.).
241
+ */
242
+ async detectWaiting(session) {
243
+ const paneText = capturePaneText(session, 30);
244
+ const match = paneText.match(CONFIRMATION_PROMPT);
245
+ if (!match) {
246
+ return { waiting: false, destructive: false, prompt: '' };
247
+ }
248
+ // Extract the line containing the prompt for context
249
+ const lines = paneText.split('\n');
250
+ const promptLine = lines.find((l) => CONFIRMATION_PROMPT.test(l))?.trim() ?? match[0];
251
+ const destructive = DESTRUCTIVE_PATTERN.test(paneText);
252
+ return { waiting: true, destructive, prompt: promptLine };
253
+ }
254
+ /**
255
+ * Check pane text for blocked indicators (errors, stuck states).
256
+ */
257
+ async detectBlocked(session) {
258
+ const paneText = capturePaneText(session, 30);
259
+ return BLOCKED_PATTERN.test(paneText);
260
+ }
261
+ /**
262
+ * Send a fix prompt to the Claude session (e.g. after CI failure).
263
+ */
264
+ async sendFix(session, fixPrompt, _resumeSessionId) {
265
+ // Escape any single quotes in the prompt for safe tmux transmission
266
+ const escaped = fixPrompt.replace(/'/g, "'\\''");
267
+ tmux(['send-keys', '-t', session, escaped, 'Enter']);
268
+ }
269
+ /**
270
+ * Send conflict resolution instructions to the Claude session.
271
+ */
272
+ async resolveConflict(session, worktree, branch, _resumeSessionId) {
273
+ const instruction = [
274
+ `There is a merge conflict on branch ${branch}.`,
275
+ `Working directory: ${worktree}`,
276
+ 'Please resolve the conflict:',
277
+ `1. Run: git fetch origin && git rebase origin/${this.config.GITLAB_MERGE_BRANCH}`,
278
+ '2. Resolve any conflicts in the affected files',
279
+ '3. Run: git add . && git rebase --continue',
280
+ '4. Run: git push --force-with-lease',
281
+ ].join('\n');
282
+ tmux(['send-keys', '-t', session, instruction, 'Enter']);
283
+ }
284
+ /**
285
+ * Release a worker session after task completion.
286
+ *
287
+ * WORKER_SESSION_REUSE=true: do nothing — keep Claude running so the
288
+ * next task can hot-reuse the session via /clear + cd (preserves
289
+ * session state, env vars, loaded MCP servers, etc.).
290
+ *
291
+ * WORKER_SESSION_REUSE=false: exit Claude but keep tmux session alive
292
+ * (next launch will restart Claude in the existing session).
293
+ */
294
+ async release(session) {
295
+ if (!sessionExists(session))
296
+ return;
297
+ if (this.config.WORKER_SESSION_REUSE) {
298
+ // Keep everything alive — next launch() will /clear + cd + send prompt
299
+ this.log.info(`Session ${session} kept alive for reuse`);
300
+ return;
301
+ }
302
+ // Exit Claude but keep tmux session
303
+ tmux(['send-keys', '-t', session, '/exit', 'Enter']);
304
+ }
305
+ /**
306
+ * Force-stop a worker session (error recovery, cleanup).
307
+ * Always exits Claude and kills the tmux session.
308
+ */
309
+ async stop(session) {
310
+ if (!sessionExists(session))
311
+ return;
312
+ tmux(['send-keys', '-t', session, '/exit', 'Enter']);
313
+ for (let i = 0; i < 5; i++) {
314
+ await this.sleep(1_000);
315
+ if (!sessionExists(session))
316
+ return;
317
+ }
318
+ tmux(['kill-session', '-t', session]);
319
+ }
320
+ /**
321
+ * Capture the last 100 lines of pane text as a summary.
322
+ */
323
+ async collectSummary(session) {
324
+ return capturePaneText(session, 100);
325
+ }
326
+ /** Helper: sleep for the given milliseconds. */
327
+ sleep(ms) {
328
+ return new Promise((resolve) => setTimeout(resolve, ms));
329
+ }
330
+ }
331
+ //# sourceMappingURL=ClaudeTmuxProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ClaudeTmuxProvider.js","sourceRoot":"","sources":["../../src/providers/ClaudeTmuxProvider.ts"],"names":[],"mappings":"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"}
@@ -1,94 +1,6 @@
1
- import type { ProjectConfig } from '../core/config.js';
2
- import type { WorkerProvider } from '../interfaces/WorkerProvider.js';
3
- import type { WorkerStatus } from '../models/types.js';
4
- export declare class ClaudeWorkerProvider implements WorkerProvider {
5
- private readonly config;
6
- constructor(config: ProjectConfig);
7
- /**
8
- * Ensure worktree directory exists and is clean.
9
- * This is largely a no-op when the worktree is already prepared.
10
- */
11
- prepareEnv(worktree: string, _seq: string): Promise<void>;
12
- /**
13
- * Launch a Claude Code worker inside a tmux session.
14
- *
15
- * Session reuse strategy (WORKER_SESSION_REUSE=true):
16
- * 1. Session exists + Claude running → reuse: /clear + cd worktree (keep context hot)
17
- * 2. Session exists + Claude not running → reuse session: cd + start claude
18
- * 3. No session → create new session + start claude
19
- */
20
- launch(session: string, worktree: string): Promise<void>;
21
- private log;
22
- /**
23
- * Poll tmux pane text until Claude's ready prompt appears.
24
- * Default timeout: 30 seconds, poll interval: 2 seconds.
25
- */
26
- waitReady(session: string, timeoutMs?: number): Promise<boolean>;
27
- /**
28
- * Send a task prompt file to the Claude session.
29
- */
30
- sendTask(session: string, promptFile: string): Promise<void>;
31
- /**
32
- * Inspect a tmux session: check if alive and capture pane text.
33
- */
34
- inspect(session: string): Promise<{
35
- alive: boolean;
36
- paneText: string;
37
- }>;
38
- /**
39
- * Multi-layer completion detection chain.
40
- *
41
- * Priority order:
42
- * 1. task_completed marker file in logDir
43
- * 2. Waiting for confirmation prompts (delegates to detectWaiting)
44
- * 3. Completion keywords in pane text
45
- * 4. MR exists on GitLab (skipped — returns ALIVE)
46
- * 5. tmux session alive → ALIVE
47
- * 6. Session dead + restart limit exceeded → DEAD_EXCEEDED
48
- */
49
- detectCompleted(session: string, logDir: string, _branch: string): Promise<WorkerStatus>;
50
- /**
51
- * Detect whether the worker is waiting for user confirmation.
52
- * Returns whether the prompt is destructive (delete/remove/drop etc.).
53
- */
54
- detectWaiting(session: string): Promise<{
55
- waiting: boolean;
56
- destructive: boolean;
57
- prompt: string;
58
- }>;
59
- /**
60
- * Check pane text for blocked indicators (errors, stuck states).
61
- */
62
- detectBlocked(session: string): Promise<boolean>;
63
- /**
64
- * Send a fix prompt to the Claude session (e.g. after CI failure).
65
- */
66
- sendFix(session: string, fixPrompt: string): Promise<void>;
67
- /**
68
- * Send conflict resolution instructions to the Claude session.
69
- */
70
- resolveConflict(session: string, worktree: string, branch: string): Promise<void>;
71
- /**
72
- * Release a worker session after task completion.
73
- *
74
- * WORKER_SESSION_REUSE=true: do nothing — keep Claude running so the
75
- * next task can hot-reuse the session via /clear + cd (preserves
76
- * session state, env vars, loaded MCP servers, etc.).
77
- *
78
- * WORKER_SESSION_REUSE=false: exit Claude but keep tmux session alive
79
- * (next launch will restart Claude in the existing session).
80
- */
81
- release(session: string): Promise<void>;
82
- /**
83
- * Force-stop a worker session (error recovery, cleanup).
84
- * Always exits Claude and kills the tmux session.
85
- */
86
- stop(session: string): Promise<void>;
87
- /**
88
- * Capture the last 100 lines of pane text as a summary.
89
- */
90
- collectSummary(session: string): Promise<string>;
91
- /** Helper: sleep for the given milliseconds. */
92
- private sleep;
93
- }
1
+ /**
2
+ * @deprecated Use ClaudeTmuxProvider or ClaudePrintProvider directly.
3
+ * This re-export exists for backward compatibility with existing imports.
4
+ */
5
+ export { ClaudeTmuxProvider as ClaudeWorkerProvider } from './ClaudeTmuxProvider.js';
94
6
  //# sourceMappingURL=ClaudeWorkerProvider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ClaudeWorkerProvider.d.ts","sourceRoot":"","sources":["../../src/providers/ClaudeWorkerProvider.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AA6DvD,qBAAa,oBAAqB,YAAW,cAAc;IACzD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;gBAE3B,MAAM,EAAE,aAAa;IAIjC;;;OAGG;IACG,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgB/D;;;;;;;OAOG;IACG,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkC9D,OAAO,CAAC,GAAG,CAAwE;IAEnF;;;OAGG;IACG,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC;IA4BtE;;OAEG;IACG,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBlE;;OAEG;IACG,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAM7E;;;;;;;;;;OAUG;IACG,eAAe,CACnB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,YAAY,CAAC;IAkCxB;;;OAGG;IACG,aAAa,CACjB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,WAAW,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAiBtE;;OAEG;IACG,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKtD;;OAEG;IACG,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMhE;;OAEG;IACG,eAAe,CACnB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC;IAchB;;;;;;;;;OASG;IACG,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAa7C;;;OAGG;IACG,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAW1C;;OAEG;IACG,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAItD,gDAAgD;IAChD,OAAO,CAAC,KAAK;CAGd"}
1
+ {"version":3,"file":"ClaudeWorkerProvider.d.ts","sourceRoot":"","sources":["../../src/providers/ClaudeWorkerProvider.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,kBAAkB,IAAI,oBAAoB,EAAE,MAAM,yBAAyB,CAAC"}