@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,110 @@
1
+ /**
2
+ * Application state management with context and reducer.
3
+ */
4
+ import { createContext, useContext, useReducer } from 'react';
5
+ export function createInitialState(threadName, debugMode = false) {
6
+ return {
7
+ messages: [],
8
+ streamBuffer: '',
9
+ isProcessing: false,
10
+ stats: { count: 0, totalTokens: 0 },
11
+ error: null,
12
+ threadName,
13
+ sessionId: null,
14
+ pendingAutoFollowUp: false,
15
+ debugMode,
16
+ debugContext: null,
17
+ debugContextExpanded: true,
18
+ overlay: null,
19
+ pendingMessage: null,
20
+ };
21
+ }
22
+ export function appReducer(state, action) {
23
+ switch (action.type) {
24
+ case 'SET_MESSAGES':
25
+ return { ...state, messages: action.messages };
26
+ case 'ADD_MESSAGE':
27
+ // Prevent duplicate messages (same ID)
28
+ if (state.messages.some(m => m.id === action.message.id)) {
29
+ return state;
30
+ }
31
+ return { ...state, messages: [...state.messages, action.message] };
32
+ case 'UPDATE_STREAM':
33
+ return { ...state, streamBuffer: action.text };
34
+ case 'APPEND_STREAM':
35
+ return { ...state, streamBuffer: state.streamBuffer + action.text };
36
+ case 'CLEAR_STREAM':
37
+ return { ...state, streamBuffer: '' };
38
+ case 'COMPLETE_RESPONSE':
39
+ // Phase 1: Clear stream + stop processing. Hold message in pendingMessage.
40
+ // The message is NOT added to messages[] yet — that happens in FLUSH_PENDING_MESSAGE
41
+ // on the next render cycle. This two-phase approach lets Ink erase the dynamic
42
+ // StreamingResponse area BEFORE Static writes the permanent message, preventing
43
+ // the duplication bug where both truncated streaming and full Static content
44
+ // appear simultaneously.
45
+ if (state.messages.some(m => m.id === action.message.id)) {
46
+ return { ...state, streamBuffer: '', isProcessing: false };
47
+ }
48
+ return {
49
+ ...state,
50
+ streamBuffer: '',
51
+ isProcessing: false,
52
+ pendingMessage: action.message,
53
+ };
54
+ case 'FLUSH_PENDING_MESSAGE':
55
+ // Phase 2: Move pending message into messages[] for Static rendering.
56
+ // By now, Ink has already erased the dynamic area from the previous render.
57
+ if (!state.pendingMessage)
58
+ return state;
59
+ if (state.messages.some(m => m.id === state.pendingMessage.id)) {
60
+ return { ...state, pendingMessage: null };
61
+ }
62
+ return {
63
+ ...state,
64
+ messages: [...state.messages, state.pendingMessage],
65
+ pendingMessage: null,
66
+ };
67
+ case 'SET_PROCESSING':
68
+ return { ...state, isProcessing: action.isProcessing };
69
+ case 'SET_STATS':
70
+ return { ...state, stats: action.stats };
71
+ case 'SET_ERROR':
72
+ return { ...state, error: action.error };
73
+ case 'SET_SESSION_ID':
74
+ return { ...state, sessionId: action.sessionId };
75
+ case 'MARK_INTERRUPTED':
76
+ // Save partial response as a message with interrupted metadata
77
+ return state;
78
+ case 'SET_PENDING_AUTO_FOLLOW_UP':
79
+ return { ...state, pendingAutoFollowUp: action.pending };
80
+ case 'SET_DEBUG_MODE':
81
+ return { ...state, debugMode: action.debugMode };
82
+ case 'SET_DEBUG_CONTEXT':
83
+ // When setting new context, auto-expand it
84
+ return {
85
+ ...state,
86
+ debugContext: action.context,
87
+ debugContextExpanded: action.context !== null,
88
+ };
89
+ case 'SET_DEBUG_EXPANDED':
90
+ return { ...state, debugContextExpanded: action.expanded };
91
+ case 'TOGGLE_DEBUG_EXPANDED':
92
+ return { ...state, debugContextExpanded: !state.debugContextExpanded };
93
+ case 'SET_OVERLAY':
94
+ return { ...state, overlay: action.overlay };
95
+ default:
96
+ return state;
97
+ }
98
+ }
99
+ export const AppContext = createContext(null);
100
+ export function useAppContext() {
101
+ const context = useContext(AppContext);
102
+ if (!context) {
103
+ throw new Error('useAppContext must be used within AppContext.Provider');
104
+ }
105
+ return context;
106
+ }
107
+ export function useAppReducer(threadName, debugMode = false) {
108
+ return useReducer(appReducer, { threadName, debugMode }, ({ threadName, debugMode }) => createInitialState(threadName, debugMode));
109
+ }
110
+ //# sourceMappingURL=useAppState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAppState.js","sourceRoot":"","sources":["../../../src/tui/hooks/useAppState.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Hook for managing Claude subprocess and streaming.
3
+ */
4
+ import { ContentStore } from '../../lib/content-store.js';
5
+ import type { DetectedImage } from '../../lib/image-utils.js';
6
+ export interface ClaudeProcessOptions {
7
+ mcpConfigPath: string;
8
+ contentStore: ContentStore;
9
+ onText: (text: string) => void;
10
+ onComplete: (fullResponse: string) => void;
11
+ onError: (error: string) => void;
12
+ onExternalize?: (contentId: string, sizeKB: number) => void;
13
+ }
14
+ export interface ClaudeProcessHandle {
15
+ invoke: (userMessage: string, systemPrompt: string, images?: DetectedImage[]) => void;
16
+ kill: () => string;
17
+ }
18
+ export declare function useClaudeProcess(options: ClaudeProcessOptions): ClaudeProcessHandle;
19
+ //# sourceMappingURL=useClaudeProcess.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useClaudeProcess.d.ts","sourceRoot":"","sources":["../../../src/tui/hooks/useClaudeProcess.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAI9D,MAAM,WAAW,oBAAoB;IACnC,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,YAAY,CAAC;IAC3B,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,UAAU,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,aAAa,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7D;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,aAAa,EAAE,KAAK,IAAI,CAAC;IACtF,IAAI,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,oBAAoB,GAAG,mBAAmB,CA2MnF"}
@@ -0,0 +1,185 @@
1
+ /**
2
+ * Hook for managing Claude subprocess and streaming.
3
+ */
4
+ import { spawn } from 'child_process';
5
+ import { useCallback, useRef } from 'react';
6
+ import { ContextBudget } from '../../lib/context-budget.js';
7
+ import { StreamProcessor } from '../../lib/stream-processor.js';
8
+ import { extractTextFromStreamLine } from '../utils/streamParser.js';
9
+ export function useClaudeProcess(options) {
10
+ const { mcpConfigPath, contentStore, onText, onComplete, onError, onExternalize } = options;
11
+ const processRef = useRef(null);
12
+ const responseRef = useRef('');
13
+ const bufferRef = useRef('');
14
+ const completedRef = useRef(false);
15
+ const kill = useCallback(() => {
16
+ const partial = responseRef.current;
17
+ if (processRef.current) {
18
+ processRef.current.kill('SIGTERM');
19
+ processRef.current = null;
20
+ }
21
+ return partial;
22
+ }, []);
23
+ const invoke = useCallback((userMessage, systemPrompt, images) => {
24
+ // Reset state
25
+ responseRef.current = '';
26
+ bufferRef.current = '';
27
+ completedRef.current = false;
28
+ // Create fresh context budget and stream processor for this turn
29
+ const budget = new ContextBudget();
30
+ const streamProcessor = new StreamProcessor({
31
+ budget,
32
+ contentStore,
33
+ onExternalize: onExternalize
34
+ ? (contentId, originalSize) => {
35
+ const sizeKB = Math.round(originalSize / 1024);
36
+ onExternalize(contentId, sizeKB);
37
+ }
38
+ : undefined,
39
+ });
40
+ const hasImages = images && images.length > 0;
41
+ // Prepend system-style instruction for cumulus read_file preference
42
+ const readFileReminder = `<system-reminder>
43
+ FILE READING: The built-in Read tool is DISABLED. Use read_file for ALL file reads (text, code, PDFs).
44
+ - read_file reads the file, extracts text (including from PDFs), chunks it, embeds it, and stores it for future retrieval
45
+ - You receive a summary, content ID, and chunk table-of-contents
46
+ - Use the TOC to navigate: read_content_chunk("contentId", chunkIndex) for specific sections
47
+ - Use search_content("query") to find content across all stored files
48
+ </system-reminder>\n`;
49
+ const prefixedMessage = readFileReminder + userMessage;
50
+ const args = [
51
+ '--print',
52
+ '--verbose',
53
+ '--output-format',
54
+ 'stream-json',
55
+ '--permission-mode',
56
+ 'bypassPermissions',
57
+ '--mcp-config',
58
+ mcpConfigPath,
59
+ '--append-system-prompt',
60
+ systemPrompt,
61
+ ];
62
+ if (hasImages) {
63
+ // Use stdin-based stream-json input for multimodal messages
64
+ args.push('--input-format', 'stream-json');
65
+ }
66
+ else {
67
+ // Text-only: pass as positional argument (with system-reminder prefix)
68
+ args.push(prefixedMessage);
69
+ }
70
+ // Filter out Claude Code env vars so child process is isolated
71
+ const cleanEnv = Object.fromEntries(Object.entries(process.env).filter(([key]) => !key.startsWith('CLAUDE') && key !== 'CLAUDECODE'));
72
+ const claude = spawn('claude', args, {
73
+ stdio: [hasImages ? 'pipe' : 'ignore', 'pipe', 'pipe'],
74
+ env: cleanEnv,
75
+ });
76
+ processRef.current = claude;
77
+ // Write multimodal content to stdin when images are present
78
+ if (hasImages && claude.stdin) {
79
+ const contentBlocks = [];
80
+ for (const img of images) {
81
+ contentBlocks.push({
82
+ type: 'image',
83
+ source: {
84
+ type: 'base64',
85
+ media_type: img.mediaType,
86
+ data: img.base64Data,
87
+ },
88
+ });
89
+ }
90
+ contentBlocks.push({
91
+ type: 'text',
92
+ text: prefixedMessage,
93
+ });
94
+ const stdinPayload = JSON.stringify({
95
+ type: 'user',
96
+ message: {
97
+ role: 'user',
98
+ content: contentBlocks,
99
+ },
100
+ });
101
+ claude.stdin.write(stdinPayload + '\n');
102
+ claude.stdin.end();
103
+ }
104
+ const processLine = async (line) => {
105
+ if (!line.trim())
106
+ return;
107
+ // Process through StreamProcessor for potential content externalization
108
+ let processed;
109
+ try {
110
+ processed = await streamProcessor.processLine(line);
111
+ }
112
+ catch (err) {
113
+ console.error('[useClaudeProcess] StreamProcessor error:', err);
114
+ processed = { line, modified: false, eventType: 'unknown' };
115
+ }
116
+ const lineToUse = processed.line;
117
+ const text = extractTextFromStreamLine(lineToUse);
118
+ if (text) {
119
+ // Add separator between distinct assistant message events (e.g., text
120
+ // segments separated by tool use). Without this, consecutive assistant
121
+ // texts get concatenated with no whitespace between them.
122
+ if (responseRef.current && !responseRef.current.endsWith('\n')) {
123
+ responseRef.current += '\n\n';
124
+ onText('\n\n');
125
+ }
126
+ responseRef.current += text;
127
+ onText(text);
128
+ }
129
+ };
130
+ claude.stdout.on('data', (data) => {
131
+ bufferRef.current += data.toString();
132
+ const lines = bufferRef.current.split('\n');
133
+ bufferRef.current = lines.pop() || '';
134
+ for (const line of lines) {
135
+ processLine(line).catch(() => {
136
+ // Ignore processing errors
137
+ });
138
+ }
139
+ });
140
+ claude.stderr.on('data', (data) => {
141
+ const text = data.toString();
142
+ if (text.includes('Error') || text.includes('error')) {
143
+ onError(text);
144
+ }
145
+ });
146
+ claude.on('close', code => {
147
+ processRef.current = null;
148
+ // Guard against double completion
149
+ if (completedRef.current)
150
+ return;
151
+ const handleCompletion = () => {
152
+ if (completedRef.current)
153
+ return;
154
+ completedRef.current = true;
155
+ if (code === 0) {
156
+ onComplete(responseRef.current);
157
+ }
158
+ else if (code !== null) {
159
+ onError(`Claude exited with code ${code}`);
160
+ }
161
+ // code === null means process was killed (interjection)
162
+ };
163
+ // Process any remaining buffer
164
+ if (bufferRef.current.trim()) {
165
+ processLine(bufferRef.current)
166
+ .catch(() => { })
167
+ .finally(handleCompletion);
168
+ }
169
+ else {
170
+ handleCompletion();
171
+ }
172
+ });
173
+ claude.on('error', err => {
174
+ processRef.current = null;
175
+ if (err.message.includes('ENOENT')) {
176
+ onError('Claude CLI not found. Please install it first.');
177
+ }
178
+ else {
179
+ onError(err.message);
180
+ }
181
+ });
182
+ }, [mcpConfigPath, contentStore, onText, onComplete, onError, onExternalize]);
183
+ return { invoke, kill };
184
+ }
185
+ //# sourceMappingURL=useClaudeProcess.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useClaudeProcess.js","sourceRoot":"","sources":["../../../src/tui/hooks/useClaudeProcess.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * TUI entry point - renders the ink-based App component.
4
+ */
5
+ export interface TuiOptions {
6
+ threadName: string;
7
+ debugMode?: boolean;
8
+ }
9
+ export declare function startTui(options: TuiOptions): void;
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tui/index.tsx"],"names":[],"mappings":";AACA;;GAEG;AAMH,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI,CAElD"}
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env node
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ /**
4
+ * TUI entry point - renders the ink-based App component.
5
+ */
6
+ import { render } from 'ink';
7
+ import { App } from './components/App.js';
8
+ export function startTui(options) {
9
+ render(_jsx(App, { threadName: options.threadName, debugMode: options.debugMode ?? false }));
10
+ }
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tui/index.tsx"],"names":[],"mappings":";;AACA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAE7B,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAO1C,MAAM,UAAU,QAAQ,CAAC,OAAmB;IAC1C,MAAM,CAAC,KAAC,GAAG,IAAC,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,KAAK,GAAI,CAAC,CAAC;AACzF,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Utilities for parsing stream-json output from Claude CLI.
3
+ */
4
+ export interface StreamJsonMessage {
5
+ type?: string;
6
+ subtype?: string;
7
+ message?: {
8
+ content?: Array<{
9
+ type: string;
10
+ text?: string;
11
+ }>;
12
+ };
13
+ result?: string;
14
+ }
15
+ /**
16
+ * Extract text content from a stream-json line.
17
+ * Returns null if the line doesn't contain assistant text.
18
+ */
19
+ export declare function extractTextFromStreamLine(line: string): string | null;
20
+ /**
21
+ * Check if a stream line indicates completion.
22
+ */
23
+ export declare function isStreamComplete(line: string): boolean;
24
+ /**
25
+ * Check if a stream line indicates an error.
26
+ */
27
+ export declare function isStreamError(line: string): {
28
+ isError: boolean;
29
+ message?: string;
30
+ };
31
+ //# sourceMappingURL=streamParser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streamParser.d.ts","sourceRoot":"","sources":["../../../src/tui/utils/streamParser.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE;QACR,OAAO,CAAC,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KAClD,CAAC;IACF,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAqBrE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAStD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAelF"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Utilities for parsing stream-json output from Claude CLI.
3
+ */
4
+ /**
5
+ * Extract text content from a stream-json line.
6
+ * Returns null if the line doesn't contain assistant text.
7
+ */
8
+ export function extractTextFromStreamLine(line) {
9
+ if (!line.trim())
10
+ return null;
11
+ try {
12
+ const parsed = JSON.parse(line);
13
+ // Handle assistant message with content
14
+ if (parsed.type === 'assistant' && parsed.message?.content) {
15
+ const texts = [];
16
+ for (const block of parsed.message.content) {
17
+ if (block.type === 'text' && block.text) {
18
+ texts.push(block.text);
19
+ }
20
+ }
21
+ return texts.length > 0 ? texts.join('\n\n') : null;
22
+ }
23
+ return null;
24
+ }
25
+ catch {
26
+ return null;
27
+ }
28
+ }
29
+ /**
30
+ * Check if a stream line indicates completion.
31
+ */
32
+ export function isStreamComplete(line) {
33
+ if (!line.trim())
34
+ return false;
35
+ try {
36
+ const parsed = JSON.parse(line);
37
+ return parsed.type === 'result' || parsed.subtype === 'success';
38
+ }
39
+ catch {
40
+ return false;
41
+ }
42
+ }
43
+ /**
44
+ * Check if a stream line indicates an error.
45
+ */
46
+ export function isStreamError(line) {
47
+ if (!line.trim())
48
+ return { isError: false };
49
+ try {
50
+ const parsed = JSON.parse(line);
51
+ if (parsed.type === 'error') {
52
+ return {
53
+ isError: true,
54
+ message: parsed.error || parsed.message || 'Unknown error',
55
+ };
56
+ }
57
+ return { isError: false };
58
+ }
59
+ catch {
60
+ return { isError: false };
61
+ }
62
+ }
63
+ //# sourceMappingURL=streamParser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streamParser.js","sourceRoot":"","sources":["../../../src/tui/utils/streamParser.ts"],"names":[],"mappings":"AAAA;;GAEG;AAWH;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CAAC,IAAY;IACpD,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;QAAE,OAAO,IAAI,CAAC;IAE9B,IAAI,CAAC;QACH,MAAM,MAAM,GAAsB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAEnD,wCAAwC;QACxC,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW,IAAI,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC;YAC3D,MAAM,KAAK,GAAa,EAAE,CAAC;YAC3B,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;gBAC3C,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;oBACxC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACzB,CAAC;YACH,CAAC;YACD,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACtD,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;QAAE,OAAO,KAAK,CAAC;IAE/B,IAAI,CAAC;QACH,MAAM,MAAM,GAAsB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACnD,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,CAAC;IAClE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAE5C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAwD,CAAC;QACvF,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC5B,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,OAAO,IAAI,eAAe;aAC3D,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC5B,CAAC;AACH,CAAC"}
package/package.json ADDED
@@ -0,0 +1,94 @@
1
+ {
2
+ "name": "@luckydraw/cumulus",
3
+ "version": "0.5.1",
4
+ "description": "RLM-based CLI chat wrapper for Claude with external history context management",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ },
13
+ "./mcp": {
14
+ "types": "./dist/mcp/index.d.ts",
15
+ "import": "./dist/mcp/index.js"
16
+ },
17
+ "./mcp/proxy": {
18
+ "import": "./dist/mcp/proxy.js"
19
+ }
20
+ },
21
+ "files": [
22
+ "dist/",
23
+ "package.json"
24
+ ],
25
+ "bin": {
26
+ "cumulus": "./dist/cli/cumulus.js",
27
+ "cumulus-mcp": "./dist/mcp/index.js"
28
+ },
29
+ "scripts": {
30
+ "build": "tsc",
31
+ "dev": "tsc --watch",
32
+ "lint": "eslint src",
33
+ "lint:fix": "eslint src --fix",
34
+ "format": "prettier --write \"src/**/*.{ts,tsx,json,md}\"",
35
+ "format:check": "prettier --check \"src/**/*.{ts,tsx,json,md}\"",
36
+ "type-check": "tsc --noEmit",
37
+ "test": "vitest",
38
+ "prepublishOnly": "npm run build && npm run type-check",
39
+ "prepare": "husky"
40
+ },
41
+ "keywords": [
42
+ "claude",
43
+ "cli",
44
+ "chat",
45
+ "rlm",
46
+ "context",
47
+ "mcp"
48
+ ],
49
+ "author": "",
50
+ "license": "MIT",
51
+ "publishConfig": {
52
+ "access": "public"
53
+ },
54
+ "engines": {
55
+ "node": ">=20.0.0"
56
+ },
57
+ "lint-staged": {
58
+ "*.{ts,tsx}": [
59
+ "eslint --fix",
60
+ "prettier --write"
61
+ ],
62
+ "*.{js,json,md}": [
63
+ "prettier --write"
64
+ ]
65
+ },
66
+ "devDependencies": {
67
+ "@eslint/js": "^9.39.2",
68
+ "@types/node": "^25.0.10",
69
+ "@types/react": "^18.3.27",
70
+ "@vitest/coverage-v8": "^4.0.18",
71
+ "eslint": "^9.39.2",
72
+ "eslint-import-resolver-typescript": "^4.4.4",
73
+ "eslint-plugin-import": "^2.32.0",
74
+ "globals": "^17.2.0",
75
+ "husky": "^9.1.7",
76
+ "ink-testing-library": "^4.0.0",
77
+ "lint-staged": "^16.2.7",
78
+ "prettier": "^3.8.1",
79
+ "typescript": "^5.9.3",
80
+ "typescript-eslint": "^8.54.0",
81
+ "vitest": "^4.0.18"
82
+ },
83
+ "dependencies": {
84
+ "@huggingface/transformers": "^3.8.1",
85
+ "@modelcontextprotocol/sdk": "^1.25.3",
86
+ "commander": "^14.0.2",
87
+ "ink": "^5.2.1",
88
+ "ink-spinner": "^5.0.0",
89
+ "ink-text-input": "^6.0.0",
90
+ "nanoid": "^5.1.6",
91
+ "pdfjs-dist": "^5.4.624",
92
+ "react": "^18.3.1"
93
+ }
94
+ }