bobs-workshop 0.3.3 → 3.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 (200) hide show
  1. package/LICENSE +2 -2
  2. package/README.md +199 -210
  3. package/bin/bobs-workshop.js +109 -0
  4. package/config/agents.json +27 -0
  5. package/dist/plugins/bobs-workshop.js +34 -0
  6. package/dist/tools/background-agent/cancel.d.ts +3 -0
  7. package/dist/tools/background-agent/cancel.d.ts.map +1 -0
  8. package/dist/tools/background-agent/cancel.js +52 -0
  9. package/dist/tools/background-agent/concurrency.d.ts +15 -0
  10. package/dist/tools/background-agent/concurrency.d.ts.map +1 -0
  11. package/dist/tools/background-agent/concurrency.js +61 -0
  12. package/dist/tools/background-agent/index.d.ts +8 -0
  13. package/dist/tools/background-agent/index.d.ts.map +1 -0
  14. package/dist/tools/background-agent/index.js +7 -0
  15. package/dist/tools/background-agent/launch.d.ts +6 -0
  16. package/dist/tools/background-agent/launch.d.ts.map +1 -0
  17. package/dist/tools/background-agent/launch.js +33 -0
  18. package/dist/tools/background-agent/list.d.ts +7 -0
  19. package/dist/tools/background-agent/list.d.ts.map +1 -0
  20. package/dist/tools/background-agent/list.js +40 -0
  21. package/dist/tools/background-agent/manager.d.ts +29 -0
  22. package/dist/tools/background-agent/manager.d.ts.map +1 -0
  23. package/dist/tools/background-agent/manager.js +377 -0
  24. package/dist/tools/background-agent/output.d.ts +3 -0
  25. package/dist/tools/background-agent/output.d.ts.map +1 -0
  26. package/dist/tools/background-agent/output.js +41 -0
  27. package/dist/tools/background-agent/types.d.ts +46 -0
  28. package/dist/tools/background-agent/types.d.ts.map +1 -0
  29. package/dist/tools/background-agent/types.js +1 -0
  30. package/dist/tools/index.d.ts +9 -0
  31. package/dist/tools/index.d.ts.map +1 -0
  32. package/dist/tools/index.js +8 -0
  33. package/dist/tools/manual/index.d.ts +3 -0
  34. package/dist/tools/manual/index.d.ts.map +1 -0
  35. package/dist/tools/manual/index.js +2 -0
  36. package/dist/tools/manual/manual-update.d.ts +4 -0
  37. package/dist/tools/manual/manual-update.d.ts.map +1 -0
  38. package/dist/tools/manual/manual-update.js +190 -0
  39. package/dist/tools/manual/verify-manual.d.ts +4 -0
  40. package/dist/tools/manual/verify-manual.d.ts.map +1 -0
  41. package/dist/tools/manual/verify-manual.js +46 -0
  42. package/package.json +34 -66
  43. package/postinstall.js +190 -0
  44. package/src/agents/alice.md +466 -0
  45. package/src/agents/bob-rev.md +493 -0
  46. package/src/agents/bob-send.md +277 -0
  47. package/src/agents/bob.md +442 -0
  48. package/src/agents/trace.md +451 -0
  49. package/src/plugins/bobs-workshop.ts +45 -0
  50. package/src/skills/api-patterns/SKILL.md +376 -0
  51. package/src/skills/architecture/SKILL.md +271 -0
  52. package/src/skills/bobs-workshop/performance/icon.svg +3 -0
  53. package/src/skills/brainstorming/SKILL.md +210 -0
  54. package/src/skills/clean-code/SKILL.md +151 -0
  55. package/src/skills/code-review-checklist/SKILL.md +220 -0
  56. package/src/skills/database-design/SKILL.md +271 -0
  57. package/src/skills/exploration/SKILL.md +257 -0
  58. package/src/skills/frontend-ui-ux/SKILL.md +78 -0
  59. package/src/skills/git-master/SKILL.md +1105 -0
  60. package/src/skills/performance/SKILL.md +144 -0
  61. package/src/skills/performance/icon.svg +3 -0
  62. package/src/skills/plan-writing/SKILL.md +225 -0
  63. package/src/skills/security/SKILL.md +410 -0
  64. package/src/skills/simplification/SKILL.md +238 -0
  65. package/src/skills/systematic-debugging/SKILL.md +175 -0
  66. package/src/skills/testing-patterns/SKILL.md +305 -0
  67. package/src/skills/verification/SKILL.md +286 -0
  68. package/src/tools/background-agent/cancel.ts +67 -0
  69. package/src/tools/background-agent/concurrency.ts +71 -0
  70. package/src/tools/background-agent/index.ts +7 -0
  71. package/src/tools/background-agent/launch.ts +39 -0
  72. package/src/tools/background-agent/list.ts +50 -0
  73. package/src/tools/background-agent/manager.ts +455 -0
  74. package/src/tools/background-agent/output.ts +57 -0
  75. package/src/tools/background-agent/types.ts +55 -0
  76. package/src/tools/index.ts +8 -0
  77. package/src/tools/manual/index.ts +2 -0
  78. package/src/tools/manual/manual-update.ts +197 -0
  79. package/src/tools/manual/verify-manual.ts +55 -0
  80. package/uninstall.js +64 -0
  81. package/Claude.md +0 -162
  82. package/bin/bobs-mcp-server.js +0 -11
  83. package/bin/bobs-mcp.js +0 -130
  84. package/dist/api/taskLogger.js +0 -106
  85. package/dist/api/taskLogger.js.map +0 -1
  86. package/dist/cli/checker.js +0 -401
  87. package/dist/cli/checker.js.map +0 -1
  88. package/dist/cli/cleanup.js +0 -131
  89. package/dist/cli/cleanup.js.map +0 -1
  90. package/dist/cli/debug.js +0 -157
  91. package/dist/cli/debug.js.map +0 -1
  92. package/dist/cli/health.js +0 -97
  93. package/dist/cli/health.js.map +0 -1
  94. package/dist/cli/setup.js +0 -81
  95. package/dist/cli/setup.js.map +0 -1
  96. package/dist/cli/workshop.js +0 -42
  97. package/dist/cli/workshop.js.map +0 -1
  98. package/dist/dashboard/server.js +0 -1203
  99. package/dist/dashboard/server.js.map +0 -1
  100. package/dist/index.js +0 -960
  101. package/dist/index.js.map +0 -1
  102. package/dist/prompts/architect.js +0 -221
  103. package/dist/prompts/architect.js.map +0 -1
  104. package/dist/prompts/debugger.js +0 -257
  105. package/dist/prompts/debugger.js.map +0 -1
  106. package/dist/prompts/engineer.js +0 -249
  107. package/dist/prompts/engineer.js.map +0 -1
  108. package/dist/prompts/orchestrator.js +0 -304
  109. package/dist/prompts/orchestrator.js.map +0 -1
  110. package/dist/prompts/reviewer.js +0 -289
  111. package/dist/prompts/reviewer.js.map +0 -1
  112. package/dist/services/activitySummarizer.js +0 -388
  113. package/dist/services/activitySummarizer.js.map +0 -1
  114. package/dist/services/changeValidator.js +0 -396
  115. package/dist/services/changeValidator.js.map +0 -1
  116. package/dist/services/claudeOrchestrator.js +0 -343
  117. package/dist/services/claudeOrchestrator.js.map +0 -1
  118. package/dist/services/fileMonitor.js +0 -250
  119. package/dist/services/fileMonitor.js.map +0 -1
  120. package/dist/services/implementationSummarizer.js +0 -306
  121. package/dist/services/implementationSummarizer.js.map +0 -1
  122. package/dist/services/liveMonitor.js +0 -315
  123. package/dist/services/liveMonitor.js.map +0 -1
  124. package/dist/services/mcpAuditLogger.js +0 -104
  125. package/dist/services/mcpAuditLogger.js.map +0 -1
  126. package/dist/services/mcpLogger.js +0 -223
  127. package/dist/services/mcpLogger.js.map +0 -1
  128. package/dist/services/tmuxManager.js +0 -541
  129. package/dist/services/tmuxManager.js.map +0 -1
  130. package/dist/tools/approvalTools.js +0 -244
  131. package/dist/tools/approvalTools.js.map +0 -1
  132. package/dist/tools/autoDebugger.js +0 -147
  133. package/dist/tools/autoDebugger.js.map +0 -1
  134. package/dist/tools/cleanupService.js +0 -221
  135. package/dist/tools/cleanupService.js.map +0 -1
  136. package/dist/tools/dashboardTools.js +0 -342
  137. package/dist/tools/dashboardTools.js.map +0 -1
  138. package/dist/tools/developmentNudges.js +0 -336
  139. package/dist/tools/developmentNudges.js.map +0 -1
  140. package/dist/tools/gitTools.js +0 -741
  141. package/dist/tools/gitTools.js.map +0 -1
  142. package/dist/tools/orchestratorTools.js +0 -832
  143. package/dist/tools/orchestratorTools.js.map +0 -1
  144. package/dist/tools/searchCache.js +0 -64
  145. package/dist/tools/searchCache.js.map +0 -1
  146. package/dist/tools/searchTools.js +0 -1107
  147. package/dist/tools/searchTools.js.map +0 -1
  148. package/dist/tools/semgrep-patterns.js +0 -296
  149. package/dist/tools/semgrep-patterns.js.map +0 -1
  150. package/dist/tools/specTools.js +0 -332
  151. package/dist/tools/specTools.js.map +0 -1
  152. package/dist/tools/structural/__tests__/orchestrator.test.js +0 -61
  153. package/dist/tools/structural/__tests__/orchestrator.test.js.map +0 -1
  154. package/dist/tools/structural/cache.js +0 -226
  155. package/dist/tools/structural/cache.js.map +0 -1
  156. package/dist/tools/structural/engines/python/index.js +0 -118
  157. package/dist/tools/structural/engines/python/index.js.map +0 -1
  158. package/dist/tools/structural/engines/typescript/__tests__/typescript-engine.test.js +0 -97
  159. package/dist/tools/structural/engines/typescript/__tests__/typescript-engine.test.js.map +0 -1
  160. package/dist/tools/structural/engines/typescript/analyzer.js +0 -433
  161. package/dist/tools/structural/engines/typescript/analyzer.js.map +0 -1
  162. package/dist/tools/structural/engines/typescript/index.js +0 -381
  163. package/dist/tools/structural/engines/typescript/index.js.map +0 -1
  164. package/dist/tools/structural/engines/typescript/utils.js +0 -279
  165. package/dist/tools/structural/engines/typescript/utils.js.map +0 -1
  166. package/dist/tools/structural/index.js +0 -248
  167. package/dist/tools/structural/index.js.map +0 -1
  168. package/dist/tools/structural/types.js +0 -18
  169. package/dist/tools/structural/types.js.map +0 -1
  170. package/dist/tools/tmuxTools.js +0 -100
  171. package/dist/tools/tmuxTools.js.map +0 -1
  172. package/dist/tools/workRecorder.js +0 -215
  173. package/dist/tools/workRecorder.js.map +0 -1
  174. package/dist/tools/worktreeTools.js +0 -705
  175. package/dist/tools/worktreeTools.js.map +0 -1
  176. package/dist/utils/__tests__/integration.test.js +0 -57
  177. package/dist/utils/__tests__/integration.test.js.map +0 -1
  178. package/dist/utils/__tests__/serverDetection.test.js +0 -151
  179. package/dist/utils/__tests__/serverDetection.test.js.map +0 -1
  180. package/dist/utils/errorHandling.js +0 -336
  181. package/dist/utils/errorHandling.js.map +0 -1
  182. package/dist/utils/processManager.js +0 -172
  183. package/dist/utils/processManager.js.map +0 -1
  184. package/dist/utils/reliability.js +0 -263
  185. package/dist/utils/reliability.js.map +0 -1
  186. package/dist/utils/responseFormatter.js +0 -250
  187. package/dist/utils/responseFormatter.js.map +0 -1
  188. package/dist/utils/serverDetection.js +0 -133
  189. package/dist/utils/serverDetection.js.map +0 -1
  190. package/dist/utils/specMigration.js +0 -105
  191. package/dist/utils/specMigration.js.map +0 -1
  192. package/dist/validation/schemas.js +0 -299
  193. package/dist/validation/schemas.js.map +0 -1
  194. package/public/.well-known/mcp/manifest.json +0 -473
  195. package/public/index.html +0 -3157
  196. package/public/index.html.backup +0 -2805
  197. package/public/index.html.backup2 +0 -1292
  198. package/scripts/cleanup-system-logs.ts +0 -121
  199. package/scripts/init-workspace.js +0 -63
  200. package/scripts/install-search-tools.js +0 -116
@@ -1,541 +0,0 @@
1
- // src/services/tmuxManager.ts
2
- import { exec } from "child_process";
3
- import { promisify } from "util";
4
- import path from "path";
5
- import fs from "fs-extra";
6
- import { claudeOrchestrator } from "./claudeOrchestrator.js";
7
- import { liveMonitor } from "./liveMonitor.js";
8
- const execAsync = promisify(exec);
9
- export class TmuxManager {
10
- constructor() {
11
- this.isAvailable = null;
12
- this.metadataPath = path.resolve(process.cwd(), ".bob/tmux-sessions.json");
13
- }
14
- /**
15
- * Check if tmux is available on the system
16
- */
17
- async checkAvailability() {
18
- if (this.isAvailable !== null) {
19
- return this.isAvailable;
20
- }
21
- try {
22
- await execAsync("which tmux");
23
- this.isAvailable = true;
24
- return true;
25
- }
26
- catch (error) {
27
- this.isAvailable = false;
28
- return false;
29
- }
30
- }
31
- /**
32
- * Get session name following convention: mcp-<manual_name> or mcp-<worktree_name>
33
- * Note: tmux doesn't allow colons or slashes, so we use hyphens and underscores
34
- */
35
- getSessionName(worktree_id, manual_name) {
36
- // Use manual name if provided, otherwise use worktree_id
37
- const baseName = manual_name || worktree_id;
38
- // Sanitize for tmux compatibility - keep alphanumeric, hyphens, underscores
39
- const sanitized = baseName
40
- .toLowerCase()
41
- .replace(/[^a-zA-Z0-9-_\s]/g, '') // Remove special chars except spaces
42
- .replace(/\s+/g, '-') // Replace spaces with hyphens
43
- .replace(/--+/g, '-') // Replace multiple hyphens with single
44
- .replace(/^-|-$/g, '') // Remove leading/trailing hyphens
45
- .substring(0, 30); // Limit length
46
- return `mcp-${sanitized}`;
47
- }
48
- /**
49
- * Validate session name follows our convention
50
- */
51
- validateSessionName(session_name) {
52
- // Allow mcp- prefix with alphanumeric, hyphens, underscores, colons, slashes, and dots
53
- // This matches the actual session names we see in practice
54
- return /^mcp[-:]?[a-zA-Z0-9-_:/\.]+$/.test(session_name);
55
- }
56
- /**
57
- * Load session metadata from disk
58
- */
59
- async loadMetadata() {
60
- try {
61
- if (await fs.pathExists(this.metadataPath)) {
62
- return await fs.readJson(this.metadataPath);
63
- }
64
- }
65
- catch (error) {
66
- console.warn("Failed to load tmux session metadata:", error);
67
- }
68
- return {
69
- sessions: {},
70
- last_updated: new Date().toISOString()
71
- };
72
- }
73
- /**
74
- * Save session metadata to disk
75
- */
76
- async saveMetadata(metadata) {
77
- try {
78
- await fs.ensureDir(path.dirname(this.metadataPath));
79
- metadata.last_updated = new Date().toISOString();
80
- await fs.writeJson(this.metadataPath, metadata, { spaces: 2 });
81
- }
82
- catch (error) {
83
- console.error("Failed to save tmux session metadata:", error);
84
- }
85
- }
86
- /**
87
- * Create a new tmux session for a worktree
88
- */
89
- async createSession(spec_id, worktree_id, worktree_path, claude_prompt, manual_name) {
90
- if (!await this.checkAvailability()) {
91
- throw new Error("tmux is not available on this system");
92
- }
93
- const session_name = this.getSessionName(worktree_id, manual_name);
94
- const absolutePath = path.resolve(process.cwd(), worktree_path);
95
- // Check if session already exists - kill it and recreate for fresh start
96
- if (await this.sessionExists(session_name)) {
97
- console.log(`Session ${session_name} already exists, killing it for fresh start`);
98
- try {
99
- await this.killSession(session_name);
100
- }
101
- catch (error) {
102
- console.warn(`Failed to kill existing session ${session_name}:`, error);
103
- }
104
- }
105
- try {
106
- // Create tmux session without Claude (claudeOrchestrator will handle Claude startup)
107
- const command = `tmux new-session -d -s "${session_name}" -c "${absolutePath}"`;
108
- await execAsync(command);
109
- const session = {
110
- session_name,
111
- spec_id,
112
- worktree_id,
113
- worktree_path: absolutePath,
114
- status: 'active',
115
- created_at: new Date().toISOString(),
116
- attached_clients: 0
117
- };
118
- // If Claude prompt provided, start Claude using the orchestrator
119
- if (claude_prompt) {
120
- await claudeOrchestrator.spawnClaudeInSession(session_name, claude_prompt, absolutePath);
121
- }
122
- // Save to metadata
123
- const metadata = await this.loadMetadata();
124
- metadata.sessions[session_name] = session;
125
- await this.saveMetadata(metadata);
126
- return session;
127
- }
128
- catch (error) {
129
- throw new Error(`Failed to create tmux session: ${error instanceof Error ? error.message : String(error)}`);
130
- }
131
- }
132
- /**
133
- * Check if a tmux session exists
134
- */
135
- async sessionExists(session_name) {
136
- if (!await this.checkAvailability()) {
137
- return false;
138
- }
139
- try {
140
- await execAsync(`tmux has-session -t "${session_name}"`);
141
- return true;
142
- }
143
- catch (error) {
144
- return false;
145
- }
146
- }
147
- /**
148
- * Kill a tmux session
149
- */
150
- async killSession(session_name) {
151
- if (!await this.checkAvailability()) {
152
- throw new Error("tmux is not available on this system");
153
- }
154
- if (!this.validateSessionName(session_name)) {
155
- throw new Error(`Invalid session name: ${session_name}`);
156
- }
157
- try {
158
- // Escape the session name properly for shell execution
159
- const escapedSessionName = session_name.replace(/'/g, "'\"'\"'");
160
- await execAsync(`tmux kill-session -t '${escapedSessionName}'`);
161
- // Remove from metadata
162
- const metadata = await this.loadMetadata();
163
- delete metadata.sessions[session_name];
164
- await this.saveMetadata(metadata);
165
- }
166
- catch (error) {
167
- throw new Error(`Failed to kill tmux session: ${error instanceof Error ? error.message : String(error)}`);
168
- }
169
- }
170
- /**
171
- * List all tmux sessions with metadata
172
- */
173
- async listSessions(filter_pattern) {
174
- if (!await this.checkAvailability()) {
175
- return [];
176
- }
177
- try {
178
- // Get live tmux session data
179
- const { stdout } = await execAsync('tmux list-sessions -F "#{session_name}|#{session_attached}|#{session_created}" 2>/dev/null || echo ""');
180
- const liveSessions = new Map();
181
- if (stdout.trim()) {
182
- stdout.trim().split('\n').forEach(line => {
183
- const [name, attached, created] = line.split('|');
184
- if (name && (name.startsWith('mcp-') || name.startsWith('mcp:'))) {
185
- liveSessions.set(name, {
186
- attached: parseInt(attached) || 0,
187
- created
188
- });
189
- }
190
- });
191
- }
192
- // Load metadata and sync with live sessions
193
- const metadata = await this.loadMetadata();
194
- const sessions = [];
195
- // Process live sessions
196
- for (const [session_name, liveData] of liveSessions) {
197
- const storedSession = metadata.sessions[session_name];
198
- if (storedSession) {
199
- // Update stored session with live data
200
- const session = {
201
- ...storedSession,
202
- status: liveData.attached > 0 ? 'active' : 'detached',
203
- attached_clients: liveData.attached
204
- };
205
- sessions.push(session);
206
- }
207
- else {
208
- // Live session not in metadata (created outside our system)
209
- const session = {
210
- session_name,
211
- spec_id: 'unknown',
212
- worktree_id: session_name.replace('mcp:', ''),
213
- worktree_path: process.cwd(),
214
- status: liveData.attached > 0 ? 'active' : 'detached',
215
- created_at: new Date().toISOString(),
216
- attached_clients: liveData.attached
217
- };
218
- sessions.push(session);
219
- }
220
- }
221
- // Mark stored sessions as inactive if not live
222
- for (const [session_name, storedSession] of Object.entries(metadata.sessions)) {
223
- if (!liveSessions.has(session_name)) {
224
- const session = {
225
- ...storedSession,
226
- status: 'inactive',
227
- attached_clients: 0
228
- };
229
- sessions.push(session);
230
- }
231
- }
232
- // Clean up stale metadata entries (sessions that no longer exist in tmux)
233
- let metadataUpdated = false;
234
- for (const sessionName in metadata.sessions) {
235
- if (!liveSessions.has(sessionName)) {
236
- delete metadata.sessions[sessionName];
237
- metadataUpdated = true;
238
- }
239
- }
240
- // Save cleaned metadata if any stale entries were removed
241
- if (metadataUpdated) {
242
- await this.saveMetadata(metadata);
243
- }
244
- // Apply filter if provided
245
- let filteredSessions = sessions;
246
- if (filter_pattern) {
247
- const regex = new RegExp(filter_pattern, 'i');
248
- filteredSessions = sessions.filter(s => regex.test(s.session_name) ||
249
- regex.test(s.spec_id) ||
250
- regex.test(s.worktree_id));
251
- }
252
- return filteredSessions.sort((a, b) => new Date(b.created_at).getTime() - new Date(a.created_at).getTime());
253
- }
254
- catch (error) {
255
- console.error("Failed to list tmux sessions:", error);
256
- return [];
257
- }
258
- }
259
- /**
260
- * Get session by worktree ID
261
- */
262
- async getSessionByWorktree(worktree_id) {
263
- const sessions = await this.listSessions();
264
- return sessions.find(s => s.worktree_id === worktree_id) || null;
265
- }
266
- /**
267
- * Clean up orphaned sessions (sessions in metadata but not live)
268
- */
269
- async cleanupOrphanedSessions() {
270
- const metadata = await this.loadMetadata();
271
- const liveSessions = new Set();
272
- // Get live session names
273
- try {
274
- const { stdout } = await execAsync('tmux list-sessions -F "#{session_name}" 2>/dev/null || echo ""');
275
- if (stdout.trim()) {
276
- stdout.trim().split('\n').forEach(name => {
277
- if (name.startsWith('mcp-')) {
278
- liveSessions.add(name);
279
- }
280
- });
281
- }
282
- }
283
- catch (error) {
284
- console.warn("Failed to get live sessions for cleanup:", error);
285
- return 0;
286
- }
287
- // Remove dead sessions from metadata
288
- const originalCount = Object.keys(metadata.sessions).length;
289
- const cleanedSessions = {};
290
- for (const [session_name, session] of Object.entries(metadata.sessions)) {
291
- if (liveSessions.has(session_name) || session.status === 'active') {
292
- cleanedSessions[session_name] = session;
293
- }
294
- }
295
- metadata.sessions = cleanedSessions;
296
- await this.saveMetadata(metadata);
297
- return originalCount - Object.keys(cleanedSessions).length;
298
- }
299
- /**
300
- * Get attachment command for a session
301
- */
302
- getAttachCommand(session_name) {
303
- return `tmux attach -t "${session_name}"`;
304
- }
305
- // ===== Enhanced Methods for Claude-in-tmux Integration =====
306
- /**
307
- * Create enhanced session with auto-Claude injection and monitoring
308
- */
309
- async createEnhancedSession(spec_id, worktree_id, worktree_path, claude_prompt, auto_monitor = true, manual_name) {
310
- if (!await this.checkAvailability()) {
311
- throw new Error("tmux is not available on this system");
312
- }
313
- const session_name = this.getSessionName(worktree_id, manual_name);
314
- const absolutePath = path.resolve(process.cwd(), worktree_path);
315
- // Check if session already exists - kill it and recreate for fresh start
316
- if (await this.sessionExists(session_name)) {
317
- console.log(`Session ${session_name} already exists, killing it for fresh start`);
318
- try {
319
- await this.killSession(session_name);
320
- }
321
- catch (error) {
322
- console.warn(`Failed to kill existing session ${session_name}:`, error);
323
- }
324
- }
325
- try {
326
- // Create tmux session without Claude initially
327
- const command = `tmux new-session -d -s "${session_name}" -c "${absolutePath}"`;
328
- await execAsync(command);
329
- // Use ClaudeOrchestrator to spawn Claude process
330
- const claudeProcess = await claudeOrchestrator.spawnClaudeInSession(session_name, claude_prompt, absolutePath);
331
- // Start live monitoring if requested
332
- if (auto_monitor) {
333
- await liveMonitor.startMonitoring(session_name);
334
- }
335
- // Create enhanced session object
336
- const session = {
337
- session_name,
338
- spec_id,
339
- worktree_id,
340
- worktree_path: absolutePath,
341
- status: 'active',
342
- created_at: new Date().toISOString(),
343
- attached_clients: 0,
344
- claude_process: claudeProcess,
345
- claude_status: claudeProcess.status,
346
- has_claude: true,
347
- last_activity: new Date().toISOString()
348
- };
349
- // Save to metadata
350
- const metadata = await this.loadMetadata();
351
- metadata.sessions[session_name] = session;
352
- await this.saveMetadata(metadata);
353
- return session;
354
- }
355
- catch (error) {
356
- throw new Error(`Failed to create enhanced tmux session: ${error instanceof Error ? error.message : String(error)}`);
357
- }
358
- }
359
- /**
360
- * Send command to Claude process in session
361
- */
362
- async sendCommand(session_name, command) {
363
- if (!await this.sessionExists(session_name)) {
364
- throw new Error(`tmux session ${session_name} does not exist`);
365
- }
366
- // Use ClaudeOrchestrator to send command
367
- await claudeOrchestrator.sendCommand(session_name, command);
368
- // Update last activity
369
- await this.updateSessionActivity(session_name);
370
- }
371
- /**
372
- * Capture pane output with options
373
- */
374
- async capturePane(session_name, options) {
375
- if (!await this.sessionExists(session_name)) {
376
- throw new Error(`tmux session ${session_name} does not exist`);
377
- }
378
- return await liveMonitor.captureOutput(session_name, options);
379
- }
380
- /**
381
- * Get live logs buffer for session
382
- */
383
- getLiveBuffer(session_name) {
384
- return liveMonitor.getBufferedLogs(session_name);
385
- }
386
- /**
387
- * Start live monitoring for a session
388
- */
389
- async startLiveMonitoring(session_name, maxLines) {
390
- if (!await this.sessionExists(session_name)) {
391
- throw new Error(`tmux session ${session_name} does not exist`);
392
- }
393
- await liveMonitor.startMonitoring(session_name, undefined, maxLines);
394
- }
395
- /**
396
- * Stop live monitoring for a session
397
- */
398
- stopLiveMonitoring(session_name) {
399
- liveMonitor.stopMonitoring(session_name);
400
- }
401
- /**
402
- * Stop Claude process in session
403
- */
404
- async stopClaudeProcess(session_name) {
405
- if (!await this.sessionExists(session_name)) {
406
- throw new Error(`tmux session ${session_name} does not exist`);
407
- }
408
- await claudeOrchestrator.stopClaudeProcess(session_name);
409
- await this.updateSessionActivity(session_name);
410
- }
411
- /**
412
- * Restart Claude process in session
413
- */
414
- async restartClaudeProcess(session_name, newPrompt) {
415
- if (!await this.sessionExists(session_name)) {
416
- throw new Error(`tmux session ${session_name} does not exist`);
417
- }
418
- const claudeProcess = await claudeOrchestrator.restartProcess(session_name, newPrompt);
419
- await this.updateSessionActivity(session_name);
420
- return claudeProcess;
421
- }
422
- /**
423
- * Get Claude process status for session
424
- */
425
- async getClaudeStatus(session_name) {
426
- return await claudeOrchestrator.getProcessStatus(session_name);
427
- }
428
- /**
429
- * Get all sessions with enhanced Claude information
430
- */
431
- async listEnhancedSessions(filter_pattern) {
432
- const sessions = await this.listSessions(filter_pattern);
433
- // Enhance sessions with Claude process information
434
- const enhancedSessions = await Promise.all(sessions.map(async (session) => {
435
- const claudeProcess = await claudeOrchestrator.getProcessStatus(session.session_name);
436
- const logBuffer = liveMonitor.getBufferedLogs(session.session_name);
437
- return {
438
- ...session,
439
- claude_process: claudeProcess || undefined,
440
- claude_status: claudeProcess?.status || undefined,
441
- has_claude: !!claudeProcess,
442
- last_activity: claudeProcess?.lastActivity || session.created_at
443
- };
444
- }));
445
- return enhancedSessions;
446
- }
447
- /**
448
- * Get session processes information
449
- */
450
- async getSessionProcesses(session_name) {
451
- const sessions = await this.listSessions();
452
- const tmuxSession = sessions.find(s => s.session_name === session_name) || null;
453
- const claudeProcess = await claudeOrchestrator.getProcessStatus(session_name);
454
- const logBuffer = liveMonitor.getBufferedLogs(session_name);
455
- return {
456
- tmux_session: tmuxSession,
457
- claude_process: claudeProcess,
458
- log_buffer: logBuffer
459
- };
460
- }
461
- /**
462
- * Enhanced cleanup with Claude processes
463
- */
464
- async enhancedCleanup() {
465
- const tmuxCleanup = await this.cleanupOrphanedSessions();
466
- const claudeCleanup = await claudeOrchestrator.cleanup();
467
- const logCleanup = await liveMonitor.cleanup();
468
- return {
469
- tmux_sessions: tmuxCleanup,
470
- claude_processes: claudeCleanup,
471
- log_buffers: logCleanup
472
- };
473
- }
474
- /**
475
- * Get monitoring statistics
476
- */
477
- getMonitoringStats() {
478
- const liveStats = liveMonitor.getStats();
479
- const claudeProcesses = claudeOrchestrator.getAllProcesses();
480
- return {
481
- tmux_sessions: this.getSyncSessionCount(),
482
- active_monitoring: liveStats.activeMonitoring,
483
- total_buffers: liveStats.totalBuffers,
484
- claude_processes: claudeProcesses.length,
485
- memory_usage: liveStats.memoryUsage
486
- };
487
- }
488
- /**
489
- * Search logs across all monitored sessions
490
- */
491
- searchAllLogs(pattern, caseSensitive = false) {
492
- const results = {};
493
- const monitoringSessions = liveMonitor.getMonitoringSessions();
494
- for (const sessionName of monitoringSessions) {
495
- const matches = liveMonitor.searchLogs(sessionName, pattern, caseSensitive);
496
- if (matches.length > 0) {
497
- results[sessionName] = matches;
498
- }
499
- }
500
- return results;
501
- }
502
- /**
503
- * Export session data for debugging or backup
504
- */
505
- async exportSessionData(session_name) {
506
- const sessionData = await this.getSessionProcesses(session_name);
507
- const logs = liveMonitor.exportLogs(session_name);
508
- return {
509
- session: sessionData.tmux_session,
510
- claude_process: sessionData.claude_process,
511
- logs,
512
- export_time: new Date().toISOString()
513
- };
514
- }
515
- /**
516
- * Update session activity timestamp
517
- */
518
- async updateSessionActivity(session_name) {
519
- try {
520
- const metadata = await this.loadMetadata();
521
- const session = metadata.sessions[session_name];
522
- if (session) {
523
- session.last_activity = new Date().toISOString();
524
- metadata.sessions[session_name] = session;
525
- await this.saveMetadata(metadata);
526
- }
527
- }
528
- catch (error) {
529
- console.warn(`Failed to update activity for session ${session_name}:`, error);
530
- }
531
- }
532
- /**
533
- * Get session count from current metadata (helper method)
534
- */
535
- getSyncSessionCount() {
536
- return Object.keys(this.buffers?.sessions || {}).length;
537
- }
538
- }
539
- // Export singleton instance
540
- export const tmuxManager = new TmuxManager();
541
- //# sourceMappingURL=tmuxManager.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tmuxManager.js","sourceRoot":"","sources":["../../src/services/tmuxManager.ts"],"names":[],"mappings":"AAAA,8BAA8B;AAC9B,OAAO,EAAS,IAAI,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,EAAE,kBAAkB,EAAgC,MAAM,yBAAyB,CAAC;AAC3F,OAAO,EAAE,WAAW,EAA6B,MAAM,kBAAkB,CAAC;AAE1E,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAuBlC,MAAM,OAAO,WAAW;IAItB;QAFQ,gBAAW,GAAmB,IAAI,CAAC;QAGzC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,yBAAyB,CAAC,CAAC;IAC7E,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAiB;QACrB,IAAI,IAAI,CAAC,WAAW,KAAK,IAAI,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAC,WAAW,CAAC;QAC1B,CAAC;QAED,IAAI,CAAC;YACH,MAAM,SAAS,CAAC,YAAY,CAAC,CAAC;YAC9B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;YACxB,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;YACzB,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;;OAGG;IACK,cAAc,CAAC,WAAmB,EAAE,WAAoB;QAC9D,yDAAyD;QACzD,MAAM,QAAQ,GAAG,WAAW,IAAI,WAAW,CAAC;QAE5C,4EAA4E;QAC5E,MAAM,SAAS,GAAG,QAAQ;aACvB,WAAW,EAAE;aACb,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC,qCAAqC;aACtE,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,8BAA8B;aACnD,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,uCAAuC;aAC5D,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,kCAAkC;aACxD,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe;QAEpC,OAAO,OAAO,SAAS,EAAE,CAAC;IAC5B,CAAC;IAED;;OAEG;IACK,mBAAmB,CAAC,YAAoB;QAC9C,uFAAuF;QACvF,2DAA2D;QAC3D,OAAO,8BAA8B,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC3D,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,YAAY;QACxB,IAAI,CAAC;YACH,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;gBAC3C,OAAO,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAC9C,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,uCAAuC,EAAE,KAAK,CAAC,CAAC;QAC/D,CAAC;QAED,OAAO;YACL,QAAQ,EAAE,EAAE;YACZ,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACvC,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,YAAY,CAAC,QAA6B;QACtD,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;YACpD,QAAQ,CAAC,YAAY,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YACjD,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;QACjE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,uCAAuC,EAAE,KAAK,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CACjB,OAAe,EACf,WAAmB,EACnB,aAAqB,EACrB,aAAsB,EACtB,WAAoB;QAEpB,IAAI,CAAC,MAAM,IAAI,CAAC,iBAAiB,EAAE,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC1D,CAAC;QAED,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QACnE,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,CAAC,CAAC;QAEhE,yEAAyE;QACzE,IAAI,MAAM,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,EAAE,CAAC;YAC3C,OAAO,CAAC,GAAG,CAAC,WAAW,YAAY,6CAA6C,CAAC,CAAC;YAClF,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;YACvC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,mCAAmC,YAAY,GAAG,EAAE,KAAK,CAAC,CAAC;YAC1E,CAAC;QACH,CAAC;QAED,IAAI,CAAC;YACH,qFAAqF;YACrF,MAAM,OAAO,GAAG,2BAA2B,YAAY,SAAS,YAAY,GAAG,CAAC;YAChF,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC;YAEzB,MAAM,OAAO,GAAgB;gBAC3B,YAAY;gBACZ,OAAO;gBACP,WAAW;gBACX,aAAa,EAAE,YAAY;gBAC3B,MAAM,EAAE,QAAQ;gBAChB,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACpC,gBAAgB,EAAE,CAAC;aACpB,CAAC;YAEF,iEAAiE;YACjE,IAAI,aAAa,EAAE,CAAC;gBAClB,MAAM,kBAAkB,CAAC,oBAAoB,CAC3C,YAAY,EACZ,aAAa,EACb,YAAY,CACb,CAAC;YACJ,CAAC;YAED,mBAAmB;YACnB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;YAC3C,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,GAAG,OAAO,CAAC;YAC1C,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;YAElC,OAAO,OAAO,CAAC;QACjB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,kCAAkC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC9G,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CAAC,YAAoB;QACtC,IAAI,CAAC,MAAM,IAAI,CAAC,iBAAiB,EAAE,EAAE,CAAC;YACpC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,CAAC;YACH,MAAM,SAAS,CAAC,wBAAwB,YAAY,GAAG,CAAC,CAAC;YACzD,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,YAAoB;QACpC,IAAI,CAAC,MAAM,IAAI,CAAC,iBAAiB,EAAE,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC1D,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC,EAAE,CAAC;YAC5C,MAAM,IAAI,KAAK,CAAC,yBAAyB,YAAY,EAAE,CAAC,CAAC;QAC3D,CAAC;QAED,IAAI,CAAC;YACH,uDAAuD;YACvD,MAAM,kBAAkB,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YACjE,MAAM,SAAS,CAAC,yBAAyB,kBAAkB,GAAG,CAAC,CAAC;YAEhE,uBAAuB;YACvB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;YAC3C,OAAO,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;YACvC,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QACpC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,gCAAgC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC5G,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAAC,cAAuB;QACxC,IAAI,CAAC,MAAM,IAAI,CAAC,iBAAiB,EAAE,EAAE,CAAC;YACpC,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,IAAI,CAAC;YACH,6BAA6B;YAC7B,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAChC,uGAAuG,CACxG,CAAC;YAEF,MAAM,YAAY,GAAG,IAAI,GAAG,EAAiD,CAAC;YAE9E,IAAI,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;gBAClB,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;oBACvC,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;oBAClD,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;wBACjE,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE;4BACrB,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC;4BACjC,OAAO;yBACR,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC;YAED,4CAA4C;YAC5C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;YAC3C,MAAM,QAAQ,GAAkB,EAAE,CAAC;YAEnC,wBAAwB;YACxB,KAAK,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,IAAI,YAAY,EAAE,CAAC;gBACpD,MAAM,aAAa,GAAG,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;gBAEtD,IAAI,aAAa,EAAE,CAAC;oBAClB,uCAAuC;oBACvC,MAAM,OAAO,GAAgB;wBAC3B,GAAG,aAAa;wBAChB,MAAM,EAAE,QAAQ,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU;wBACrD,gBAAgB,EAAE,QAAQ,CAAC,QAAQ;qBACpC,CAAC;oBACF,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACzB,CAAC;qBAAM,CAAC;oBACN,4DAA4D;oBAC5D,MAAM,OAAO,GAAgB;wBAC3B,YAAY;wBACZ,OAAO,EAAE,SAAS;wBAClB,WAAW,EAAE,YAAY,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;wBAC7C,aAAa,EAAE,OAAO,CAAC,GAAG,EAAE;wBAC5B,MAAM,EAAE,QAAQ,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU;wBACrD,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;wBACpC,gBAAgB,EAAE,QAAQ,CAAC,QAAQ;qBACpC,CAAC;oBACF,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACzB,CAAC;YACH,CAAC;YAED,+CAA+C;YAC/C,KAAK,MAAM,CAAC,YAAY,EAAE,aAAa,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC9E,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;oBACpC,MAAM,OAAO,GAAgB;wBAC3B,GAAG,aAAa;wBAChB,MAAM,EAAE,UAAU;wBAClB,gBAAgB,EAAE,CAAC;qBACpB,CAAC;oBACF,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACzB,CAAC;YACH,CAAC;YAED,0EAA0E;YAC1E,IAAI,eAAe,GAAG,KAAK,CAAC;YAC5B,KAAK,MAAM,WAAW,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;gBAC5C,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;oBACnC,OAAO,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;oBACtC,eAAe,GAAG,IAAI,CAAC;gBACzB,CAAC;YACH,CAAC;YAED,0DAA0D;YAC1D,IAAI,eAAe,EAAE,CAAC;gBACpB,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;YACpC,CAAC;YAED,2BAA2B;YAC3B,IAAI,gBAAgB,GAAG,QAAQ,CAAC;YAChC,IAAI,cAAc,EAAE,CAAC;gBACnB,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;gBAC9C,gBAAgB,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CACrC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC;oBAC1B,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;oBACrB,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAC1B,CAAC;YACJ,CAAC;YAED,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACpC,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,CACpE,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,KAAK,CAAC,CAAC;YACtD,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,oBAAoB,CAAC,WAAmB;QAC5C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC3C,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,WAAW,CAAC,IAAI,IAAI,CAAC;IACnE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,uBAAuB;QAC3B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC3C,MAAM,YAAY,GAAG,IAAI,GAAG,EAAE,CAAC;QAE/B,yBAAyB;QACzB,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAChC,gEAAgE,CACjE,CAAC;YAEF,IAAI,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;gBAClB,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;oBACvC,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;wBAC5B,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;oBACzB,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,0CAA0C,EAAE,KAAK,CAAC,CAAC;YAChE,OAAO,CAAC,CAAC;QACX,CAAC;QAED,qCAAqC;QACrC,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC;QAC5D,MAAM,eAAe,GAAgC,EAAE,CAAC;QAExD,KAAK,MAAM,CAAC,YAAY,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACxE,IAAI,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAClE,eAAe,CAAC,YAAY,CAAC,GAAG,OAAO,CAAC;YAC1C,CAAC;QACH,CAAC;QAED,QAAQ,CAAC,QAAQ,GAAG,eAAe,CAAC;QACpC,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QAElC,OAAO,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,MAAM,CAAC;IAC7D,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,YAAoB;QACnC,OAAO,mBAAmB,YAAY,GAAG,CAAC;IAC5C,CAAC;IAED,8DAA8D;IAE9D;;OAEG;IACH,KAAK,CAAC,qBAAqB,CACzB,OAAe,EACf,WAAmB,EACnB,aAAqB,EACrB,aAAqB,EACrB,eAAwB,IAAI,EAC5B,WAAoB;QAEpB,IAAI,CAAC,MAAM,IAAI,CAAC,iBAAiB,EAAE,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC1D,CAAC;QAED,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QACnE,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,CAAC,CAAC;QAEhE,yEAAyE;QACzE,IAAI,MAAM,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,EAAE,CAAC;YAC3C,OAAO,CAAC,GAAG,CAAC,WAAW,YAAY,6CAA6C,CAAC,CAAC;YAClF,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;YACvC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,mCAAmC,YAAY,GAAG,EAAE,KAAK,CAAC,CAAC;YAC1E,CAAC;QACH,CAAC;QAED,IAAI,CAAC;YACH,+CAA+C;YAC/C,MAAM,OAAO,GAAG,2BAA2B,YAAY,SAAS,YAAY,GAAG,CAAC;YAChF,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC;YAEzB,iDAAiD;YACjD,MAAM,aAAa,GAAG,MAAM,kBAAkB,CAAC,oBAAoB,CACjE,YAAY,EACZ,aAAa,EACb,YAAY,CACb,CAAC;YAEF,qCAAqC;YACrC,IAAI,YAAY,EAAE,CAAC;gBACjB,MAAM,WAAW,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;YAClD,CAAC;YAED,iCAAiC;YACjC,MAAM,OAAO,GAAgB;gBAC3B,YAAY;gBACZ,OAAO;gBACP,WAAW;gBACX,aAAa,EAAE,YAAY;gBAC3B,MAAM,EAAE,QAAQ;gBAChB,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACpC,gBAAgB,EAAE,CAAC;gBACnB,cAAc,EAAE,aAAa;gBAC7B,aAAa,EAAE,aAAa,CAAC,MAAM;gBACnC,UAAU,EAAE,IAAI;gBAChB,aAAa,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACxC,CAAC;YAEF,mBAAmB;YACnB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;YAC3C,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,GAAG,OAAO,CAAC;YAC1C,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;YAElC,OAAO,OAAO,CAAC;QACjB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,2CAA2C,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACvH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,YAAoB,EAAE,OAAe;QACrD,IAAI,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,EAAE,CAAC;YAC5C,MAAM,IAAI,KAAK,CAAC,gBAAgB,YAAY,iBAAiB,CAAC,CAAC;QACjE,CAAC;QAED,yCAAyC;QACzC,MAAM,kBAAkB,CAAC,WAAW,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAE5D,uBAAuB;QACvB,MAAM,IAAI,CAAC,qBAAqB,CAAC,YAAY,CAAC,CAAC;IACjD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,YAAoB,EAAE,OAAwB;QAC9D,IAAI,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,EAAE,CAAC;YAC5C,MAAM,IAAI,KAAK,CAAC,gBAAgB,YAAY,iBAAiB,CAAC,CAAC;QACjE,CAAC;QAED,OAAO,MAAM,WAAW,CAAC,aAAa,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAChE,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,YAAoB;QAChC,OAAO,WAAW,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;IACnD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,mBAAmB,CAAC,YAAoB,EAAE,QAAiB;QAC/D,IAAI,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,EAAE,CAAC;YAC5C,MAAM,IAAI,KAAK,CAAC,gBAAgB,YAAY,iBAAiB,CAAC,CAAC;QACjE,CAAC;QAED,MAAM,WAAW,CAAC,eAAe,CAAC,YAAY,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IACvE,CAAC;IAED;;OAEG;IACH,kBAAkB,CAAC,YAAoB;QACrC,WAAW,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;IAC3C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAiB,CAAC,YAAoB;QAC1C,IAAI,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,EAAE,CAAC;YAC5C,MAAM,IAAI,KAAK,CAAC,gBAAgB,YAAY,iBAAiB,CAAC,CAAC;QACjE,CAAC;QAED,MAAM,kBAAkB,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;QACzD,MAAM,IAAI,CAAC,qBAAqB,CAAC,YAAY,CAAC,CAAC;IACjD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,oBAAoB,CAAC,YAAoB,EAAE,SAAkB;QACjE,IAAI,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,EAAE,CAAC;YAC5C,MAAM,IAAI,KAAK,CAAC,gBAAgB,YAAY,iBAAiB,CAAC,CAAC;QACjE,CAAC;QAED,MAAM,aAAa,GAAG,MAAM,kBAAkB,CAAC,cAAc,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;QACvF,MAAM,IAAI,CAAC,qBAAqB,CAAC,YAAY,CAAC,CAAC;QAC/C,OAAO,aAAa,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe,CAAC,YAAoB;QACxC,OAAO,MAAM,kBAAkB,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC;IACjE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,oBAAoB,CAAC,cAAuB;QAChD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;QAEzD,mDAAmD;QACnD,MAAM,gBAAgB,GAAG,MAAM,OAAO,CAAC,GAAG,CACxC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;YAC7B,MAAM,aAAa,GAAG,MAAM,kBAAkB,CAAC,gBAAgB,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;YACtF,MAAM,SAAS,GAAG,WAAW,CAAC,eAAe,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;YAEpE,OAAO;gBACL,GAAG,OAAO;gBACV,cAAc,EAAE,aAAa,IAAI,SAAS;gBAC1C,aAAa,EAAE,aAAa,EAAE,MAAM,IAAI,SAAS;gBACjD,UAAU,EAAE,CAAC,CAAC,aAAa;gBAC3B,aAAa,EAAE,aAAa,EAAE,YAAY,IAAI,OAAO,CAAC,UAAU;aACjE,CAAC;QACJ,CAAC,CAAC,CACH,CAAC;QAEF,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,mBAAmB,CAAC,YAAoB;QAK5C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC3C,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,KAAK,YAAY,CAAC,IAAI,IAAI,CAAC;QAChF,MAAM,aAAa,GAAG,MAAM,kBAAkB,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC;QAC9E,MAAM,SAAS,GAAG,WAAW,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;QAE5D,OAAO;YACL,YAAY,EAAE,WAAW;YACzB,cAAc,EAAE,aAAa;YAC7B,UAAU,EAAE,SAAS;SACtB,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe;QAKnB,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,uBAAuB,EAAE,CAAC;QACzD,MAAM,aAAa,GAAG,MAAM,kBAAkB,CAAC,OAAO,EAAE,CAAC;QACzD,MAAM,UAAU,GAAG,MAAM,WAAW,CAAC,OAAO,EAAE,CAAC;QAE/C,OAAO;YACL,aAAa,EAAE,WAAW;YAC1B,gBAAgB,EAAE,aAAa;YAC/B,WAAW,EAAE,UAAU;SACxB,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,kBAAkB;QAOhB,MAAM,SAAS,GAAG,WAAW,CAAC,QAAQ,EAAE,CAAC;QACzC,MAAM,eAAe,GAAG,kBAAkB,CAAC,eAAe,EAAE,CAAC;QAE7D,OAAO;YACL,aAAa,EAAE,IAAI,CAAC,mBAAmB,EAAE;YACzC,iBAAiB,EAAE,SAAS,CAAC,gBAAgB;YAC7C,aAAa,EAAE,SAAS,CAAC,YAAY;YACrC,gBAAgB,EAAE,eAAe,CAAC,MAAM;YACxC,YAAY,EAAE,SAAS,CAAC,WAAW;SACpC,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,OAAe,EAAE,gBAAyB,KAAK;QAG3D,MAAM,OAAO,GAAwC,EAAE,CAAC;QACxD,MAAM,kBAAkB,GAAG,WAAW,CAAC,qBAAqB,EAAE,CAAC;QAE/D,KAAK,MAAM,WAAW,IAAI,kBAAkB,EAAE,CAAC;YAC7C,MAAM,OAAO,GAAG,WAAW,CAAC,UAAU,CAAC,WAAW,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC;YAC5E,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,OAAO,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC;YACjC,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAiB,CAAC,YAAoB;QAM1C,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC;QACjE,MAAM,IAAI,GAAG,WAAW,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;QAElD,OAAO;YACL,OAAO,EAAE,WAAW,CAAC,YAAY;YACjC,cAAc,EAAE,WAAW,CAAC,cAAc;YAC1C,IAAI;YACJ,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACtC,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,qBAAqB,CAAC,YAAoB;QACtD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;YAC3C,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;YAEhD,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,aAAa,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;gBACjD,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,GAAG,OAAO,CAAC;gBAC1C,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;YACpC,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,yCAAyC,YAAY,GAAG,EAAE,KAAK,CAAC,CAAC;QAChF,CAAC;IACH,CAAC;IAED;;OAEG;IACK,mBAAmB;QACzB,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;IAC1D,CAAC;CAGF;AAED,4BAA4B;AAC5B,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC"}