mstro-app 0.2.0 → 0.3.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 (114) hide show
  1. package/PRIVACY.md +126 -0
  2. package/README.md +24 -23
  3. package/bin/commands/login.js +79 -49
  4. package/bin/mstro.js +240 -37
  5. package/dist/server/cli/headless/claude-invoker.d.ts.map +1 -1
  6. package/dist/server/cli/headless/claude-invoker.js +133 -27
  7. package/dist/server/cli/headless/claude-invoker.js.map +1 -1
  8. package/dist/server/cli/headless/runner.d.ts.map +1 -1
  9. package/dist/server/cli/headless/runner.js +23 -0
  10. package/dist/server/cli/headless/runner.js.map +1 -1
  11. package/dist/server/cli/headless/stall-assessor.d.ts +3 -1
  12. package/dist/server/cli/headless/stall-assessor.d.ts.map +1 -1
  13. package/dist/server/cli/headless/stall-assessor.js +20 -1
  14. package/dist/server/cli/headless/stall-assessor.js.map +1 -1
  15. package/dist/server/cli/headless/tool-watchdog.d.ts +4 -1
  16. package/dist/server/cli/headless/tool-watchdog.d.ts.map +1 -1
  17. package/dist/server/cli/headless/tool-watchdog.js +30 -24
  18. package/dist/server/cli/headless/tool-watchdog.js.map +1 -1
  19. package/dist/server/cli/headless/types.d.ts +19 -1
  20. package/dist/server/cli/headless/types.d.ts.map +1 -1
  21. package/dist/server/cli/improvisation-session-manager.d.ts +28 -1
  22. package/dist/server/cli/improvisation-session-manager.d.ts.map +1 -1
  23. package/dist/server/cli/improvisation-session-manager.js +221 -29
  24. package/dist/server/cli/improvisation-session-manager.js.map +1 -1
  25. package/dist/server/index.js +0 -3
  26. package/dist/server/index.js.map +1 -1
  27. package/dist/server/services/analytics.d.ts.map +1 -1
  28. package/dist/server/services/analytics.js +13 -1
  29. package/dist/server/services/analytics.js.map +1 -1
  30. package/dist/server/services/platform.d.ts.map +1 -1
  31. package/dist/server/services/platform.js +13 -1
  32. package/dist/server/services/platform.js.map +1 -1
  33. package/dist/server/services/terminal/pty-manager.d.ts +2 -0
  34. package/dist/server/services/terminal/pty-manager.d.ts.map +1 -1
  35. package/dist/server/services/terminal/pty-manager.js +50 -3
  36. package/dist/server/services/terminal/pty-manager.js.map +1 -1
  37. package/dist/server/services/websocket/file-explorer-handlers.d.ts +5 -0
  38. package/dist/server/services/websocket/file-explorer-handlers.d.ts.map +1 -0
  39. package/dist/server/services/websocket/file-explorer-handlers.js +518 -0
  40. package/dist/server/services/websocket/file-explorer-handlers.js.map +1 -0
  41. package/dist/server/services/websocket/git-handlers.d.ts +36 -0
  42. package/dist/server/services/websocket/git-handlers.d.ts.map +1 -0
  43. package/dist/server/services/websocket/git-handlers.js +797 -0
  44. package/dist/server/services/websocket/git-handlers.js.map +1 -0
  45. package/dist/server/services/websocket/git-pr-handlers.d.ts +4 -0
  46. package/dist/server/services/websocket/git-pr-handlers.d.ts.map +1 -0
  47. package/dist/server/services/websocket/git-pr-handlers.js +299 -0
  48. package/dist/server/services/websocket/git-pr-handlers.js.map +1 -0
  49. package/dist/server/services/websocket/git-worktree-handlers.d.ts +4 -0
  50. package/dist/server/services/websocket/git-worktree-handlers.d.ts.map +1 -0
  51. package/dist/server/services/websocket/git-worktree-handlers.js +353 -0
  52. package/dist/server/services/websocket/git-worktree-handlers.js.map +1 -0
  53. package/dist/server/services/websocket/handler-context.d.ts +32 -0
  54. package/dist/server/services/websocket/handler-context.d.ts.map +1 -0
  55. package/dist/server/services/websocket/handler-context.js +4 -0
  56. package/dist/server/services/websocket/handler-context.js.map +1 -0
  57. package/dist/server/services/websocket/handler.d.ts +27 -359
  58. package/dist/server/services/websocket/handler.d.ts.map +1 -1
  59. package/dist/server/services/websocket/handler.js +67 -2328
  60. package/dist/server/services/websocket/handler.js.map +1 -1
  61. package/dist/server/services/websocket/index.d.ts +1 -1
  62. package/dist/server/services/websocket/index.d.ts.map +1 -1
  63. package/dist/server/services/websocket/index.js.map +1 -1
  64. package/dist/server/services/websocket/session-handlers.d.ts +10 -0
  65. package/dist/server/services/websocket/session-handlers.d.ts.map +1 -0
  66. package/dist/server/services/websocket/session-handlers.js +507 -0
  67. package/dist/server/services/websocket/session-handlers.js.map +1 -0
  68. package/dist/server/services/websocket/settings-handlers.d.ts +6 -0
  69. package/dist/server/services/websocket/settings-handlers.d.ts.map +1 -0
  70. package/dist/server/services/websocket/settings-handlers.js +125 -0
  71. package/dist/server/services/websocket/settings-handlers.js.map +1 -0
  72. package/dist/server/services/websocket/tab-handlers.d.ts +10 -0
  73. package/dist/server/services/websocket/tab-handlers.d.ts.map +1 -0
  74. package/dist/server/services/websocket/tab-handlers.js +131 -0
  75. package/dist/server/services/websocket/tab-handlers.js.map +1 -0
  76. package/dist/server/services/websocket/terminal-handlers.d.ts +9 -0
  77. package/dist/server/services/websocket/terminal-handlers.d.ts.map +1 -0
  78. package/dist/server/services/websocket/terminal-handlers.js +220 -0
  79. package/dist/server/services/websocket/terminal-handlers.js.map +1 -0
  80. package/dist/server/services/websocket/types.d.ts +63 -2
  81. package/dist/server/services/websocket/types.d.ts.map +1 -1
  82. package/package.json +4 -2
  83. package/server/README.md +176 -159
  84. package/server/cli/headless/claude-invoker.ts +155 -31
  85. package/server/cli/headless/output-utils.test.ts +225 -0
  86. package/server/cli/headless/runner.ts +25 -0
  87. package/server/cli/headless/stall-assessor.test.ts +165 -0
  88. package/server/cli/headless/stall-assessor.ts +25 -0
  89. package/server/cli/headless/tool-watchdog.test.ts +429 -0
  90. package/server/cli/headless/tool-watchdog.ts +33 -25
  91. package/server/cli/headless/types.ts +10 -1
  92. package/server/cli/improvisation-session-manager.ts +277 -30
  93. package/server/index.ts +0 -4
  94. package/server/mcp/README.md +59 -67
  95. package/server/mcp/bouncer-integration.test.ts +161 -0
  96. package/server/mcp/security-patterns.test.ts +258 -0
  97. package/server/services/analytics.ts +13 -1
  98. package/server/services/platform.ts +12 -1
  99. package/server/services/terminal/pty-manager.ts +53 -3
  100. package/server/services/websocket/autocomplete.test.ts +194 -0
  101. package/server/services/websocket/file-explorer-handlers.ts +587 -0
  102. package/server/services/websocket/git-handlers.ts +924 -0
  103. package/server/services/websocket/git-pr-handlers.ts +363 -0
  104. package/server/services/websocket/git-worktree-handlers.ts +403 -0
  105. package/server/services/websocket/handler-context.ts +44 -0
  106. package/server/services/websocket/handler.test.ts +1 -1
  107. package/server/services/websocket/handler.ts +83 -2678
  108. package/server/services/websocket/index.ts +1 -1
  109. package/server/services/websocket/session-handlers.ts +574 -0
  110. package/server/services/websocket/settings-handlers.ts +150 -0
  111. package/server/services/websocket/tab-handlers.ts +150 -0
  112. package/server/services/websocket/terminal-handlers.ts +277 -0
  113. package/server/services/websocket/types.ts +135 -0
  114. package/bin/release.sh +0 -110
@@ -0,0 +1,353 @@
1
+ // Copyright (c) 2025-present Mstro, Inc. All rights reserved.
2
+ // Licensed under the MIT License. See LICENSE file for details.
3
+ import { dirname, join } from 'node:path';
4
+ import { executeGitCommand, handleGitStatus, spawnWithOutput } from './git-handlers.js';
5
+ export function handleGitWorktreeMessage(ctx, ws, msg, tabId, gitDir, workingDir) {
6
+ const handlers = {
7
+ gitWorktreeList: () => handleGitWorktreeList(ctx, ws, tabId, gitDir),
8
+ gitWorktreeCreate: () => handleGitWorktreeCreate(ctx, ws, msg, tabId, gitDir),
9
+ gitWorktreeRemove: () => handleGitWorktreeRemove(ctx, ws, msg, tabId, gitDir),
10
+ tabWorktreeSwitch: () => handleTabWorktreeSwitch(ctx, ws, msg, tabId, workingDir),
11
+ gitWorktreePush: () => handleGitWorktreePush(ctx, ws, msg, tabId, gitDir),
12
+ gitWorktreeCreatePR: () => handleGitWorktreeCreatePR(ctx, ws, msg, tabId, gitDir),
13
+ gitMergePreview: () => handleGitMergePreview(ctx, ws, msg, tabId, gitDir),
14
+ gitWorktreeMerge: () => handleGitWorktreeMerge(ctx, ws, msg, tabId, gitDir),
15
+ gitMergeAbort: () => handleGitMergeAbort(ctx, ws, tabId, gitDir),
16
+ gitMergeComplete: () => handleGitMergeComplete(ctx, ws, msg, tabId, gitDir),
17
+ };
18
+ handlers[msg.type]?.();
19
+ }
20
+ function applyWorktreePorcelainLine(line, worktrees, current) {
21
+ if (line.startsWith('worktree ')) {
22
+ if (current.path)
23
+ worktrees.push(current);
24
+ return { path: line.slice(9).trim(), isMain: false, isBare: false };
25
+ }
26
+ if (line.startsWith('HEAD '))
27
+ current.head = line.slice(5).trim();
28
+ else if (line.startsWith('branch '))
29
+ current.branch = line.slice(7).trim().replace('refs/heads/', '');
30
+ else if (line === 'bare')
31
+ current.isBare = true;
32
+ else if (line === 'prunable')
33
+ current.prunable = true;
34
+ return current;
35
+ }
36
+ function parseWorktreePorcelain(stdout) {
37
+ const worktrees = [];
38
+ let current = {};
39
+ for (const line of stdout.split('\n')) {
40
+ current = applyWorktreePorcelainLine(line, worktrees, current);
41
+ }
42
+ if (current.path)
43
+ worktrees.push(current);
44
+ if (worktrees.length > 0)
45
+ worktrees[0].isMain = true;
46
+ return worktrees;
47
+ }
48
+ async function handleGitWorktreeList(ctx, ws, tabId, workingDir) {
49
+ try {
50
+ const result = await executeGitCommand(['worktree', 'list', '--porcelain'], workingDir);
51
+ if (result.exitCode !== 0) {
52
+ ctx.send(ws, { type: 'gitError', tabId, data: { error: result.stderr || 'Failed to list worktrees' } });
53
+ return;
54
+ }
55
+ const worktrees = parseWorktreePorcelain(result.stdout);
56
+ ctx.send(ws, { type: 'gitWorktreeListResult', tabId, data: { worktrees } });
57
+ }
58
+ catch (error) {
59
+ ctx.send(ws, { type: 'gitError', tabId, data: { error: error.message } });
60
+ }
61
+ }
62
+ async function handleGitWorktreeCreate(ctx, ws, msg, tabId, workingDir) {
63
+ try {
64
+ const { branchName, baseBranch, path: worktreePath } = msg.data || {};
65
+ if (!branchName) {
66
+ ctx.send(ws, { type: 'gitError', tabId, data: { error: 'Branch name is required' } });
67
+ return;
68
+ }
69
+ const repoName = workingDir.split('/').pop() || 'repo';
70
+ const wtPath = worktreePath || join(dirname(workingDir), `${repoName}-worktrees`, branchName);
71
+ const args = ['worktree', 'add', wtPath, '-b', branchName, ...(baseBranch ? [baseBranch] : [])];
72
+ const result = await executeGitCommand(args, workingDir);
73
+ if (result.exitCode !== 0) {
74
+ ctx.send(ws, { type: 'gitError', tabId, data: { error: result.stderr || 'Failed to create worktree' } });
75
+ return;
76
+ }
77
+ const headResult = await executeGitCommand(['rev-parse', '--short', 'HEAD'], wtPath);
78
+ ctx.send(ws, {
79
+ type: 'gitWorktreeCreated',
80
+ tabId,
81
+ data: { path: wtPath, branch: branchName, head: headResult.stdout.trim() },
82
+ });
83
+ }
84
+ catch (error) {
85
+ ctx.send(ws, { type: 'gitError', tabId, data: { error: error.message } });
86
+ }
87
+ }
88
+ async function handleGitWorktreeRemove(ctx, ws, msg, tabId, workingDir) {
89
+ try {
90
+ const { path: wtPath, force, deleteBranch } = msg.data || {};
91
+ if (!wtPath) {
92
+ ctx.send(ws, { type: 'gitError', tabId, data: { error: 'Worktree path is required' } });
93
+ return;
94
+ }
95
+ let branchToDelete;
96
+ if (deleteBranch) {
97
+ const branchResult = await executeGitCommand(['rev-parse', '--abbrev-ref', 'HEAD'], wtPath);
98
+ branchToDelete = branchResult.stdout.trim();
99
+ }
100
+ const args = force ? ['worktree', 'remove', '--force', wtPath] : ['worktree', 'remove', wtPath];
101
+ const result = await executeGitCommand(args, workingDir);
102
+ if (result.exitCode !== 0) {
103
+ ctx.send(ws, { type: 'gitError', tabId, data: { error: result.stderr || 'Failed to remove worktree' } });
104
+ return;
105
+ }
106
+ if (branchToDelete && deleteBranch) {
107
+ await executeGitCommand(['branch', '-d', branchToDelete], workingDir);
108
+ }
109
+ await executeGitCommand(['worktree', 'prune'], workingDir);
110
+ ctx.send(ws, { type: 'gitWorktreeRemoved', tabId, data: { path: wtPath } });
111
+ }
112
+ catch (error) {
113
+ ctx.send(ws, { type: 'gitError', tabId, data: { error: error.message } });
114
+ }
115
+ }
116
+ async function handleTabWorktreeSwitch(ctx, ws, msg, tabId, workingDir) {
117
+ try {
118
+ const { tabId: targetTabId, worktreePath } = msg.data || {};
119
+ const resolvedTabId = targetTabId || tabId;
120
+ if (!worktreePath) {
121
+ ctx.gitDirectories.delete(resolvedTabId);
122
+ ctx.send(ws, { type: 'tabWorktreeSwitched', tabId: resolvedTabId, data: { tabId: resolvedTabId, worktreePath: workingDir, branch: '' } });
123
+ handleGitStatus(ctx, ws, resolvedTabId, workingDir);
124
+ return;
125
+ }
126
+ ctx.gitDirectories.set(resolvedTabId, worktreePath);
127
+ const branchResult = await executeGitCommand(['rev-parse', '--abbrev-ref', 'HEAD'], worktreePath);
128
+ const branch = branchResult.stdout.trim();
129
+ ctx.send(ws, { type: 'tabWorktreeSwitched', tabId: resolvedTabId, data: { tabId: resolvedTabId, worktreePath, branch } });
130
+ handleGitStatus(ctx, ws, resolvedTabId, worktreePath);
131
+ }
132
+ catch (error) {
133
+ ctx.send(ws, { type: 'gitError', tabId, data: { error: error.message } });
134
+ }
135
+ }
136
+ async function pushWithUpstreamRetry(worktreePath, pushRemote, pushBranch, setUpstream) {
137
+ const args = setUpstream
138
+ ? ['push', '--set-upstream', pushRemote, pushBranch]
139
+ : ['push', pushRemote, pushBranch];
140
+ const result = await executeGitCommand(args, worktreePath);
141
+ if (result.exitCode === 0)
142
+ return { exitCode: 0, output: result.stderr || result.stdout, error: '' };
143
+ const needsUpstream = result.stderr.includes('no upstream') || result.stderr.includes('has no upstream');
144
+ if (!needsUpstream)
145
+ return { exitCode: result.exitCode, output: '', error: result.stderr || 'Failed to push' };
146
+ const retry = await executeGitCommand(['push', '--set-upstream', pushRemote, pushBranch], worktreePath);
147
+ if (retry.exitCode !== 0)
148
+ return { exitCode: retry.exitCode, output: '', error: retry.stderr || 'Failed to push' };
149
+ return { exitCode: 0, output: retry.stderr || retry.stdout, error: '' };
150
+ }
151
+ async function handleGitWorktreePush(ctx, ws, msg, tabId, _workingDir) {
152
+ try {
153
+ const { worktreePath, remote, branch, setUpstream } = msg.data || {};
154
+ if (!worktreePath) {
155
+ ctx.send(ws, { type: 'gitError', tabId, data: { error: 'Worktree path is required' } });
156
+ return;
157
+ }
158
+ const pushRemote = remote || 'origin';
159
+ const branchResult = await executeGitCommand(['rev-parse', '--abbrev-ref', 'HEAD'], worktreePath);
160
+ const pushBranch = branch || branchResult.stdout.trim();
161
+ const pushResult = await pushWithUpstreamRetry(worktreePath, pushRemote, pushBranch, !!setUpstream);
162
+ if (pushResult.exitCode !== 0) {
163
+ ctx.send(ws, { type: 'gitError', tabId, data: { error: pushResult.error } });
164
+ return;
165
+ }
166
+ ctx.send(ws, { type: 'gitWorktreePushed', tabId, data: { output: pushResult.output, upstream: `${pushRemote}/${pushBranch}` } });
167
+ }
168
+ catch (error) {
169
+ ctx.send(ws, { type: 'gitError', tabId, data: { error: error.message } });
170
+ }
171
+ }
172
+ async function handleGitWorktreeCreatePR(ctx, ws, msg, tabId, _workingDir) {
173
+ try {
174
+ const { worktreePath, title, body, baseBranch, draft } = msg.data || {};
175
+ if (!worktreePath) {
176
+ ctx.send(ws, { type: 'gitError', tabId, data: { error: 'Worktree path is required' } });
177
+ return;
178
+ }
179
+ const branchResult = await executeGitCommand(['rev-parse', '--abbrev-ref', 'HEAD'], worktreePath);
180
+ const branchName = branchResult.stdout.trim();
181
+ const prTitle = title || branchName.replace(/[-_/]/g, ' ').replace(/^\w/, c => c.toUpperCase());
182
+ const args = ['pr', 'create', '--title', prTitle];
183
+ if (body)
184
+ args.push('--body', body);
185
+ if (baseBranch)
186
+ args.push('--base', baseBranch);
187
+ if (draft)
188
+ args.push('--draft');
189
+ const result = await spawnWithOutput('gh', args, worktreePath);
190
+ if (result.exitCode !== 0) {
191
+ ctx.send(ws, { type: 'gitError', tabId, data: { error: result.stderr || 'Failed to create PR' } });
192
+ return;
193
+ }
194
+ const prUrl = result.stdout.trim();
195
+ const prNumberMatch = prUrl.match(/\/(\d+)$/);
196
+ const prNumber = prNumberMatch ? parseInt(prNumberMatch[1], 10) : 0;
197
+ ctx.send(ws, { type: 'gitWorktreePRCreated', tabId, data: { prUrl, prNumber } });
198
+ }
199
+ catch (error) {
200
+ ctx.send(ws, { type: 'gitError', tabId, data: { error: error.message } });
201
+ }
202
+ }
203
+ async function handleGitMergePreview(ctx, ws, msg, tabId, workingDir) {
204
+ try {
205
+ const { sourceBranch, targetBranch } = msg.data || {};
206
+ if (!sourceBranch || !targetBranch) {
207
+ ctx.send(ws, { type: 'gitError', tabId, data: { error: 'Source and target branches are required' } });
208
+ return;
209
+ }
210
+ let clean = true;
211
+ let conflicts = [];
212
+ const mergeTreeResult = await executeGitCommand(['merge-tree', '--write-tree', targetBranch, sourceBranch], workingDir);
213
+ if (mergeTreeResult.exitCode !== 0) {
214
+ clean = false;
215
+ conflicts = mergeTreeResult.stdout.split('\n')
216
+ .filter(line => line.includes('CONFLICT'))
217
+ .map(line => {
218
+ const match = line.match(/CONFLICT.*:\s+(.+)/);
219
+ return match?.[1]?.trim() || line;
220
+ });
221
+ }
222
+ const statResult = await executeGitCommand(['diff', `${targetBranch}...${sourceBranch}`, '--stat'], workingDir);
223
+ const stat = statResult.stdout.trim();
224
+ const logResult = await executeGitCommand(['log', `${targetBranch}..${sourceBranch}`, '--oneline', '--format=%h|%s'], workingDir);
225
+ const commits = logResult.stdout.trim().split('\n')
226
+ .filter(line => line.trim())
227
+ .map(line => {
228
+ const [hash, ...rest] = line.split('|');
229
+ return { hash: hash.trim(), message: rest.join('|').trim() };
230
+ });
231
+ ctx.send(ws, {
232
+ type: 'gitMergePreviewResult',
233
+ tabId,
234
+ data: { clean, conflicts, stat, commits, ahead: commits.length },
235
+ });
236
+ }
237
+ catch (error) {
238
+ ctx.send(ws, { type: 'gitError', tabId, data: { error: error.message } });
239
+ }
240
+ }
241
+ async function resolveMainWorktreePath(workingDir) {
242
+ const wtListResult = await executeGitCommand(['worktree', 'list', '--porcelain'], workingDir);
243
+ const firstLine = wtListResult.stdout.split('\n').find(l => l.startsWith('worktree '));
244
+ return firstLine ? firstLine.slice(9).trim() : workingDir;
245
+ }
246
+ async function executeMergeStrategy(strategy, sourceBranch, commitMessage, mainPath) {
247
+ if (strategy === 'squash') {
248
+ const squashResult = await executeGitCommand(['merge', '--squash', sourceBranch], mainPath);
249
+ if (squashResult.exitCode !== 0)
250
+ return { exitCode: squashResult.exitCode, error: squashResult.stderr };
251
+ const msg2 = commitMessage || `Squash merge branch '${sourceBranch}'`;
252
+ const commitResult = await executeGitCommand(['commit', '-m', msg2], mainPath);
253
+ if (commitResult.exitCode !== 0)
254
+ return { exitCode: commitResult.exitCode, error: commitResult.stderr || 'Failed to commit squash merge' };
255
+ return { exitCode: 0 };
256
+ }
257
+ if (strategy === 'rebase') {
258
+ const result = await executeGitCommand(['merge', '--ff-only', sourceBranch], mainPath);
259
+ return { exitCode: result.exitCode, error: result.stderr };
260
+ }
261
+ const mergeArgs = commitMessage ? ['merge', sourceBranch, '-m', commitMessage] : ['merge', sourceBranch];
262
+ const result = await executeGitCommand(mergeArgs, mainPath);
263
+ return { exitCode: result.exitCode, error: result.stderr };
264
+ }
265
+ async function detectMergeConflicts(mainPath) {
266
+ const result = await executeGitCommand(['diff', '--name-only', '--diff-filter=U'], mainPath);
267
+ return result.stdout.trim().split('\n').filter(f => f.trim());
268
+ }
269
+ async function cleanupAfterMerge(mainPath, sourceBranch, strategy, deleteWorktree, deleteBranch) {
270
+ if (deleteWorktree) {
271
+ const wtList = await executeGitCommand(['worktree', 'list', '--porcelain'], mainPath);
272
+ const worktreePath = findWorktreePathForBranch(wtList.stdout, sourceBranch);
273
+ if (worktreePath && worktreePath !== mainPath) {
274
+ await executeGitCommand(['worktree', 'remove', worktreePath], mainPath);
275
+ }
276
+ }
277
+ if (deleteBranch) {
278
+ const deleteFlag = strategy === 'squash' ? '-D' : '-d';
279
+ await executeGitCommand(['branch', deleteFlag, sourceBranch], mainPath);
280
+ }
281
+ await executeGitCommand(['worktree', 'prune'], mainPath);
282
+ }
283
+ function findWorktreePathForBranch(porcelainOutput, branchName) {
284
+ let currentWtPath = '';
285
+ for (const line of porcelainOutput.split('\n')) {
286
+ if (line.startsWith('worktree '))
287
+ currentWtPath = line.slice(9).trim();
288
+ if (line.startsWith('branch ') && line.includes(branchName))
289
+ return currentWtPath;
290
+ }
291
+ return null;
292
+ }
293
+ async function handleGitWorktreeMerge(ctx, ws, msg, tabId, workingDir) {
294
+ try {
295
+ const { sourceBranch, targetBranch, strategy, commitMessage, deleteWorktree, deleteBranch } = msg.data || {};
296
+ if (!sourceBranch || !targetBranch || !strategy) {
297
+ ctx.send(ws, { type: 'gitError', tabId, data: { error: 'Source branch, target branch, and strategy are required' } });
298
+ return;
299
+ }
300
+ const mainPath = await resolveMainWorktreePath(workingDir);
301
+ const mainBranchResult = await executeGitCommand(['rev-parse', '--abbrev-ref', 'HEAD'], mainPath);
302
+ if (mainBranchResult.stdout.trim() !== targetBranch) {
303
+ ctx.send(ws, { type: 'gitWorktreeMergeResult', tabId, data: { success: false, error: `Switch the main worktree to "${targetBranch}" before merging` } });
304
+ return;
305
+ }
306
+ const mergeResult = await executeMergeStrategy(strategy, sourceBranch, commitMessage, mainPath);
307
+ if (mergeResult.exitCode !== 0) {
308
+ const conflictFiles = await detectMergeConflicts(mainPath);
309
+ const data = conflictFiles.length > 0
310
+ ? { success: false, conflictFiles }
311
+ : { success: false, error: mergeResult.error || 'Merge failed' };
312
+ ctx.send(ws, { type: 'gitWorktreeMergeResult', tabId, data });
313
+ return;
314
+ }
315
+ const commitHashResult = await executeGitCommand(['rev-parse', '--short', 'HEAD'], mainPath);
316
+ await cleanupAfterMerge(mainPath, sourceBranch, strategy, !!deleteWorktree, !!deleteBranch);
317
+ ctx.send(ws, { type: 'gitWorktreeMergeResult', tabId, data: { success: true, mergeCommit: commitHashResult.stdout.trim() } });
318
+ }
319
+ catch (error) {
320
+ ctx.send(ws, { type: 'gitError', tabId, data: { error: error.message } });
321
+ }
322
+ }
323
+ async function handleGitMergeAbort(ctx, ws, tabId, workingDir) {
324
+ try {
325
+ const mainPath = await resolveMainWorktreePath(workingDir);
326
+ const result = await executeGitCommand(['merge', '--abort'], mainPath);
327
+ if (result.exitCode !== 0) {
328
+ ctx.send(ws, { type: 'gitError', tabId, data: { error: result.stderr || 'Failed to abort merge' } });
329
+ return;
330
+ }
331
+ ctx.send(ws, { type: 'gitMergeAborted', tabId, data: { aborted: true } });
332
+ }
333
+ catch (error) {
334
+ ctx.send(ws, { type: 'gitError', tabId, data: { error: error.message } });
335
+ }
336
+ }
337
+ async function handleGitMergeComplete(ctx, ws, _msg, tabId, workingDir) {
338
+ try {
339
+ const mainPath = await resolveMainWorktreePath(workingDir);
340
+ const result = await executeGitCommand(['commit', '--no-edit'], mainPath);
341
+ if (result.exitCode !== 0) {
342
+ ctx.send(ws, { type: 'gitError', tabId, data: { error: result.stderr || 'Failed to complete merge' } });
343
+ return;
344
+ }
345
+ const hashResult = await executeGitCommand(['rev-parse', '--short', 'HEAD'], mainPath);
346
+ const mergeCommit = hashResult.stdout.trim();
347
+ ctx.send(ws, { type: 'gitMergeCompleted', tabId, data: { success: true, mergeCommit } });
348
+ }
349
+ catch (error) {
350
+ ctx.send(ws, { type: 'gitError', tabId, data: { error: error.message } });
351
+ }
352
+ }
353
+ //# sourceMappingURL=git-worktree-handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-worktree-handlers.js","sourceRoot":"","sources":["../../../../server/services/websocket/git-worktree-handlers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import type { ChildProcess } from 'node:child_process';
2
+ import type { ImprovisationSessionManager } from '../../cli/improvisation-session-manager.js';
3
+ import type { AutocompleteService } from './autocomplete.js';
4
+ import type { SessionRegistry } from './session-registry.js';
5
+ import type { WebSocketResponse, WSContext } from './types.js';
6
+ export interface UsageReport {
7
+ tokensUsed: number;
8
+ sessionId?: string;
9
+ movementId?: string;
10
+ }
11
+ export type UsageReporter = (report: UsageReport) => void;
12
+ /**
13
+ * Shared context passed to all domain handler functions.
14
+ * The WebSocketImproviseHandler class satisfies this interface directly.
15
+ */
16
+ export interface HandlerContext {
17
+ sessions: Map<string, ImprovisationSessionManager>;
18
+ connections: Map<WSContext, Map<string, string>>;
19
+ allConnections: Set<WSContext>;
20
+ gitDirectories: Map<string, string>;
21
+ activeSearches: Map<string, ChildProcess>;
22
+ terminalSubscribers: Map<string, Set<WSContext>>;
23
+ terminalListenerCleanups: Map<string, () => void>;
24
+ autocompleteService: AutocompleteService;
25
+ usageReporter: UsageReporter | null;
26
+ getRegistry(workingDir: string): SessionRegistry;
27
+ send(ws: WSContext, response: WebSocketResponse): void;
28
+ broadcastToOthers(sender: WSContext, response: WebSocketResponse): void;
29
+ broadcastToAll(response: WebSocketResponse): void;
30
+ recordFileSelection(filePath: string): void;
31
+ }
32
+ //# sourceMappingURL=handler-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler-context.d.ts","sourceRoot":"","sources":["../../../../server/services/websocket/handler-context.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,4CAA4C,CAAC;AAC9F,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE/D,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,aAAa,GAAG,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,CAAC;AAE1D;;;GAGG;AACH,MAAM,WAAW,cAAc;IAE7B,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,2BAA2B,CAAC,CAAC;IACnD,WAAW,EAAE,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACjD,cAAc,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;IAC/B,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAC1C,mBAAmB,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;IACjD,wBAAwB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,CAAC;IAClD,mBAAmB,EAAE,mBAAmB,CAAC;IACzC,aAAa,EAAE,aAAa,GAAG,IAAI,CAAC;IAGpC,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,eAAe,CAAC;IAGjD,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACvD,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACxE,cAAc,CAAC,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAGlD,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7C"}
@@ -0,0 +1,4 @@
1
+ // Copyright (c) 2025-present Mstro, Inc. All rights reserved.
2
+ // Licensed under the MIT License. See LICENSE file for details.
3
+ export {};
4
+ //# sourceMappingURL=handler-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler-context.js","sourceRoot":"","sources":["../../../../server/services/websocket/handler-context.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,gEAAgE"}