@luckydraw/cumulus 0.5.1

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 (142) hide show
  1. package/README.md +148 -0
  2. package/dist/cli/cumulus.d.ts +3 -0
  3. package/dist/cli/cumulus.d.ts.map +1 -0
  4. package/dist/cli/cumulus.js +233 -0
  5. package/dist/cli/cumulus.js.map +1 -0
  6. package/dist/index.d.ts +33 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +43 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/lib/config.d.ts +86 -0
  11. package/dist/lib/config.d.ts.map +1 -0
  12. package/dist/lib/config.js +241 -0
  13. package/dist/lib/config.js.map +1 -0
  14. package/dist/lib/content-detector.d.ts +46 -0
  15. package/dist/lib/content-detector.d.ts.map +1 -0
  16. package/dist/lib/content-detector.js +359 -0
  17. package/dist/lib/content-detector.js.map +1 -0
  18. package/dist/lib/content-store.d.ts +255 -0
  19. package/dist/lib/content-store.d.ts.map +1 -0
  20. package/dist/lib/content-store.js +955 -0
  21. package/dist/lib/content-store.js.map +1 -0
  22. package/dist/lib/context-budget.d.ts +83 -0
  23. package/dist/lib/context-budget.d.ts.map +1 -0
  24. package/dist/lib/context-budget.js +101 -0
  25. package/dist/lib/context-budget.js.map +1 -0
  26. package/dist/lib/embeddings.d.ts +64 -0
  27. package/dist/lib/embeddings.d.ts.map +1 -0
  28. package/dist/lib/embeddings.js +176 -0
  29. package/dist/lib/embeddings.js.map +1 -0
  30. package/dist/lib/history.d.ts +120 -0
  31. package/dist/lib/history.d.ts.map +1 -0
  32. package/dist/lib/history.js +205 -0
  33. package/dist/lib/history.js.map +1 -0
  34. package/dist/lib/image-utils.d.ts +41 -0
  35. package/dist/lib/image-utils.d.ts.map +1 -0
  36. package/dist/lib/image-utils.js +288 -0
  37. package/dist/lib/image-utils.js.map +1 -0
  38. package/dist/lib/migrate.d.ts +35 -0
  39. package/dist/lib/migrate.d.ts.map +1 -0
  40. package/dist/lib/migrate.js +196 -0
  41. package/dist/lib/migrate.js.map +1 -0
  42. package/dist/lib/retriever.d.ts +56 -0
  43. package/dist/lib/retriever.d.ts.map +1 -0
  44. package/dist/lib/retriever.js +644 -0
  45. package/dist/lib/retriever.js.map +1 -0
  46. package/dist/lib/revert.d.ts +23 -0
  47. package/dist/lib/revert.d.ts.map +1 -0
  48. package/dist/lib/revert.js +75 -0
  49. package/dist/lib/revert.js.map +1 -0
  50. package/dist/lib/session.d.ts +65 -0
  51. package/dist/lib/session.d.ts.map +1 -0
  52. package/dist/lib/session.js +289 -0
  53. package/dist/lib/session.js.map +1 -0
  54. package/dist/lib/snapshots.d.ts +39 -0
  55. package/dist/lib/snapshots.d.ts.map +1 -0
  56. package/dist/lib/snapshots.js +99 -0
  57. package/dist/lib/snapshots.js.map +1 -0
  58. package/dist/lib/stream-processor.d.ts +149 -0
  59. package/dist/lib/stream-processor.d.ts.map +1 -0
  60. package/dist/lib/stream-processor.js +389 -0
  61. package/dist/lib/stream-processor.js.map +1 -0
  62. package/dist/lib/summarizer.d.ts +67 -0
  63. package/dist/lib/summarizer.d.ts.map +1 -0
  64. package/dist/lib/summarizer.js +213 -0
  65. package/dist/lib/summarizer.js.map +1 -0
  66. package/dist/mcp/index.d.ts +3 -0
  67. package/dist/mcp/index.d.ts.map +1 -0
  68. package/dist/mcp/index.js +16 -0
  69. package/dist/mcp/index.js.map +1 -0
  70. package/dist/mcp/proxy.d.ts +19 -0
  71. package/dist/mcp/proxy.d.ts.map +1 -0
  72. package/dist/mcp/proxy.js +120 -0
  73. package/dist/mcp/proxy.js.map +1 -0
  74. package/dist/mcp/server.d.ts +6 -0
  75. package/dist/mcp/server.d.ts.map +1 -0
  76. package/dist/mcp/server.js +29 -0
  77. package/dist/mcp/server.js.map +1 -0
  78. package/dist/mcp/shared-server.d.ts +21 -0
  79. package/dist/mcp/shared-server.d.ts.map +1 -0
  80. package/dist/mcp/shared-server.js +210 -0
  81. package/dist/mcp/shared-server.js.map +1 -0
  82. package/dist/mcp/tool-handler.d.ts +20 -0
  83. package/dist/mcp/tool-handler.d.ts.map +1 -0
  84. package/dist/mcp/tool-handler.js +1405 -0
  85. package/dist/mcp/tool-handler.js.map +1 -0
  86. package/dist/tui/components/App.d.ts +11 -0
  87. package/dist/tui/components/App.d.ts.map +1 -0
  88. package/dist/tui/components/App.js +607 -0
  89. package/dist/tui/components/App.js.map +1 -0
  90. package/dist/tui/components/DebugContextView.d.ts +13 -0
  91. package/dist/tui/components/DebugContextView.d.ts.map +1 -0
  92. package/dist/tui/components/DebugContextView.js +78 -0
  93. package/dist/tui/components/DebugContextView.js.map +1 -0
  94. package/dist/tui/components/IncludeMenu.d.ts +12 -0
  95. package/dist/tui/components/IncludeMenu.d.ts.map +1 -0
  96. package/dist/tui/components/IncludeMenu.js +127 -0
  97. package/dist/tui/components/IncludeMenu.js.map +1 -0
  98. package/dist/tui/components/InputArea.d.ts +27 -0
  99. package/dist/tui/components/InputArea.d.ts.map +1 -0
  100. package/dist/tui/components/InputArea.js +366 -0
  101. package/dist/tui/components/InputArea.js.map +1 -0
  102. package/dist/tui/components/MarkdownText.d.ts +38 -0
  103. package/dist/tui/components/MarkdownText.d.ts.map +1 -0
  104. package/dist/tui/components/MarkdownText.js +234 -0
  105. package/dist/tui/components/MarkdownText.js.map +1 -0
  106. package/dist/tui/components/MessageBubble.d.ts +11 -0
  107. package/dist/tui/components/MessageBubble.d.ts.map +1 -0
  108. package/dist/tui/components/MessageBubble.js +16 -0
  109. package/dist/tui/components/MessageBubble.js.map +1 -0
  110. package/dist/tui/components/MessageHistory.d.ts +11 -0
  111. package/dist/tui/components/MessageHistory.d.ts.map +1 -0
  112. package/dist/tui/components/MessageHistory.js +12 -0
  113. package/dist/tui/components/MessageHistory.js.map +1 -0
  114. package/dist/tui/components/RevertMenu.d.ts +17 -0
  115. package/dist/tui/components/RevertMenu.d.ts.map +1 -0
  116. package/dist/tui/components/RevertMenu.js +144 -0
  117. package/dist/tui/components/RevertMenu.js.map +1 -0
  118. package/dist/tui/components/StatusBar.d.ts +14 -0
  119. package/dist/tui/components/StatusBar.d.ts.map +1 -0
  120. package/dist/tui/components/StatusBar.js +13 -0
  121. package/dist/tui/components/StatusBar.js.map +1 -0
  122. package/dist/tui/components/StreamingResponse.d.ts +15 -0
  123. package/dist/tui/components/StreamingResponse.d.ts.map +1 -0
  124. package/dist/tui/components/StreamingResponse.js +52 -0
  125. package/dist/tui/components/StreamingResponse.js.map +1 -0
  126. package/dist/tui/hooks/useAppState.d.ts +147 -0
  127. package/dist/tui/hooks/useAppState.d.ts.map +1 -0
  128. package/dist/tui/hooks/useAppState.js +110 -0
  129. package/dist/tui/hooks/useAppState.js.map +1 -0
  130. package/dist/tui/hooks/useClaudeProcess.d.ts +19 -0
  131. package/dist/tui/hooks/useClaudeProcess.d.ts.map +1 -0
  132. package/dist/tui/hooks/useClaudeProcess.js +185 -0
  133. package/dist/tui/hooks/useClaudeProcess.js.map +1 -0
  134. package/dist/tui/index.d.ts +10 -0
  135. package/dist/tui/index.d.ts.map +1 -0
  136. package/dist/tui/index.js +11 -0
  137. package/dist/tui/index.js.map +1 -0
  138. package/dist/tui/utils/streamParser.d.ts +31 -0
  139. package/dist/tui/utils/streamParser.d.ts.map +1 -0
  140. package/dist/tui/utils/streamParser.js +63 -0
  141. package/dist/tui/utils/streamParser.js.map +1 -0
  142. package/package.json +94 -0
@@ -0,0 +1,607 @@
1
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
+ /**
3
+ * Main TUI application component.
4
+ */
5
+ import * as fs from 'fs';
6
+ import * as os from 'os';
7
+ import * as path from 'path';
8
+ import { fileURLToPath } from 'url';
9
+ import { Box, Text, useApp, useInput } from 'ink';
10
+ import { useEffect, useCallback, useState, useMemo, useRef } from 'react';
11
+ import { loadGlobalConfig, loadThreadConfig, mergeConfigs, readAlwaysIncludeFiles, } from '../../lib/config.js';
12
+ import { ContentStore } from '../../lib/content-store.js';
13
+ import { ContextBudget, estimateTokens } from '../../lib/context-budget.js';
14
+ import { HistoryStore } from '../../lib/history.js';
15
+ import { processImagesInMessage } from '../../lib/image-utils.js';
16
+ import { retrieve } from '../../lib/retriever.js';
17
+ import { SessionManager } from '../../lib/session.js';
18
+ import { captureSnapshot } from '../../lib/snapshots.js';
19
+ import { shouldExternalizeUserInput, externalizeUserInput } from '../../lib/stream-processor.js';
20
+ import { useAppReducer, AppContext } from '../hooks/useAppState.js';
21
+ import { useClaudeProcess } from '../hooks/useClaudeProcess.js';
22
+ import { DebugContextView } from './DebugContextView.js';
23
+ import { IncludeMenu } from './IncludeMenu.js';
24
+ import { InputArea } from './InputArea.js';
25
+ import { MessageHistory } from './MessageHistory.js';
26
+ import { RevertMenu } from './RevertMenu.js';
27
+ import { StatusBar } from './StatusBar.js';
28
+ import { StreamingResponse } from './StreamingResponse.js';
29
+ const __filename = fileURLToPath(import.meta.url);
30
+ const __dirname = path.dirname(__filename);
31
+ const CUMULUS_DIR = path.join(os.homedir(), '.cumulus');
32
+ const THREADS_DIR = path.join(CUMULUS_DIR, 'threads');
33
+ const RECENT_CONTEXT_COUNT = 10;
34
+ const RECENT_MSG_MAX_TOKENS = 500;
35
+ const SLASH_COMMANDS = [
36
+ { name: '/include', description: 'Manage always-include files' },
37
+ { name: '/revert', description: 'Revert conversation to earlier point' },
38
+ { name: '/exit', description: 'Exit cumulus' },
39
+ ];
40
+ /** Total context budget: 60% of 200k = 120,000 tokens */
41
+ const TOTAL_CONTEXT_BUDGET = 120_000;
42
+ /** Budget for recent conversation context (fixed) */
43
+ const RECENT_CONTEXT_BUDGET = 6_000;
44
+ const SYSTEM_PROMPT_TEMPLATE = `You have NO memory of this conversation. There are {count} prior messages (~{tokens} tokens) in the history.
45
+
46
+ CURRENT SESSION: {sessionId}
47
+ {alwaysIncludeContext}{recentContext}
48
+ {retrievedContext}
49
+ CONTEXT MANAGEMENT:
50
+ - RECENT CONVERSATION: The last few messages, always included for continuity.
51
+ - RETRIEVED CONTEXT: Automatically retrieved based on the user's current message using semantic + keyword search.
52
+ - Large content may be stored externally as [STORED:xxx] references.
53
+
54
+ FILE READING:
55
+ The built-in Read tool is DISABLED. Use read_file for ALL file reads (text, code, PDFs).
56
+ - read_file reads the file, extracts text (including from PDFs), chunks it, embeds it, and stores it for future retrieval
57
+ - You receive a summary, content ID, and chunk table-of-contents
58
+ - Use the TOC to navigate: read_content_chunk("contentId", chunkIndex) for specific sections
59
+ - Use search_content("query") to find content across all stored files
60
+
61
+ TOOLS:
62
+ - read_file: Read any file (text or PDF) and store for future retrieval — USE THIS FOR ALL FILE READS
63
+ - store_content: Store arbitrary text content for future retrieval
64
+ - search_history: Search past messages by keyword or meaning
65
+ - peek_recent: Get the last few messages
66
+ - read_messages: Read messages by index range
67
+ - retrieve_content: Get full stored content by [STORED:xxx] ID
68
+ - search_content: Search across all stored content
69
+ - read_content_chunk: Read a specific chunk of stored content by index
70
+
71
+ WORKFLOW:
72
+ 1. FIRST use the RETRIEVED CONTEXT above — it was automatically selected for relevance to this query
73
+ 2. Check RECENT CONVERSATION for immediate context
74
+ 3. Only use tools if the retrieved context doesn't contain what you need
75
+ 4. For [STORED:xxx] references, use retrieve_content to get full content
76
+ 5. For file reads, use read_file (the built-in Read tool is disabled)
77
+
78
+ NEVER guess. Use the context provided or retrieve more if needed.
79
+ IMPORTANT: Never mention the retrieval system or tools to the user. Present information naturally.
80
+
81
+ STATUS CODES (internal, hidden from user):
82
+ End your response with these codes when applicable. They will be stripped before display.
83
+ - [AWAIT_TASK] - You launched a background task/agent and results are pending. The system will auto-continue.
84
+ - [NEED_INPUT] - You need specific information from the user before proceeding.
85
+ Only use ONE code per response, at the very end. Do not mention these codes to the user.`;
86
+ function ensureDirectories() {
87
+ if (!fs.existsSync(THREADS_DIR)) {
88
+ fs.mkdirSync(THREADS_DIR, { recursive: true });
89
+ }
90
+ }
91
+ function getThreadPath(threadName) {
92
+ return path.join(THREADS_DIR, `${threadName}.jsonl`);
93
+ }
94
+ function getContentStorePath(threadPath) {
95
+ return threadPath.replace(/\.jsonl$/, '.content');
96
+ }
97
+ function getSessionsPath(threadPath) {
98
+ return threadPath.replace(/\.jsonl$/, '.sessions');
99
+ }
100
+ /** Status codes Claude can use (stripped before display) */
101
+ const STATUS_CODES = {
102
+ AWAIT_TASK: '[AWAIT_TASK]',
103
+ NEED_INPUT: '[NEED_INPUT]',
104
+ };
105
+ /**
106
+ * Extract and strip status code from response.
107
+ * Returns the cleaned response and any detected status code.
108
+ */
109
+ function extractStatusCode(response) {
110
+ for (const code of Object.values(STATUS_CODES)) {
111
+ if (response.trimEnd().endsWith(code)) {
112
+ return {
113
+ cleaned: response.slice(0, response.lastIndexOf(code)).trimEnd(),
114
+ status: code,
115
+ };
116
+ }
117
+ }
118
+ return { cleaned: response, status: null };
119
+ }
120
+ function truncateToTokens(content, maxTokens) {
121
+ const tokens = estimateTokens(content);
122
+ if (tokens <= maxTokens)
123
+ return content;
124
+ const targetChars = maxTokens * 3;
125
+ return content.slice(0, targetChars) + '... [truncated]';
126
+ }
127
+ function formatRecentContext(recentMessages, budgetTokens) {
128
+ if (recentMessages.length === 0 || budgetTokens <= 0)
129
+ return '';
130
+ const header = '\nRECENT CONVERSATION (last few messages):\n---\n';
131
+ const footer = '---\n';
132
+ const overhead = estimateTokens(header + footer);
133
+ let remaining = budgetTokens - overhead;
134
+ if (remaining <= 0)
135
+ return '';
136
+ const formatted = [];
137
+ for (let i = recentMessages.length - 1; i >= 0 && remaining > 0; i--) {
138
+ const msg = recentMessages[i];
139
+ const label = msg.role === 'user' ? 'User' : 'Assistant';
140
+ const truncated = truncateToTokens(msg.content, RECENT_MSG_MAX_TOKENS);
141
+ const line = `[${label}]: ${truncated}\n`;
142
+ const lineTokens = estimateTokens(line);
143
+ if (lineTokens > remaining)
144
+ break;
145
+ formatted.unshift(line);
146
+ remaining -= lineTokens;
147
+ }
148
+ if (formatted.length === 0)
149
+ return '';
150
+ return header + formatted.join('') + footer;
151
+ }
152
+ function generateSystemPrompt(count, tokens, sessionId, recentMessages, retrievedContext, alwaysIncludeContext) {
153
+ const recentContext = formatRecentContext(recentMessages, RECENT_CONTEXT_BUDGET);
154
+ return SYSTEM_PROMPT_TEMPLATE.replace('{count}', count.toString())
155
+ .replace('{tokens}', tokens.toString())
156
+ .replace('{sessionId}', sessionId)
157
+ .replace('{alwaysIncludeContext}', alwaysIncludeContext)
158
+ .replace('{recentContext}', recentContext)
159
+ .replace('{retrievedContext}', retrievedContext);
160
+ }
161
+ function generateMcpConfig(threadPath, sessionId) {
162
+ const mcpServerPath = path.resolve(__dirname, '../../mcp/index.js');
163
+ const contentStorePath = getContentStorePath(threadPath);
164
+ const sessionsPath = getSessionsPath(threadPath);
165
+ const config = {
166
+ mcpServers: {
167
+ 'cumulus-history': {
168
+ command: 'node',
169
+ args: [mcpServerPath],
170
+ env: {
171
+ CUMULUS_THREAD_PATH: threadPath,
172
+ CUMULUS_CONTENT_PATH: contentStorePath,
173
+ CUMULUS_SESSIONS_PATH: sessionsPath,
174
+ ...(sessionId && { CUMULUS_SESSION_ID: sessionId }),
175
+ },
176
+ },
177
+ },
178
+ };
179
+ const configPath = path.join(CUMULUS_DIR, `mcp-config-${Date.now()}.json`);
180
+ fs.writeFileSync(configPath, JSON.stringify(config, null, 2));
181
+ return configPath;
182
+ }
183
+ function cleanupMcpConfig(configPath) {
184
+ try {
185
+ if (fs.existsSync(configPath)) {
186
+ fs.unlinkSync(configPath);
187
+ }
188
+ }
189
+ catch {
190
+ // Ignore cleanup errors
191
+ }
192
+ }
193
+ export function App({ threadName, debugMode = false }) {
194
+ const { exit } = useApp();
195
+ const [state, dispatch] = useAppReducer(threadName, debugMode);
196
+ const [initialized, setInitialized] = useState(false);
197
+ // Refs for stores
198
+ const [stores, setStores] = useState(null);
199
+ // Pending images for the current turn (used in onComplete to store analysis)
200
+ const pendingImagesRef = useRef([]);
201
+ // Initialize stores
202
+ useEffect(() => {
203
+ async function init() {
204
+ ensureDirectories();
205
+ const threadPath = getThreadPath(threadName);
206
+ const contentStorePath = getContentStorePath(threadPath);
207
+ const sessionsPath = getSessionsPath(threadPath);
208
+ const historyStore = new HistoryStore(threadPath);
209
+ const contentStore = new ContentStore(contentStorePath);
210
+ const sessionManager = new SessionManager(sessionsPath, threadName);
211
+ await sessionManager.initialize();
212
+ const mcpConfigPath = generateMcpConfig(threadPath, sessionManager.getSessionId());
213
+ // Load initial state
214
+ const stats = await historyStore.getStats();
215
+ const messages = await historyStore.getAll();
216
+ dispatch({ type: 'SET_STATS', stats });
217
+ dispatch({ type: 'SET_MESSAGES', messages });
218
+ dispatch({ type: 'SET_SESSION_ID', sessionId: sessionManager.getSessionId() });
219
+ setStores({
220
+ history: historyStore,
221
+ content: contentStore,
222
+ session: sessionManager,
223
+ mcpConfigPath,
224
+ });
225
+ setInitialized(true);
226
+ }
227
+ init();
228
+ return () => {
229
+ if (stores) {
230
+ cleanupMcpConfig(stores.mcpConfigPath);
231
+ }
232
+ };
233
+ }, [threadName]);
234
+ // Claude process handlers
235
+ const onText = useCallback((text) => {
236
+ dispatch({ type: 'APPEND_STREAM', text });
237
+ }, [dispatch]);
238
+ const onComplete = useCallback(async (fullResponse) => {
239
+ if (!stores)
240
+ return;
241
+ // Extract and strip any status code from the response
242
+ const { cleaned, status } = extractStatusCode(fullResponse);
243
+ // Save assistant message to history (with status code stripped)
244
+ const message = await stores.history.append({
245
+ role: 'assistant',
246
+ content: cleaned,
247
+ metadata: { sessionId: stores.session.getSessionId() },
248
+ });
249
+ // Use atomic COMPLETE_RESPONSE to clear stream + add message + stop processing
250
+ // in a single render. This prevents the bug where Ink's <Static> commits the
251
+ // new message permanently while StreamingResponse still shows the same content
252
+ // (because CLEAR_STREAM hasn't been processed yet), causing a visible duplicate.
253
+ dispatch({ type: 'COMPLETE_RESPONSE', message });
254
+ // Collapse debug context after response completes (keep the data)
255
+ dispatch({ type: 'SET_DEBUG_EXPANDED', expanded: false });
256
+ // Update stats
257
+ const stats = await stores.history.getStats();
258
+ dispatch({ type: 'SET_STATS', stats });
259
+ // Update session document
260
+ const messages = await stores.history.getRecent(2);
261
+ const userMsg = messages.find(m => m.role === 'user');
262
+ if (userMsg) {
263
+ await stores.session.appendExchange(userMsg.content, cleaned);
264
+ stores.session.generateMissingEmbeddings().catch(() => { });
265
+ }
266
+ // Store image analysis entries in content store
267
+ if (pendingImagesRef.current.length > 0) {
268
+ const imagesToStore = pendingImagesRef.current;
269
+ pendingImagesRef.current = [];
270
+ for (const img of imagesToStore) {
271
+ try {
272
+ await stores.content.store(cleaned, {
273
+ sourceType: 'image_analysis',
274
+ contentType: 'binary_desc',
275
+ summary: `Image analysis: ${img.originalPath === 'clipboard' ? 'clipboard image' : path.basename(img.originalPath)}`,
276
+ metadata: {
277
+ originalPath: img.originalPath,
278
+ cachedPath: img.cachedPath,
279
+ mediaType: img.mediaType,
280
+ sizeBytes: img.sizeBytes,
281
+ },
282
+ });
283
+ }
284
+ catch {
285
+ // Non-fatal: image analysis storage failure
286
+ }
287
+ }
288
+ }
289
+ // Handle status codes
290
+ if (status === STATUS_CODES.AWAIT_TASK) {
291
+ dispatch({ type: 'SET_PENDING_AUTO_FOLLOW_UP', pending: true });
292
+ }
293
+ }, [stores, dispatch]);
294
+ const onError = useCallback((error) => {
295
+ dispatch({ type: 'SET_ERROR', error });
296
+ dispatch({ type: 'SET_PROCESSING', isProcessing: false });
297
+ }, [dispatch]);
298
+ const onExternalize = useCallback((_contentId, _sizeKB) => {
299
+ // Could show a notification in the future
300
+ }, []);
301
+ const claudeProcess = useClaudeProcess({
302
+ mcpConfigPath: stores?.mcpConfigPath ?? '',
303
+ contentStore: stores?.content ?? new ContentStore('/tmp'),
304
+ onText,
305
+ onComplete,
306
+ onError,
307
+ onExternalize,
308
+ });
309
+ // Handle message submission
310
+ // skipProcessingCheck is used by interjection to bypass the stale state check
311
+ const handleSubmit = useCallback(async (text, skipProcessingCheckOrImages, maybeSkip) => {
312
+ // Support both signatures:
313
+ // handleSubmit(text, skipProcessingCheck)
314
+ // handleSubmit(text, images)
315
+ // handleSubmit(text, images, skipProcessingCheck)
316
+ let images;
317
+ let skipProcessingCheck = false;
318
+ if (typeof skipProcessingCheckOrImages === 'boolean') {
319
+ skipProcessingCheck = skipProcessingCheckOrImages;
320
+ }
321
+ else if (Array.isArray(skipProcessingCheckOrImages)) {
322
+ images = skipProcessingCheckOrImages;
323
+ skipProcessingCheck = maybeSkip ?? false;
324
+ }
325
+ if (!stores || (!skipProcessingCheck && state.isProcessing))
326
+ return;
327
+ // Check for exit command
328
+ if (text.toLowerCase() === 'exit') {
329
+ cleanupMcpConfig(stores.mcpConfigPath);
330
+ exit();
331
+ return;
332
+ }
333
+ // Slash command routing
334
+ if (text.startsWith('/')) {
335
+ const command = text.split(/\s+/)[0].toLowerCase();
336
+ if (command === '/include') {
337
+ dispatch({ type: 'SET_OVERLAY', overlay: 'include' });
338
+ }
339
+ else if (command === '/revert') {
340
+ if (state.messages.length === 0) {
341
+ dispatch({ type: 'SET_ERROR', error: 'No messages to revert.' });
342
+ }
343
+ else {
344
+ dispatch({ type: 'SET_OVERLAY', overlay: 'revert' });
345
+ }
346
+ }
347
+ else if (command === '/exit') {
348
+ cleanupMcpConfig(stores.mcpConfigPath);
349
+ exit();
350
+ }
351
+ else {
352
+ dispatch({ type: 'SET_ERROR', error: `Unknown command: ${command}` });
353
+ }
354
+ return;
355
+ }
356
+ dispatch({ type: 'SET_PROCESSING', isProcessing: true });
357
+ dispatch({ type: 'SET_ERROR', error: null });
358
+ // Process images from file paths in the message text
359
+ const contentStorePath = getContentStorePath(getThreadPath(threadName));
360
+ let pathImages = [];
361
+ let cleanedText = text;
362
+ try {
363
+ const result = await processImagesInMessage(text, contentStorePath);
364
+ pathImages = result.images;
365
+ cleanedText = result.cleanedText;
366
+ // Show warnings for failed image paths
367
+ for (const err of result.errors) {
368
+ console.error(`[Image] ${err.path}: ${err.error}`);
369
+ }
370
+ }
371
+ catch {
372
+ // Image processing failure is non-fatal
373
+ }
374
+ // Merge path-detected images with clipboard-attached images from InputArea
375
+ const allImages = [...pathImages, ...(images ?? [])];
376
+ // Store pending images for onComplete
377
+ pendingImagesRef.current = allImages;
378
+ // Create fresh context budget for this turn
379
+ const budget = new ContextBudget();
380
+ // Deduct image tokens from budget (~1600 per image)
381
+ const imageTokenCost = allImages.length * 1600;
382
+ if (imageTokenCost > 0) {
383
+ budget.consume(imageTokenCost);
384
+ }
385
+ // Build the text that will be saved to history (with image indicators)
386
+ let historyText = cleanedText;
387
+ if (allImages.length > 0) {
388
+ const imageIndicators = allImages
389
+ .map(img => ` [IMAGE: ${img.originalPath === 'clipboard' ? 'clipboard' : img.resolvedPath}]`)
390
+ .join('\n');
391
+ historyText = cleanedText + '\n' + imageIndicators;
392
+ }
393
+ // Check if user input should be externalized
394
+ let messageForClaude = cleanedText;
395
+ if (shouldExternalizeUserInput(cleanedText, budget)) {
396
+ const { replacement } = await externalizeUserInput(cleanedText, stores.content);
397
+ messageForClaude = replacement;
398
+ }
399
+ else {
400
+ budget.consume(estimateTokens(cleanedText));
401
+ }
402
+ // Capture git snapshot before this turn
403
+ const gitSnapshot = await captureSnapshot();
404
+ // Save user message to history (with image indicators)
405
+ const userMessage = await stores.history.append({
406
+ role: 'user',
407
+ content: historyText,
408
+ metadata: {
409
+ sessionId: stores.session.getSessionId(),
410
+ ...(gitSnapshot && { gitSnapshot }),
411
+ ...(allImages.length > 0 && {
412
+ imageCount: allImages.length,
413
+ imagePaths: allImages.map(img => img.cachedPath),
414
+ }),
415
+ },
416
+ });
417
+ dispatch({ type: 'ADD_MESSAGE', message: userMessage });
418
+ // Update stats
419
+ const currentStats = await stores.history.getStats();
420
+ dispatch({ type: 'SET_STATS', stats: currentStats });
421
+ // Get recent messages for system prompt
422
+ const recentMessages = await stores.history.getRecent(RECENT_CONTEXT_COUNT);
423
+ const recentConversation = recentMessages
424
+ .filter(m => m.role !== 'session')
425
+ .map(m => ({ role: m.role, content: m.content }));
426
+ // Load and read always-include files
427
+ const globalConfig = await loadGlobalConfig();
428
+ const threadConfig = await loadThreadConfig(threadName);
429
+ const mergedConfig = mergeConfigs(globalConfig, threadConfig);
430
+ const alwaysInclude = await readAlwaysIncludeFiles(mergedConfig, process.cwd());
431
+ // Calculate dynamic RAG budget (account for image tokens)
432
+ const userQueryTokens = estimateTokens(cleanedText);
433
+ const ragBudget = Math.max(0, TOTAL_CONTEXT_BUDGET -
434
+ userQueryTokens -
435
+ imageTokenCost -
436
+ alwaysInclude.totalTokens -
437
+ RECENT_CONTEXT_BUDGET);
438
+ // Run automatic RAG retrieval
439
+ const threadPath = getThreadPath(threadName);
440
+ const sessionsPath = getSessionsPath(threadPath);
441
+ let retrievalResult = null;
442
+ try {
443
+ retrievalResult = await retrieve(text, stores.history, stores.content, {
444
+ budgetTokens: ragBudget,
445
+ currentSessionId: stores.session.getSessionId(),
446
+ sessionsPath,
447
+ recentMessages: recentConversation,
448
+ });
449
+ }
450
+ catch (err) {
451
+ // Retrieval failure is non-fatal, continue without retrieved context
452
+ console.error('[Retrieval error]', err);
453
+ }
454
+ const retrievedContext = retrievalResult?.context ?? '';
455
+ const systemPrompt = generateSystemPrompt(currentStats.count, currentStats.totalTokens, stores.session.getSessionId(), recentConversation, retrievedContext, alwaysInclude.formattedContext);
456
+ // Set debug context if debug mode is enabled
457
+ if (state.debugMode) {
458
+ dispatch({
459
+ type: 'SET_DEBUG_CONTEXT',
460
+ context: {
461
+ systemPrompt,
462
+ userMessage: messageForClaude,
463
+ recentMessages: recentConversation,
464
+ sessionId: stores.session.getSessionId(),
465
+ messageCount: currentStats.count,
466
+ tokenCount: currentStats.totalTokens,
467
+ retrieval: retrievalResult
468
+ ? {
469
+ historyCount: retrievalResult.historyCount,
470
+ contentCount: retrievalResult.contentCount,
471
+ tokensUsed: retrievalResult.tokensUsed,
472
+ debug: retrievalResult.debug,
473
+ }
474
+ : null,
475
+ alwaysInclude: {
476
+ files: alwaysInclude.files.map(f => ({
477
+ path: f.path,
478
+ resolvedPath: f.resolvedPath,
479
+ tokens: f.tokens,
480
+ truncated: f.truncated,
481
+ error: f.error,
482
+ })),
483
+ totalTokens: alwaysInclude.totalTokens,
484
+ },
485
+ budget: {
486
+ total: TOTAL_CONTEXT_BUDGET,
487
+ userQuery: userQueryTokens,
488
+ alwaysInclude: alwaysInclude.totalTokens,
489
+ recentContext: RECENT_CONTEXT_BUDGET,
490
+ ragAvailable: ragBudget,
491
+ ragUsed: retrievalResult?.tokensUsed ?? 0,
492
+ },
493
+ },
494
+ });
495
+ }
496
+ // Invoke Claude (pass images if any)
497
+ claudeProcess.invoke(messageForClaude, systemPrompt, allImages.length > 0 ? allImages : undefined);
498
+ }, [stores, state.isProcessing, state.debugMode, dispatch, exit, claudeProcess, threadName]);
499
+ // Handle interjection
500
+ const handleInterjection = useCallback(async (interjectionText) => {
501
+ if (!stores)
502
+ return;
503
+ // Kill Claude and get partial response
504
+ const partialResponse = claudeProcess.kill();
505
+ // Save partial response with interrupted metadata
506
+ if (partialResponse) {
507
+ const partialMessage = await stores.history.append({
508
+ role: 'assistant',
509
+ content: partialResponse,
510
+ metadata: {
511
+ sessionId: stores.session.getSessionId(),
512
+ interrupted: true,
513
+ },
514
+ });
515
+ // Clear stream BEFORE adding message to avoid the same Static/dynamic
516
+ // duplicate rendering issue as in onComplete
517
+ dispatch({ type: 'CLEAR_STREAM' });
518
+ dispatch({ type: 'ADD_MESSAGE', message: partialMessage });
519
+ }
520
+ else {
521
+ dispatch({ type: 'CLEAR_STREAM' });
522
+ }
523
+ // Note: We don't set isProcessing to false here because handleSubmit will set it to true
524
+ // and we need to skip the check anyway due to React's async state updates
525
+ // Submit the interjection as a new message, bypassing the stale isProcessing check
526
+ await handleSubmit(interjectionText, true);
527
+ }, [stores, claudeProcess, dispatch, handleSubmit]);
528
+ const handleOverlayClose = useCallback(() => {
529
+ dispatch({ type: 'SET_OVERLAY', overlay: null });
530
+ }, [dispatch]);
531
+ // Handle revert completion: reload state from truncated history
532
+ const handleRevert = useCallback(async () => {
533
+ if (!stores)
534
+ return;
535
+ // Reload messages from truncated JSONL
536
+ const messages = await stores.history.getAll();
537
+ dispatch({ type: 'SET_MESSAGES', messages });
538
+ // Update stats
539
+ const stats = await stores.history.getStats();
540
+ dispatch({ type: 'SET_STATS', stats });
541
+ // Create new SessionManager (old session context is stale after revert)
542
+ const threadPath = getThreadPath(threadName);
543
+ const sessionsPath = getSessionsPath(threadPath);
544
+ const newSession = new SessionManager(sessionsPath, threadName);
545
+ await newSession.initialize();
546
+ dispatch({ type: 'SET_SESSION_ID', sessionId: newSession.getSessionId() });
547
+ // Regenerate MCP config with new session ID
548
+ cleanupMcpConfig(stores.mcpConfigPath);
549
+ const newMcpConfigPath = generateMcpConfig(threadPath, newSession.getSessionId());
550
+ setStores({
551
+ ...stores,
552
+ session: newSession,
553
+ mcpConfigPath: newMcpConfigPath,
554
+ });
555
+ dispatch({ type: 'SET_OVERLAY', overlay: null });
556
+ }, [stores, dispatch, threadName]);
557
+ // Handle Ctrl+C
558
+ useEffect(() => {
559
+ const handler = () => {
560
+ if (stores) {
561
+ cleanupMcpConfig(stores.mcpConfigPath);
562
+ }
563
+ exit();
564
+ };
565
+ process.on('SIGINT', handler);
566
+ return () => {
567
+ process.off('SIGINT', handler);
568
+ };
569
+ }, [stores, exit]);
570
+ // Auto-follow-up when Claude indicates a background task was launched
571
+ useEffect(() => {
572
+ if (!state.pendingAutoFollowUp || state.isProcessing) {
573
+ return;
574
+ }
575
+ dispatch({ type: 'SET_PENDING_AUTO_FOLLOW_UP', pending: false });
576
+ // Small delay to let the UI update before sending follow-up
577
+ const timer = setTimeout(() => {
578
+ handleSubmit('Please share the results.', true);
579
+ }, 100);
580
+ return () => clearTimeout(timer);
581
+ }, [state.pendingAutoFollowUp, state.isProcessing, dispatch, handleSubmit]);
582
+ // Two-phase completion: flush pending message to Static after Ink has cleared
583
+ // the dynamic StreamingResponse area. This prevents the duplication bug where
584
+ // Ink's Static write pushes the streaming remnant into scrollback before eraseLines
585
+ // can clean it up.
586
+ useEffect(() => {
587
+ if (!state.pendingMessage)
588
+ return;
589
+ const timer = setTimeout(() => {
590
+ dispatch({ type: 'FLUSH_PENDING_MESSAGE' });
591
+ }, 50);
592
+ return () => clearTimeout(timer);
593
+ }, [state.pendingMessage, dispatch]);
594
+ // Handle keyboard shortcuts for debug mode
595
+ useInput((input, key) => {
596
+ // Ctrl+D toggles debug context expansion
597
+ if (state.debugMode && state.debugContext && key.ctrl && input === 'd') {
598
+ dispatch({ type: 'TOGGLE_DEBUG_EXPANDED' });
599
+ }
600
+ }, { isActive: state.debugMode && !!state.debugContext && !state.overlay });
601
+ const contextValue = useMemo(() => ({ state, dispatch }), [state, dispatch]);
602
+ if (!initialized) {
603
+ return (_jsx(Box, { children: _jsxs(Text, { children: ["Loading thread: ", threadName, "..."] }) }));
604
+ }
605
+ return (_jsx(AppContext.Provider, { value: contextValue, children: _jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { marginBottom: 1, children: [_jsxs(Text, { color: "cyan", bold: true, children: ["Cumulus - Thread: ", threadName] }), state.stats.count > 0 && (_jsxs(Text, { color: "gray", children: [' ', "| Continuing (", state.stats.count, " messages, ~", state.stats.totalTokens, " tokens)"] })), state.debugMode && (_jsxs(Text, { color: "magenta", bold: true, children: [' ', "| DEBUG MODE"] }))] }), state.debugMode && state.debugContext && (_jsx(Box, { marginBottom: 1, children: _jsx(DebugContextView, { context: state.debugContext, expanded: state.debugContextExpanded }) })), _jsx(MessageHistory, { messages: state.messages }), _jsx(StreamingResponse, { content: state.streamBuffer }), state.overlay === 'include' && (_jsx(IncludeMenu, { threadName: threadName, onClose: handleOverlayClose })), state.overlay === 'revert' && stores && (_jsx(RevertMenu, { messages: state.messages, threadName: threadName, historyStore: stores.history, onRevert: handleRevert, onClose: handleOverlayClose })), _jsx(InputArea, { isProcessing: state.isProcessing, onSubmit: handleSubmit, onInterjection: handleInterjection, isOverlayActive: !!state.overlay, contentBasePath: stores ? getContentStorePath(getThreadPath(threadName)) : undefined, commands: SLASH_COMMANDS }), _jsx(StatusBar, { threadName: state.threadName, stats: state.stats, isProcessing: state.isProcessing, error: state.error })] }) }));
606
+ }
607
+ //# sourceMappingURL=App.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"App.js","sourceRoot":"","sources":["../../../src/tui/components/App.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Debug view component that displays the context being sent to Claude
3
+ * with color-coding to indicate provenance of each section.
4
+ */
5
+ import React from 'react';
6
+ import type { DebugContext } from '../hooks/useAppState.js';
7
+ interface DebugContextViewProps {
8
+ context: DebugContext;
9
+ expanded?: boolean;
10
+ }
11
+ export declare function DebugContextView({ context, expanded, }: DebugContextViewProps): React.ReactElement;
12
+ export {};
13
+ //# sourceMappingURL=DebugContextView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DebugContextView.d.ts","sourceRoot":"","sources":["../../../src/tui/components/DebugContextView.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAE5D,UAAU,qBAAqB;IAC7B,OAAO,EAAE,YAAY,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AA0BD,wBAAgB,gBAAgB,CAAC,EAC/B,OAAO,EACP,QAAe,GAChB,EAAE,qBAAqB,GAAG,KAAK,CAAC,YAAY,CAoO5C"}