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,507 @@
1
+ // Copyright (c) 2025-present Mstro, Inc. All rights reserved.
2
+ // Licensed under the MIT License. See LICENSE file for details.
3
+ import { existsSync, readdirSync, readFileSync, unlinkSync } from 'node:fs';
4
+ import { join } from 'node:path';
5
+ import { ImprovisationSessionManager } from '../../cli/improvisation-session-manager.js';
6
+ import { getModel } from '../settings.js';
7
+ /** Convert tool history entries into OutputLine-compatible lines */
8
+ function convertToolHistoryToLines(tools, ts) {
9
+ const lines = [];
10
+ for (const tool of tools) {
11
+ lines.push({ type: 'tool-call', text: '', toolName: tool.toolName, toolInput: tool.toolInput || {}, timestamp: ts });
12
+ if (tool.result !== undefined) {
13
+ lines.push({ type: 'tool-result', text: '', toolResult: tool.result || 'No output', toolStatus: tool.isError ? 'error' : 'success', timestamp: ts });
14
+ }
15
+ }
16
+ return lines;
17
+ }
18
+ /** Convert a single movement record into OutputLine-compatible entries */
19
+ function convertMovementToLines(movement) {
20
+ const lines = [];
21
+ const ts = new Date(movement.timestamp).getTime();
22
+ lines.push({ type: 'user', text: movement.userPrompt, timestamp: ts });
23
+ if (movement.thinkingOutput) {
24
+ lines.push({ type: 'thinking', text: '', thinking: movement.thinkingOutput, timestamp: ts });
25
+ }
26
+ if (movement.toolUseHistory) {
27
+ lines.push(...convertToolHistoryToLines(movement.toolUseHistory, ts));
28
+ }
29
+ if (movement.assistantResponse) {
30
+ lines.push({ type: 'assistant', text: movement.assistantResponse, timestamp: ts });
31
+ }
32
+ if (movement.errorOutput) {
33
+ lines.push({ type: 'error', text: `Error: ${movement.errorOutput}`, timestamp: ts });
34
+ }
35
+ const durationText = movement.durationMs
36
+ ? `Completed in ${(movement.durationMs / 1000).toFixed(2)}s`
37
+ : 'Completed';
38
+ lines.push({ type: 'system', text: durationText, timestamp: ts });
39
+ return lines;
40
+ }
41
+ function requireSession(ctx, ws, tabId) {
42
+ const session = getSession(ctx, ws, tabId);
43
+ if (!session)
44
+ throw new Error(`No session found for tab ${tabId}`);
45
+ return session;
46
+ }
47
+ function getSession(ctx, ws, tabId) {
48
+ const tabMap = ctx.connections.get(ws);
49
+ if (!tabMap)
50
+ return null;
51
+ const sessionId = tabMap.get(tabId);
52
+ if (!sessionId)
53
+ return null;
54
+ return ctx.sessions.get(sessionId) || null;
55
+ }
56
+ export function buildOutputHistory(session) {
57
+ const history = session.getHistory();
58
+ return history.movements.flatMap(convertMovementToLines);
59
+ }
60
+ export function setupSessionListeners(ctx, session, ws, tabId) {
61
+ session.removeAllListeners();
62
+ session.on('onOutput', (text) => {
63
+ ctx.send(ws, { type: 'output', tabId, data: { text, timestamp: Date.now() } });
64
+ });
65
+ session.on('onThinking', (text) => {
66
+ ctx.send(ws, { type: 'thinking', tabId, data: { text } });
67
+ });
68
+ session.on('onMovementStart', (sequenceNumber, prompt) => {
69
+ ctx.send(ws, { type: 'movementStart', tabId, data: { sequenceNumber, prompt, timestamp: Date.now(), executionStartTimestamp: session.executionStartTimestamp } });
70
+ ctx.broadcastToAll({ type: 'tabStateChanged', data: { tabId, isExecuting: true, executionStartTimestamp: session.executionStartTimestamp } });
71
+ });
72
+ session.on('onMovementComplete', (movement) => {
73
+ ctx.send(ws, { type: 'movementComplete', tabId, data: movement });
74
+ const registry = ctx.getRegistry('');
75
+ // Use a try/catch since getRegistry may not have been initialized with the right workingDir
76
+ try {
77
+ registry.markTabUnviewed(tabId);
78
+ }
79
+ catch { /* ignore */ }
80
+ ctx.broadcastToAll({ type: 'tabStateChanged', data: { tabId, isExecuting: false, hasUnviewedCompletion: true } });
81
+ if (ctx.usageReporter && movement.tokensUsed) {
82
+ ctx.usageReporter({
83
+ tokensUsed: movement.tokensUsed,
84
+ sessionId: session.getSessionInfo().sessionId,
85
+ movementId: `${movement.sequenceNumber}`
86
+ });
87
+ }
88
+ });
89
+ session.on('onMovementError', (error) => {
90
+ ctx.send(ws, { type: 'movementError', tabId, data: { message: error.message } });
91
+ ctx.broadcastToAll({ type: 'tabStateChanged', data: { tabId, isExecuting: false } });
92
+ });
93
+ session.on('onSessionUpdate', (history) => {
94
+ ctx.send(ws, { type: 'sessionUpdate', tabId, data: history });
95
+ });
96
+ session.on('onPlanNeedsConfirmation', (plan) => {
97
+ ctx.send(ws, { type: 'approvalRequired', tabId, data: plan });
98
+ });
99
+ session.on('onToolUse', (event) => {
100
+ ctx.send(ws, { type: 'toolUse', tabId, data: { ...event, timestamp: Date.now() } });
101
+ });
102
+ session.on('onTokenUsage', (usage) => {
103
+ ctx.send(ws, { type: 'streamingTokens', tabId, data: usage });
104
+ });
105
+ }
106
+ export function handleSessionMessage(ctx, ws, msg, tabId, permission) {
107
+ switch (msg.type) {
108
+ case 'execute': {
109
+ if (!msg.data?.prompt)
110
+ throw new Error('Prompt is required');
111
+ const session = requireSession(ctx, ws, tabId);
112
+ const sandboxed = permission === 'control' || permission === 'view';
113
+ const worktreeDir = ctx.gitDirectories.get(tabId);
114
+ session.executePrompt(msg.data.prompt, msg.data.attachments, { sandboxed, workingDir: worktreeDir });
115
+ break;
116
+ }
117
+ case 'cancel': {
118
+ const session = requireSession(ctx, ws, tabId);
119
+ session.cancel();
120
+ break;
121
+ }
122
+ case 'getHistory': {
123
+ const session = requireSession(ctx, ws, tabId);
124
+ ctx.send(ws, { type: 'history', tabId, data: session.getHistory() });
125
+ break;
126
+ }
127
+ case 'new': {
128
+ const oldSession = requireSession(ctx, ws, tabId);
129
+ const newSession = oldSession.startNewSession({ model: getModel() });
130
+ setupSessionListeners(ctx, newSession, ws, tabId);
131
+ const newSessionId = newSession.getSessionInfo().sessionId;
132
+ ctx.sessions.set(newSessionId, newSession);
133
+ const tabMap = ctx.connections.get(ws);
134
+ if (tabMap)
135
+ tabMap.set(tabId, newSessionId);
136
+ const registry = ctx.getRegistry('');
137
+ try {
138
+ registry.updateTabSession(tabId, newSessionId);
139
+ }
140
+ catch { /* ignore */ }
141
+ ctx.send(ws, { type: 'newSession', tabId, data: newSession.getSessionInfo() });
142
+ break;
143
+ }
144
+ case 'approve': {
145
+ const session = requireSession(ctx, ws, tabId);
146
+ session.respondToApproval?.(true);
147
+ ctx.send(ws, { type: 'output', tabId, data: { text: '\n✅ Approved - proceeding with operation\n' } });
148
+ break;
149
+ }
150
+ case 'reject': {
151
+ const session = requireSession(ctx, ws, tabId);
152
+ session.respondToApproval?.(false);
153
+ ctx.send(ws, { type: 'output', tabId, data: { text: '\n🚫 Rejected - operation cancelled\n' } });
154
+ break;
155
+ }
156
+ }
157
+ }
158
+ export function handleHistoryMessage(ctx, ws, msg, tabId, workingDir) {
159
+ switch (msg.type) {
160
+ case 'getSessions': {
161
+ const result = getSessionsList(workingDir, msg.data?.limit ?? 20, msg.data?.offset ?? 0);
162
+ ctx.send(ws, { type: 'sessions', tabId, data: result });
163
+ break;
164
+ }
165
+ case 'getSessionsCount':
166
+ ctx.send(ws, { type: 'sessionsCount', tabId, data: { total: getSessionsCount(workingDir) } });
167
+ break;
168
+ case 'getSessionById':
169
+ if (!msg.data?.sessionId)
170
+ throw new Error('Session ID is required');
171
+ ctx.send(ws, { type: 'sessionData', tabId, data: getSessionById(workingDir, msg.data.sessionId) });
172
+ break;
173
+ case 'deleteSession':
174
+ if (!msg.data?.sessionId)
175
+ throw new Error('Session ID is required');
176
+ ctx.send(ws, { type: 'sessionDeleted', tabId, data: deleteSession(workingDir, msg.data.sessionId) });
177
+ break;
178
+ case 'clearHistory':
179
+ ctx.send(ws, { type: 'historyCleared', tabId, data: clearAllSessions(workingDir) });
180
+ break;
181
+ case 'searchHistory': {
182
+ if (!msg.data?.query)
183
+ throw new Error('Search query is required');
184
+ const result = searchSessions(workingDir, msg.data.query, msg.data?.limit ?? 20, msg.data?.offset ?? 0);
185
+ ctx.send(ws, { type: 'searchResults', tabId, data: { ...result, query: msg.data.query } });
186
+ break;
187
+ }
188
+ }
189
+ }
190
+ export async function initializeTab(ctx, ws, tabId, workingDir, tabName) {
191
+ const tabMap = ctx.connections.get(ws);
192
+ const registry = ctx.getRegistry(workingDir);
193
+ // 1. Check per-connection map (same WS reconnect)
194
+ const existingSessionId = tabMap?.get(tabId);
195
+ if (existingSessionId) {
196
+ const existingSession = ctx.sessions.get(existingSessionId);
197
+ if (existingSession) {
198
+ reattachSession(ctx, existingSession, ws, tabId, registry);
199
+ return;
200
+ }
201
+ }
202
+ // 2. Check session registry (cross-connection reattach)
203
+ const registrySessionId = registry.getTabSession(tabId);
204
+ if (registrySessionId) {
205
+ const inMemorySession = ctx.sessions.get(registrySessionId);
206
+ if (inMemorySession) {
207
+ reattachSession(ctx, inMemorySession, ws, tabId, registry);
208
+ return;
209
+ }
210
+ try {
211
+ const diskSession = ImprovisationSessionManager.resumeFromHistory(workingDir, registrySessionId);
212
+ setupSessionListeners(ctx, diskSession, ws, tabId);
213
+ const diskSessionId = diskSession.getSessionInfo().sessionId;
214
+ ctx.sessions.set(diskSessionId, diskSession);
215
+ if (tabMap)
216
+ tabMap.set(tabId, diskSessionId);
217
+ registry.touchTab(tabId);
218
+ ctx.send(ws, {
219
+ type: 'tabInitialized',
220
+ tabId,
221
+ data: {
222
+ ...diskSession.getSessionInfo(),
223
+ outputHistory: buildOutputHistory(diskSession),
224
+ }
225
+ });
226
+ return;
227
+ }
228
+ catch {
229
+ // Disk session not found — fall through to create new
230
+ }
231
+ }
232
+ // 3. Create new session
233
+ const session = new ImprovisationSessionManager({ workingDir, model: getModel() });
234
+ setupSessionListeners(ctx, session, ws, tabId);
235
+ const sessionId = session.getSessionInfo().sessionId;
236
+ ctx.sessions.set(sessionId, session);
237
+ if (tabMap) {
238
+ tabMap.set(tabId, sessionId);
239
+ }
240
+ registry.registerTab(tabId, sessionId, tabName);
241
+ const registeredTab = registry.getTab(tabId);
242
+ ctx.broadcastToAll({
243
+ type: 'tabCreated',
244
+ data: { tabId, tabName: registeredTab?.tabName || 'Chat', createdAt: registeredTab?.createdAt, order: registeredTab?.order, sessionInfo: session.getSessionInfo() }
245
+ });
246
+ ctx.send(ws, {
247
+ type: 'tabInitialized',
248
+ tabId,
249
+ data: session.getSessionInfo()
250
+ });
251
+ }
252
+ export async function resumeHistoricalSession(ctx, ws, tabId, workingDir, historicalSessionId) {
253
+ const tabMap = ctx.connections.get(ws);
254
+ const registry = ctx.getRegistry(workingDir);
255
+ const existingSessionId = tabMap?.get(tabId);
256
+ if (existingSessionId) {
257
+ const existingSession = ctx.sessions.get(existingSessionId);
258
+ if (existingSession) {
259
+ reattachSession(ctx, existingSession, ws, tabId, registry);
260
+ return;
261
+ }
262
+ }
263
+ const registrySessionId = registry.getTabSession(tabId);
264
+ if (registrySessionId) {
265
+ const inMemorySession = ctx.sessions.get(registrySessionId);
266
+ if (inMemorySession) {
267
+ reattachSession(ctx, inMemorySession, ws, tabId, registry);
268
+ return;
269
+ }
270
+ }
271
+ let session;
272
+ let isNewSession = false;
273
+ try {
274
+ session = ImprovisationSessionManager.resumeFromHistory(workingDir, historicalSessionId, { model: getModel() });
275
+ }
276
+ catch (error) {
277
+ console.warn(`[WebSocketImproviseHandler] Could not resume session ${historicalSessionId}: ${error.message}. Creating new session.`);
278
+ session = new ImprovisationSessionManager({ workingDir, model: getModel() });
279
+ isNewSession = true;
280
+ }
281
+ setupSessionListeners(ctx, session, ws, tabId);
282
+ const sessionId = session.getSessionInfo().sessionId;
283
+ ctx.sessions.set(sessionId, session);
284
+ if (tabMap) {
285
+ tabMap.set(tabId, sessionId);
286
+ }
287
+ registry.registerTab(tabId, sessionId);
288
+ ctx.send(ws, {
289
+ type: 'tabInitialized',
290
+ tabId,
291
+ data: {
292
+ ...session.getSessionInfo(),
293
+ outputHistory: buildOutputHistory(session),
294
+ resumeFailed: isNewSession,
295
+ originalSessionId: isNewSession ? historicalSessionId : undefined
296
+ }
297
+ });
298
+ }
299
+ function reattachSession(ctx, session, ws, tabId, registry) {
300
+ setupSessionListeners(ctx, session, ws, tabId);
301
+ const tabMap = ctx.connections.get(ws);
302
+ const sessionId = session.getSessionInfo().sessionId;
303
+ if (tabMap)
304
+ tabMap.set(tabId, sessionId);
305
+ registry.touchTab(tabId);
306
+ const outputHistory = buildOutputHistory(session);
307
+ const executionEvents = session.isExecuting
308
+ ? session.getExecutionEventLog()
309
+ : undefined;
310
+ ctx.send(ws, {
311
+ type: 'tabInitialized',
312
+ tabId,
313
+ data: {
314
+ ...session.getSessionInfo(),
315
+ outputHistory,
316
+ isExecuting: session.isExecuting,
317
+ executionEvents,
318
+ ...(session.isExecuting && session.executionStartTimestamp ? { executionStartTimestamp: session.executionStartTimestamp } : {}),
319
+ }
320
+ });
321
+ }
322
+ // ============================================
323
+ // History persistence functions
324
+ // ============================================
325
+ function getSessionsCount(workingDir) {
326
+ const sessionsDir = join(workingDir, '.mstro', 'history');
327
+ if (!existsSync(sessionsDir))
328
+ return 0;
329
+ return readdirSync(sessionsDir).filter((name) => name.endsWith('.json')).length;
330
+ }
331
+ function getSessionsList(workingDir, limit = 20, offset = 0) {
332
+ const sessionsDir = join(workingDir, '.mstro', 'history');
333
+ if (!existsSync(sessionsDir)) {
334
+ return { sessions: [], total: 0, hasMore: false };
335
+ }
336
+ const historyFiles = readdirSync(sessionsDir)
337
+ .filter((name) => name.endsWith('.json'))
338
+ .sort((a, b) => {
339
+ const timestampA = parseInt(a.replace('.json', ''), 10);
340
+ const timestampB = parseInt(b.replace('.json', ''), 10);
341
+ return timestampB - timestampA;
342
+ });
343
+ const total = historyFiles.length;
344
+ const pageFiles = historyFiles.slice(offset, offset + limit);
345
+ const sessions = pageFiles.map((filename) => {
346
+ const historyPath = join(sessionsDir, filename);
347
+ try {
348
+ const historyData = JSON.parse(readFileSync(historyPath, 'utf-8'));
349
+ const firstPrompt = historyData.movements?.[0]?.userPrompt || '';
350
+ const movementPreviews = (historyData.movements || []).slice(0, 3).map((m) => ({
351
+ userPrompt: m.userPrompt?.slice(0, 100) || ''
352
+ }));
353
+ return {
354
+ sessionId: historyData.sessionId,
355
+ startedAt: historyData.startedAt,
356
+ lastActivityAt: historyData.lastActivityAt,
357
+ totalTokens: historyData.totalTokens,
358
+ movementCount: historyData.movements?.length || 0,
359
+ title: firstPrompt.slice(0, 80) + (firstPrompt.length > 80 ? '...' : ''),
360
+ movements: movementPreviews
361
+ };
362
+ }
363
+ catch {
364
+ return null;
365
+ }
366
+ }).filter(Boolean);
367
+ return { sessions, total, hasMore: offset + limit < total };
368
+ }
369
+ function getSessionById(workingDir, sessionId) {
370
+ const sessionsDir = join(workingDir, '.mstro', 'history');
371
+ if (!existsSync(sessionsDir))
372
+ return null;
373
+ const historyFiles = readdirSync(sessionsDir).filter((name) => name.endsWith('.json'));
374
+ for (const filename of historyFiles) {
375
+ const historyPath = join(sessionsDir, filename);
376
+ try {
377
+ const historyData = JSON.parse(readFileSync(historyPath, 'utf-8'));
378
+ if (historyData.sessionId === sessionId) {
379
+ const firstPrompt = historyData.movements?.[0]?.userPrompt || '';
380
+ return {
381
+ sessionId: historyData.sessionId,
382
+ startedAt: historyData.startedAt,
383
+ lastActivityAt: historyData.lastActivityAt,
384
+ totalTokens: historyData.totalTokens,
385
+ movementCount: historyData.movements?.length || 0,
386
+ title: firstPrompt.slice(0, 80) + (firstPrompt.length > 80 ? '...' : ''),
387
+ movements: historyData.movements || [],
388
+ };
389
+ }
390
+ }
391
+ catch {
392
+ // Skip files that can't be parsed
393
+ }
394
+ }
395
+ return null;
396
+ }
397
+ function deleteSession(workingDir, sessionId) {
398
+ const sessionsDir = join(workingDir, '.mstro', 'history');
399
+ if (!existsSync(sessionsDir))
400
+ return { sessionId, success: false };
401
+ try {
402
+ const historyFiles = readdirSync(sessionsDir).filter((name) => name.endsWith('.json'));
403
+ for (const filename of historyFiles) {
404
+ const historyPath = join(sessionsDir, filename);
405
+ try {
406
+ const historyData = JSON.parse(readFileSync(historyPath, 'utf-8'));
407
+ if (historyData.sessionId === sessionId) {
408
+ unlinkSync(historyPath);
409
+ return { sessionId, success: true };
410
+ }
411
+ }
412
+ catch {
413
+ // Skip files that can't be parsed
414
+ }
415
+ }
416
+ return { sessionId, success: false };
417
+ }
418
+ catch (error) {
419
+ console.error('[WebSocketImproviseHandler] Error deleting session:', error);
420
+ return { sessionId, success: false };
421
+ }
422
+ }
423
+ function clearAllSessions(workingDir) {
424
+ const sessionsDir = join(workingDir, '.mstro', 'history');
425
+ if (!existsSync(sessionsDir))
426
+ return { success: true, deletedCount: 0 };
427
+ try {
428
+ const historyFiles = readdirSync(sessionsDir).filter((name) => name.endsWith('.json'));
429
+ let deletedCount = 0;
430
+ for (const filename of historyFiles) {
431
+ const historyPath = join(sessionsDir, filename);
432
+ try {
433
+ unlinkSync(historyPath);
434
+ deletedCount++;
435
+ }
436
+ catch {
437
+ // Skip files that can't be deleted
438
+ }
439
+ }
440
+ return { success: true, deletedCount };
441
+ }
442
+ catch (error) {
443
+ console.error('[WebSocketImproviseHandler] Error clearing sessions:', error);
444
+ return { success: false, deletedCount: 0 };
445
+ }
446
+ }
447
+ function movementMatchesQuery(movements, lowerQuery) {
448
+ if (!movements)
449
+ return false;
450
+ return movements.some((m) => m.userPrompt?.toLowerCase().includes(lowerQuery) ||
451
+ m.summary?.toLowerCase().includes(lowerQuery) ||
452
+ m.assistantResponse?.toLowerCase().includes(lowerQuery));
453
+ }
454
+ function buildSessionSummary(historyData) {
455
+ const firstPrompt = historyData.movements?.[0]?.userPrompt || '';
456
+ const movementPreviews = (historyData.movements || []).slice(0, 3).map((m) => ({
457
+ userPrompt: m.userPrompt?.slice(0, 100) || ''
458
+ }));
459
+ return {
460
+ sessionId: historyData.sessionId,
461
+ startedAt: historyData.startedAt,
462
+ lastActivityAt: historyData.lastActivityAt,
463
+ totalTokens: historyData.totalTokens,
464
+ movementCount: historyData.movements?.length || 0,
465
+ title: firstPrompt.slice(0, 80) + (firstPrompt.length > 80 ? '...' : ''),
466
+ movements: movementPreviews
467
+ };
468
+ }
469
+ function searchSessions(workingDir, query, limit = 20, offset = 0) {
470
+ const sessionsDir = join(workingDir, '.mstro', 'history');
471
+ if (!existsSync(sessionsDir))
472
+ return { sessions: [], total: 0, hasMore: false };
473
+ const lowerQuery = query.toLowerCase();
474
+ try {
475
+ const historyFiles = readdirSync(sessionsDir)
476
+ .filter((name) => name.endsWith('.json'))
477
+ .sort((a, b) => {
478
+ const timestampA = parseInt(a.replace('.json', ''), 10);
479
+ const timestampB = parseInt(b.replace('.json', ''), 10);
480
+ return timestampB - timestampA;
481
+ });
482
+ const allMatches = [];
483
+ for (const filename of historyFiles) {
484
+ try {
485
+ const content = readFileSync(join(sessionsDir, filename), 'utf-8');
486
+ const historyData = JSON.parse(content);
487
+ if (movementMatchesQuery(historyData.movements, lowerQuery)) {
488
+ allMatches.push(buildSessionSummary(historyData));
489
+ }
490
+ }
491
+ catch {
492
+ // Skip files that can't be parsed
493
+ }
494
+ }
495
+ const total = allMatches.length;
496
+ return {
497
+ sessions: allMatches.slice(offset, offset + limit),
498
+ total,
499
+ hasMore: offset + limit < total
500
+ };
501
+ }
502
+ catch (error) {
503
+ console.error('[WebSocketImproviseHandler] Error searching sessions:', error);
504
+ return { sessions: [], total: 0, hasMore: false };
505
+ }
506
+ }
507
+ //# sourceMappingURL=session-handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-handlers.js","sourceRoot":"","sources":["../../../../server/services/websocket/session-handlers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { HandlerContext } from './handler-context.js';
2
+ import type { WebSocketMessage, WSContext } from './types.js';
3
+ export declare function handleGetSettings(ctx: HandlerContext, ws: WSContext): void;
4
+ export declare function handleUpdateSettings(ctx: HandlerContext, _ws: WSContext, msg: WebSocketMessage): void;
5
+ export declare function generateNotificationSummary(ctx: HandlerContext, ws: WSContext, tabId: string, userPrompt: string, output: string, workingDir: string): Promise<void>;
6
+ //# sourceMappingURL=settings-handlers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings-handlers.d.ts","sourceRoot":"","sources":["../../../../server/services/websocket/settings-handlers.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE9D,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,cAAc,EAAE,EAAE,EAAE,SAAS,GAAG,IAAI,CAE1E;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,gBAAgB,GAAG,IAAI,CAKrG;AAED,wBAAsB,2BAA2B,CAC/C,GAAG,EAAE,cAAc,EACnB,EAAE,EAAE,SAAS,EACb,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAiHf"}