@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.
- package/README.md +148 -0
- package/dist/cli/cumulus.d.ts +3 -0
- package/dist/cli/cumulus.d.ts.map +1 -0
- package/dist/cli/cumulus.js +233 -0
- package/dist/cli/cumulus.js.map +1 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +43 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/config.d.ts +86 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +241 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/content-detector.d.ts +46 -0
- package/dist/lib/content-detector.d.ts.map +1 -0
- package/dist/lib/content-detector.js +359 -0
- package/dist/lib/content-detector.js.map +1 -0
- package/dist/lib/content-store.d.ts +255 -0
- package/dist/lib/content-store.d.ts.map +1 -0
- package/dist/lib/content-store.js +955 -0
- package/dist/lib/content-store.js.map +1 -0
- package/dist/lib/context-budget.d.ts +83 -0
- package/dist/lib/context-budget.d.ts.map +1 -0
- package/dist/lib/context-budget.js +101 -0
- package/dist/lib/context-budget.js.map +1 -0
- package/dist/lib/embeddings.d.ts +64 -0
- package/dist/lib/embeddings.d.ts.map +1 -0
- package/dist/lib/embeddings.js +176 -0
- package/dist/lib/embeddings.js.map +1 -0
- package/dist/lib/history.d.ts +120 -0
- package/dist/lib/history.d.ts.map +1 -0
- package/dist/lib/history.js +205 -0
- package/dist/lib/history.js.map +1 -0
- package/dist/lib/image-utils.d.ts +41 -0
- package/dist/lib/image-utils.d.ts.map +1 -0
- package/dist/lib/image-utils.js +288 -0
- package/dist/lib/image-utils.js.map +1 -0
- package/dist/lib/migrate.d.ts +35 -0
- package/dist/lib/migrate.d.ts.map +1 -0
- package/dist/lib/migrate.js +196 -0
- package/dist/lib/migrate.js.map +1 -0
- package/dist/lib/retriever.d.ts +56 -0
- package/dist/lib/retriever.d.ts.map +1 -0
- package/dist/lib/retriever.js +644 -0
- package/dist/lib/retriever.js.map +1 -0
- package/dist/lib/revert.d.ts +23 -0
- package/dist/lib/revert.d.ts.map +1 -0
- package/dist/lib/revert.js +75 -0
- package/dist/lib/revert.js.map +1 -0
- package/dist/lib/session.d.ts +65 -0
- package/dist/lib/session.d.ts.map +1 -0
- package/dist/lib/session.js +289 -0
- package/dist/lib/session.js.map +1 -0
- package/dist/lib/snapshots.d.ts +39 -0
- package/dist/lib/snapshots.d.ts.map +1 -0
- package/dist/lib/snapshots.js +99 -0
- package/dist/lib/snapshots.js.map +1 -0
- package/dist/lib/stream-processor.d.ts +149 -0
- package/dist/lib/stream-processor.d.ts.map +1 -0
- package/dist/lib/stream-processor.js +389 -0
- package/dist/lib/stream-processor.js.map +1 -0
- package/dist/lib/summarizer.d.ts +67 -0
- package/dist/lib/summarizer.d.ts.map +1 -0
- package/dist/lib/summarizer.js +213 -0
- package/dist/lib/summarizer.js.map +1 -0
- package/dist/mcp/index.d.ts +3 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +16 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/proxy.d.ts +19 -0
- package/dist/mcp/proxy.d.ts.map +1 -0
- package/dist/mcp/proxy.js +120 -0
- package/dist/mcp/proxy.js.map +1 -0
- package/dist/mcp/server.d.ts +6 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +29 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/shared-server.d.ts +21 -0
- package/dist/mcp/shared-server.d.ts.map +1 -0
- package/dist/mcp/shared-server.js +210 -0
- package/dist/mcp/shared-server.js.map +1 -0
- package/dist/mcp/tool-handler.d.ts +20 -0
- package/dist/mcp/tool-handler.d.ts.map +1 -0
- package/dist/mcp/tool-handler.js +1405 -0
- package/dist/mcp/tool-handler.js.map +1 -0
- package/dist/tui/components/App.d.ts +11 -0
- package/dist/tui/components/App.d.ts.map +1 -0
- package/dist/tui/components/App.js +607 -0
- package/dist/tui/components/App.js.map +1 -0
- package/dist/tui/components/DebugContextView.d.ts +13 -0
- package/dist/tui/components/DebugContextView.d.ts.map +1 -0
- package/dist/tui/components/DebugContextView.js +78 -0
- package/dist/tui/components/DebugContextView.js.map +1 -0
- package/dist/tui/components/IncludeMenu.d.ts +12 -0
- package/dist/tui/components/IncludeMenu.d.ts.map +1 -0
- package/dist/tui/components/IncludeMenu.js +127 -0
- package/dist/tui/components/IncludeMenu.js.map +1 -0
- package/dist/tui/components/InputArea.d.ts +27 -0
- package/dist/tui/components/InputArea.d.ts.map +1 -0
- package/dist/tui/components/InputArea.js +366 -0
- package/dist/tui/components/InputArea.js.map +1 -0
- package/dist/tui/components/MarkdownText.d.ts +38 -0
- package/dist/tui/components/MarkdownText.d.ts.map +1 -0
- package/dist/tui/components/MarkdownText.js +234 -0
- package/dist/tui/components/MarkdownText.js.map +1 -0
- package/dist/tui/components/MessageBubble.d.ts +11 -0
- package/dist/tui/components/MessageBubble.d.ts.map +1 -0
- package/dist/tui/components/MessageBubble.js +16 -0
- package/dist/tui/components/MessageBubble.js.map +1 -0
- package/dist/tui/components/MessageHistory.d.ts +11 -0
- package/dist/tui/components/MessageHistory.d.ts.map +1 -0
- package/dist/tui/components/MessageHistory.js +12 -0
- package/dist/tui/components/MessageHistory.js.map +1 -0
- package/dist/tui/components/RevertMenu.d.ts +17 -0
- package/dist/tui/components/RevertMenu.d.ts.map +1 -0
- package/dist/tui/components/RevertMenu.js +144 -0
- package/dist/tui/components/RevertMenu.js.map +1 -0
- package/dist/tui/components/StatusBar.d.ts +14 -0
- package/dist/tui/components/StatusBar.d.ts.map +1 -0
- package/dist/tui/components/StatusBar.js +13 -0
- package/dist/tui/components/StatusBar.js.map +1 -0
- package/dist/tui/components/StreamingResponse.d.ts +15 -0
- package/dist/tui/components/StreamingResponse.d.ts.map +1 -0
- package/dist/tui/components/StreamingResponse.js +52 -0
- package/dist/tui/components/StreamingResponse.js.map +1 -0
- package/dist/tui/hooks/useAppState.d.ts +147 -0
- package/dist/tui/hooks/useAppState.d.ts.map +1 -0
- package/dist/tui/hooks/useAppState.js +110 -0
- package/dist/tui/hooks/useAppState.js.map +1 -0
- package/dist/tui/hooks/useClaudeProcess.d.ts +19 -0
- package/dist/tui/hooks/useClaudeProcess.d.ts.map +1 -0
- package/dist/tui/hooks/useClaudeProcess.js +185 -0
- package/dist/tui/hooks/useClaudeProcess.js.map +1 -0
- package/dist/tui/index.d.ts +10 -0
- package/dist/tui/index.d.ts.map +1 -0
- package/dist/tui/index.js +11 -0
- package/dist/tui/index.js.map +1 -0
- package/dist/tui/utils/streamParser.d.ts +31 -0
- package/dist/tui/utils/streamParser.d.ts.map +1 -0
- package/dist/tui/utils/streamParser.js +63 -0
- package/dist/tui/utils/streamParser.js.map +1 -0
- 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"}
|