agent-tower 0.5.2-beta.2 → 0.5.2-beta.4

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 (186) hide show
  1. package/dist/app.d.ts.map +1 -1
  2. package/dist/app.js +22 -2
  3. package/dist/app.js.map +1 -1
  4. package/dist/app.test.js +67 -0
  5. package/dist/app.test.js.map +1 -1
  6. package/dist/cli.js +2 -0
  7. package/dist/cli.js.map +1 -1
  8. package/dist/core/container.d.ts +2 -0
  9. package/dist/core/container.d.ts.map +1 -1
  10. package/dist/core/container.js +9 -1
  11. package/dist/core/container.js.map +1 -1
  12. package/dist/core/event-bus.d.ts +2 -1
  13. package/dist/core/event-bus.d.ts.map +1 -1
  14. package/dist/core/event-bus.js.map +1 -1
  15. package/dist/executors/__tests__/base.executor.test.d.ts +2 -0
  16. package/dist/executors/__tests__/base.executor.test.d.ts.map +1 -0
  17. package/dist/executors/__tests__/base.executor.test.js +264 -0
  18. package/dist/executors/__tests__/base.executor.test.js.map +1 -0
  19. package/dist/executors/__tests__/codex.executor.test.js +18 -1
  20. package/dist/executors/__tests__/codex.executor.test.js.map +1 -1
  21. package/dist/executors/base.executor.d.ts.map +1 -1
  22. package/dist/executors/base.executor.js +61 -33
  23. package/dist/executors/base.executor.js.map +1 -1
  24. package/dist/executors/codex.executor.d.ts.map +1 -1
  25. package/dist/executors/codex.executor.js +3 -4
  26. package/dist/executors/codex.executor.js.map +1 -1
  27. package/dist/executors/execution-env.d.ts +7 -1
  28. package/dist/executors/execution-env.d.ts.map +1 -1
  29. package/dist/executors/execution-env.js +41 -2
  30. package/dist/executors/execution-env.js.map +1 -1
  31. package/dist/git/git-cli.d.ts +5 -3
  32. package/dist/git/git-cli.d.ts.map +1 -1
  33. package/dist/git/git-cli.js +3 -1
  34. package/dist/git/git-cli.js.map +1 -1
  35. package/dist/git/worktree.manager.js +1 -1
  36. package/dist/git/worktree.manager.js.map +1 -1
  37. package/dist/git/worktree.manager.test.js +69 -0
  38. package/dist/git/worktree.manager.test.js.map +1 -1
  39. package/dist/index.js +2 -0
  40. package/dist/index.js.map +1 -1
  41. package/dist/mcp/http-client.d.ts +1 -0
  42. package/dist/mcp/http-client.d.ts.map +1 -1
  43. package/dist/mcp/http-client.js +3 -0
  44. package/dist/mcp/http-client.js.map +1 -1
  45. package/dist/mcp/server.d.ts.map +1 -1
  46. package/dist/mcp/server.js +27 -2
  47. package/dist/mcp/server.js.map +1 -1
  48. package/dist/mcp/types.d.ts +6 -6
  49. package/dist/routes/__tests__/tasks.test.js +179 -0
  50. package/dist/routes/__tests__/tasks.test.js.map +1 -1
  51. package/dist/routes/git.d.ts.map +1 -1
  52. package/dist/routes/git.js +41 -1
  53. package/dist/routes/git.js.map +1 -1
  54. package/dist/routes/tasks.d.ts.map +1 -1
  55. package/dist/routes/tasks.js +10 -2
  56. package/dist/routes/tasks.js.map +1 -1
  57. package/dist/routes/team-runs.d.ts.map +1 -1
  58. package/dist/routes/team-runs.js +9 -0
  59. package/dist/routes/team-runs.js.map +1 -1
  60. package/dist/services/__tests__/project.service.test.js +85 -1
  61. package/dist/services/__tests__/project.service.test.js.map +1 -1
  62. package/dist/services/__tests__/session-manager.team-run.test.js +84 -1
  63. package/dist/services/__tests__/session-manager.team-run.test.js.map +1 -1
  64. package/dist/services/__tests__/task.service.test.js +190 -0
  65. package/dist/services/__tests__/task.service.test.js.map +1 -1
  66. package/dist/services/__tests__/team-reconciler.service.test.js +122 -2
  67. package/dist/services/__tests__/team-reconciler.service.test.js.map +1 -1
  68. package/dist/services/__tests__/team-run.service.test.js +105 -1
  69. package/dist/services/__tests__/team-run.service.test.js.map +1 -1
  70. package/dist/services/__tests__/team-scheduler.service.test.js +46 -5
  71. package/dist/services/__tests__/team-scheduler.service.test.js.map +1 -1
  72. package/dist/services/__tests__/workspace-git-watcher.service.test.d.ts +2 -0
  73. package/dist/services/__tests__/workspace-git-watcher.service.test.d.ts.map +1 -0
  74. package/dist/services/__tests__/workspace-git-watcher.service.test.js +287 -0
  75. package/dist/services/__tests__/workspace-git-watcher.service.test.js.map +1 -0
  76. package/dist/services/__tests__/workspace.service.test.js +43 -1
  77. package/dist/services/__tests__/workspace.service.test.js.map +1 -1
  78. package/dist/services/project.service.d.ts +28 -24
  79. package/dist/services/project.service.d.ts.map +1 -1
  80. package/dist/services/project.service.js +11 -0
  81. package/dist/services/project.service.js.map +1 -1
  82. package/dist/services/session-manager.d.ts +44 -43
  83. package/dist/services/session-manager.d.ts.map +1 -1
  84. package/dist/services/session-manager.js +19 -3
  85. package/dist/services/session-manager.js.map +1 -1
  86. package/dist/services/task-cleanup.service.d.ts +3 -1
  87. package/dist/services/task-cleanup.service.d.ts.map +1 -1
  88. package/dist/services/task-cleanup.service.js +6 -1
  89. package/dist/services/task-cleanup.service.js.map +1 -1
  90. package/dist/services/task.service.d.ts +96 -65
  91. package/dist/services/task.service.d.ts.map +1 -1
  92. package/dist/services/task.service.js +208 -15
  93. package/dist/services/task.service.js.map +1 -1
  94. package/dist/services/team-run.service.d.ts +3 -0
  95. package/dist/services/team-run.service.d.ts.map +1 -1
  96. package/dist/services/team-run.service.js +77 -16
  97. package/dist/services/team-run.service.js.map +1 -1
  98. package/dist/services/team-scheduler.service.d.ts.map +1 -1
  99. package/dist/services/team-scheduler.service.js +16 -4
  100. package/dist/services/team-scheduler.service.js.map +1 -1
  101. package/dist/services/workspace-git-watcher.service.d.ts +67 -0
  102. package/dist/services/workspace-git-watcher.service.d.ts.map +1 -0
  103. package/dist/services/workspace-git-watcher.service.js +413 -0
  104. package/dist/services/workspace-git-watcher.service.js.map +1 -0
  105. package/dist/services/workspace.service.d.ts +99 -108
  106. package/dist/services/workspace.service.d.ts.map +1 -1
  107. package/dist/services/workspace.service.js +43 -6
  108. package/dist/services/workspace.service.js.map +1 -1
  109. package/dist/socket/events.d.ts +1 -1
  110. package/dist/socket/events.d.ts.map +1 -1
  111. package/dist/socket/events.js.map +1 -1
  112. package/dist/socket/index.d.ts.map +1 -1
  113. package/dist/socket/index.js +12 -0
  114. package/dist/socket/index.js.map +1 -1
  115. package/dist/socket/socket-gateway.d.ts.map +1 -1
  116. package/dist/socket/socket-gateway.js +5 -1
  117. package/dist/socket/socket-gateway.js.map +1 -1
  118. package/dist/web/assets/AgentDemoPage-BIMA7LtG.js +1 -0
  119. package/dist/web/assets/{DemoPage-PD8AX5pI.js → DemoPage-Ck0jATn9.js} +3 -3
  120. package/dist/web/assets/GeneralSettingsPage-C5KUTpFg.js +1 -0
  121. package/dist/web/assets/{MemberAvatar-BDXmryjB.js → MemberAvatar-CKkPlE4w.js} +1 -1
  122. package/dist/web/assets/NotificationSettingsPage-Dl2nJ6Kj.js +1 -0
  123. package/dist/web/assets/ProfileSettingsPage-D_YQBJqm.js +3 -0
  124. package/dist/web/assets/ProjectKanbanPage-D2_609qP.js +89 -0
  125. package/dist/web/assets/ProjectSettingsPage-DpewUnnG.js +2 -0
  126. package/dist/web/assets/ProviderSettingsPage-BbruFhJJ.js +54 -0
  127. package/dist/web/assets/SettingsMasterDetail-zGxTmEVL.js +1 -0
  128. package/dist/web/assets/TeamSettingsPage-B3dBegBu.js +1 -0
  129. package/dist/web/assets/arrow-left-DTTqavaj.js +1 -0
  130. package/dist/web/assets/check-N8co_7vS.js +1 -0
  131. package/dist/web/assets/chevron-down-CXD7aP1s.js +1 -0
  132. package/dist/web/assets/chevron-right-DSp9sZpx.js +1 -0
  133. package/dist/web/assets/{chevron-up-BEHjZ-SB.js → chevron-up-DAXQrjEz.js} +1 -1
  134. package/dist/web/assets/{code-block-OCS4YCEC-6FHTyCN2.js → code-block-OCS4YCEC-Cwwrn6vr.js} +1 -1
  135. package/dist/web/assets/{confirm-dialog-B_wk_zqm.js → confirm-dialog-DnHo_qsz.js} +1 -1
  136. package/dist/web/assets/folder-picker-TUuS8jPV.js +1 -0
  137. package/dist/web/assets/index-JZcaQb4r.css +1 -0
  138. package/dist/web/assets/index-X6FFd4Oy.js +13 -0
  139. package/dist/web/assets/input-CWSScfQB.js +1 -0
  140. package/dist/web/assets/layers-DMovMRW4.js +1 -0
  141. package/dist/web/assets/loader-circle-CvnvXNY6.js +1 -0
  142. package/dist/web/assets/{mermaid-NOHMQCX5-fubZbKyF.js → mermaid-NOHMQCX5-CmO9pIR-.js} +4 -4
  143. package/dist/web/assets/message-square-tazyMedo.js +1 -0
  144. package/dist/web/assets/modal-D9LZcnXe.js +1 -0
  145. package/dist/web/assets/{pencil-uRBgB4qA.js → pencil-Cfcl8xtO.js} +1 -1
  146. package/dist/web/assets/rotate-ccw-BCxAIasK.js +1 -0
  147. package/dist/web/assets/{select-BMlH2AuL.js → select-wCJbdjbF.js} +1 -1
  148. package/dist/web/assets/switch-BpVaaZIq.js +1 -0
  149. package/dist/web/assets/textarea-CqAqQ-DJ.js +1 -0
  150. package/dist/web/assets/{upload-B-Mpvu9j.js → upload-Doc6mqhw.js} +1 -1
  151. package/dist/web/assets/{use-profiles-D6cZwU1R.js → use-profiles-CLbwBXdL.js} +1 -1
  152. package/dist/web/assets/{use-providers-DVP6emIi.js → use-providers-C8Rfahov.js} +1 -1
  153. package/dist/web/favicon.ico +0 -0
  154. package/dist/web/index.html +4 -4
  155. package/node_modules/@agent-tower/shared/dist/socket/events.d.ts +10 -0
  156. package/node_modules/@agent-tower/shared/dist/socket/events.d.ts.map +1 -1
  157. package/node_modules/@agent-tower/shared/dist/socket/events.js +1 -0
  158. package/node_modules/@agent-tower/shared/dist/socket/events.js.map +1 -1
  159. package/node_modules/@agent-tower/shared/dist/types.d.ts +21 -0
  160. package/node_modules/@agent-tower/shared/dist/types.d.ts.map +1 -1
  161. package/node_modules/@agent-tower/shared/dist/types.js.map +1 -1
  162. package/node_modules/@prisma/client/.prisma/client/edge.js +2 -2
  163. package/node_modules/@prisma/client/.prisma/client/index.js +2 -2
  164. package/package.json +1 -1
  165. package/dist/web/assets/AgentDemoPage-Co63rtls.js +0 -1
  166. package/dist/web/assets/GeneralSettingsPage-C5eiEeTZ.js +0 -1
  167. package/dist/web/assets/NotificationSettingsPage-BjjPan2M.js +0 -1
  168. package/dist/web/assets/ProfileSettingsPage-BRpeNq6u.js +0 -3
  169. package/dist/web/assets/ProjectKanbanPage-DUUu2EYy.js +0 -89
  170. package/dist/web/assets/ProjectSettingsPage-avctMKfk.js +0 -2
  171. package/dist/web/assets/ProviderSettingsPage-BIUYN2e0.js +0 -54
  172. package/dist/web/assets/SettingsSection-pLJ3msrT.js +0 -1
  173. package/dist/web/assets/TeamSettingsPage-BjKW9nT8.js +0 -1
  174. package/dist/web/assets/arrow-left-lFz8nyZM.js +0 -1
  175. package/dist/web/assets/button-BUA8P726.js +0 -1
  176. package/dist/web/assets/check-BYuuXc71.js +0 -1
  177. package/dist/web/assets/chevron-down-B931AgE2.js +0 -1
  178. package/dist/web/assets/chevron-right-F9i4wey6.js +0 -1
  179. package/dist/web/assets/circle-check-C7xXtl8B.js +0 -1
  180. package/dist/web/assets/folder-picker-BEHS3b2Q.js +0 -1
  181. package/dist/web/assets/index-DEQhT5sD.css +0 -1
  182. package/dist/web/assets/index-RxbHMWXV.js +0 -13
  183. package/dist/web/assets/loader-circle-stJcjnm-.js +0 -1
  184. package/dist/web/assets/message-square-C8lb-TDo.js +0 -1
  185. package/dist/web/assets/modal-UGrjU63G.js +0 -1
  186. package/dist/web/assets/rotate-ccw-CWaMrTz4.js +0 -1
@@ -0,0 +1,413 @@
1
+ import fs from 'node:fs';
2
+ import fsPromises from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ import { execFile } from 'node:child_process';
5
+ import { promisify } from 'node:util';
6
+ import { prisma } from '../utils/index.js';
7
+ import { WorkspaceKind, WorkspaceStatus } from '../types/index.js';
8
+ const execFileAsync = promisify(execFile);
9
+ const DEFAULT_DEBOUNCE_MS = 250;
10
+ const WATCHER_RETRY_MS = 1_000;
11
+ const IGNORED_PATH_SEGMENTS = new Set(['node_modules', '.agent-tower']);
12
+ async function pathExists(targetPath) {
13
+ return fsPromises.access(targetPath).then(() => true).catch(() => false);
14
+ }
15
+ function normalizePath(targetPath) {
16
+ return path.resolve(targetPath);
17
+ }
18
+ function isNotFoundLike(error) {
19
+ return typeof error === 'object'
20
+ && error !== null
21
+ && 'code' in error
22
+ && (error.code === 'ENOENT'
23
+ || error.code === 'ENOTDIR');
24
+ }
25
+ /**
26
+ * Watches ACTIVE worktree workspaces for filesystem and git metadata changes.
27
+ *
28
+ * The service intentionally listens to the filesystem rather than terminal
29
+ * output, so changes from the built-in shell, external terminals, IDEs, and
30
+ * scripts all flow through the same path.
31
+ */
32
+ export class WorkspaceGitWatcherService {
33
+ eventBus;
34
+ watchers = new Map();
35
+ debounceMs;
36
+ retryMs;
37
+ startupGeneration = 0;
38
+ startupActive = false;
39
+ serviceGeneration = 0;
40
+ workspaceGenerations = new Map();
41
+ loadActiveWorkspaces;
42
+ constructor(eventBus, options = {}) {
43
+ this.eventBus = eventBus;
44
+ this.debounceMs = options.debounceMs ?? DEFAULT_DEBOUNCE_MS;
45
+ this.retryMs = options.retryMs ?? WATCHER_RETRY_MS;
46
+ this.loadActiveWorkspaces = options.loadActiveWorkspaces ?? (() => this.findActiveWorkspaces());
47
+ }
48
+ async start() {
49
+ const generation = ++this.startupGeneration;
50
+ this.startupActive = true;
51
+ const workspaces = await this.loadActiveWorkspaces();
52
+ for (const workspace of workspaces) {
53
+ if (!this.isStartupCurrent(generation))
54
+ return;
55
+ await this.watchWorkspaceInternal(workspace, generation);
56
+ }
57
+ }
58
+ stop() {
59
+ this.startupActive = false;
60
+ this.startupGeneration += 1;
61
+ this.serviceGeneration += 1;
62
+ for (const workspaceId of [...this.watchers.keys()]) {
63
+ this.unwatchWorkspace(workspaceId);
64
+ }
65
+ }
66
+ async refreshWorkspace(workspaceId) {
67
+ const workspace = await prisma.workspace.findUnique({
68
+ where: { id: workspaceId },
69
+ include: { task: { select: { projectId: true, deletedAt: true } } },
70
+ });
71
+ if (!workspace
72
+ || workspace.task.deletedAt
73
+ || workspace.status !== WorkspaceStatus.ACTIVE
74
+ || workspace.workspaceKind !== WorkspaceKind.WORKTREE
75
+ || !workspace.worktreePath) {
76
+ this.unwatchWorkspace(workspaceId);
77
+ return;
78
+ }
79
+ await this.watchWorkspace({
80
+ id: workspace.id,
81
+ taskId: workspace.taskId,
82
+ worktreePath: workspace.worktreePath,
83
+ workingDir: workspace.workingDir,
84
+ task: { projectId: workspace.task.projectId },
85
+ });
86
+ }
87
+ async watchWorkspace(workspace) {
88
+ await this.watchWorkspaceInternal(workspace);
89
+ }
90
+ async watchWorkspaceInternal(workspace, startupGeneration) {
91
+ const registration = this.beginWorkspaceRegistration(workspace.id, startupGeneration);
92
+ const canContinueRegistration = () => this.isRegistrationCurrent(workspace.id, registration);
93
+ if (!canContinueRegistration())
94
+ return;
95
+ const workingDir = workspace.workingDir || workspace.worktreePath;
96
+ if (!workingDir || !await pathExists(workingDir)) {
97
+ this.unwatchWorkspace(workspace.id);
98
+ return;
99
+ }
100
+ if (!canContinueRegistration())
101
+ return;
102
+ const normalizedWorkspace = {
103
+ ...workspace,
104
+ worktreePath: normalizePath(workspace.worktreePath),
105
+ workingDir: normalizePath(workingDir),
106
+ };
107
+ const existing = this.watchers.get(workspace.id);
108
+ if (existing && this.sameWorkspace(existing.workspace, normalizedWorkspace)) {
109
+ return;
110
+ }
111
+ if (existing) {
112
+ this.closeManagedWorkspace(workspace.id, existing);
113
+ }
114
+ const targets = await this.buildWatchTargets(normalizedWorkspace.workingDir);
115
+ if (!canContinueRegistration())
116
+ return;
117
+ const managed = {
118
+ workspace: normalizedWorkspace,
119
+ targets,
120
+ watchers: [],
121
+ watchedPaths: new Set(),
122
+ timers: new Set(),
123
+ changeTimer: null,
124
+ pendingReason: 'unknown',
125
+ stopped: false,
126
+ };
127
+ this.watchers.set(normalizedWorkspace.id, managed);
128
+ for (const target of managed.targets) {
129
+ this.openWatcher(managed, target);
130
+ }
131
+ }
132
+ unwatchWorkspace(workspaceId) {
133
+ this.invalidateWorkspaceRegistration(workspaceId);
134
+ const managed = this.watchers.get(workspaceId);
135
+ if (!managed)
136
+ return;
137
+ this.closeManagedWorkspace(workspaceId, managed);
138
+ }
139
+ closeManagedWorkspace(workspaceId, managed) {
140
+ managed.stopped = true;
141
+ for (const watcher of managed.watchers) {
142
+ watcher.close();
143
+ }
144
+ for (const timer of managed.timers) {
145
+ clearTimeout(timer);
146
+ }
147
+ if (managed.changeTimer) {
148
+ clearTimeout(managed.changeTimer);
149
+ }
150
+ this.watchers.delete(workspaceId);
151
+ }
152
+ getWatchedWorkspaceIds() {
153
+ return [...this.watchers.keys()];
154
+ }
155
+ isStartupCurrent(generation) {
156
+ return this.startupActive && this.startupGeneration === generation;
157
+ }
158
+ canContinueStartup(generation) {
159
+ return generation === undefined || this.isStartupCurrent(generation);
160
+ }
161
+ beginWorkspaceRegistration(workspaceId, startupGeneration) {
162
+ const workspaceGeneration = this.nextWorkspaceGeneration(workspaceId);
163
+ const token = {
164
+ serviceGeneration: this.serviceGeneration,
165
+ workspaceGeneration,
166
+ };
167
+ if (startupGeneration !== undefined) {
168
+ token.startupGeneration = startupGeneration;
169
+ }
170
+ return token;
171
+ }
172
+ invalidateWorkspaceRegistration(workspaceId) {
173
+ this.nextWorkspaceGeneration(workspaceId);
174
+ }
175
+ nextWorkspaceGeneration(workspaceId) {
176
+ const nextGeneration = (this.workspaceGenerations.get(workspaceId) ?? 0) + 1;
177
+ this.workspaceGenerations.set(workspaceId, nextGeneration);
178
+ return nextGeneration;
179
+ }
180
+ isRegistrationCurrent(workspaceId, token) {
181
+ return this.serviceGeneration === token.serviceGeneration
182
+ && this.workspaceGenerations.get(workspaceId) === token.workspaceGeneration
183
+ && this.canContinueStartup(token.startupGeneration);
184
+ }
185
+ async findActiveWorkspaces() {
186
+ return prisma.workspace.findMany({
187
+ where: {
188
+ status: WorkspaceStatus.ACTIVE,
189
+ workspaceKind: WorkspaceKind.WORKTREE,
190
+ worktreePath: { not: '' },
191
+ task: { deletedAt: null },
192
+ },
193
+ include: { task: { select: { projectId: true } } },
194
+ });
195
+ }
196
+ sameWorkspace(left, right) {
197
+ return left.worktreePath === right.worktreePath
198
+ && left.workingDir === right.workingDir
199
+ && left.taskId === right.taskId
200
+ && left.task.projectId === right.task.projectId;
201
+ }
202
+ async buildWatchTargets(workingDir) {
203
+ const targets = [{ path: workingDir, recursive: true, kind: 'worktree' }];
204
+ const gitDirs = await this.resolveGitDirs(workingDir);
205
+ for (const gitDir of gitDirs) {
206
+ if (await pathExists(gitDir)) {
207
+ targets.push({ path: normalizePath(gitDir), recursive: false, kind: 'git-dir' });
208
+ }
209
+ const recursivePaths = ['refs', 'logs', 'rebase-merge', 'rebase-apply'];
210
+ for (const child of recursivePaths) {
211
+ const candidate = path.join(gitDir, child);
212
+ if (await pathExists(candidate)) {
213
+ targets.push({ path: normalizePath(candidate), recursive: true, kind: 'git-dir' });
214
+ }
215
+ }
216
+ }
217
+ return this.dedupeTargets(targets);
218
+ }
219
+ dedupeTargets(targets) {
220
+ const seen = new Set();
221
+ const result = [];
222
+ for (const target of targets) {
223
+ const key = `${target.kind}:${target.path}:${target.recursive}`;
224
+ if (seen.has(key))
225
+ continue;
226
+ seen.add(key);
227
+ result.push(target);
228
+ }
229
+ return result;
230
+ }
231
+ async resolveGitDirs(workingDir) {
232
+ const result = new Set();
233
+ try {
234
+ const [gitDirOutput, commonDirOutput] = await Promise.all([
235
+ this.execGit(workingDir, ['rev-parse', '--git-dir']),
236
+ this.execGit(workingDir, ['rev-parse', '--git-common-dir']),
237
+ ]);
238
+ for (const raw of [gitDirOutput, commonDirOutput]) {
239
+ const resolved = this.resolveGitPath(workingDir, raw.trim());
240
+ if (resolved)
241
+ result.add(resolved);
242
+ }
243
+ }
244
+ catch {
245
+ const dotGit = path.join(workingDir, '.git');
246
+ if (await pathExists(dotGit)) {
247
+ const stat = await fsPromises.stat(dotGit).catch(() => null);
248
+ if (stat?.isDirectory()) {
249
+ result.add(dotGit);
250
+ }
251
+ }
252
+ }
253
+ return [...result];
254
+ }
255
+ resolveGitPath(workingDir, gitPath) {
256
+ if (!gitPath)
257
+ return null;
258
+ return normalizePath(path.isAbsolute(gitPath) ? gitPath : path.join(workingDir, gitPath));
259
+ }
260
+ openWatcher(managed, target) {
261
+ if (managed.stopped)
262
+ return;
263
+ if (managed.watchedPaths.has(target.path))
264
+ return;
265
+ try {
266
+ const watcher = fs.watch(target.path, { recursive: target.recursive }, (_eventType, filename) => {
267
+ if (filename && this.shouldIgnorePath(filename.toString()))
268
+ return;
269
+ this.scheduleChange(managed, target.kind === 'git-dir' ? 'git-dir' : 'worktree');
270
+ });
271
+ watcher.on('error', (error) => {
272
+ if (managed.stopped)
273
+ return;
274
+ if (isNotFoundLike(error)) {
275
+ this.scheduleRetry(managed, target);
276
+ return;
277
+ }
278
+ console.warn(`[WorkspaceGitWatcher] watcher error for ${managed.workspace.id} at ${target.path}:`, error instanceof Error ? error.message : error);
279
+ });
280
+ managed.watchers.push(watcher);
281
+ managed.watchedPaths.add(target.path);
282
+ }
283
+ catch (error) {
284
+ if (target.recursive && this.isRecursiveWatchUnsupported(error)) {
285
+ this.openDirectoryTreeWatchers(managed, target.path, target.kind).catch((err) => {
286
+ console.warn(`[WorkspaceGitWatcher] failed to open directory tree watchers for ${target.path}:`, err instanceof Error ? err.message : err);
287
+ });
288
+ return;
289
+ }
290
+ if (isNotFoundLike(error)) {
291
+ this.scheduleRetry(managed, target);
292
+ return;
293
+ }
294
+ console.warn(`[WorkspaceGitWatcher] failed to watch ${target.path} for ${managed.workspace.id}:`, error instanceof Error ? error.message : error);
295
+ }
296
+ }
297
+ isRecursiveWatchUnsupported(error) {
298
+ return typeof error === 'object'
299
+ && error !== null
300
+ && 'code' in error
301
+ && (error.code === 'ERR_FEATURE_UNAVAILABLE_ON_PLATFORM'
302
+ || error.code === 'ERR_INVALID_ARG_VALUE');
303
+ }
304
+ async openDirectoryTreeWatchers(managed, rootPath, kind) {
305
+ if (managed.stopped || !await pathExists(rootPath))
306
+ return;
307
+ const entries = await fsPromises.readdir(rootPath, { withFileTypes: true }).catch(() => []);
308
+ if (managed.stopped)
309
+ return;
310
+ this.openNonRecursiveWatcher(managed, rootPath, kind);
311
+ for (const entry of entries) {
312
+ if (!entry.isDirectory())
313
+ continue;
314
+ if (this.shouldIgnorePath(path.join(rootPath, entry.name)))
315
+ continue;
316
+ await this.openDirectoryTreeWatchers(managed, path.join(rootPath, entry.name), kind);
317
+ }
318
+ }
319
+ openNonRecursiveWatcher(managed, targetPath, kind) {
320
+ if (managed.stopped)
321
+ return;
322
+ const normalizedTarget = normalizePath(targetPath);
323
+ if (managed.watchedPaths.has(normalizedTarget))
324
+ return;
325
+ try {
326
+ const watcher = fs.watch(normalizedTarget, (eventType, filename) => {
327
+ const childPath = filename ? path.join(normalizedTarget, filename.toString()) : normalizedTarget;
328
+ if (this.shouldIgnorePath(childPath))
329
+ return;
330
+ this.scheduleChange(managed, kind === 'git-dir' ? 'git-dir' : 'worktree');
331
+ if (eventType === 'rename') {
332
+ fsPromises.stat(childPath)
333
+ .then((stat) => {
334
+ if (stat.isDirectory()) {
335
+ return this.openDirectoryTreeWatchers(managed, childPath, kind);
336
+ }
337
+ })
338
+ .catch(() => undefined);
339
+ }
340
+ });
341
+ watcher.on('error', (error) => {
342
+ if (managed.stopped)
343
+ return;
344
+ if (isNotFoundLike(error))
345
+ return;
346
+ console.warn(`[WorkspaceGitWatcher] watcher error for ${managed.workspace.id} at ${normalizedTarget}:`, error instanceof Error ? error.message : error);
347
+ });
348
+ managed.watchers.push(watcher);
349
+ managed.watchedPaths.add(normalizedTarget);
350
+ }
351
+ catch (error) {
352
+ if (isNotFoundLike(error))
353
+ return;
354
+ console.warn(`[WorkspaceGitWatcher] failed to watch ${normalizedTarget} for ${managed.workspace.id}:`, error instanceof Error ? error.message : error);
355
+ }
356
+ }
357
+ scheduleRetry(managed, target) {
358
+ if (managed.stopped)
359
+ return;
360
+ const timer = setTimeout(() => {
361
+ managed.timers.delete(timer);
362
+ this.openWatcher(managed, target);
363
+ }, this.retryMs);
364
+ managed.timers.add(timer);
365
+ timer.unref?.();
366
+ }
367
+ shouldIgnorePath(filename) {
368
+ return filename
369
+ .replace(/\\/g, '/')
370
+ .split('/')
371
+ .some((segment) => IGNORED_PATH_SEGMENTS.has(segment));
372
+ }
373
+ scheduleChange(managed, reason) {
374
+ if (managed.stopped)
375
+ return;
376
+ managed.pendingReason = reason;
377
+ this.scheduleMaybeChanged(managed);
378
+ }
379
+ scheduleMaybeChanged(managed) {
380
+ if (managed.stopped)
381
+ return;
382
+ if (managed.changeTimer) {
383
+ clearTimeout(managed.changeTimer);
384
+ }
385
+ const timer = setTimeout(() => {
386
+ managed.changeTimer = null;
387
+ this.emitMaybeChanged(managed, managed.pendingReason);
388
+ }, this.debounceMs);
389
+ managed.changeTimer = timer;
390
+ timer.unref?.();
391
+ }
392
+ emitMaybeChanged(managed, reason) {
393
+ if (managed.stopped)
394
+ return;
395
+ this.eventBus.emit('workspace:git_changed', {
396
+ workspaceId: managed.workspace.id,
397
+ taskId: managed.workspace.taskId,
398
+ projectId: managed.workspace.task.projectId,
399
+ workingDir: managed.workspace.workingDir,
400
+ reason,
401
+ });
402
+ }
403
+ async execGit(workingDir, args) {
404
+ const { stdout } = await execFileAsync('git', args, {
405
+ cwd: workingDir,
406
+ timeout: 10_000,
407
+ maxBuffer: 10 * 1024 * 1024,
408
+ encoding: 'utf-8',
409
+ });
410
+ return stdout;
411
+ }
412
+ }
413
+ //# sourceMappingURL=workspace-git-watcher.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-git-watcher.service.js","sourceRoot":"","sources":["../../src/services/workspace-git-watcher.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,UAAU,MAAM,kBAAkB,CAAC;AAC1C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAItC,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEnE,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE1C,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAChC,MAAM,gBAAgB,GAAG,KAAK,CAAC;AAC/B,MAAM,qBAAqB,GAAG,IAAI,GAAG,CAAC,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC,CAAC;AA+CxE,KAAK,UAAU,UAAU,CAAC,UAAkB;IAC1C,OAAO,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;AAC3E,CAAC;AAED,SAAS,aAAa,CAAC,UAAkB;IACvC,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAClC,CAAC;AAED,SAAS,cAAc,CAAC,KAAc;IACpC,OAAO,OAAO,KAAK,KAAK,QAAQ;WAC3B,KAAK,KAAK,IAAI;WACd,MAAM,IAAI,KAAK;WACf,CAAE,KAA4B,CAAC,IAAI,KAAK,QAAQ;eAC7C,KAA4B,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;AAC3D,CAAC;AAED;;;;;;GAMG;AACH,MAAM,OAAO,0BAA0B;IAWlB;IAVX,QAAQ,GAAG,IAAI,GAAG,EAAmC,CAAC;IACtD,UAAU,CAAS;IACnB,OAAO,CAAS;IAChB,iBAAiB,GAAG,CAAC,CAAC;IACtB,aAAa,GAAG,KAAK,CAAC;IACtB,iBAAiB,GAAG,CAAC,CAAC;IACtB,oBAAoB,GAAG,IAAI,GAAG,EAAkB,CAAC;IACxC,oBAAoB,CAAuB;IAE5D,YACmB,QAAkB,EACnC,UAAsC,EAAE;QADvB,aAAQ,GAAR,QAAQ,CAAU;QAGnC,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,mBAAmB,CAAC;QAC5D,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,gBAAgB,CAAC;QACnD,IAAI,CAAC,oBAAoB,GAAG,OAAO,CAAC,oBAAoB,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC,CAAC;IAClG,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,UAAU,GAAG,EAAE,IAAI,CAAC,iBAAiB,CAAC;QAC5C,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC1B,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAErD,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC;gBAAE,OAAO;YAC/C,MAAM,IAAI,CAAC,sBAAsB,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAED,IAAI;QACF,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;QAC3B,IAAI,CAAC,iBAAiB,IAAI,CAAC,CAAC;QAC5B,IAAI,CAAC,iBAAiB,IAAI,CAAC,CAAC;QAC5B,KAAK,MAAM,WAAW,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;YACpD,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,WAAmB;QACxC,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC;YAClD,KAAK,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE;YAC1B,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE;SACpE,CAAC,CAAC;QAEH,IAAI,CAAC,SAAS;eACT,SAAS,CAAC,IAAI,CAAC,SAAS;eACxB,SAAS,CAAC,MAAM,KAAK,eAAe,CAAC,MAAM;eAC3C,SAAS,CAAC,aAAa,KAAK,aAAa,CAAC,QAAQ;eAClD,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC;YAC7B,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;YACnC,OAAO;QACT,CAAC;QAED,MAAM,IAAI,CAAC,cAAc,CAAC;YACxB,EAAE,EAAE,SAAS,CAAC,EAAE;YAChB,MAAM,EAAE,SAAS,CAAC,MAAM;YACxB,YAAY,EAAE,SAAS,CAAC,YAAY;YACpC,UAAU,EAAE,SAAS,CAAC,UAAU;YAChC,IAAI,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE;SAC9C,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,SAA6B;QAChD,MAAM,IAAI,CAAC,sBAAsB,CAAC,SAAS,CAAC,CAAC;IAC/C,CAAC;IAEO,KAAK,CAAC,sBAAsB,CAClC,SAA6B,EAC7B,iBAA0B;QAE1B,MAAM,YAAY,GAAG,IAAI,CAAC,0BAA0B,CAAC,SAAS,CAAC,EAAE,EAAE,iBAAiB,CAAC,CAAC;QACtF,MAAM,uBAAuB,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,qBAAqB,CAAC,SAAS,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;QAE7F,IAAI,CAAC,uBAAuB,EAAE;YAAE,OAAO;QACvC,MAAM,UAAU,GAAG,SAAS,CAAC,UAAU,IAAI,SAAS,CAAC,YAAY,CAAC;QAClE,IAAI,CAAC,UAAU,IAAI,CAAC,MAAM,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YACjD,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YACpC,OAAO;QACT,CAAC;QACD,IAAI,CAAC,uBAAuB,EAAE;YAAE,OAAO;QAEvC,MAAM,mBAAmB,GAAuB;YAC9C,GAAG,SAAS;YACZ,YAAY,EAAE,aAAa,CAAC,SAAS,CAAC,YAAY,CAAC;YACnD,UAAU,EAAE,aAAa,CAAC,UAAU,CAAC;SACtC,CAAC;QAEF,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACjD,IAAI,QAAQ,IAAI,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,SAAS,EAAE,mBAAmB,CAAC,EAAE,CAAC;YAC5E,OAAO;QACT,CAAC;QACD,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,CAAC,qBAAqB,CAAC,SAAS,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;QACrD,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC;QAC7E,IAAI,CAAC,uBAAuB,EAAE;YAAE,OAAO;QAEvC,MAAM,OAAO,GAA4B;YACvC,SAAS,EAAE,mBAAmB;YAC9B,OAAO;YACP,QAAQ,EAAE,EAAE;YACZ,YAAY,EAAE,IAAI,GAAG,EAAE;YACvB,MAAM,EAAE,IAAI,GAAG,EAAE;YACjB,WAAW,EAAE,IAAI;YACjB,aAAa,EAAE,SAAS;YACxB,OAAO,EAAE,KAAK;SACf,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,mBAAmB,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QACnD,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACrC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAED,gBAAgB,CAAC,WAAmB;QAClC,IAAI,CAAC,+BAA+B,CAAC,WAAW,CAAC,CAAC;QAClD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAC/C,IAAI,CAAC,OAAO;YAAE,OAAO;QAErB,IAAI,CAAC,qBAAqB,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IACnD,CAAC;IAEO,qBAAqB,CAAC,WAAmB,EAAE,OAAgC;QACjF,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;QACvB,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACvC,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnC,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;QACD,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;YACxB,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QACpC,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IACpC,CAAC;IAED,sBAAsB;QACpB,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IACnC,CAAC;IAEO,gBAAgB,CAAC,UAAkB;QACzC,OAAO,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,iBAAiB,KAAK,UAAU,CAAC;IACrE,CAAC;IAEO,kBAAkB,CAAC,UAAmB;QAC5C,OAAO,UAAU,KAAK,SAAS,IAAI,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;IACvE,CAAC;IAEO,0BAA0B,CAChC,WAAmB,EACnB,iBAA0B;QAE1B,MAAM,mBAAmB,GAAG,IAAI,CAAC,uBAAuB,CAAC,WAAW,CAAC,CAAC;QACtE,MAAM,KAAK,GAA+B;YACxC,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;YACzC,mBAAmB;SACpB,CAAC;QACF,IAAI,iBAAiB,KAAK,SAAS,EAAE,CAAC;YACpC,KAAK,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;QAC9C,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,+BAA+B,CAAC,WAAmB;QACzD,IAAI,CAAC,uBAAuB,CAAC,WAAW,CAAC,CAAC;IAC5C,CAAC;IAEO,uBAAuB,CAAC,WAAmB;QACjD,MAAM,cAAc,GAAG,CAAC,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QAC7E,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;QAC3D,OAAO,cAAc,CAAC;IACxB,CAAC;IAEO,qBAAqB,CAC3B,WAAmB,EACnB,KAAiC;QAEjC,OAAO,IAAI,CAAC,iBAAiB,KAAK,KAAK,CAAC,iBAAiB;eACpD,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,KAAK,CAAC,mBAAmB;eACxE,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACxD,CAAC;IAEO,KAAK,CAAC,oBAAoB;QAChC,OAAO,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC;YAC/B,KAAK,EAAE;gBACL,MAAM,EAAE,eAAe,CAAC,MAAM;gBAC9B,aAAa,EAAE,aAAa,CAAC,QAAQ;gBACrC,YAAY,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE;gBACzB,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE;aAC1B;YACD,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE;SACnD,CAAC,CAAC;IACL,CAAC;IAEO,aAAa,CAAC,IAAwB,EAAE,KAAyB;QACvE,OAAO,IAAI,CAAC,YAAY,KAAK,KAAK,CAAC,YAAY;eAC1C,IAAI,CAAC,UAAU,KAAK,KAAK,CAAC,UAAU;eACpC,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;eAC5B,IAAI,CAAC,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;IACpD,CAAC;IAEO,KAAK,CAAC,iBAAiB,CAAC,UAAkB;QAChD,MAAM,OAAO,GAAkB,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;QACzF,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;QAEtD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,MAAM,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC7B,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;YACnF,CAAC;YAED,MAAM,cAAc,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,cAAc,CAAC,CAAC;YACxE,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;gBACnC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;gBAC3C,IAAI,MAAM,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;oBAChC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;gBACrF,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;IAEO,aAAa,CAAC,OAAsB;QAC1C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,MAAM,MAAM,GAAkB,EAAE,CAAC;QACjC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YAChE,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,SAAS;YAC5B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACd,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtB,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,KAAK,CAAC,cAAc,CAAC,UAAkB;QAC7C,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;QACjC,IAAI,CAAC;YACH,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBACxD,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;gBACpD,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;aAC5D,CAAC,CAAC;YACH,KAAK,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE,eAAe,CAAC,EAAE,CAAC;gBAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC7D,IAAI,QAAQ;oBAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;YAC7C,IAAI,MAAM,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC7B,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;gBAC7D,IAAI,IAAI,EAAE,WAAW,EAAE,EAAE,CAAC;oBACxB,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBACrB,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC;IACrB,CAAC;IAEO,cAAc,CAAC,UAAkB,EAAE,OAAe;QACxD,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAC1B,OAAO,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;IAC5F,CAAC;IAEO,WAAW,CAAC,OAAgC,EAAE,MAAmB;QACvE,IAAI,OAAO,CAAC,OAAO;YAAE,OAAO;QAC5B,IAAI,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC;YAAE,OAAO;QAElD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,EAAE,CAAC,KAAK,CACtB,MAAM,CAAC,IAAI,EACX,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,EAC/B,CAAC,UAAU,EAAE,QAAQ,EAAE,EAAE;gBACvB,IAAI,QAAQ,IAAI,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;oBAAE,OAAO;gBACnE,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;YACnF,CAAC,CACF,CAAC;YACF,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;gBAC5B,IAAI,OAAO,CAAC,OAAO;oBAAE,OAAO;gBAC5B,IAAI,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC1B,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;oBACpC,OAAO;gBACT,CAAC;gBACD,OAAO,CAAC,IAAI,CACV,2CAA2C,OAAO,CAAC,SAAS,CAAC,EAAE,OAAO,MAAM,CAAC,IAAI,GAAG,EACpF,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAC/C,CAAC;YACJ,CAAC,CAAC,CAAC;YACH,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC/B,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACxC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC,2BAA2B,CAAC,KAAK,CAAC,EAAE,CAAC;gBAChE,IAAI,CAAC,yBAAyB,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;oBAC9E,OAAO,CAAC,IAAI,CACV,oEAAoE,MAAM,CAAC,IAAI,GAAG,EAClF,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CACzC,CAAC;gBACJ,CAAC,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YACD,IAAI,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC1B,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;gBACpC,OAAO;YACT,CAAC;YACD,OAAO,CAAC,IAAI,CACV,yCAAyC,MAAM,CAAC,IAAI,QAAQ,OAAO,CAAC,SAAS,CAAC,EAAE,GAAG,EACnF,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAC/C,CAAC;QACJ,CAAC;IACH,CAAC;IAEO,2BAA2B,CAAC,KAAc;QAChD,OAAO,OAAO,KAAK,KAAK,QAAQ;eAC3B,KAAK,KAAK,IAAI;eACd,MAAM,IAAI,KAAK;eACf,CAAE,KAA4B,CAAC,IAAI,KAAK,qCAAqC;mBAC1E,KAA4B,CAAC,IAAI,KAAK,uBAAuB,CAAC,CAAC;IACzE,CAAC;IAEO,KAAK,CAAC,yBAAyB,CACrC,OAAgC,EAChC,QAAgB,EAChB,IAAqB;QAErB,IAAI,OAAO,CAAC,OAAO,IAAI,CAAC,MAAM,UAAU,CAAC,QAAQ,CAAC;YAAE,OAAO;QAC3D,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QAC5F,IAAI,OAAO,CAAC,OAAO;YAAE,OAAO;QAE5B,IAAI,CAAC,uBAAuB,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;QACtD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;gBAAE,SAAS;YACnC,IAAI,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;gBAAE,SAAS;YACrE,MAAM,IAAI,CAAC,yBAAyB,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;QACvF,CAAC;IACH,CAAC;IAEO,uBAAuB,CAC7B,OAAgC,EAChC,UAAkB,EAClB,IAAqB;QAErB,IAAI,OAAO,CAAC,OAAO;YAAE,OAAO;QAC5B,MAAM,gBAAgB,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;QACnD,IAAI,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,gBAAgB,CAAC;YAAE,OAAO;QAEvD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,EAAE;gBACjE,MAAM,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC;gBACjG,IAAI,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC;oBAAE,OAAO;gBAC7C,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;gBAC1E,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;oBAC3B,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC;yBACvB,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;wBACb,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;4BACvB,OAAO,IAAI,CAAC,yBAAyB,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;wBAClE,CAAC;oBACH,CAAC,CAAC;yBACD,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;gBAC5B,CAAC;YACH,CAAC,CAAC,CAAC;YACH,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;gBAC5B,IAAI,OAAO,CAAC,OAAO;oBAAE,OAAO;gBAC5B,IAAI,cAAc,CAAC,KAAK,CAAC;oBAAE,OAAO;gBAClC,OAAO,CAAC,IAAI,CACV,2CAA2C,OAAO,CAAC,SAAS,CAAC,EAAE,OAAO,gBAAgB,GAAG,EACzF,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAC/C,CAAC;YACJ,CAAC,CAAC,CAAC;YACH,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC/B,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAC7C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,cAAc,CAAC,KAAK,CAAC;gBAAE,OAAO;YAClC,OAAO,CAAC,IAAI,CACV,yCAAyC,gBAAgB,QAAQ,OAAO,CAAC,SAAS,CAAC,EAAE,GAAG,EACxF,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAC/C,CAAC;QACJ,CAAC;IACH,CAAC;IAEO,aAAa,CAAC,OAAgC,EAAE,MAAmB;QACzE,IAAI,OAAO,CAAC,OAAO;YAAE,OAAO;QAC5B,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC7B,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACpC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACjB,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC1B,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;IAClB,CAAC;IAEO,gBAAgB,CAAC,QAAgB;QACvC,OAAO,QAAQ;aACZ,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;aACnB,KAAK,CAAC,GAAG,CAAC;aACV,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,qBAAqB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;IAC3D,CAAC;IAEO,cAAc,CAAC,OAAgC,EAAE,MAAsB;QAC7E,IAAI,OAAO,CAAC,OAAO;YAAE,OAAO;QAC5B,OAAO,CAAC,aAAa,GAAG,MAAM,CAAC;QAC/B,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;IAEO,oBAAoB,CAAC,OAAgC;QAC3D,IAAI,OAAO,CAAC,OAAO;YAAE,OAAO;QAC5B,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;YACxB,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QACpC,CAAC;QAED,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;YAC3B,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;QACxD,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QACpB,OAAO,CAAC,WAAW,GAAG,KAAK,CAAC;QAC5B,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;IAClB,CAAC;IAEO,gBAAgB,CACtB,OAAgC,EAChC,MAAsB;QAEtB,IAAI,OAAO,CAAC,OAAO;YAAE,OAAO;QAE5B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,uBAAuB,EAAE;YAC1C,WAAW,EAAE,OAAO,CAAC,SAAS,CAAC,EAAE;YACjC,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,MAAM;YAChC,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS;YAC3C,UAAU,EAAE,OAAO,CAAC,SAAS,CAAC,UAAU;YACxC,MAAM;SACP,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,OAAO,CAAC,UAAkB,EAAE,IAAc;QACtD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,IAAI,EAAE;YAClD,GAAG,EAAE,UAAU;YACf,OAAO,EAAE,MAAM;YACf,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI;YAC3B,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}