mstro-app 0.3.8 → 0.4.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 (109) hide show
  1. package/LICENSE +191 -21
  2. package/PRIVACY.md +286 -62
  3. package/README.md +81 -58
  4. package/bin/commands/status.js +1 -1
  5. package/dist/server/cli/headless/claude-invoker.d.ts.map +1 -1
  6. package/dist/server/cli/headless/claude-invoker.js +22 -12
  7. package/dist/server/cli/headless/claude-invoker.js.map +1 -1
  8. package/dist/server/cli/headless/headless-logger.d.ts +10 -0
  9. package/dist/server/cli/headless/headless-logger.d.ts.map +1 -0
  10. package/dist/server/cli/headless/headless-logger.js +66 -0
  11. package/dist/server/cli/headless/headless-logger.js.map +1 -0
  12. package/dist/server/cli/headless/mcp-config.d.ts.map +1 -1
  13. package/dist/server/cli/headless/mcp-config.js +6 -5
  14. package/dist/server/cli/headless/mcp-config.js.map +1 -1
  15. package/dist/server/cli/headless/runner.d.ts.map +1 -1
  16. package/dist/server/cli/headless/runner.js +4 -0
  17. package/dist/server/cli/headless/runner.js.map +1 -1
  18. package/dist/server/cli/headless/stall-assessor.d.ts +21 -0
  19. package/dist/server/cli/headless/stall-assessor.d.ts.map +1 -1
  20. package/dist/server/cli/headless/stall-assessor.js +100 -24
  21. package/dist/server/cli/headless/stall-assessor.js.map +1 -1
  22. package/dist/server/cli/headless/tool-watchdog.d.ts +0 -12
  23. package/dist/server/cli/headless/tool-watchdog.d.ts.map +1 -1
  24. package/dist/server/cli/headless/tool-watchdog.js +22 -9
  25. package/dist/server/cli/headless/tool-watchdog.js.map +1 -1
  26. package/dist/server/cli/headless/types.d.ts +8 -1
  27. package/dist/server/cli/headless/types.d.ts.map +1 -1
  28. package/dist/server/cli/improvisation-session-manager.d.ts +16 -0
  29. package/dist/server/cli/improvisation-session-manager.d.ts.map +1 -1
  30. package/dist/server/cli/improvisation-session-manager.js +94 -11
  31. package/dist/server/cli/improvisation-session-manager.js.map +1 -1
  32. package/dist/server/mcp/bouncer-cli.d.ts +3 -0
  33. package/dist/server/mcp/bouncer-cli.d.ts.map +1 -0
  34. package/dist/server/mcp/bouncer-cli.js +54 -0
  35. package/dist/server/mcp/bouncer-cli.js.map +1 -0
  36. package/dist/server/services/plan/composer.d.ts +4 -0
  37. package/dist/server/services/plan/composer.d.ts.map +1 -0
  38. package/dist/server/services/plan/composer.js +181 -0
  39. package/dist/server/services/plan/composer.js.map +1 -0
  40. package/dist/server/services/plan/dependency-resolver.d.ts +28 -0
  41. package/dist/server/services/plan/dependency-resolver.d.ts.map +1 -0
  42. package/dist/server/services/plan/dependency-resolver.js +154 -0
  43. package/dist/server/services/plan/dependency-resolver.js.map +1 -0
  44. package/dist/server/services/plan/executor.d.ts +110 -0
  45. package/dist/server/services/plan/executor.d.ts.map +1 -0
  46. package/dist/server/services/plan/executor.js +641 -0
  47. package/dist/server/services/plan/executor.js.map +1 -0
  48. package/dist/server/services/plan/parser.d.ts +11 -0
  49. package/dist/server/services/plan/parser.d.ts.map +1 -0
  50. package/dist/server/services/plan/parser.js +445 -0
  51. package/dist/server/services/plan/parser.js.map +1 -0
  52. package/dist/server/services/plan/state-reconciler.d.ts +2 -0
  53. package/dist/server/services/plan/state-reconciler.d.ts.map +1 -0
  54. package/dist/server/services/plan/state-reconciler.js +145 -0
  55. package/dist/server/services/plan/state-reconciler.js.map +1 -0
  56. package/dist/server/services/plan/types.d.ts +121 -0
  57. package/dist/server/services/plan/types.d.ts.map +1 -0
  58. package/dist/server/services/plan/types.js +4 -0
  59. package/dist/server/services/plan/types.js.map +1 -0
  60. package/dist/server/services/plan/watcher.d.ts +14 -0
  61. package/dist/server/services/plan/watcher.d.ts.map +1 -0
  62. package/dist/server/services/plan/watcher.js +69 -0
  63. package/dist/server/services/plan/watcher.js.map +1 -0
  64. package/dist/server/services/websocket/file-explorer-handlers.js +20 -0
  65. package/dist/server/services/websocket/file-explorer-handlers.js.map +1 -1
  66. package/dist/server/services/websocket/handler.d.ts.map +1 -1
  67. package/dist/server/services/websocket/handler.js +21 -0
  68. package/dist/server/services/websocket/handler.js.map +1 -1
  69. package/dist/server/services/websocket/plan-handlers.d.ts +6 -0
  70. package/dist/server/services/websocket/plan-handlers.d.ts.map +1 -0
  71. package/dist/server/services/websocket/plan-handlers.js +494 -0
  72. package/dist/server/services/websocket/plan-handlers.js.map +1 -0
  73. package/dist/server/services/websocket/quality-handlers.d.ts.map +1 -1
  74. package/dist/server/services/websocket/quality-handlers.js +384 -12
  75. package/dist/server/services/websocket/quality-handlers.js.map +1 -1
  76. package/dist/server/services/websocket/quality-persistence.d.ts +45 -0
  77. package/dist/server/services/websocket/quality-persistence.d.ts.map +1 -0
  78. package/dist/server/services/websocket/quality-persistence.js +187 -0
  79. package/dist/server/services/websocket/quality-persistence.js.map +1 -0
  80. package/dist/server/services/websocket/quality-service.d.ts +12 -2
  81. package/dist/server/services/websocket/quality-service.d.ts.map +1 -1
  82. package/dist/server/services/websocket/quality-service.js +162 -18
  83. package/dist/server/services/websocket/quality-service.js.map +1 -1
  84. package/dist/server/services/websocket/types.d.ts +2 -2
  85. package/dist/server/services/websocket/types.d.ts.map +1 -1
  86. package/package.json +3 -3
  87. package/server/cli/headless/claude-invoker.ts +25 -12
  88. package/server/cli/headless/headless-logger.ts +78 -0
  89. package/server/cli/headless/mcp-config.ts +6 -5
  90. package/server/cli/headless/runner.ts +4 -0
  91. package/server/cli/headless/stall-assessor.ts +131 -24
  92. package/server/cli/headless/tool-watchdog.ts +10 -9
  93. package/server/cli/headless/types.ts +10 -1
  94. package/server/cli/improvisation-session-manager.ts +118 -11
  95. package/server/mcp/bouncer-cli.ts +73 -0
  96. package/server/services/plan/composer.ts +199 -0
  97. package/server/services/plan/dependency-resolver.ts +182 -0
  98. package/server/services/plan/executor.ts +700 -0
  99. package/server/services/plan/parser.ts +491 -0
  100. package/server/services/plan/state-reconciler.ts +174 -0
  101. package/server/services/plan/types.ts +166 -0
  102. package/server/services/plan/watcher.ts +73 -0
  103. package/server/services/websocket/file-explorer-handlers.ts +20 -0
  104. package/server/services/websocket/handler.ts +21 -0
  105. package/server/services/websocket/plan-handlers.ts +592 -0
  106. package/server/services/websocket/quality-handlers.ts +450 -12
  107. package/server/services/websocket/quality-persistence.ts +250 -0
  108. package/server/services/websocket/quality-service.ts +183 -18
  109. package/server/services/websocket/types.ts +48 -2
@@ -0,0 +1,494 @@
1
+ // Copyright (c) 2025-present Mstro, Inc. All rights reserved.
2
+ // Licensed under the MIT License. See LICENSE file for details.
3
+ /**
4
+ * Plan Handlers — WebSocket message handlers for Plan view
5
+ *
6
+ * Routes plan* messages to the PPS parser and file operations.
7
+ * Follows the same pattern as quality-handlers.ts and git-handlers.ts.
8
+ */
9
+ import { existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from 'node:fs';
10
+ import { join, resolve } from 'node:path';
11
+ import { handlePlanPrompt } from '../plan/composer.js';
12
+ import { PlanExecutor } from '../plan/executor.js';
13
+ import { getNextId, parsePlanDirectory, parseSingleIssue, parseSingleMilestone, parseSingleSprint, planDirExists, resolvePmDir } from '../plan/parser.js';
14
+ import { PlanWatcher } from '../plan/watcher.js';
15
+ const watcherCache = new Map();
16
+ const executorCache = new Map();
17
+ // ============================================================================
18
+ // Helpers
19
+ // ============================================================================
20
+ /** Validate that a user-supplied path resolves within the .pm/ (or legacy .plan/) directory. */
21
+ function resolvePlanPath(workingDir, relativePath) {
22
+ const pmDir = resolvePmDir(workingDir);
23
+ if (!pmDir)
24
+ return null;
25
+ const resolved = resolve(pmDir, relativePath);
26
+ if (!resolved.startsWith(`${pmDir}/`) && resolved !== pmDir)
27
+ return null;
28
+ return resolved;
29
+ }
30
+ /** Guard for write operations — returns true if denied. */
31
+ function denyIfViewOnly(ctx, ws, permission) {
32
+ if (permission === 'view') {
33
+ ctx.send(ws, { type: 'planError', data: { error: 'Permission denied' } });
34
+ return true;
35
+ }
36
+ return false;
37
+ }
38
+ function formatYamlValue(value) {
39
+ if (value === null || value === undefined)
40
+ return 'null';
41
+ if (typeof value === 'boolean')
42
+ return String(value);
43
+ if (typeof value === 'number')
44
+ return String(value);
45
+ if (Array.isArray(value)) {
46
+ if (value.length === 0)
47
+ return '[]';
48
+ return `[${value.map(v => typeof v === 'string' ? v : String(v)).join(', ')}]`;
49
+ }
50
+ return `"${String(value).replace(/"/g, '\\"')}"`;
51
+ }
52
+ function buildIssueMarkdown(id, title, type, priority, labels, sprint, description) {
53
+ const labelsYaml = labels.length > 0 ? `[${labels.join(', ')}]` : '[]';
54
+ const today = new Date().toISOString().split('T')[0];
55
+ return `---
56
+ id: ${id}
57
+ title: "${title.replace(/"/g, '\\"')}"
58
+ type: ${type}
59
+ status: backlog
60
+ priority: ${priority}
61
+ estimate: null
62
+ labels: ${labelsYaml}
63
+ epic: null
64
+ sprint: ${sprint || 'null'}
65
+ milestone: null
66
+ assigned: null
67
+ created: "${today}"
68
+ due: null
69
+ blocked_by: []
70
+ blocks: []
71
+ relates_to: []
72
+ ---
73
+
74
+ # ${id}: ${title}
75
+
76
+ ## Description
77
+ ${description}
78
+
79
+ ## Acceptance Criteria
80
+
81
+ ## Technical Notes
82
+
83
+ ## Files to Modify
84
+
85
+ ## Activity
86
+ `;
87
+ }
88
+ function buildProjectMarkdown(name) {
89
+ const today = new Date().toISOString().split('T')[0];
90
+ const projectId = name.toLowerCase().replace(/[^a-z0-9]+/g, '-');
91
+ return `---
92
+ name: "${name}"
93
+ id: ${projectId}
94
+ created: "${today}"
95
+ status: active
96
+ estimation: fibonacci
97
+ id_prefixes:
98
+ epic: EP
99
+ issue: IS
100
+ bug: BG
101
+ labels: []
102
+ ---
103
+
104
+ # ${name}
105
+
106
+ ## Goals
107
+
108
+ ## Teams
109
+
110
+ ## Labels
111
+
112
+ ## Workflows
113
+ | Status | Category | Description |
114
+ |---|---|---|
115
+ | backlog | unstarted | Accepted, not yet scheduled |
116
+ | todo | unstarted | Scheduled for current sprint |
117
+ | in_progress | started | Actively being worked on |
118
+ | in_review | started | PR open, awaiting review |
119
+ | done | completed | Merged and verified |
120
+ | cancelled | cancelled | Will not be done |
121
+ `;
122
+ }
123
+ function buildStateMarkdown(name) {
124
+ return `---
125
+ project: "${name}"
126
+ current_sprint: null
127
+ active_milestone: null
128
+ paused: false
129
+ last_session: null
130
+ ---
131
+
132
+ # Project State
133
+
134
+ ## Current Focus
135
+
136
+ ## Ready to Work
137
+
138
+ ## In Progress
139
+
140
+ ## Blocked
141
+
142
+ ## Recently Completed
143
+
144
+ ## Warnings
145
+ `;
146
+ }
147
+ function getWatcher(workingDir, ctx) {
148
+ let watcher = watcherCache.get(workingDir);
149
+ if (!watcher) {
150
+ watcher = new PlanWatcher(workingDir, ctx);
151
+ watcherCache.set(workingDir, watcher);
152
+ }
153
+ return watcher;
154
+ }
155
+ function getExecutor(workingDir) {
156
+ let executor = executorCache.get(workingDir);
157
+ if (!executor) {
158
+ executor = new PlanExecutor(workingDir);
159
+ executorCache.set(workingDir, executor);
160
+ }
161
+ return executor;
162
+ }
163
+ /** Cleanup watchers and executors for a working directory. */
164
+ export function cleanupPlanResources(workingDir) {
165
+ const watcher = watcherCache.get(workingDir);
166
+ if (watcher) {
167
+ watcher.stop();
168
+ watcherCache.delete(workingDir);
169
+ }
170
+ const executor = executorCache.get(workingDir);
171
+ if (executor) {
172
+ executor.stop();
173
+ executorCache.delete(workingDir);
174
+ }
175
+ }
176
+ // ============================================================================
177
+ // Main dispatcher
178
+ // ============================================================================
179
+ export function handlePlanMessage(ctx, ws, msg, _tabId, workingDir, permission) {
180
+ const handlers = {
181
+ planInit: () => handlePlanInit(ctx, ws, workingDir),
182
+ planGetState: () => handlePlanInit(ctx, ws, workingDir),
183
+ planListIssues: () => handleListIssues(ctx, ws, workingDir),
184
+ planGetIssue: () => handleGetIssue(ctx, ws, msg, workingDir),
185
+ planGetSprint: () => handleGetSprint(ctx, ws, msg, workingDir),
186
+ planGetMilestone: () => handleGetMilestone(ctx, ws, msg, workingDir),
187
+ planCreateIssue: () => handleCreateIssue(ctx, ws, msg, workingDir, permission),
188
+ planUpdateIssue: () => handleUpdateIssue(ctx, ws, msg, workingDir, permission),
189
+ planDeleteIssue: () => handleDeleteIssue(ctx, ws, msg, workingDir, permission),
190
+ planScaffold: () => handleScaffold(ctx, ws, msg, workingDir, permission),
191
+ planPrompt: () => handlePrompt(ctx, ws, msg, workingDir, permission),
192
+ planExecute: () => handleExecute(ctx, ws, workingDir, permission),
193
+ planExecuteEpic: () => handleExecuteEpic(ctx, ws, msg, workingDir, permission),
194
+ planPause: () => handlePause(ctx, ws, workingDir, permission),
195
+ planStop: () => handleStop(ctx, ws, workingDir, permission),
196
+ planResume: () => handleResume(ctx, ws, workingDir, permission),
197
+ };
198
+ const handler = handlers[msg.type];
199
+ if (!handler)
200
+ return;
201
+ try {
202
+ handler();
203
+ }
204
+ catch (error) {
205
+ const errMsg = error instanceof Error ? error.message : String(error);
206
+ ctx.send(ws, { type: 'planError', data: { error: errMsg } });
207
+ }
208
+ }
209
+ // ============================================================================
210
+ // Read-only handlers
211
+ // ============================================================================
212
+ function handlePlanInit(ctx, ws, workingDir) {
213
+ if (!planDirExists(workingDir)) {
214
+ ctx.send(ws, { type: 'planNotFound', data: {} });
215
+ return;
216
+ }
217
+ const fullState = parsePlanDirectory(workingDir);
218
+ if (!fullState) {
219
+ ctx.send(ws, { type: 'planNotFound', data: {} });
220
+ return;
221
+ }
222
+ ctx.send(ws, { type: 'planState', data: fullState });
223
+ const watcher = getWatcher(workingDir, ctx);
224
+ watcher.start();
225
+ }
226
+ function handleListIssues(ctx, ws, workingDir) {
227
+ const fullState = parsePlanDirectory(workingDir);
228
+ if (!fullState) {
229
+ ctx.send(ws, { type: 'planNotFound', data: {} });
230
+ return;
231
+ }
232
+ ctx.send(ws, { type: 'planIssueList', data: { issues: fullState.issues } });
233
+ }
234
+ function handleGetIssue(ctx, ws, msg, workingDir) {
235
+ const path = msg.data?.path;
236
+ if (!path || !resolvePlanPath(workingDir, path)) {
237
+ ctx.send(ws, { type: 'planError', data: { error: 'Invalid issue path' } });
238
+ return;
239
+ }
240
+ const issue = parseSingleIssue(workingDir, path);
241
+ if (!issue) {
242
+ ctx.send(ws, { type: 'planError', data: { error: `Issue not found: ${path}` } });
243
+ return;
244
+ }
245
+ ctx.send(ws, { type: 'planIssue', data: issue });
246
+ }
247
+ function handleGetSprint(ctx, ws, msg, workingDir) {
248
+ const path = msg.data?.path;
249
+ if (!path || !resolvePlanPath(workingDir, path)) {
250
+ ctx.send(ws, { type: 'planError', data: { error: 'Invalid sprint path' } });
251
+ return;
252
+ }
253
+ const sprint = parseSingleSprint(workingDir, path);
254
+ if (!sprint) {
255
+ ctx.send(ws, { type: 'planError', data: { error: `Sprint not found: ${path}` } });
256
+ return;
257
+ }
258
+ ctx.send(ws, { type: 'planSprint', data: sprint });
259
+ }
260
+ function handleGetMilestone(ctx, ws, msg, workingDir) {
261
+ const path = msg.data?.path;
262
+ if (!path || !resolvePlanPath(workingDir, path)) {
263
+ ctx.send(ws, { type: 'planError', data: { error: 'Invalid milestone path' } });
264
+ return;
265
+ }
266
+ const milestone = parseSingleMilestone(workingDir, path);
267
+ if (!milestone) {
268
+ ctx.send(ws, { type: 'planError', data: { error: `Milestone not found: ${path}` } });
269
+ return;
270
+ }
271
+ ctx.send(ws, { type: 'planMilestone', data: milestone });
272
+ }
273
+ // ============================================================================
274
+ // Mutation handlers
275
+ // ============================================================================
276
+ function handleCreateIssue(ctx, ws, msg, workingDir, permission) {
277
+ if (denyIfViewOnly(ctx, ws, permission))
278
+ return;
279
+ const { title, type = 'issue', priority = 'P2', labels = [], sprint, description = '' } = msg.data || {};
280
+ if (!title) {
281
+ ctx.send(ws, { type: 'planError', data: { error: 'Title required' } });
282
+ return;
283
+ }
284
+ const pmDir = resolvePmDir(workingDir) ?? join(workingDir, '.pm');
285
+ const backlogDir = join(pmDir, 'backlog');
286
+ if (!existsSync(backlogDir)) {
287
+ mkdirSync(backlogDir, { recursive: true });
288
+ }
289
+ const fullState = parsePlanDirectory(workingDir);
290
+ const prefix = type === 'bug' ? 'BG' : type === 'epic' ? 'EP' : 'IS';
291
+ const id = fullState ? getNextId(fullState.issues, prefix) : `${prefix}-001`;
292
+ const content = buildIssueMarkdown(id, title, type, priority, labels, sprint, description);
293
+ const fileName = `${id}.md`;
294
+ writeFileSync(join(backlogDir, fileName), content, 'utf-8');
295
+ const issue = parseSingleIssue(workingDir, `backlog/${fileName}`);
296
+ ctx.broadcastToAll({ type: 'planIssueCreated', data: issue });
297
+ }
298
+ function handleUpdateIssue(ctx, ws, msg, workingDir, permission) {
299
+ if (denyIfViewOnly(ctx, ws, permission))
300
+ return;
301
+ const { path, fields } = msg.data || {};
302
+ if (!path || !fields) {
303
+ ctx.send(ws, { type: 'planError', data: { error: 'Path and fields required' } });
304
+ return;
305
+ }
306
+ const fullPath = resolvePlanPath(workingDir, path);
307
+ if (!fullPath || !existsSync(fullPath)) {
308
+ ctx.send(ws, { type: 'planError', data: { error: `File not found: ${path}` } });
309
+ return;
310
+ }
311
+ const content = readFileSync(fullPath, 'utf-8');
312
+ const match = content.match(/^---\n([\s\S]*?)\n---\n?([\s\S]*)$/);
313
+ if (!match) {
314
+ ctx.send(ws, { type: 'planError', data: { error: 'Invalid file format' } });
315
+ return;
316
+ }
317
+ let yamlStr = match[1];
318
+ const body = match[2];
319
+ for (const [key, value] of Object.entries(fields)) {
320
+ const yamlKey = key.replace(/([A-Z])/g, '_$1').toLowerCase();
321
+ const yamlValue = formatYamlValue(value);
322
+ const regex = new RegExp(`^${yamlKey}:.*$`, 'm');
323
+ if (regex.test(yamlStr)) {
324
+ yamlStr = yamlStr.replace(regex, `${yamlKey}: ${yamlValue}`);
325
+ }
326
+ else {
327
+ yamlStr += `\n${yamlKey}: ${yamlValue}`;
328
+ }
329
+ }
330
+ writeFileSync(fullPath, `---\n${yamlStr}\n---\n${body}`, 'utf-8');
331
+ const issue = parseSingleIssue(workingDir, path);
332
+ ctx.broadcastToAll({ type: 'planIssueUpdated', data: issue });
333
+ }
334
+ function handleDeleteIssue(ctx, ws, msg, workingDir, permission) {
335
+ if (denyIfViewOnly(ctx, ws, permission))
336
+ return;
337
+ const path = msg.data?.path;
338
+ if (!path) {
339
+ ctx.send(ws, { type: 'planError', data: { error: 'Path required' } });
340
+ return;
341
+ }
342
+ const fullPath = resolvePlanPath(workingDir, path);
343
+ if (!fullPath || !existsSync(fullPath)) {
344
+ ctx.send(ws, { type: 'planError', data: { error: `File not found: ${path}` } });
345
+ return;
346
+ }
347
+ unlinkSync(fullPath);
348
+ ctx.broadcastToAll({ type: 'planIssueDeleted', data: { path } });
349
+ }
350
+ function handleScaffold(ctx, ws, msg, workingDir, permission) {
351
+ if (denyIfViewOnly(ctx, ws, permission))
352
+ return;
353
+ const name = msg.data?.name || 'My Project';
354
+ const planDir = join(workingDir, '.pm');
355
+ for (const dir of ['backlog', 'sprints', 'milestones', 'docs', 'docs/decisions']) {
356
+ mkdirSync(join(planDir, dir), { recursive: true });
357
+ }
358
+ writeFileSync(join(planDir, 'project.md'), buildProjectMarkdown(name), 'utf-8');
359
+ writeFileSync(join(planDir, 'STATE.md'), buildStateMarkdown(name), 'utf-8');
360
+ writeFileSync(join(planDir, 'progress.md'), '# Progress Log\n', 'utf-8');
361
+ const fullState = parsePlanDirectory(workingDir);
362
+ ctx.broadcastToAll({ type: 'planScaffolded', data: fullState });
363
+ }
364
+ // ============================================================================
365
+ // Composer + Execution handlers
366
+ // ============================================================================
367
+ function handlePrompt(ctx, ws, msg, workingDir, permission) {
368
+ if (denyIfViewOnly(ctx, ws, permission))
369
+ return;
370
+ const prompt = msg.data?.prompt;
371
+ if (!prompt) {
372
+ ctx.send(ws, { type: 'planError', data: { error: 'Prompt required' } });
373
+ return;
374
+ }
375
+ handlePlanPrompt(ctx, ws, prompt, workingDir).catch(error => {
376
+ ctx.send(ws, {
377
+ type: 'planError',
378
+ data: { error: error instanceof Error ? error.message : String(error) },
379
+ });
380
+ });
381
+ }
382
+ function wireExecutorEvents(executor, ctx, workingDir) {
383
+ executor.removeAllListeners();
384
+ executor.on('statusChanged', (status) => {
385
+ ctx.broadcastToAll({ type: 'planExecutionProgress', data: { status } });
386
+ });
387
+ executor.on('issueStarted', (issue) => {
388
+ ctx.broadcastToAll({
389
+ type: 'planExecutionProgress',
390
+ data: { issueId: issue.id, status: 'executing', title: issue.title },
391
+ });
392
+ });
393
+ executor.on('output', (data) => {
394
+ ctx.broadcastToAll({ type: 'planExecutionOutput', data });
395
+ });
396
+ executor.on('issueCompleted', () => {
397
+ ctx.broadcastToAll({ type: 'planExecutionMetrics', data: executor.getMetrics() });
398
+ const fullState = parsePlanDirectory(workingDir);
399
+ if (fullState) {
400
+ ctx.broadcastToAll({ type: 'planStateUpdated', data: fullState });
401
+ }
402
+ });
403
+ executor.on('issueError', (data) => {
404
+ ctx.broadcastToAll({ type: 'planExecutionError', data });
405
+ });
406
+ executor.on('waveStarted', (data) => {
407
+ ctx.broadcastToAll({
408
+ type: 'planExecutionProgress',
409
+ data: { status: 'wave', issueIds: data.issueIds },
410
+ });
411
+ });
412
+ executor.on('waveError', (data) => {
413
+ ctx.broadcastToAll({ type: 'planExecutionError', data });
414
+ });
415
+ executor.on('stateUpdated', () => {
416
+ const fullState = parsePlanDirectory(workingDir);
417
+ if (fullState) {
418
+ ctx.broadcastToAll({ type: 'planStateUpdated', data: fullState });
419
+ }
420
+ });
421
+ executor.on('complete', (reason) => {
422
+ ctx.broadcastToAll({ type: 'planExecutionComplete', data: { reason, metrics: executor.getMetrics() } });
423
+ });
424
+ executor.on('error', (error) => {
425
+ ctx.broadcastToAll({ type: 'planExecutionError', data: { error } });
426
+ });
427
+ }
428
+ function handleExecute(ctx, ws, workingDir, permission) {
429
+ if (denyIfViewOnly(ctx, ws, permission))
430
+ return;
431
+ const executor = getExecutor(workingDir);
432
+ if (executor.getStatus() === 'executing' || executor.getStatus() === 'starting') {
433
+ ctx.send(ws, { type: 'planError', data: { error: 'Execution already in progress' } });
434
+ return;
435
+ }
436
+ wireExecutorEvents(executor, ctx, workingDir);
437
+ ctx.send(ws, { type: 'planExecutionStarted', data: { status: 'executing' } });
438
+ executor.start().catch(error => {
439
+ ctx.send(ws, {
440
+ type: 'planExecutionError',
441
+ data: { error: error instanceof Error ? error.message : String(error) },
442
+ });
443
+ });
444
+ }
445
+ function handleExecuteEpic(ctx, ws, msg, workingDir, permission) {
446
+ if (denyIfViewOnly(ctx, ws, permission))
447
+ return;
448
+ const epicPath = msg.data?.epicPath;
449
+ if (!epicPath) {
450
+ ctx.send(ws, { type: 'planError', data: { error: 'Epic path required' } });
451
+ return;
452
+ }
453
+ const executor = getExecutor(workingDir);
454
+ if (executor.getStatus() === 'executing' || executor.getStatus() === 'starting') {
455
+ ctx.send(ws, { type: 'planError', data: { error: 'Execution already in progress' } });
456
+ return;
457
+ }
458
+ wireExecutorEvents(executor, ctx, workingDir);
459
+ ctx.send(ws, { type: 'planExecutionStarted', data: { status: 'executing', epicPath } });
460
+ executor.startEpic(epicPath).catch(error => {
461
+ ctx.send(ws, {
462
+ type: 'planExecutionError',
463
+ data: { error: error instanceof Error ? error.message : String(error) },
464
+ });
465
+ });
466
+ }
467
+ function handlePause(ctx, ws, workingDir, permission) {
468
+ if (denyIfViewOnly(ctx, ws, permission))
469
+ return;
470
+ const executor = executorCache.get(workingDir);
471
+ if (executor)
472
+ executor.pause();
473
+ }
474
+ function handleStop(ctx, ws, workingDir, permission) {
475
+ if (denyIfViewOnly(ctx, ws, permission))
476
+ return;
477
+ const executor = executorCache.get(workingDir);
478
+ if (executor)
479
+ executor.stop();
480
+ }
481
+ function handleResume(ctx, ws, workingDir, permission) {
482
+ if (denyIfViewOnly(ctx, ws, permission))
483
+ return;
484
+ const executor = executorCache.get(workingDir);
485
+ if (executor) {
486
+ executor.resume().catch(error => {
487
+ ctx.send(ws, {
488
+ type: 'planExecutionError',
489
+ data: { error: error instanceof Error ? error.message : String(error) },
490
+ });
491
+ });
492
+ }
493
+ }
494
+ //# sourceMappingURL=plan-handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-handlers.js","sourceRoot":"","sources":["../../../../server/services/websocket/plan-handlers.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"quality-handlers.d.ts","sourceRoot":"","sources":["../../../../server/services/websocket/quality-handlers.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,OAAO,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE9D,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,cAAc,EACnB,EAAE,EAAE,SAAS,EACb,GAAG,EAAE,gBAAgB,EACrB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,GACjB,IAAI,CAoBN"}
1
+ {"version":3,"file":"quality-handlers.d.ts","sourceRoot":"","sources":["../../../../server/services/websocket/quality-handlers.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAG3D,OAAO,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAyC9D,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,cAAc,EACnB,EAAE,EAAE,SAAS,EACb,GAAG,EAAE,gBAAgB,EACrB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,GACjB,IAAI,CAuBN"}