mstro-app 0.1.47

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 (213) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +177 -0
  3. package/bin/commands/config.js +145 -0
  4. package/bin/commands/login.js +313 -0
  5. package/bin/commands/logout.js +75 -0
  6. package/bin/commands/status.js +197 -0
  7. package/bin/commands/whoami.js +161 -0
  8. package/bin/configure-claude.js +298 -0
  9. package/bin/mstro.js +581 -0
  10. package/bin/postinstall.js +45 -0
  11. package/bin/release.sh +110 -0
  12. package/dist/server/cli/headless/claude-invoker.d.ts +17 -0
  13. package/dist/server/cli/headless/claude-invoker.d.ts.map +1 -0
  14. package/dist/server/cli/headless/claude-invoker.js +311 -0
  15. package/dist/server/cli/headless/claude-invoker.js.map +1 -0
  16. package/dist/server/cli/headless/index.d.ts +13 -0
  17. package/dist/server/cli/headless/index.d.ts.map +1 -0
  18. package/dist/server/cli/headless/index.js +10 -0
  19. package/dist/server/cli/headless/index.js.map +1 -0
  20. package/dist/server/cli/headless/mcp-config.d.ts +11 -0
  21. package/dist/server/cli/headless/mcp-config.d.ts.map +1 -0
  22. package/dist/server/cli/headless/mcp-config.js +76 -0
  23. package/dist/server/cli/headless/mcp-config.js.map +1 -0
  24. package/dist/server/cli/headless/output-utils.d.ts +33 -0
  25. package/dist/server/cli/headless/output-utils.d.ts.map +1 -0
  26. package/dist/server/cli/headless/output-utils.js +101 -0
  27. package/dist/server/cli/headless/output-utils.js.map +1 -0
  28. package/dist/server/cli/headless/prompt-utils.d.ts +21 -0
  29. package/dist/server/cli/headless/prompt-utils.d.ts.map +1 -0
  30. package/dist/server/cli/headless/prompt-utils.js +84 -0
  31. package/dist/server/cli/headless/prompt-utils.js.map +1 -0
  32. package/dist/server/cli/headless/runner.d.ts +24 -0
  33. package/dist/server/cli/headless/runner.d.ts.map +1 -0
  34. package/dist/server/cli/headless/runner.js +99 -0
  35. package/dist/server/cli/headless/runner.js.map +1 -0
  36. package/dist/server/cli/headless/types.d.ts +106 -0
  37. package/dist/server/cli/headless/types.d.ts.map +1 -0
  38. package/dist/server/cli/headless/types.js +4 -0
  39. package/dist/server/cli/headless/types.js.map +1 -0
  40. package/dist/server/cli/improvisation-session-manager.d.ts +155 -0
  41. package/dist/server/cli/improvisation-session-manager.d.ts.map +1 -0
  42. package/dist/server/cli/improvisation-session-manager.js +415 -0
  43. package/dist/server/cli/improvisation-session-manager.js.map +1 -0
  44. package/dist/server/index.d.ts +2 -0
  45. package/dist/server/index.d.ts.map +1 -0
  46. package/dist/server/index.js +386 -0
  47. package/dist/server/index.js.map +1 -0
  48. package/dist/server/mcp/bouncer-cli.d.ts +3 -0
  49. package/dist/server/mcp/bouncer-cli.d.ts.map +1 -0
  50. package/dist/server/mcp/bouncer-cli.js +99 -0
  51. package/dist/server/mcp/bouncer-cli.js.map +1 -0
  52. package/dist/server/mcp/bouncer-integration.d.ts +36 -0
  53. package/dist/server/mcp/bouncer-integration.d.ts.map +1 -0
  54. package/dist/server/mcp/bouncer-integration.js +301 -0
  55. package/dist/server/mcp/bouncer-integration.js.map +1 -0
  56. package/dist/server/mcp/security-audit.d.ts +52 -0
  57. package/dist/server/mcp/security-audit.d.ts.map +1 -0
  58. package/dist/server/mcp/security-audit.js +118 -0
  59. package/dist/server/mcp/security-audit.js.map +1 -0
  60. package/dist/server/mcp/security-patterns.d.ts +73 -0
  61. package/dist/server/mcp/security-patterns.d.ts.map +1 -0
  62. package/dist/server/mcp/security-patterns.js +247 -0
  63. package/dist/server/mcp/security-patterns.js.map +1 -0
  64. package/dist/server/mcp/server.d.ts +3 -0
  65. package/dist/server/mcp/server.d.ts.map +1 -0
  66. package/dist/server/mcp/server.js +146 -0
  67. package/dist/server/mcp/server.js.map +1 -0
  68. package/dist/server/routes/files.d.ts +9 -0
  69. package/dist/server/routes/files.d.ts.map +1 -0
  70. package/dist/server/routes/files.js +24 -0
  71. package/dist/server/routes/files.js.map +1 -0
  72. package/dist/server/routes/improvise.d.ts +3 -0
  73. package/dist/server/routes/improvise.d.ts.map +1 -0
  74. package/dist/server/routes/improvise.js +72 -0
  75. package/dist/server/routes/improvise.js.map +1 -0
  76. package/dist/server/routes/index.d.ts +10 -0
  77. package/dist/server/routes/index.d.ts.map +1 -0
  78. package/dist/server/routes/index.js +12 -0
  79. package/dist/server/routes/index.js.map +1 -0
  80. package/dist/server/routes/instances.d.ts +10 -0
  81. package/dist/server/routes/instances.d.ts.map +1 -0
  82. package/dist/server/routes/instances.js +47 -0
  83. package/dist/server/routes/instances.js.map +1 -0
  84. package/dist/server/routes/notifications.d.ts +3 -0
  85. package/dist/server/routes/notifications.d.ts.map +1 -0
  86. package/dist/server/routes/notifications.js +136 -0
  87. package/dist/server/routes/notifications.js.map +1 -0
  88. package/dist/server/services/analytics.d.ts +56 -0
  89. package/dist/server/services/analytics.d.ts.map +1 -0
  90. package/dist/server/services/analytics.js +240 -0
  91. package/dist/server/services/analytics.js.map +1 -0
  92. package/dist/server/services/auth.d.ts +26 -0
  93. package/dist/server/services/auth.d.ts.map +1 -0
  94. package/dist/server/services/auth.js +71 -0
  95. package/dist/server/services/auth.js.map +1 -0
  96. package/dist/server/services/client-id.d.ts +10 -0
  97. package/dist/server/services/client-id.d.ts.map +1 -0
  98. package/dist/server/services/client-id.js +61 -0
  99. package/dist/server/services/client-id.js.map +1 -0
  100. package/dist/server/services/credentials.d.ts +39 -0
  101. package/dist/server/services/credentials.d.ts.map +1 -0
  102. package/dist/server/services/credentials.js +110 -0
  103. package/dist/server/services/credentials.js.map +1 -0
  104. package/dist/server/services/files.d.ts +119 -0
  105. package/dist/server/services/files.d.ts.map +1 -0
  106. package/dist/server/services/files.js +560 -0
  107. package/dist/server/services/files.js.map +1 -0
  108. package/dist/server/services/instances.d.ts +52 -0
  109. package/dist/server/services/instances.d.ts.map +1 -0
  110. package/dist/server/services/instances.js +241 -0
  111. package/dist/server/services/instances.js.map +1 -0
  112. package/dist/server/services/pathUtils.d.ts +47 -0
  113. package/dist/server/services/pathUtils.d.ts.map +1 -0
  114. package/dist/server/services/pathUtils.js +124 -0
  115. package/dist/server/services/pathUtils.js.map +1 -0
  116. package/dist/server/services/platform.d.ts +72 -0
  117. package/dist/server/services/platform.d.ts.map +1 -0
  118. package/dist/server/services/platform.js +368 -0
  119. package/dist/server/services/platform.js.map +1 -0
  120. package/dist/server/services/sentry.d.ts +5 -0
  121. package/dist/server/services/sentry.d.ts.map +1 -0
  122. package/dist/server/services/sentry.js +71 -0
  123. package/dist/server/services/sentry.js.map +1 -0
  124. package/dist/server/services/terminal/pty-manager.d.ts +149 -0
  125. package/dist/server/services/terminal/pty-manager.d.ts.map +1 -0
  126. package/dist/server/services/terminal/pty-manager.js +377 -0
  127. package/dist/server/services/terminal/pty-manager.js.map +1 -0
  128. package/dist/server/services/terminal/tmux-manager.d.ts +82 -0
  129. package/dist/server/services/terminal/tmux-manager.d.ts.map +1 -0
  130. package/dist/server/services/terminal/tmux-manager.js +352 -0
  131. package/dist/server/services/terminal/tmux-manager.js.map +1 -0
  132. package/dist/server/services/websocket/autocomplete.d.ts +50 -0
  133. package/dist/server/services/websocket/autocomplete.d.ts.map +1 -0
  134. package/dist/server/services/websocket/autocomplete.js +361 -0
  135. package/dist/server/services/websocket/autocomplete.js.map +1 -0
  136. package/dist/server/services/websocket/file-utils.d.ts +44 -0
  137. package/dist/server/services/websocket/file-utils.d.ts.map +1 -0
  138. package/dist/server/services/websocket/file-utils.js +272 -0
  139. package/dist/server/services/websocket/file-utils.js.map +1 -0
  140. package/dist/server/services/websocket/handler.d.ts +246 -0
  141. package/dist/server/services/websocket/handler.d.ts.map +1 -0
  142. package/dist/server/services/websocket/handler.js +1771 -0
  143. package/dist/server/services/websocket/handler.js.map +1 -0
  144. package/dist/server/services/websocket/index.d.ts +11 -0
  145. package/dist/server/services/websocket/index.d.ts.map +1 -0
  146. package/dist/server/services/websocket/index.js +14 -0
  147. package/dist/server/services/websocket/index.js.map +1 -0
  148. package/dist/server/services/websocket/types.d.ts +214 -0
  149. package/dist/server/services/websocket/types.d.ts.map +1 -0
  150. package/dist/server/services/websocket/types.js +4 -0
  151. package/dist/server/services/websocket/types.js.map +1 -0
  152. package/dist/server/utils/agent-manager.d.ts +69 -0
  153. package/dist/server/utils/agent-manager.d.ts.map +1 -0
  154. package/dist/server/utils/agent-manager.js +269 -0
  155. package/dist/server/utils/agent-manager.js.map +1 -0
  156. package/dist/server/utils/paths.d.ts +25 -0
  157. package/dist/server/utils/paths.d.ts.map +1 -0
  158. package/dist/server/utils/paths.js +38 -0
  159. package/dist/server/utils/paths.js.map +1 -0
  160. package/dist/server/utils/port-manager.d.ts +10 -0
  161. package/dist/server/utils/port-manager.d.ts.map +1 -0
  162. package/dist/server/utils/port-manager.js +60 -0
  163. package/dist/server/utils/port-manager.js.map +1 -0
  164. package/dist/server/utils/port.d.ts +26 -0
  165. package/dist/server/utils/port.d.ts.map +1 -0
  166. package/dist/server/utils/port.js +83 -0
  167. package/dist/server/utils/port.js.map +1 -0
  168. package/hooks/bouncer.sh +138 -0
  169. package/package.json +74 -0
  170. package/server/README.md +191 -0
  171. package/server/cli/headless/claude-invoker.ts +415 -0
  172. package/server/cli/headless/index.ts +39 -0
  173. package/server/cli/headless/mcp-config.ts +87 -0
  174. package/server/cli/headless/output-utils.ts +109 -0
  175. package/server/cli/headless/prompt-utils.ts +108 -0
  176. package/server/cli/headless/runner.ts +133 -0
  177. package/server/cli/headless/types.ts +118 -0
  178. package/server/cli/improvisation-session-manager.ts +531 -0
  179. package/server/index.ts +456 -0
  180. package/server/mcp/README.md +122 -0
  181. package/server/mcp/bouncer-cli.ts +127 -0
  182. package/server/mcp/bouncer-integration.ts +430 -0
  183. package/server/mcp/security-audit.ts +180 -0
  184. package/server/mcp/security-patterns.ts +290 -0
  185. package/server/mcp/server.ts +174 -0
  186. package/server/routes/files.ts +29 -0
  187. package/server/routes/improvise.ts +82 -0
  188. package/server/routes/index.ts +13 -0
  189. package/server/routes/instances.ts +54 -0
  190. package/server/routes/notifications.ts +158 -0
  191. package/server/services/analytics.ts +277 -0
  192. package/server/services/auth.ts +80 -0
  193. package/server/services/client-id.ts +68 -0
  194. package/server/services/credentials.ts +134 -0
  195. package/server/services/files.ts +710 -0
  196. package/server/services/instances.ts +275 -0
  197. package/server/services/pathUtils.ts +158 -0
  198. package/server/services/platform.test.ts +1314 -0
  199. package/server/services/platform.ts +435 -0
  200. package/server/services/sentry.ts +81 -0
  201. package/server/services/terminal/pty-manager.ts +464 -0
  202. package/server/services/terminal/tmux-manager.ts +426 -0
  203. package/server/services/websocket/autocomplete.ts +438 -0
  204. package/server/services/websocket/file-utils.ts +305 -0
  205. package/server/services/websocket/handler.test.ts +20 -0
  206. package/server/services/websocket/handler.ts +2047 -0
  207. package/server/services/websocket/index.ts +40 -0
  208. package/server/services/websocket/types.ts +339 -0
  209. package/server/tsconfig.json +19 -0
  210. package/server/utils/agent-manager.ts +323 -0
  211. package/server/utils/paths.ts +45 -0
  212. package/server/utils/port-manager.ts +70 -0
  213. package/server/utils/port.ts +102 -0
@@ -0,0 +1,415 @@
1
+ // Copyright (c) 2025-present Mstro, Inc. All rights reserved.
2
+ // Licensed under the MIT License. See LICENSE file for details.
3
+ /**
4
+ * Improvisation Session Manager v2
5
+ *
6
+ * Optimized for fast, direct prompt execution in Improvise mode.
7
+ * For complex multi-part prompts with parallel/sequential movements, use Compose tab instead.
8
+ */
9
+ import { EventEmitter } from 'node:events';
10
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
11
+ import { join } from 'node:path';
12
+ import { HeadlessRunner } from './headless/index.js';
13
+ export class ImprovisationSessionManager extends EventEmitter {
14
+ sessionId;
15
+ improviseDir;
16
+ historyPath;
17
+ history;
18
+ currentRunner = null;
19
+ options;
20
+ pendingApproval;
21
+ outputQueue = [];
22
+ queueTimer = null;
23
+ isFirstPrompt = true; // Track if this is the first prompt (no --resume needed)
24
+ claudeSessionId; // Claude CLI session ID for tab isolation
25
+ isResumedSession = false; // Track if this is a resumed historical session
26
+ accumulatedKnowledge = '';
27
+ /**
28
+ * Resume from a historical session.
29
+ * Creates a new session manager that continues the conversation from a previous session.
30
+ * The first prompt will include context from the historical session.
31
+ */
32
+ static resumeFromHistory(workingDir, historicalSessionId) {
33
+ const improviseDir = join(workingDir, '.mstro', 'improvise');
34
+ // Extract timestamp from session ID (format: improv-1234567890123 or just 1234567890123)
35
+ const timestamp = historicalSessionId.replace('improv-', '');
36
+ const historyPath = join(improviseDir, `history-${timestamp}.json`);
37
+ if (!existsSync(historyPath)) {
38
+ throw new Error(`Historical session not found: ${historicalSessionId}`);
39
+ }
40
+ // Read the historical session
41
+ const historyData = JSON.parse(readFileSync(historyPath, 'utf-8'));
42
+ // Create a new session manager with the SAME session ID
43
+ // This ensures we continue writing to the same history file
44
+ const manager = new ImprovisationSessionManager({
45
+ workingDir,
46
+ sessionId: historyData.sessionId
47
+ });
48
+ // Load the historical data
49
+ manager.history = historyData;
50
+ // Build accumulated knowledge from historical movements
51
+ manager.accumulatedKnowledge = historyData.movements
52
+ .filter(m => m.summary)
53
+ .map(m => m.summary)
54
+ .join('\n\n');
55
+ // Restore Claude session ID if available so we can --resume the actual conversation
56
+ // NOTE: Always mark as resumed session so historical context can be injected as fallback
57
+ // if the Claude CLI session has expired (e.g., client was restarted)
58
+ manager.isResumedSession = true;
59
+ manager.isFirstPrompt = true; // Always true so historical context is injected on first prompt
60
+ if (historyData.claudeSessionId) {
61
+ manager.claudeSessionId = historyData.claudeSessionId;
62
+ }
63
+ return manager;
64
+ }
65
+ constructor(options = {}) {
66
+ super();
67
+ this.options = {
68
+ workingDir: options.workingDir || process.cwd(),
69
+ sessionId: options.sessionId || `improv-${Date.now()}`,
70
+ tokenBudgetThreshold: options.tokenBudgetThreshold || 170000,
71
+ maxSessions: options.maxSessions || 10,
72
+ verbose: options.verbose || false,
73
+ noColor: options.noColor || false
74
+ };
75
+ this.sessionId = this.options.sessionId;
76
+ this.improviseDir = join(this.options.workingDir, '.mstro', 'improvise');
77
+ this.historyPath = join(this.improviseDir, `history-${this.sessionId.replace('improv-', '')}.json`);
78
+ // Ensure improvise directory exists
79
+ if (!existsSync(this.improviseDir)) {
80
+ mkdirSync(this.improviseDir, { recursive: true });
81
+ }
82
+ // Load or initialize history
83
+ this.history = this.loadHistory();
84
+ // Start output queue processor
85
+ this.startQueueProcessor();
86
+ }
87
+ /**
88
+ * Start background queue processor that flushes output immediately
89
+ */
90
+ startQueueProcessor() {
91
+ this.queueTimer = setInterval(() => {
92
+ this.flushOutputQueue();
93
+ }, 10); // Process queue every 10ms for near-instant output
94
+ }
95
+ /**
96
+ * Queue output for immediate processing
97
+ */
98
+ queueOutput(text) {
99
+ this.outputQueue.push({ text, timestamp: Date.now() });
100
+ }
101
+ /**
102
+ * Flush all queued output immediately
103
+ */
104
+ flushOutputQueue() {
105
+ while (this.outputQueue.length > 0) {
106
+ const item = this.outputQueue.shift();
107
+ if (item) {
108
+ this.emit('onOutput', item.text);
109
+ }
110
+ }
111
+ }
112
+ /**
113
+ * Build prompt with text file attachments prepended
114
+ * Format: each text file is shown as @path followed by content in code block
115
+ */
116
+ buildPromptWithAttachments(userPrompt, attachments) {
117
+ if (!attachments || attachments.length === 0) {
118
+ return userPrompt;
119
+ }
120
+ // Filter to text files only (non-images)
121
+ const textFiles = attachments.filter(a => !a.isImage);
122
+ if (textFiles.length === 0) {
123
+ return userPrompt;
124
+ }
125
+ // Build file content blocks
126
+ const fileBlocks = textFiles.map(file => {
127
+ return `@${file.filePath}\n\`\`\`\n${file.content}\n\`\`\``;
128
+ }).join('\n\n');
129
+ // Prepend file content to user prompt
130
+ return `${fileBlocks}\n\n${userPrompt}`;
131
+ }
132
+ /**
133
+ * Execute a user prompt directly (Improvise mode - no score decomposition)
134
+ * Uses persistent Claude sessions via --resume <sessionId> for conversation continuity
135
+ * Each tab maintains its own claudeSessionId for proper isolation
136
+ * Supports file attachments: text files prepended to prompt, images via stream-json multimodal
137
+ */
138
+ async executePrompt(userPrompt, attachments) {
139
+ const _execStart = Date.now();
140
+ this.emit('onMovementStart', this.history.movements.length + 1, userPrompt);
141
+ try {
142
+ const sequenceNumber = this.history.movements.length + 1;
143
+ // DEBUG: Removed "Executing prompt..." message - it serves no purpose now that system responds fast
144
+ // this.queueOutput(`\n🎵 Executing prompt...\n`);
145
+ // this.flushOutputQueue();
146
+ // NOTE: Risk analysis removed - now handled by MCP bouncer at tool-use time
147
+ // The MCP bouncer intercepts ALL tool calls (Bash, Write, etc.) and uses
148
+ // Mstro's bouncer-integration.ts for AI-powered approval/denial.
149
+ // This is more effective than analyzing user prompts, which had false positives.
150
+ // Build prompt with text file attachments prepended
151
+ const promptWithAttachments = this.buildPromptWithAttachments(userPrompt, attachments);
152
+ // PERSISTENT SESSION: Use --resume <sessionId> to maintain conversation history per tab
153
+ // CRITICAL FIX: Using claudeSessionId ensures each tab resumes its own Claude session
154
+ // Previously used --continue which resumed the most recent global session, causing cross-tab contamination
155
+ const runner = new HeadlessRunner({
156
+ workingDir: this.options.workingDir,
157
+ tokenBudgetThreshold: this.options.tokenBudgetThreshold,
158
+ maxSessions: this.options.maxSessions,
159
+ verbose: this.options.verbose,
160
+ noColor: this.options.noColor,
161
+ improvisationMode: true,
162
+ movementNumber: sequenceNumber,
163
+ continueSession: !this.isFirstPrompt, // Used as fallback only if claudeSessionId is missing
164
+ claudeSessionId: this.claudeSessionId, // Resume specific session for tab isolation
165
+ outputCallback: (text) => {
166
+ this.queueOutput(text);
167
+ this.flushOutputQueue();
168
+ },
169
+ thinkingCallback: (text) => {
170
+ this.emit('onThinking', text);
171
+ this.flushOutputQueue();
172
+ },
173
+ toolUseCallback: (event) => {
174
+ this.emit('onToolUse', event);
175
+ this.flushOutputQueue();
176
+ },
177
+ directPrompt: promptWithAttachments,
178
+ // Pass image attachments for multimodal handling via stream-json
179
+ imageAttachments: attachments?.filter(a => a.isImage),
180
+ // Inject historical context on first prompt of a resumed session
181
+ // This serves as both the primary context mechanism (no claudeSessionId)
182
+ // and a fallback if claudeSessionId is stale (client restarted since original session)
183
+ promptContext: (this.isResumedSession && this.isFirstPrompt)
184
+ ? { accumulatedKnowledge: this.buildHistoricalContext(), filesModified: [] }
185
+ : undefined
186
+ });
187
+ this.currentRunner = runner;
188
+ const result = await runner.run();
189
+ this.currentRunner = null;
190
+ // Capture Claude session ID for future prompts in this tab
191
+ // This is critical for tab isolation - each tab maintains its own Claude session
192
+ if (result.claudeSessionId) {
193
+ this.claudeSessionId = result.claudeSessionId;
194
+ this.history.claudeSessionId = result.claudeSessionId;
195
+ }
196
+ // Mark that we've executed at least one prompt
197
+ this.isFirstPrompt = false;
198
+ // Create movement record with accumulated output for persistence
199
+ const movement = {
200
+ id: `prompt-${sequenceNumber}`,
201
+ sequenceNumber,
202
+ userPrompt,
203
+ timestamp: new Date().toISOString(),
204
+ tokensUsed: result.totalTokens,
205
+ summary: '', // No summary needed - Claude session maintains context
206
+ filesModified: [],
207
+ // Persist accumulated output for history replay
208
+ assistantResponse: result.assistantResponse,
209
+ thinkingOutput: result.thinkingOutput,
210
+ toolUseHistory: result.toolUseHistory?.map(t => ({
211
+ toolName: t.toolName,
212
+ toolId: t.toolId,
213
+ toolInput: t.toolInput,
214
+ result: t.result,
215
+ isError: t.isError,
216
+ duration: t.duration
217
+ })),
218
+ errorOutput: result.error
219
+ };
220
+ // Handle file conflicts if any
221
+ if (result.conflicts && result.conflicts.length > 0) {
222
+ this.queueOutput(`\n⚠ File conflicts detected: ${result.conflicts.length}`);
223
+ result.conflicts.forEach(c => {
224
+ this.queueOutput(` - ${c.filePath} (modified by: ${c.modifiedBy.join(', ')})`);
225
+ if (c.backupPath) {
226
+ this.queueOutput(` Backup created: ${c.backupPath}`);
227
+ }
228
+ });
229
+ this.flushOutputQueue();
230
+ }
231
+ this.history.movements.push(movement);
232
+ this.history.totalTokens += movement.tokensUsed;
233
+ // Save history
234
+ this.saveHistory();
235
+ // Completion message is now handled by the client-side movementComplete event handler
236
+ // This prevents duplicate completion messages (one white, one green)
237
+ // this.queueOutput(`\n✓ Complete (tokens: ${result.totalTokens.toLocaleString()})\n`);
238
+ // this.flushOutputQueue();
239
+ this.emit('onMovementComplete', movement);
240
+ this.emit('onSessionUpdate', this.getHistory());
241
+ return movement;
242
+ }
243
+ catch (error) {
244
+ this.currentRunner = null;
245
+ this.emit('onMovementError', error);
246
+ this.queueOutput(`\n❌ Error: ${error.message}\n`);
247
+ this.flushOutputQueue();
248
+ throw error;
249
+ }
250
+ finally {
251
+ // Ensure final flush
252
+ this.flushOutputQueue();
253
+ }
254
+ }
255
+ /**
256
+ * Build historical context for resuming a session.
257
+ * This creates a summary of the previous conversation that will be injected
258
+ * into the first prompt of a resumed session.
259
+ */
260
+ buildHistoricalContext() {
261
+ if (this.history.movements.length === 0) {
262
+ return '';
263
+ }
264
+ const contextParts = [
265
+ '--- CONVERSATION HISTORY (for context, do not repeat these responses) ---',
266
+ ''
267
+ ];
268
+ // Include each movement as context
269
+ for (const movement of this.history.movements) {
270
+ contextParts.push(`[User Prompt ${movement.sequenceNumber}]:`);
271
+ contextParts.push(movement.userPrompt);
272
+ contextParts.push('');
273
+ if (movement.assistantResponse) {
274
+ contextParts.push(`[Your Response ${movement.sequenceNumber}]:`);
275
+ // Truncate very long responses to save tokens
276
+ const response = movement.assistantResponse.length > 2000
277
+ ? `${movement.assistantResponse.slice(0, 2000)}\n... (response truncated for context)`
278
+ : movement.assistantResponse;
279
+ contextParts.push(response);
280
+ contextParts.push('');
281
+ }
282
+ if (movement.toolUseHistory && movement.toolUseHistory.length > 0) {
283
+ contextParts.push(`[Tools Used in Prompt ${movement.sequenceNumber}]:`);
284
+ for (const tool of movement.toolUseHistory) {
285
+ contextParts.push(`- ${tool.toolName}`);
286
+ }
287
+ contextParts.push('');
288
+ }
289
+ }
290
+ contextParts.push('--- END OF CONVERSATION HISTORY ---');
291
+ contextParts.push('');
292
+ contextParts.push('Continue the conversation from where we left off. The user is now asking:');
293
+ contextParts.push('');
294
+ return contextParts.join('\n');
295
+ }
296
+ /**
297
+ * Load history from disk
298
+ */
299
+ loadHistory() {
300
+ if (existsSync(this.historyPath)) {
301
+ try {
302
+ const data = readFileSync(this.historyPath, 'utf-8');
303
+ return JSON.parse(data);
304
+ }
305
+ catch (error) {
306
+ console.error('Failed to load history:', error);
307
+ }
308
+ }
309
+ return {
310
+ sessionId: this.sessionId,
311
+ startedAt: new Date().toISOString(),
312
+ lastActivityAt: new Date().toISOString(),
313
+ totalTokens: 0,
314
+ movements: []
315
+ };
316
+ }
317
+ /**
318
+ * Save history to disk
319
+ */
320
+ saveHistory() {
321
+ this.history.lastActivityAt = new Date().toISOString();
322
+ writeFileSync(this.historyPath, JSON.stringify(this.history, null, 2));
323
+ }
324
+ /**
325
+ * Get session history
326
+ */
327
+ getHistory() {
328
+ return this.history;
329
+ }
330
+ /**
331
+ * Cancel current execution
332
+ */
333
+ cancel() {
334
+ if (this.currentRunner) {
335
+ this.currentRunner.cleanup();
336
+ this.currentRunner = null;
337
+ this.queueOutput('\n⚠ Execution cancelled\n');
338
+ this.flushOutputQueue();
339
+ }
340
+ }
341
+ /**
342
+ * Cleanup queue processor on shutdown
343
+ */
344
+ destroy() {
345
+ if (this.queueTimer) {
346
+ clearInterval(this.queueTimer);
347
+ this.queueTimer = null;
348
+ }
349
+ this.flushOutputQueue(); // Final flush
350
+ }
351
+ /**
352
+ * Clear session history and reset to fresh Claude session
353
+ * This resets the isFirstPrompt flag and claudeSessionId so the next prompt starts a new session
354
+ */
355
+ clearHistory() {
356
+ this.history.movements = [];
357
+ this.history.totalTokens = 0;
358
+ this.accumulatedKnowledge = '';
359
+ this.isFirstPrompt = true; // Reset to start fresh Claude session
360
+ this.claudeSessionId = undefined; // Clear Claude session ID to start new conversation
361
+ this.saveHistory();
362
+ this.emit('onSessionUpdate', this.getHistory());
363
+ }
364
+ /**
365
+ * Request user approval for a plan
366
+ * Returns a promise that resolves when the user approves/rejects
367
+ */
368
+ async requestApproval(plan) {
369
+ return new Promise((resolve) => {
370
+ this.pendingApproval = { plan, resolve };
371
+ this.emit('onApprovalRequired', plan);
372
+ });
373
+ }
374
+ /**
375
+ * Respond to approval request
376
+ */
377
+ respondToApproval(approved) {
378
+ if (this.pendingApproval) {
379
+ this.pendingApproval.resolve(approved);
380
+ this.pendingApproval = undefined;
381
+ }
382
+ }
383
+ /**
384
+ * Get session metadata
385
+ */
386
+ getSessionInfo() {
387
+ return {
388
+ sessionId: this.sessionId,
389
+ startTime: this.history.startedAt,
390
+ workingDir: this.options.workingDir,
391
+ totalTokens: this.history.totalTokens,
392
+ tokenBudgetThreshold: this.options.tokenBudgetThreshold,
393
+ movementCount: this.history.movements.length
394
+ };
395
+ }
396
+ /**
397
+ * Start a new session with fresh context
398
+ * Creates a completely new session manager with isFirstPrompt=true and no claudeSessionId,
399
+ * ensuring the next prompt starts a fresh Claude conversation (proper tab isolation)
400
+ */
401
+ startNewSession() {
402
+ // Save current session
403
+ this.saveHistory();
404
+ // Create new session manager - the new instance has:
405
+ // - isFirstPrompt=true by default
406
+ // - claudeSessionId=undefined by default
407
+ // This means the first prompt will start a completely fresh Claude conversation
408
+ const newSession = new ImprovisationSessionManager({
409
+ ...this.options,
410
+ sessionId: `improv-${Date.now()}`
411
+ });
412
+ return newSession;
413
+ }
414
+ }
415
+ //# sourceMappingURL=improvisation-session-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"improvisation-session-manager.js","sourceRoot":"","sources":["../../../server/cli/improvisation-session-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../server/index.ts"],"names":[],"mappings":""}