@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,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
|
+
}
|