agent-tower 0.5.2-beta.1 → 0.5.2-beta.3

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 (188) hide show
  1. package/dist/app.d.ts.map +1 -1
  2. package/dist/app.js +9 -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/index.js +2 -0
  32. package/dist/index.js.map +1 -1
  33. package/dist/mcp/http-client.d.ts +8 -2
  34. package/dist/mcp/http-client.d.ts.map +1 -1
  35. package/dist/mcp/http-client.js +4 -4
  36. package/dist/mcp/http-client.js.map +1 -1
  37. package/dist/mcp/server.d.ts.map +1 -1
  38. package/dist/mcp/server.js +48 -5
  39. package/dist/mcp/server.js.map +1 -1
  40. package/dist/mcp/types.d.ts +6 -6
  41. package/dist/routes/__tests__/tasks.test.js +179 -0
  42. package/dist/routes/__tests__/tasks.test.js.map +1 -1
  43. package/dist/routes/git.d.ts.map +1 -1
  44. package/dist/routes/git.js +41 -1
  45. package/dist/routes/git.js.map +1 -1
  46. package/dist/routes/tasks.d.ts.map +1 -1
  47. package/dist/routes/tasks.js +10 -2
  48. package/dist/routes/tasks.js.map +1 -1
  49. package/dist/routes/team-runs.d.ts.map +1 -1
  50. package/dist/routes/team-runs.js +92 -2
  51. package/dist/routes/team-runs.js.map +1 -1
  52. package/dist/services/__tests__/project.service.test.js +85 -1
  53. package/dist/services/__tests__/project.service.test.js.map +1 -1
  54. package/dist/services/__tests__/session-manager.team-run.test.js +84 -1
  55. package/dist/services/__tests__/session-manager.team-run.test.js.map +1 -1
  56. package/dist/services/__tests__/task.service.test.js +190 -0
  57. package/dist/services/__tests__/task.service.test.js.map +1 -1
  58. package/dist/services/__tests__/team-reconciler.service.test.js +173 -5
  59. package/dist/services/__tests__/team-reconciler.service.test.js.map +1 -1
  60. package/dist/services/__tests__/team-run.service.test.js +162 -1
  61. package/dist/services/__tests__/team-run.service.test.js.map +1 -1
  62. package/dist/services/__tests__/team-scheduler.service.test.js +177 -5
  63. package/dist/services/__tests__/team-scheduler.service.test.js.map +1 -1
  64. package/dist/services/__tests__/workspace-git-watcher.service.test.d.ts +2 -0
  65. package/dist/services/__tests__/workspace-git-watcher.service.test.d.ts.map +1 -0
  66. package/dist/services/__tests__/workspace-git-watcher.service.test.js +148 -0
  67. package/dist/services/__tests__/workspace-git-watcher.service.test.js.map +1 -0
  68. package/dist/services/__tests__/workspace.service.test.js +43 -1
  69. package/dist/services/__tests__/workspace.service.test.js.map +1 -1
  70. package/dist/services/project.service.d.ts +28 -24
  71. package/dist/services/project.service.d.ts.map +1 -1
  72. package/dist/services/project.service.js +11 -0
  73. package/dist/services/project.service.js.map +1 -1
  74. package/dist/services/session-manager.d.ts +44 -43
  75. package/dist/services/session-manager.d.ts.map +1 -1
  76. package/dist/services/session-manager.js +30 -3
  77. package/dist/services/session-manager.js.map +1 -1
  78. package/dist/services/task-cleanup.service.d.ts +3 -1
  79. package/dist/services/task-cleanup.service.d.ts.map +1 -1
  80. package/dist/services/task-cleanup.service.js +6 -1
  81. package/dist/services/task-cleanup.service.js.map +1 -1
  82. package/dist/services/task.service.d.ts +96 -65
  83. package/dist/services/task.service.d.ts.map +1 -1
  84. package/dist/services/task.service.js +208 -15
  85. package/dist/services/task.service.js.map +1 -1
  86. package/dist/services/team-run.service.d.ts +18 -0
  87. package/dist/services/team-run.service.d.ts.map +1 -1
  88. package/dist/services/team-run.service.js +234 -13
  89. package/dist/services/team-run.service.js.map +1 -1
  90. package/dist/services/team-scheduler.service.d.ts +8 -4
  91. package/dist/services/team-scheduler.service.d.ts.map +1 -1
  92. package/dist/services/team-scheduler.service.js +42 -13
  93. package/dist/services/team-scheduler.service.js.map +1 -1
  94. package/dist/services/workspace-git-watcher.service.d.ts +62 -0
  95. package/dist/services/workspace-git-watcher.service.d.ts.map +1 -0
  96. package/dist/services/workspace-git-watcher.service.js +427 -0
  97. package/dist/services/workspace-git-watcher.service.js.map +1 -0
  98. package/dist/services/workspace.service.d.ts +99 -108
  99. package/dist/services/workspace.service.d.ts.map +1 -1
  100. package/dist/services/workspace.service.js +43 -6
  101. package/dist/services/workspace.service.js.map +1 -1
  102. package/dist/socket/events.d.ts +1 -1
  103. package/dist/socket/events.d.ts.map +1 -1
  104. package/dist/socket/events.js.map +1 -1
  105. package/dist/socket/socket-gateway.d.ts.map +1 -1
  106. package/dist/socket/socket-gateway.js +5 -1
  107. package/dist/socket/socket-gateway.js.map +1 -1
  108. package/dist/utils/process-launch.d.ts.map +1 -1
  109. package/dist/utils/process-launch.js +52 -9
  110. package/dist/utils/process-launch.js.map +1 -1
  111. package/dist/utils/process-launch.test.js +65 -1
  112. package/dist/utils/process-launch.test.js.map +1 -1
  113. package/dist/web/assets/AgentDemoPage-DRtgA1-w.js +1 -0
  114. package/dist/web/assets/{DemoPage-dkmp8Vvn.js → DemoPage-8g4kqlV1.js} +3 -3
  115. package/dist/web/assets/GeneralSettingsPage-b2dViAif.js +1 -0
  116. package/dist/web/assets/{MemberAvatar-pwugXGL4.js → MemberAvatar-BuaKw8fE.js} +1 -1
  117. package/dist/web/assets/NotificationSettingsPage-DCtnFBrk.js +1 -0
  118. package/dist/web/assets/ProfileSettingsPage-Hplbudpu.js +3 -0
  119. package/dist/web/assets/ProjectKanbanPage-UJVkISeV.js +89 -0
  120. package/dist/web/assets/ProjectSettingsPage-CnG-6FVF.js +2 -0
  121. package/dist/web/assets/ProviderSettingsPage-B-u7Av-v.js +54 -0
  122. package/dist/web/assets/SettingsMasterDetail-C7L4KTOf.js +1 -0
  123. package/dist/web/assets/TeamSettingsPage-DCsq_ojZ.js +1 -0
  124. package/dist/web/assets/arrow-left-BSle2OYV.js +1 -0
  125. package/dist/web/assets/check-COf1UbPe.js +1 -0
  126. package/dist/web/assets/chevron-down-Dj8_pYCl.js +1 -0
  127. package/dist/web/assets/chevron-right-BUCnUjsN.js +1 -0
  128. package/dist/web/assets/{chevron-up-BnCoaejn.js → chevron-up-BhzmceCN.js} +1 -1
  129. package/dist/web/assets/{code-block-OCS4YCEC-DkMlYSza.js → code-block-OCS4YCEC-C9ZDvx5q.js} +1 -1
  130. package/dist/web/assets/{confirm-dialog-wsb35VpE.js → confirm-dialog-NY6uLJRk.js} +1 -1
  131. package/dist/web/assets/folder-picker-B5loyQsl.js +1 -0
  132. package/dist/web/assets/index-3iFMFw1l.css +1 -0
  133. package/dist/web/assets/index-DSFOeuuj.js +13 -0
  134. package/dist/web/assets/input-D67geHKZ.js +1 -0
  135. package/dist/web/assets/layers-Dl9LLqoY.js +1 -0
  136. package/dist/web/assets/loader-circle-CP1oxYjb.js +1 -0
  137. package/dist/web/assets/{mermaid-NOHMQCX5-DoPzf-UA.js → mermaid-NOHMQCX5-C-bBE9vu.js} +4 -4
  138. package/dist/web/assets/message-square-Bwt_cqko.js +1 -0
  139. package/dist/web/assets/modal-0iwqEf_V.js +1 -0
  140. package/dist/web/assets/{pencil-CaJR6Dqm.js → pencil-CAgGPSMf.js} +1 -1
  141. package/dist/web/assets/rotate-ccw-CnfGwAnp.js +1 -0
  142. package/dist/web/assets/{select-CzeTYLO4.js → select-C0X1iRxk.js} +1 -1
  143. package/dist/web/assets/switch-D_KOTssd.js +1 -0
  144. package/dist/web/assets/textarea-DS-Evqsv.js +1 -0
  145. package/dist/web/assets/{upload-_2T21rVP.js → upload-CTsJ3wDk.js} +1 -1
  146. package/dist/web/assets/{use-profiles-BaCwGP06.js → use-profiles-CzdxiQuG.js} +1 -1
  147. package/dist/web/assets/{use-providers-Bwl7R5Ql.js → use-providers-BdxKwaE3.js} +1 -1
  148. package/dist/web/favicon.ico +0 -0
  149. package/dist/web/index.html +4 -4
  150. package/node_modules/@agent-tower/shared/dist/socket/events.d.ts +10 -1
  151. package/node_modules/@agent-tower/shared/dist/socket/events.d.ts.map +1 -1
  152. package/node_modules/@agent-tower/shared/dist/socket/events.js +1 -0
  153. package/node_modules/@agent-tower/shared/dist/socket/events.js.map +1 -1
  154. package/node_modules/@agent-tower/shared/dist/types.d.ts +25 -1
  155. package/node_modules/@agent-tower/shared/dist/types.d.ts.map +1 -1
  156. package/node_modules/@agent-tower/shared/dist/types.js.map +1 -1
  157. package/node_modules/@prisma/client/.prisma/client/edge.js +6 -5
  158. package/node_modules/@prisma/client/.prisma/client/index-browser.js +1 -0
  159. package/node_modules/@prisma/client/.prisma/client/index.d.ts +43 -0
  160. package/node_modules/@prisma/client/.prisma/client/index.js +6 -5
  161. package/node_modules/@prisma/client/.prisma/client/package.json +1 -1
  162. package/node_modules/@prisma/client/.prisma/client/schema.prisma +2 -0
  163. package/node_modules/@prisma/client/.prisma/client/wasm.js +1 -0
  164. package/package.json +1 -1
  165. package/prisma/migrations/20260609000000_add_team_member_membership_status/migration.sql +3 -0
  166. package/prisma/schema.prisma +2 -0
  167. package/dist/web/assets/AgentDemoPage-CkhVcgZo.js +0 -1
  168. package/dist/web/assets/GeneralSettingsPage-B4DH6g3D.js +0 -1
  169. package/dist/web/assets/NotificationSettingsPage-C-bPU_ZE.js +0 -1
  170. package/dist/web/assets/ProfileSettingsPage-Dlr6BmHb.js +0 -3
  171. package/dist/web/assets/ProjectKanbanPage-7oEfjjWV.js +0 -89
  172. package/dist/web/assets/ProjectSettingsPage-DZZksq5G.js +0 -2
  173. package/dist/web/assets/ProviderSettingsPage-BWN7CEG6.js +0 -54
  174. package/dist/web/assets/SettingsSection-C-sMhXpf.js +0 -1
  175. package/dist/web/assets/TeamSettingsPage-924xpocx.js +0 -1
  176. package/dist/web/assets/arrow-left-UHjQiY5K.js +0 -1
  177. package/dist/web/assets/button-CUTjpRqw.js +0 -1
  178. package/dist/web/assets/check-CPkZgPjx.js +0 -1
  179. package/dist/web/assets/chevron-down-Bby7sJEv.js +0 -1
  180. package/dist/web/assets/chevron-right-DCC0lyoB.js +0 -1
  181. package/dist/web/assets/circle-check-BscClK07.js +0 -1
  182. package/dist/web/assets/folder-picker-B-X_nrS1.js +0 -1
  183. package/dist/web/assets/index-4hNWw0yi.css +0 -1
  184. package/dist/web/assets/index-CUJoWIuo.js +0 -13
  185. package/dist/web/assets/loader-circle-Cul4BuAa.js +0 -1
  186. package/dist/web/assets/message-square-C7Q71jFj.js +0 -1
  187. package/dist/web/assets/modal-25-qs8P5.js +0 -1
  188. package/dist/web/assets/rotate-ccw-Bvz7590n.js +0 -1
@@ -0,0 +1,427 @@
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
+ loadActiveWorkspaces;
40
+ constructor(eventBus, options = {}) {
41
+ this.eventBus = eventBus;
42
+ this.debounceMs = options.debounceMs ?? DEFAULT_DEBOUNCE_MS;
43
+ this.retryMs = options.retryMs ?? WATCHER_RETRY_MS;
44
+ this.loadActiveWorkspaces = options.loadActiveWorkspaces ?? (() => this.findActiveWorkspaces());
45
+ }
46
+ async start() {
47
+ const generation = ++this.startupGeneration;
48
+ this.startupActive = true;
49
+ const workspaces = await this.loadActiveWorkspaces();
50
+ for (const workspace of workspaces) {
51
+ if (!this.isStartupCurrent(generation))
52
+ return;
53
+ await this.watchWorkspaceInternal(workspace, generation);
54
+ }
55
+ }
56
+ stop() {
57
+ this.startupActive = false;
58
+ this.startupGeneration += 1;
59
+ for (const workspaceId of [...this.watchers.keys()]) {
60
+ this.unwatchWorkspace(workspaceId);
61
+ }
62
+ }
63
+ async refreshWorkspace(workspaceId) {
64
+ const workspace = await prisma.workspace.findUnique({
65
+ where: { id: workspaceId },
66
+ include: { task: { select: { projectId: true, deletedAt: true } } },
67
+ });
68
+ if (!workspace
69
+ || workspace.task.deletedAt
70
+ || workspace.status !== WorkspaceStatus.ACTIVE
71
+ || workspace.workspaceKind !== WorkspaceKind.WORKTREE
72
+ || !workspace.worktreePath) {
73
+ this.unwatchWorkspace(workspaceId);
74
+ return;
75
+ }
76
+ await this.watchWorkspace({
77
+ id: workspace.id,
78
+ taskId: workspace.taskId,
79
+ worktreePath: workspace.worktreePath,
80
+ workingDir: workspace.workingDir,
81
+ task: { projectId: workspace.task.projectId },
82
+ });
83
+ }
84
+ async watchWorkspace(workspace) {
85
+ await this.watchWorkspaceInternal(workspace);
86
+ }
87
+ async watchWorkspaceInternal(workspace, startupGeneration) {
88
+ if (!this.canContinueStartup(startupGeneration))
89
+ return;
90
+ const workingDir = workspace.workingDir || workspace.worktreePath;
91
+ if (!workingDir || !await pathExists(workingDir)) {
92
+ this.unwatchWorkspace(workspace.id);
93
+ return;
94
+ }
95
+ if (!this.canContinueStartup(startupGeneration))
96
+ return;
97
+ const normalizedWorkspace = {
98
+ ...workspace,
99
+ worktreePath: normalizePath(workspace.worktreePath),
100
+ workingDir: normalizePath(workingDir),
101
+ };
102
+ const existing = this.watchers.get(workspace.id);
103
+ if (existing && this.sameWorkspace(existing.workspace, normalizedWorkspace)) {
104
+ return;
105
+ }
106
+ if (existing) {
107
+ this.unwatchWorkspace(workspace.id);
108
+ }
109
+ const targets = await this.buildWatchTargets(normalizedWorkspace.workingDir);
110
+ if (!this.canContinueStartup(startupGeneration))
111
+ return;
112
+ const fingerprint = await this.getFingerprint(normalizedWorkspace.workingDir);
113
+ if (!this.canContinueStartup(startupGeneration))
114
+ return;
115
+ const managed = {
116
+ workspace: normalizedWorkspace,
117
+ targets,
118
+ watchers: [],
119
+ watchedPaths: new Set(),
120
+ timers: new Set(),
121
+ changeTimer: null,
122
+ pendingReason: 'unknown',
123
+ fingerprint,
124
+ stopped: false,
125
+ };
126
+ this.watchers.set(normalizedWorkspace.id, managed);
127
+ for (const target of managed.targets) {
128
+ this.openWatcher(managed, target);
129
+ }
130
+ }
131
+ unwatchWorkspace(workspaceId) {
132
+ const managed = this.watchers.get(workspaceId);
133
+ if (!managed)
134
+ return;
135
+ managed.stopped = true;
136
+ for (const watcher of managed.watchers) {
137
+ watcher.close();
138
+ }
139
+ for (const timer of managed.timers) {
140
+ clearTimeout(timer);
141
+ }
142
+ if (managed.changeTimer) {
143
+ clearTimeout(managed.changeTimer);
144
+ }
145
+ this.watchers.delete(workspaceId);
146
+ }
147
+ getWatchedWorkspaceIds() {
148
+ return [...this.watchers.keys()];
149
+ }
150
+ isStartupCurrent(generation) {
151
+ return this.startupActive && this.startupGeneration === generation;
152
+ }
153
+ canContinueStartup(generation) {
154
+ return generation === undefined || this.isStartupCurrent(generation);
155
+ }
156
+ async findActiveWorkspaces() {
157
+ return prisma.workspace.findMany({
158
+ where: {
159
+ status: WorkspaceStatus.ACTIVE,
160
+ workspaceKind: WorkspaceKind.WORKTREE,
161
+ worktreePath: { not: '' },
162
+ task: { deletedAt: null },
163
+ },
164
+ include: { task: { select: { projectId: true } } },
165
+ });
166
+ }
167
+ sameWorkspace(left, right) {
168
+ return left.worktreePath === right.worktreePath
169
+ && left.workingDir === right.workingDir
170
+ && left.taskId === right.taskId
171
+ && left.task.projectId === right.task.projectId;
172
+ }
173
+ async buildWatchTargets(workingDir) {
174
+ const targets = [{ path: workingDir, recursive: true, kind: 'worktree' }];
175
+ const gitDirs = await this.resolveGitDirs(workingDir);
176
+ for (const gitDir of gitDirs) {
177
+ if (await pathExists(gitDir)) {
178
+ targets.push({ path: normalizePath(gitDir), recursive: false, kind: 'git-dir' });
179
+ }
180
+ const recursivePaths = ['refs', 'logs', 'rebase-merge', 'rebase-apply'];
181
+ for (const child of recursivePaths) {
182
+ const candidate = path.join(gitDir, child);
183
+ if (await pathExists(candidate)) {
184
+ targets.push({ path: normalizePath(candidate), recursive: true, kind: 'git-dir' });
185
+ }
186
+ }
187
+ }
188
+ return this.dedupeTargets(targets);
189
+ }
190
+ dedupeTargets(targets) {
191
+ const seen = new Set();
192
+ const result = [];
193
+ for (const target of targets) {
194
+ const key = `${target.kind}:${target.path}:${target.recursive}`;
195
+ if (seen.has(key))
196
+ continue;
197
+ seen.add(key);
198
+ result.push(target);
199
+ }
200
+ return result;
201
+ }
202
+ async resolveGitDirs(workingDir) {
203
+ const result = new Set();
204
+ try {
205
+ const [gitDirOutput, commonDirOutput] = await Promise.all([
206
+ this.execGit(workingDir, ['rev-parse', '--git-dir']),
207
+ this.execGit(workingDir, ['rev-parse', '--git-common-dir']),
208
+ ]);
209
+ for (const raw of [gitDirOutput, commonDirOutput]) {
210
+ const resolved = this.resolveGitPath(workingDir, raw.trim());
211
+ if (resolved)
212
+ result.add(resolved);
213
+ }
214
+ }
215
+ catch {
216
+ const dotGit = path.join(workingDir, '.git');
217
+ if (await pathExists(dotGit)) {
218
+ const stat = await fsPromises.stat(dotGit).catch(() => null);
219
+ if (stat?.isDirectory()) {
220
+ result.add(dotGit);
221
+ }
222
+ }
223
+ }
224
+ return [...result];
225
+ }
226
+ resolveGitPath(workingDir, gitPath) {
227
+ if (!gitPath)
228
+ return null;
229
+ return normalizePath(path.isAbsolute(gitPath) ? gitPath : path.join(workingDir, gitPath));
230
+ }
231
+ openWatcher(managed, target) {
232
+ if (managed.stopped)
233
+ return;
234
+ if (managed.watchedPaths.has(target.path))
235
+ return;
236
+ try {
237
+ const watcher = fs.watch(target.path, { recursive: target.recursive }, (_eventType, filename) => {
238
+ if (filename && this.shouldIgnorePath(filename.toString()))
239
+ return;
240
+ this.scheduleChange(managed, target.kind === 'git-dir' ? 'git-dir' : 'worktree');
241
+ });
242
+ watcher.on('error', (error) => {
243
+ if (managed.stopped)
244
+ return;
245
+ if (isNotFoundLike(error)) {
246
+ this.scheduleRetry(managed, target);
247
+ return;
248
+ }
249
+ console.warn(`[WorkspaceGitWatcher] watcher error for ${managed.workspace.id} at ${target.path}:`, error instanceof Error ? error.message : error);
250
+ });
251
+ managed.watchers.push(watcher);
252
+ managed.watchedPaths.add(target.path);
253
+ }
254
+ catch (error) {
255
+ if (target.recursive && this.isRecursiveWatchUnsupported(error)) {
256
+ this.openDirectoryTreeWatchers(managed, target.path, target.kind).catch((err) => {
257
+ console.warn(`[WorkspaceGitWatcher] failed to open directory tree watchers for ${target.path}:`, err instanceof Error ? err.message : err);
258
+ });
259
+ return;
260
+ }
261
+ if (isNotFoundLike(error)) {
262
+ this.scheduleRetry(managed, target);
263
+ return;
264
+ }
265
+ console.warn(`[WorkspaceGitWatcher] failed to watch ${target.path} for ${managed.workspace.id}:`, error instanceof Error ? error.message : error);
266
+ }
267
+ }
268
+ isRecursiveWatchUnsupported(error) {
269
+ return typeof error === 'object'
270
+ && error !== null
271
+ && 'code' in error
272
+ && (error.code === 'ERR_FEATURE_UNAVAILABLE_ON_PLATFORM'
273
+ || error.code === 'ERR_INVALID_ARG_VALUE');
274
+ }
275
+ async openDirectoryTreeWatchers(managed, rootPath, kind) {
276
+ if (managed.stopped || !await pathExists(rootPath))
277
+ return;
278
+ const entries = await fsPromises.readdir(rootPath, { withFileTypes: true }).catch(() => []);
279
+ if (managed.stopped)
280
+ return;
281
+ this.openNonRecursiveWatcher(managed, rootPath, kind);
282
+ for (const entry of entries) {
283
+ if (!entry.isDirectory())
284
+ continue;
285
+ if (this.shouldIgnorePath(path.join(rootPath, entry.name)))
286
+ continue;
287
+ await this.openDirectoryTreeWatchers(managed, path.join(rootPath, entry.name), kind);
288
+ }
289
+ }
290
+ openNonRecursiveWatcher(managed, targetPath, kind) {
291
+ if (managed.stopped)
292
+ return;
293
+ const normalizedTarget = normalizePath(targetPath);
294
+ if (managed.watchedPaths.has(normalizedTarget))
295
+ return;
296
+ try {
297
+ const watcher = fs.watch(normalizedTarget, (eventType, filename) => {
298
+ const childPath = filename ? path.join(normalizedTarget, filename.toString()) : normalizedTarget;
299
+ if (this.shouldIgnorePath(childPath))
300
+ return;
301
+ this.scheduleChange(managed, kind === 'git-dir' ? 'git-dir' : 'worktree');
302
+ if (eventType === 'rename') {
303
+ fsPromises.stat(childPath)
304
+ .then((stat) => {
305
+ if (stat.isDirectory()) {
306
+ return this.openDirectoryTreeWatchers(managed, childPath, kind);
307
+ }
308
+ })
309
+ .catch(() => undefined);
310
+ }
311
+ });
312
+ watcher.on('error', (error) => {
313
+ if (managed.stopped)
314
+ return;
315
+ if (isNotFoundLike(error))
316
+ return;
317
+ console.warn(`[WorkspaceGitWatcher] watcher error for ${managed.workspace.id} at ${normalizedTarget}:`, error instanceof Error ? error.message : error);
318
+ });
319
+ managed.watchers.push(watcher);
320
+ managed.watchedPaths.add(normalizedTarget);
321
+ }
322
+ catch (error) {
323
+ if (isNotFoundLike(error))
324
+ return;
325
+ console.warn(`[WorkspaceGitWatcher] failed to watch ${normalizedTarget} for ${managed.workspace.id}:`, error instanceof Error ? error.message : error);
326
+ }
327
+ }
328
+ scheduleRetry(managed, target) {
329
+ if (managed.stopped)
330
+ return;
331
+ const timer = setTimeout(() => {
332
+ managed.timers.delete(timer);
333
+ this.openWatcher(managed, target);
334
+ }, this.retryMs);
335
+ managed.timers.add(timer);
336
+ timer.unref?.();
337
+ }
338
+ shouldIgnorePath(filename) {
339
+ return filename
340
+ .replace(/\\/g, '/')
341
+ .split('/')
342
+ .some((segment) => IGNORED_PATH_SEGMENTS.has(segment));
343
+ }
344
+ scheduleChange(managed, reason) {
345
+ if (managed.stopped)
346
+ return;
347
+ managed.pendingReason = reason;
348
+ if (managed.changeTimer) {
349
+ clearTimeout(managed.changeTimer);
350
+ }
351
+ const timer = setTimeout(() => {
352
+ managed.changeTimer = null;
353
+ this.emitIfChanged(managed, managed.pendingReason).catch((error) => {
354
+ console.warn(`[WorkspaceGitWatcher] failed to process change for ${managed.workspace.id}:`, error instanceof Error ? error.message : error);
355
+ });
356
+ }, this.debounceMs);
357
+ managed.changeTimer = timer;
358
+ timer.unref?.();
359
+ }
360
+ async emitIfChanged(managed, reason) {
361
+ if (managed.stopped)
362
+ return;
363
+ const nextFingerprint = await this.getFingerprint(managed.workspace.workingDir);
364
+ if (nextFingerprint === managed.fingerprint)
365
+ return;
366
+ managed.fingerprint = nextFingerprint;
367
+ this.eventBus.emit('workspace:git_changed', {
368
+ workspaceId: managed.workspace.id,
369
+ taskId: managed.workspace.taskId,
370
+ projectId: managed.workspace.task.projectId,
371
+ workingDir: managed.workspace.workingDir,
372
+ reason,
373
+ });
374
+ }
375
+ async getFingerprint(workingDir) {
376
+ const [status, head, heads, staged, dirtyFiles] = await Promise.all([
377
+ this.execGit(workingDir, ['status', '--porcelain=v1', '-b', '--untracked-files=all'])
378
+ .catch((error) => `status-error:${String(error)}`),
379
+ this.execGit(workingDir, ['rev-parse', 'HEAD']).catch((error) => `head-error:${String(error)}`),
380
+ this.execGit(workingDir, ['show-ref', '--heads']).catch((error) => `heads-error:${String(error)}`),
381
+ this.execGit(workingDir, ['diff', '--cached', '--raw', '--no-abbrev', 'HEAD'])
382
+ .catch((error) => `staged-error:${String(error)}`),
383
+ this.execGit(workingDir, ['ls-files', '--modified', '--others', '--exclude-standard', '-z'])
384
+ .catch(() => ''),
385
+ ]);
386
+ const dirtyStats = await this.buildDirtyFileStats(workingDir, dirtyFiles);
387
+ return [
388
+ status.trim(),
389
+ head.trim(),
390
+ heads.trim(),
391
+ staged.trim(),
392
+ dirtyStats,
393
+ ].join('\n');
394
+ }
395
+ async buildDirtyFileStats(workingDir, filesOutput) {
396
+ const files = filesOutput
397
+ .split('\0')
398
+ .map((file) => file.trim())
399
+ .filter(Boolean)
400
+ .sort();
401
+ const stats = [];
402
+ for (const file of files) {
403
+ const absolutePath = path.resolve(workingDir, file);
404
+ if (!this.isPathInside(workingDir, absolutePath))
405
+ continue;
406
+ const stat = await fsPromises.stat(absolutePath).catch(() => null);
407
+ if (!stat?.isFile())
408
+ continue;
409
+ stats.push(`${file}\0${stat.size}\0${stat.mtimeMs}`);
410
+ }
411
+ return stats.join('\n');
412
+ }
413
+ isPathInside(root, targetPath) {
414
+ const relative = path.relative(root, targetPath);
415
+ return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));
416
+ }
417
+ async execGit(workingDir, args) {
418
+ const { stdout } = await execFileAsync('git', args, {
419
+ cwd: workingDir,
420
+ timeout: 10_000,
421
+ maxBuffer: 10 * 1024 * 1024,
422
+ encoding: 'utf-8',
423
+ });
424
+ return stdout;
425
+ }
426
+ }
427
+ //# 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":"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"}