@luckydraw/cumulus 0.9.1 → 0.10.0

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/dist/index.d.ts CHANGED
@@ -31,6 +31,8 @@ export { getSummary, getSummaryPath, loadSummaries, runSummarization, saveSummar
31
31
  export type { GetSummaryResult, Summary, SummaryFile } from './lib/summarizer.js';
32
32
  export { executeRevert } from './lib/revert.js';
33
33
  export type { RevertResult, RevertOptions } from './lib/revert.js';
34
+ export { sendMessage, getOrCreateThread, clearThreadCache, resolveClaudeCli, resolveNode, truncateToTokens, formatRecentContext, generateSystemPrompt, generateMcpConfig, cleanupMcpConfig, parseStreamSegments, extractTextFromStreamLine, computeAvgRelevance, SYSTEM_PROMPT_TEMPLATE, FILE_READ_REMINDER, RECENT_CONTEXT_COUNT, RECENT_MSG_MAX_TOKENS, RECENT_CONTEXT_BUDGET, } from './lib/gateway.js';
35
+ export type { StreamSegment, DebugSnapshot, McpServerEntry, MessagePipelineOptions, MessagePipelineResult, ThreadState, } from './lib/gateway.js';
34
36
  export { startSharedMcpServer } from './mcp/shared-server.js';
35
37
  export type { SharedMcpServerOptions, SharedMcpServerHandle } from './mcp/shared-server.js';
36
38
  /** Absolute path to the lightweight stdio→HTTP proxy script for shared MCP server */
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -32,6 +32,8 @@ export { isGitRepo, captureSnapshot, restoreSnapshot } from './lib/snapshots.js'
32
32
  export { getSummary, getSummaryPath, loadSummaries, runSummarization, saveSummaries, shouldSummarize, generateChunkSummary, generateSessionSummary, } from './lib/summarizer.js';
33
33
  // Revert
34
34
  export { executeRevert } from './lib/revert.js';
35
+ // Gateway — message pipeline for Janus and gateway server
36
+ export { sendMessage, getOrCreateThread, clearThreadCache, resolveClaudeCli, resolveNode, truncateToTokens, formatRecentContext, generateSystemPrompt, generateMcpConfig, cleanupMcpConfig, parseStreamSegments, extractTextFromStreamLine, computeAvgRelevance, SYSTEM_PROMPT_TEMPLATE, FILE_READ_REMINDER, RECENT_CONTEXT_COUNT, RECENT_MSG_MAX_TOKENS, RECENT_CONTEXT_BUDGET, } from './lib/gateway.js';
35
37
  // MCP - Shared server for multi-agent setups
36
38
  export { startSharedMcpServer } from './mcp/shared-server.js';
37
39
  // MCP paths - for spawning subprocesses via --mcp-config
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,kDAAkD;AAClD,4BAA4B;AAE5B,UAAU;AACV,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAGjE,gBAAgB;AAChB,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAYtD,mBAAmB;AACnB,OAAO,EACL,cAAc,EACd,wBAAwB,EACxB,kBAAkB,EAClB,eAAe,EACf,iBAAiB,GAClB,MAAM,2BAA2B,CAAC;AAGnC,iBAAiB;AACjB,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAGxE,0BAA0B;AAC1B,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,iBAAiB,EACjB,yBAAyB,GAC1B,MAAM,kCAAkC,CAAC;AAQ1C,aAAa;AACb,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,kBAAkB,EAClB,yBAAyB,EACzB,oBAAoB,EACpB,iBAAiB,EACjB,cAAc,EACd,cAAc,GACf,MAAM,qBAAqB,CAAC;AAQ7B,UAAU;AACV,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGlD,YAAY;AACZ,OAAO,EAAE,QAAQ,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAGzE,WAAW;AACX,OAAO,EACL,aAAa,EACb,mBAAmB,EACnB,cAAc,EACd,qBAAqB,EACrB,eAAe,EACf,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,mBAAmB,CAAC;AAG3B,mBAAmB;AACnB,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAG/E,mBAAmB;AACnB,OAAO,EACL,eAAe,EACf,0BAA0B,EAC1B,oBAAoB,GACrB,MAAM,2BAA2B,CAAC;AAQnC,SAAS;AACT,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,YAAY,EACZ,eAAe,EACf,sBAAsB,EACtB,UAAU,EACV,oBAAoB,EACpB,uBAAuB,EACvB,sBAAsB,EACtB,gBAAgB,GACjB,MAAM,iBAAiB,CAAC;AAWzB,cAAc;AACd,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAGlF,YAAY;AACZ,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAGjF,aAAa;AACb,OAAO,EACL,UAAU,EACV,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,eAAe,EACf,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,qBAAqB,CAAC;AAG7B,SAAS;AACT,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGhD,6CAA6C;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAG9D,yDAAyD;AACzD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE9D,qFAAqF;AACrF,MAAM,UAAU,YAAY;IAC1B,OAAO,IAAI,CAAC,aAAa,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;AAChD,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,gBAAgB;IAC9B,OAAO,IAAI,CAAC,aAAa,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;AAChD,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,185 @@
1
+ /**
2
+ * Gateway — the reusable message pipeline.
3
+ *
4
+ * Extracts the full "send message" pipeline (budget → persist → RAG → prompt →
5
+ * Claude CLI spawn → stream → persist response) into a single function that
6
+ * both Janus (over IPC) and the gateway server (over HTTP/SSE) can call.
7
+ */
8
+ import { AdaptiveContextBudget } from './adaptive-context-budget.js';
9
+ import { ContentStore } from './content-store.js';
10
+ import { HistoryStore } from './history.js';
11
+ import type { Message } from './history.js';
12
+ import { SessionManager } from './session.js';
13
+ import type { RetrievalResult } from './retriever.js';
14
+ export declare const RECENT_CONTEXT_COUNT = 10;
15
+ export declare const RECENT_MSG_MAX_TOKENS = 500;
16
+ export declare const RECENT_CONTEXT_BUDGET = 6000;
17
+ export declare const SYSTEM_PROMPT_TEMPLATE = "You have NO memory of this conversation. There are {count} prior messages (~{tokens} tokens) in the history.\n\nCURRENT SESSION: {sessionId}\n{alwaysIncludeContext}{recentContext}\n{retrievedContext}\nCONTEXT MANAGEMENT:\n- RECENT CONVERSATION: The last few messages, always included for continuity.\n- RETRIEVED CONTEXT: Automatically retrieved based on the user's current message using semantic + keyword search.\n- Large content may be stored externally as [STORED:xxx] references.\n\nWORKFLOW:\n1. FIRST use the RETRIEVED CONTEXT above \u2014 it was automatically selected for relevance to this query\n2. Check RECENT CONVERSATION for immediate context\n3. Only use tools if the retrieved context doesn't contain what you need\n4. For [STORED:xxx] references, use retrieve_content to get full content\n5. For file reads, use read_file (the built-in Read tool is disabled)\n\nNEVER guess. Use the context provided or retrieve more if needed.\nIMPORTANT: Never mention the retrieval system or tools to the user. Present information naturally.\n\nFILE READING (MANDATORY):\nThe built-in Read tool is DISABLED in this environment. You MUST use read_file (MCP tool) for ALL file reads.\n- read_file reads the file, chunks it, embeds it into a vector store, and stores it for persistent retrieval across sessions\n- You receive a summary, content ID, and chunk table-of-contents\n- Use read_content_chunk(contentId, N) to navigate to specific sections\n- Using the built-in Read tool bypasses vector storage and loses context permanently \u2014 NEVER use it\n\nTOOL ROUTING (CRITICAL):\n\n| Need to... | CORRECT tool | WRONG tool (do NOT use) |\n|---------------------|-------------------|-------------------------|\n| Read a file | read_file | Read |\n| Search stored files | search_content | Grep |\n| Get stored content | retrieve_content | Read |\n\nTOOLS:\n- read_file: Read any file (text or PDF) and store for future retrieval \u2014 USE THIS FOR ALL FILE READS\n- store_content: Store arbitrary text content for future retrieval\n- search_history: Search past messages by keyword or meaning\n- peek_recent: Get the last few messages\n- read_messages: Read messages by index range\n- retrieve_content: Get full stored content by [STORED:xxx] ID\n- search_content: Search across all stored content\n- read_content_chunk: Read a specific chunk of stored content by index\n\nSTATUS CODES (internal, hidden from user):\nEnd your response with these codes when applicable. They will be stripped before display.\n- [AWAIT_TASK] - You launched a background task/agent and results are pending. The system will auto-continue.\n- [NEED_INPUT] - You need specific information from the user before proceeding.\nOnly use ONE code per response, at the very end. Do not mention these codes to the user.";
18
+ export declare const FILE_READ_REMINDER = "<system-reminder>\nFILE READING: The built-in Read tool is DISABLED. Use read_file for ALL file reads (text, code, PDFs).\n- read_file reads the file, extracts text (including from PDFs), chunks it, embeds it, and stores it for future retrieval\n- You receive a summary, content ID, and chunk table-of-contents\n- Use the TOC to navigate: read_content_chunk(\"contentId\", chunkIndex) for specific sections\n- Use search_content(\"query\") to find content across all stored files\n</system-reminder>\n\n";
19
+ /** Typed stream segment for verbose display */
20
+ export type StreamSegment = {
21
+ type: 'text';
22
+ content: string;
23
+ } | {
24
+ type: 'thinking';
25
+ content: string;
26
+ } | {
27
+ type: 'tool_use';
28
+ tool: string;
29
+ input: Record<string, unknown>;
30
+ } | {
31
+ type: 'tool_result';
32
+ content: string;
33
+ isError: boolean;
34
+ } | {
35
+ type: 'system';
36
+ content: string;
37
+ } | {
38
+ type: 'result';
39
+ duration_ms?: number;
40
+ usage?: Record<string, unknown>;
41
+ };
42
+ /** Debug snapshot captured during each message turn */
43
+ export interface DebugSnapshot {
44
+ timestamp: number;
45
+ threadName: string;
46
+ sessionId: string;
47
+ messageCount: number;
48
+ tokenCount: number;
49
+ userMessage: string;
50
+ budget: {
51
+ total: number;
52
+ userQuery: number;
53
+ alwaysInclude: number;
54
+ recentContext: number;
55
+ ragAvailable: number;
56
+ ragUsed: number;
57
+ };
58
+ retrieval: {
59
+ historyCount: number;
60
+ contentCount: number;
61
+ tokensUsed: number;
62
+ avgRelevance: number;
63
+ queryType: string;
64
+ } | null;
65
+ alwaysInclude: {
66
+ files: Array<{
67
+ path: string;
68
+ tokens: number;
69
+ truncated: boolean;
70
+ error: string | null;
71
+ }>;
72
+ totalTokens: number;
73
+ };
74
+ recentMessageCount: number;
75
+ systemPromptLength: number;
76
+ systemPromptBreakdown?: {
77
+ instructionTokens: number;
78
+ alwaysIncludeTokens: number;
79
+ recentContextTokens: number;
80
+ ragTokens: number;
81
+ totalTokens: number;
82
+ };
83
+ }
84
+ /** MCP server config entry */
85
+ export interface McpServerEntry {
86
+ command: string;
87
+ args: string[];
88
+ env: Record<string, string>;
89
+ }
90
+ /** Options for the message pipeline */
91
+ export interface MessagePipelineOptions {
92
+ threadName: string;
93
+ message: string;
94
+ images?: Array<{
95
+ mimeType: string;
96
+ base64: string;
97
+ }>;
98
+ attachments?: Array<{
99
+ name: string;
100
+ type: string;
101
+ mimeType: string;
102
+ path: string;
103
+ }>;
104
+ basePath?: string;
105
+ claudePath?: string;
106
+ sharedMcpPort?: number;
107
+ systemPromptTemplate?: string;
108
+ projectDir?: string;
109
+ /** Extra MCP server configs to include (e.g., janus-agents) */
110
+ extraMcpServers?: Record<string, McpServerEntry>;
111
+ /** Callback: text token streamed */
112
+ onToken?: (token: string) => void;
113
+ /** Callback: structured segment for verbose display */
114
+ onSegment?: (segment: StreamSegment) => void;
115
+ /** Callback: error occurred */
116
+ onError?: (error: string) => void;
117
+ }
118
+ /** Result from the message pipeline */
119
+ export interface MessagePipelineResult {
120
+ response: string;
121
+ ttft: number | null;
122
+ userMessage: Message;
123
+ assistantMessage: Message | null;
124
+ segments: StreamSegment[];
125
+ debug: DebugSnapshot;
126
+ }
127
+ /** Cached thread state */
128
+ export interface ThreadState {
129
+ history: HistoryStore;
130
+ content: ContentStore;
131
+ session: SessionManager;
132
+ adaptive: AdaptiveContextBudget;
133
+ threadPath: string;
134
+ }
135
+ /**
136
+ * Resolve the full path to the `claude` CLI binary.
137
+ * When launched from Finder/launchd, PATH is minimal.
138
+ */
139
+ export declare function resolveClaudeCli(): string;
140
+ /**
141
+ * Resolve the full path to `node`.
142
+ */
143
+ export declare function resolveNode(): string;
144
+ /** Token-aware string truncation */
145
+ export declare function truncateToTokens(content: string, maxTokens: number): string;
146
+ /** Format recent messages into a context block */
147
+ export declare function formatRecentContext(recentMessages: Array<{
148
+ role: string;
149
+ content: string;
150
+ }>, budgetTokens: number): string;
151
+ /** Assemble the full system prompt from template + context */
152
+ export declare function generateSystemPrompt(count: number, tokens: number, sessionId: string, recentMessages: Array<{
153
+ role: string;
154
+ content: string;
155
+ }>, retrievedContext: string, alwaysIncludeContext: string, template?: string): string;
156
+ /** Write MCP config JSON for Claude CLI and return its path */
157
+ export declare function generateMcpConfig(threadPath: string, sessionId: string, threadName: string, sharedMcpPort?: number, extraMcpServers?: Record<string, McpServerEntry>): string;
158
+ /** Clean up a temp MCP config file */
159
+ export declare function cleanupMcpConfig(configPath: string): void;
160
+ /**
161
+ * Parse a stream-json line into typed StreamSegment objects.
162
+ */
163
+ export declare function parseStreamSegments(line: string): StreamSegment[];
164
+ /** Extract text content from a stream-json line */
165
+ export declare function extractTextFromStreamLine(line: string): string | null;
166
+ /**
167
+ * Compute average relevance from the top-K retrieval scores.
168
+ * Takes the top 10 scores across history + content results.
169
+ */
170
+ export declare function computeAvgRelevance(debug: RetrievalResult['debug'] | undefined): number;
171
+ /**
172
+ * Get or create a thread's stores and adaptive budget.
173
+ * Cached in a module-level Map.
174
+ */
175
+ export declare function getOrCreateThread(threadName: string, _basePath?: string): Promise<ThreadState>;
176
+ /** Clear a thread from the cache */
177
+ export declare function clearThreadCache(threadName?: string): void;
178
+ /**
179
+ * The full message pipeline: externalize → persist → RAG → prompt → spawn → stream → persist.
180
+ *
181
+ * This is the extracted core of Janus's CumulusBridge.sendMessage(), now callable
182
+ * from both Janus (via IPC) and the gateway server (via HTTP/SSE).
183
+ */
184
+ export declare function sendMessage(options: MessagePipelineOptions): Promise<MessagePipelineResult>;
185
+ //# sourceMappingURL=gateway.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../../src/lib/gateway.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,715 @@
1
+ /**
2
+ * Gateway — the reusable message pipeline.
3
+ *
4
+ * Extracts the full "send message" pipeline (budget → persist → RAG → prompt →
5
+ * Claude CLI spawn → stream → persist response) into a single function that
6
+ * both Janus (over IPC) and the gateway server (over HTTP/SSE) can call.
7
+ */
8
+ import { spawn } from 'child_process';
9
+ import * as fs from 'fs';
10
+ import * as os from 'os';
11
+ import * as path from 'path';
12
+ import { loadAdaptiveState } from './adaptive-context-budget.js';
13
+ import { ContextBudget, estimateTokens } from './context-budget.js';
14
+ import { ContentStore } from './content-store.js';
15
+ import { HistoryStore } from './history.js';
16
+ import { SessionManager } from './session.js';
17
+ import { StreamProcessor, shouldExternalizeUserInput, externalizeUserInput } from './stream-processor.js';
18
+ import { retrieve } from './retriever.js';
19
+ import { loadGlobalConfig, loadThreadConfig, mergeConfigs, readAlwaysIncludeFiles, resolveRagBudget, } from './config.js';
20
+ // ─── Constants ───────────────────────────────────────────────────────────────
21
+ const CUMULUS_DIR = path.join(os.homedir(), '.cumulus');
22
+ const THREADS_DIR = path.join(CUMULUS_DIR, 'threads');
23
+ export const RECENT_CONTEXT_COUNT = 10;
24
+ export const RECENT_MSG_MAX_TOKENS = 500;
25
+ export const RECENT_CONTEXT_BUDGET = 6_000;
26
+ export const SYSTEM_PROMPT_TEMPLATE = `You have NO memory of this conversation. There are {count} prior messages (~{tokens} tokens) in the history.
27
+
28
+ CURRENT SESSION: {sessionId}
29
+ {alwaysIncludeContext}{recentContext}
30
+ {retrievedContext}
31
+ CONTEXT MANAGEMENT:
32
+ - RECENT CONVERSATION: The last few messages, always included for continuity.
33
+ - RETRIEVED CONTEXT: Automatically retrieved based on the user's current message using semantic + keyword search.
34
+ - Large content may be stored externally as [STORED:xxx] references.
35
+
36
+ WORKFLOW:
37
+ 1. FIRST use the RETRIEVED CONTEXT above — it was automatically selected for relevance to this query
38
+ 2. Check RECENT CONVERSATION for immediate context
39
+ 3. Only use tools if the retrieved context doesn't contain what you need
40
+ 4. For [STORED:xxx] references, use retrieve_content to get full content
41
+ 5. For file reads, use read_file (the built-in Read tool is disabled)
42
+
43
+ NEVER guess. Use the context provided or retrieve more if needed.
44
+ IMPORTANT: Never mention the retrieval system or tools to the user. Present information naturally.
45
+
46
+ FILE READING (MANDATORY):
47
+ The built-in Read tool is DISABLED in this environment. You MUST use read_file (MCP tool) for ALL file reads.
48
+ - read_file reads the file, chunks it, embeds it into a vector store, and stores it for persistent retrieval across sessions
49
+ - You receive a summary, content ID, and chunk table-of-contents
50
+ - Use read_content_chunk(contentId, N) to navigate to specific sections
51
+ - Using the built-in Read tool bypasses vector storage and loses context permanently — NEVER use it
52
+
53
+ TOOL ROUTING (CRITICAL):
54
+
55
+ | Need to... | CORRECT tool | WRONG tool (do NOT use) |
56
+ |---------------------|-------------------|-------------------------|
57
+ | Read a file | read_file | Read |
58
+ | Search stored files | search_content | Grep |
59
+ | Get stored content | retrieve_content | Read |
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
+ STATUS CODES (internal, hidden from user):
72
+ End your response with these codes when applicable. They will be stripped before display.
73
+ - [AWAIT_TASK] - You launched a background task/agent and results are pending. The system will auto-continue.
74
+ - [NEED_INPUT] - You need specific information from the user before proceeding.
75
+ Only use ONE code per response, at the very end. Do not mention these codes to the user.`;
76
+ export const FILE_READ_REMINDER = `<system-reminder>
77
+ FILE READING: The built-in Read tool is DISABLED. Use read_file for ALL file reads (text, code, PDFs).
78
+ - read_file reads the file, extracts text (including from PDFs), chunks it, embeds it, and stores it for future retrieval
79
+ - You receive a summary, content ID, and chunk table-of-contents
80
+ - Use the TOC to navigate: read_content_chunk("contentId", chunkIndex) for specific sections
81
+ - Use search_content("query") to find content across all stored files
82
+ </system-reminder>
83
+
84
+ `;
85
+ // ─── Thread cache ────────────────────────────────────────────────────────────
86
+ const threadCache = new Map();
87
+ // ─── Helper Functions ────────────────────────────────────────────────────────
88
+ function ensureDirectories() {
89
+ if (!fs.existsSync(THREADS_DIR)) {
90
+ fs.mkdirSync(THREADS_DIR, { recursive: true });
91
+ }
92
+ }
93
+ function getThreadPath(threadName) {
94
+ return path.join(THREADS_DIR, `${threadName}.jsonl`);
95
+ }
96
+ function getContentStorePath(threadPath) {
97
+ return threadPath.replace(/\.jsonl$/, '.content');
98
+ }
99
+ function getSessionsPath(threadPath) {
100
+ return threadPath.replace(/\.jsonl$/, '.sessions');
101
+ }
102
+ /**
103
+ * Resolve the full path to the `claude` CLI binary.
104
+ * When launched from Finder/launchd, PATH is minimal.
105
+ */
106
+ export function resolveClaudeCli() {
107
+ const home = os.homedir();
108
+ const candidates = [
109
+ path.join(home, '.local', 'bin', 'claude'),
110
+ path.join(home, '.claude', 'bin', 'claude'),
111
+ '/usr/local/bin/claude',
112
+ '/opt/homebrew/bin/claude',
113
+ ];
114
+ for (const candidate of candidates) {
115
+ if (fs.existsSync(candidate))
116
+ return candidate;
117
+ }
118
+ return 'claude'; // fallback to PATH lookup
119
+ }
120
+ /**
121
+ * Resolve the full path to `node`.
122
+ */
123
+ export function resolveNode() {
124
+ const candidates = [
125
+ '/usr/local/bin/node',
126
+ '/opt/homebrew/bin/node',
127
+ path.join(os.homedir(), '.nvm/versions/node', 'current', 'bin/node'),
128
+ '/usr/bin/node',
129
+ ];
130
+ // Also check NVM versions directory
131
+ const nvmDir = path.join(os.homedir(), '.nvm/versions/node');
132
+ try {
133
+ const versions = fs.readdirSync(nvmDir).sort().reverse();
134
+ for (const v of versions) {
135
+ candidates.push(path.join(nvmDir, v, 'bin/node'));
136
+ }
137
+ }
138
+ catch {
139
+ // No NVM installed
140
+ }
141
+ for (const candidate of candidates) {
142
+ if (fs.existsSync(candidate))
143
+ return candidate;
144
+ }
145
+ return 'node';
146
+ }
147
+ /** Token-aware string truncation */
148
+ export function truncateToTokens(content, maxTokens) {
149
+ const tokens = estimateTokens(content);
150
+ if (tokens <= maxTokens)
151
+ return content;
152
+ const targetChars = maxTokens * 3;
153
+ return content.slice(0, targetChars) + '... [truncated]';
154
+ }
155
+ /** Format recent messages into a context block */
156
+ export function formatRecentContext(recentMessages, budgetTokens) {
157
+ if (recentMessages.length === 0 || budgetTokens <= 0)
158
+ return '';
159
+ const header = '\nRECENT CONVERSATION (last few messages):\n---\n';
160
+ const footer = '---\n';
161
+ const overhead = estimateTokens(header + footer);
162
+ let remaining = budgetTokens - overhead;
163
+ if (remaining <= 0)
164
+ return '';
165
+ const formatted = [];
166
+ for (let i = recentMessages.length - 1; i >= 0 && remaining > 0; i--) {
167
+ const msg = recentMessages[i];
168
+ const label = msg.role === 'user' ? 'User' : 'Assistant';
169
+ const truncated = truncateToTokens(msg.content, RECENT_MSG_MAX_TOKENS);
170
+ const line = `[${label}]: ${truncated}\n`;
171
+ const lineTokens = estimateTokens(line);
172
+ if (lineTokens > remaining)
173
+ break;
174
+ formatted.unshift(line);
175
+ remaining -= lineTokens;
176
+ }
177
+ if (formatted.length === 0)
178
+ return '';
179
+ return header + formatted.join('') + footer;
180
+ }
181
+ /** Assemble the full system prompt from template + context */
182
+ export function generateSystemPrompt(count, tokens, sessionId, recentMessages, retrievedContext, alwaysIncludeContext, template) {
183
+ const recentContext = formatRecentContext(recentMessages, RECENT_CONTEXT_BUDGET);
184
+ return (template ?? SYSTEM_PROMPT_TEMPLATE)
185
+ .replace('{count}', count.toString())
186
+ .replace('{tokens}', tokens.toString())
187
+ .replace('{sessionId}', sessionId)
188
+ .replace('{alwaysIncludeContext}', alwaysIncludeContext)
189
+ .replace('{recentContext}', recentContext)
190
+ .replace('{retrievedContext}', retrievedContext);
191
+ }
192
+ /** Write MCP config JSON for Claude CLI and return its path */
193
+ export function generateMcpConfig(threadPath, sessionId, threadName, sharedMcpPort, extraMcpServers) {
194
+ const nodePath = resolveNode();
195
+ let cumulusHistoryConfig;
196
+ if (sharedMcpPort) {
197
+ // Shared mode: lightweight proxy
198
+ const proxyPath = getProxyPathInternal();
199
+ cumulusHistoryConfig = {
200
+ command: nodePath,
201
+ args: [proxyPath],
202
+ env: {
203
+ CUMULUS_SHARED_URL: `http://127.0.0.1:${sharedMcpPort}`,
204
+ CUMULUS_THREAD_NAME: threadName,
205
+ },
206
+ };
207
+ }
208
+ else {
209
+ // Full MCP server per thread
210
+ const mcpServerPath = getMcpServerPathInternal();
211
+ const contentStorePath = getContentStorePath(threadPath);
212
+ const sessionsPath = getSessionsPath(threadPath);
213
+ cumulusHistoryConfig = {
214
+ command: nodePath,
215
+ args: [mcpServerPath],
216
+ env: {
217
+ CUMULUS_THREAD_PATH: threadPath,
218
+ CUMULUS_CONTENT_PATH: contentStorePath,
219
+ CUMULUS_SESSIONS_PATH: sessionsPath,
220
+ ...(sessionId && { CUMULUS_SESSION_ID: sessionId }),
221
+ },
222
+ };
223
+ }
224
+ const config = {
225
+ mcpServers: {
226
+ 'cumulus-history': cumulusHistoryConfig,
227
+ ...(extraMcpServers ?? {}),
228
+ },
229
+ };
230
+ const configPath = path.join(CUMULUS_DIR, `mcp-config-${Date.now()}.json`);
231
+ ensureDirectories();
232
+ fs.writeFileSync(configPath, JSON.stringify(config, null, 2));
233
+ return configPath;
234
+ }
235
+ /** Clean up a temp MCP config file */
236
+ export function cleanupMcpConfig(configPath) {
237
+ try {
238
+ if (configPath && fs.existsSync(configPath)) {
239
+ fs.unlinkSync(configPath);
240
+ }
241
+ }
242
+ catch {
243
+ // Ignore cleanup errors
244
+ }
245
+ }
246
+ /** Internal path helpers (avoid circular with index.ts exports) */
247
+ function getProxyPathInternal() {
248
+ return path.join(path.dirname(new URL(import.meta.url).pathname), '..', 'mcp', 'proxy.js');
249
+ }
250
+ function getMcpServerPathInternal() {
251
+ return path.join(path.dirname(new URL(import.meta.url).pathname), '..', 'mcp', 'index.js');
252
+ }
253
+ /**
254
+ * Parse a stream-json line into typed StreamSegment objects.
255
+ */
256
+ export function parseStreamSegments(line) {
257
+ if (!line.trim())
258
+ return [];
259
+ try {
260
+ const parsed = JSON.parse(line);
261
+ // Assistant message — may contain text, thinking, tool_use blocks
262
+ if (parsed.type === 'assistant' && parsed.message?.content) {
263
+ const segments = [];
264
+ for (const block of parsed.message.content) {
265
+ if (block.type === 'text' && block.text) {
266
+ segments.push({ type: 'text', content: block.text });
267
+ }
268
+ else if (block.type === 'thinking' && block.thinking) {
269
+ segments.push({ type: 'thinking', content: block.thinking });
270
+ }
271
+ else if (block.type === 'tool_use') {
272
+ segments.push({ type: 'tool_use', tool: block.name, input: block.input || {} });
273
+ }
274
+ else if (block.type === 'tool_result') {
275
+ const content = typeof block.content === 'string' ? block.content : JSON.stringify(block.content);
276
+ segments.push({ type: 'tool_result', content, isError: !!block.is_error });
277
+ }
278
+ }
279
+ return segments;
280
+ }
281
+ // User message — contains tool_result blocks
282
+ if (parsed.type === 'user' && parsed.message?.content) {
283
+ const segments = [];
284
+ for (const block of parsed.message.content) {
285
+ if (block.type === 'tool_result') {
286
+ const content = typeof block.content === 'string' ? block.content : JSON.stringify(block.content);
287
+ segments.push({ type: 'tool_result', content, isError: !!block.is_error });
288
+ }
289
+ }
290
+ return segments;
291
+ }
292
+ // Standalone tool_result event
293
+ if (parsed.type === 'tool_result') {
294
+ const content = typeof parsed.content === 'string'
295
+ ? parsed.content
296
+ : (parsed.content ? JSON.stringify(parsed.content) : '');
297
+ return [{ type: 'tool_result', content, isError: !!parsed.is_error }];
298
+ }
299
+ // Standalone tool_result event (output field, no type)
300
+ if (parsed.output !== undefined) {
301
+ return [{ type: 'tool_result', content: String(parsed.output), isError: false }];
302
+ }
303
+ // System event
304
+ if (parsed.type === 'system') {
305
+ const content = parsed.subtype
306
+ ? `${parsed.subtype}: ${parsed.message || ''}`
307
+ : (parsed.message || JSON.stringify(parsed));
308
+ return [{ type: 'system', content }];
309
+ }
310
+ // Result / completion event
311
+ if (parsed.type === 'result') {
312
+ return [{ type: 'result', duration_ms: parsed.duration_ms, usage: parsed.usage }];
313
+ }
314
+ return [];
315
+ }
316
+ catch {
317
+ return [];
318
+ }
319
+ }
320
+ /** Extract text content from a stream-json line */
321
+ export function extractTextFromStreamLine(line) {
322
+ if (!line.trim())
323
+ return null;
324
+ try {
325
+ const parsed = JSON.parse(line);
326
+ if (parsed.type === 'assistant' && parsed.message?.content) {
327
+ const texts = [];
328
+ for (const block of parsed.message.content) {
329
+ if (block.type === 'text' && block.text) {
330
+ texts.push(block.text);
331
+ }
332
+ }
333
+ return texts.length > 0 ? texts.join('\n\n') : null;
334
+ }
335
+ return null;
336
+ }
337
+ catch {
338
+ return null;
339
+ }
340
+ }
341
+ /**
342
+ * Compute average relevance from the top-K retrieval scores.
343
+ * Takes the top 10 scores across history + content results.
344
+ */
345
+ export function computeAvgRelevance(debug) {
346
+ if (!debug)
347
+ return 0;
348
+ const allScores = [
349
+ ...(debug.historyResults || []).map((r) => r.score),
350
+ ...(debug.contentResults || []).map((r) => r.score),
351
+ ];
352
+ if (allScores.length === 0)
353
+ return 0;
354
+ allScores.sort((a, b) => b - a);
355
+ const topK = allScores.slice(0, 10);
356
+ return topK.reduce((sum, s) => sum + s, 0) / topK.length;
357
+ }
358
+ // ─── Thread Management ───────────────────────────────────────────────────────
359
+ /**
360
+ * Get or create a thread's stores and adaptive budget.
361
+ * Cached in a module-level Map.
362
+ */
363
+ export async function getOrCreateThread(threadName, _basePath) {
364
+ if (threadCache.has(threadName)) {
365
+ return threadCache.get(threadName);
366
+ }
367
+ ensureDirectories();
368
+ const threadPath = getThreadPath(threadName);
369
+ const contentStorePath = getContentStorePath(threadPath);
370
+ const sessionsPath = getSessionsPath(threadPath);
371
+ const history = new HistoryStore(threadPath);
372
+ const content = new ContentStore(contentStorePath);
373
+ const session = new SessionManager(sessionsPath, threadName);
374
+ await session.initialize();
375
+ const adaptive = await loadAdaptiveState(threadPath);
376
+ const thread = { history, content, session, adaptive, threadPath };
377
+ threadCache.set(threadName, thread);
378
+ return thread;
379
+ }
380
+ /** Clear a thread from the cache */
381
+ export function clearThreadCache(threadName) {
382
+ if (threadName) {
383
+ threadCache.delete(threadName);
384
+ }
385
+ else {
386
+ threadCache.clear();
387
+ }
388
+ }
389
+ // ─── Core Pipeline ───────────────────────────────────────────────────────────
390
+ /**
391
+ * The full message pipeline: externalize → persist → RAG → prompt → spawn → stream → persist.
392
+ *
393
+ * This is the extracted core of Janus's CumulusBridge.sendMessage(), now callable
394
+ * from both Janus (via IPC) and the gateway server (via HTTP/SSE).
395
+ */
396
+ export async function sendMessage(options) {
397
+ const { threadName, message, images = [], attachments = [], basePath = CUMULUS_DIR, claudePath, sharedMcpPort, systemPromptTemplate, projectDir, extraMcpServers, onToken, onSegment, onError, } = options;
398
+ const thread = await getOrCreateThread(threadName, basePath);
399
+ // ── Build image content blocks ──
400
+ const imageBlocks = [];
401
+ let messageForClaude = message;
402
+ if (attachments.length > 0) {
403
+ const fileRefs = [];
404
+ for (const att of attachments) {
405
+ if (att.type === 'image' && att.path) {
406
+ try {
407
+ const data = fs.readFileSync(att.path);
408
+ const base64 = data.toString('base64');
409
+ const ext = path.extname(att.path).toLowerCase().replace('.', '');
410
+ const mimeMap = { png: 'image/png', jpg: 'image/jpeg', jpeg: 'image/jpeg', gif: 'image/gif', webp: 'image/webp' };
411
+ const mediaType = att.mimeType || mimeMap[ext] || 'image/png';
412
+ imageBlocks.push({
413
+ type: 'image',
414
+ source: { type: 'base64', media_type: mediaType, data: base64 },
415
+ });
416
+ }
417
+ catch {
418
+ fileRefs.push(`[Attached image (unreadable): ${att.path}]`);
419
+ }
420
+ }
421
+ else {
422
+ fileRefs.push(`[Attached file: ${att.path}]`);
423
+ }
424
+ }
425
+ if (fileRefs.length > 0) {
426
+ messageForClaude = messageForClaude
427
+ ? messageForClaude + '\n\n' + fileRefs.join('\n')
428
+ : fileRefs.join('\n');
429
+ }
430
+ }
431
+ // Also support raw base64 images passed directly
432
+ for (const img of images) {
433
+ imageBlocks.push({
434
+ type: 'image',
435
+ source: { type: 'base64', media_type: img.mimeType, data: img.base64 },
436
+ });
437
+ }
438
+ const hasImages = imageBlocks.length > 0;
439
+ // ── Budget + externalization ──
440
+ const budget = new ContextBudget();
441
+ if (shouldExternalizeUserInput(messageForClaude, budget)) {
442
+ const { replacement } = await externalizeUserInput(messageForClaude, thread.content);
443
+ messageForClaude = replacement;
444
+ }
445
+ else {
446
+ budget.consume(estimateTokens(messageForClaude));
447
+ }
448
+ // ── Persist user message ──
449
+ const userMessage = await thread.history.append({
450
+ role: 'user',
451
+ content: message,
452
+ metadata: { sessionId: thread.session.getSessionId() },
453
+ attachments: attachments.length > 0 ? attachments.map(att => ({
454
+ name: att.name,
455
+ type: att.type,
456
+ mimeType: att.mimeType,
457
+ storedPath: att.path,
458
+ })) : undefined,
459
+ });
460
+ // ── Stats + recent context ──
461
+ const stats = await thread.history.getStats();
462
+ const recentMessages = await thread.history.getRecent(RECENT_CONTEXT_COUNT);
463
+ const recentConversation = recentMessages
464
+ .filter((m) => m.role !== 'session')
465
+ .map((m) => ({ role: m.role, content: m.content }));
466
+ // ── Config + always-include ──
467
+ const threadCwd = projectDir || os.homedir();
468
+ const globalConfig = await loadGlobalConfig();
469
+ const threadConfig = await loadThreadConfig(threadName);
470
+ const mergedConfig = mergeConfigs(globalConfig, threadConfig);
471
+ const alwaysInclude = await readAlwaysIncludeFiles(mergedConfig, threadCwd);
472
+ // ── RAG budget ──
473
+ const adaptiveBudget = thread.adaptive.getTotalContextBudget();
474
+ const userQueryTokens = estimateTokens(message);
475
+ const overhead = userQueryTokens + alwaysInclude.totalTokens + RECENT_CONTEXT_BUDGET;
476
+ const effectiveBudget = resolveRagBudget(mergedConfig, adaptiveBudget, overhead);
477
+ const ragBudget = Math.max(0, effectiveBudget - userQueryTokens - alwaysInclude.totalTokens - RECENT_CONTEXT_BUDGET);
478
+ // ── RAG retrieval ──
479
+ let retrievalResult = null;
480
+ try {
481
+ const threadPath = getThreadPath(threadName);
482
+ const sessionsPath = getSessionsPath(threadPath);
483
+ const allMessages = await thread.history.getAll();
484
+ retrievalResult = await retrieve(message, thread.history, thread.content, {
485
+ budgetTokens: ragBudget,
486
+ currentSessionId: thread.session.getSessionId(),
487
+ sessionsPath,
488
+ recentMessages: recentConversation,
489
+ totalMessages: allMessages.length,
490
+ });
491
+ }
492
+ catch (err) {
493
+ console.error('[Gateway] Retrieval error:', err);
494
+ }
495
+ const retrievedContext = retrievalResult?.context ?? '';
496
+ // ── Debug snapshot ──
497
+ const debug = {
498
+ timestamp: Date.now(),
499
+ threadName,
500
+ sessionId: thread.session.getSessionId(),
501
+ messageCount: stats.count,
502
+ tokenCount: stats.totalTokens,
503
+ userMessage: message,
504
+ budget: {
505
+ total: adaptiveBudget,
506
+ userQuery: userQueryTokens,
507
+ alwaysInclude: alwaysInclude.totalTokens,
508
+ recentContext: RECENT_CONTEXT_BUDGET,
509
+ ragAvailable: ragBudget,
510
+ ragUsed: retrievalResult?.tokensUsed ?? 0,
511
+ },
512
+ retrieval: retrievalResult ? {
513
+ historyCount: retrievalResult.historyCount ?? 0,
514
+ contentCount: retrievalResult.contentCount ?? 0,
515
+ tokensUsed: retrievalResult.tokensUsed ?? 0,
516
+ avgRelevance: computeAvgRelevance(retrievalResult.debug),
517
+ queryType: retrievalResult.debug?.queryType ?? 'unknown',
518
+ } : null,
519
+ alwaysInclude: {
520
+ files: alwaysInclude.files?.map((f) => ({
521
+ path: f.path || f.resolvedPath,
522
+ tokens: f.tokens || 0,
523
+ truncated: !!f.truncated,
524
+ error: f.error || null,
525
+ })) || [],
526
+ totalTokens: alwaysInclude.totalTokens,
527
+ },
528
+ recentMessageCount: recentMessages.length,
529
+ systemPromptLength: 0,
530
+ };
531
+ // ── System prompt ──
532
+ const systemPrompt = generateSystemPrompt(stats.count, stats.totalTokens, thread.session.getSessionId(), recentConversation, retrievedContext, alwaysInclude.formattedContext, systemPromptTemplate);
533
+ // Update debug with system prompt breakdown
534
+ const systemPromptTokens = estimateTokens(systemPrompt);
535
+ const ragTokens = retrievalResult ? estimateTokens(retrievedContext) : 0;
536
+ const recentContext = formatRecentContext(recentConversation, RECENT_CONTEXT_BUDGET);
537
+ const recentContextTokens = estimateTokens(recentContext);
538
+ const alwaysIncludeTokens = alwaysInclude.totalTokens;
539
+ const instructionTokens = systemPromptTokens - ragTokens - alwaysIncludeTokens - recentContextTokens;
540
+ debug.systemPromptLength = systemPromptTokens;
541
+ debug.systemPromptBreakdown = {
542
+ instructionTokens,
543
+ alwaysIncludeTokens,
544
+ recentContextTokens,
545
+ ragTokens,
546
+ totalTokens: systemPromptTokens,
547
+ };
548
+ // ── Stream processor for content externalization ──
549
+ const streamProcessor = new StreamProcessor({ budget, contentStore: thread.content });
550
+ // ── Prepend file-read reminder ──
551
+ messageForClaude = FILE_READ_REMINDER + messageForClaude;
552
+ // ── MCP config ──
553
+ const mcpConfigPath = generateMcpConfig(thread.threadPath, thread.session.getSessionId(), threadName, sharedMcpPort, extraMcpServers);
554
+ // ── Spawn Claude ──
555
+ const args = [
556
+ '--print',
557
+ '--verbose',
558
+ '--output-format', 'stream-json',
559
+ '--permission-mode', 'bypassPermissions',
560
+ '--mcp-config', mcpConfigPath,
561
+ '--append-system-prompt', systemPrompt,
562
+ ];
563
+ if (hasImages) {
564
+ args.push('--input-format', 'stream-json');
565
+ }
566
+ else {
567
+ args.push(messageForClaude);
568
+ }
569
+ // Filter out Claude env vars
570
+ const cleanEnv = Object.fromEntries(Object.entries(process.env).filter(([key]) => !key.startsWith('CLAUDE') && key !== 'CLAUDECODE'));
571
+ const resolvedClaudePath = claudePath || resolveClaudeCli();
572
+ const claude = spawn(resolvedClaudePath, args, {
573
+ stdio: [hasImages ? 'pipe' : 'ignore', 'pipe', 'pipe'],
574
+ env: cleanEnv,
575
+ cwd: threadCwd,
576
+ });
577
+ // For multimodal messages, write content blocks to stdin
578
+ if (hasImages && claude.stdin) {
579
+ const contentBlocks = [
580
+ ...imageBlocks,
581
+ { type: 'text', text: messageForClaude || '' },
582
+ ];
583
+ const payload = JSON.stringify({
584
+ type: 'user',
585
+ message: { role: 'user', content: contentBlocks },
586
+ });
587
+ claude.stdin.write(payload + '\n');
588
+ claude.stdin.end();
589
+ }
590
+ // ── Stream response ──
591
+ let fullResponse = '';
592
+ let buffer = '';
593
+ const pendingLines = [];
594
+ const collectedSegments = [];
595
+ const spawnTime = Date.now();
596
+ let ttft = null;
597
+ const processLine = async (line) => {
598
+ if (!line.trim())
599
+ return;
600
+ let processed;
601
+ try {
602
+ processed = await streamProcessor.processLine(line);
603
+ }
604
+ catch {
605
+ processed = { line, modified: false, eventType: 'unknown' };
606
+ }
607
+ // Text extraction
608
+ const text = extractTextFromStreamLine(processed.line);
609
+ if (text) {
610
+ if (ttft === null) {
611
+ ttft = Date.now() - spawnTime;
612
+ }
613
+ if (fullResponse && !fullResponse.endsWith('\n')) {
614
+ fullResponse += '\n\n';
615
+ onToken?.('\n\n');
616
+ }
617
+ fullResponse += text;
618
+ onToken?.(text);
619
+ }
620
+ // Structured segments
621
+ const segments = parseStreamSegments(processed.line);
622
+ for (const seg of segments) {
623
+ collectedSegments.push(seg);
624
+ onSegment?.(seg);
625
+ }
626
+ };
627
+ claude.stdout.on('data', (data) => {
628
+ buffer += data.toString();
629
+ const lines = buffer.split('\n');
630
+ buffer = lines.pop() || '';
631
+ for (const line of lines) {
632
+ pendingLines.push(processLine(line).catch(() => { }));
633
+ }
634
+ });
635
+ claude.stderr.on('data', (data) => {
636
+ const text = data.toString();
637
+ if (text.includes('ENOENT')) {
638
+ onError?.(text);
639
+ }
640
+ });
641
+ // ── Wait for completion ──
642
+ return new Promise((resolve, reject) => {
643
+ let completed = false;
644
+ const handleCompletion = async () => {
645
+ if (completed)
646
+ return;
647
+ completed = true;
648
+ try {
649
+ let assistantMessage = null;
650
+ if (fullResponse) {
651
+ assistantMessage = await thread.history.append({
652
+ role: 'assistant',
653
+ content: fullResponse,
654
+ metadata: { sessionId: thread.session.getSessionId() },
655
+ });
656
+ // Update session (non-critical)
657
+ try {
658
+ const messages = await thread.history.getRecent(2);
659
+ const userMsg = messages.find((m) => m.role === 'user');
660
+ if (userMsg) {
661
+ await thread.session.appendExchange(userMsg.content, fullResponse);
662
+ thread.session.generateMissingEmbeddings().catch(() => { });
663
+ }
664
+ }
665
+ catch (sessionErr) {
666
+ console.error('[Gateway] session update failed (non-fatal):', sessionErr);
667
+ }
668
+ // Record adaptive turn
669
+ try {
670
+ const tokensUsed = estimateTokens(fullResponse) + userQueryTokens;
671
+ thread.adaptive.recordTurn({
672
+ ttft: ttft ?? (Date.now() - spawnTime),
673
+ tokensUsed,
674
+ relevanceScore: computeAvgRelevance(retrievalResult?.debug),
675
+ });
676
+ await thread.adaptive.save();
677
+ }
678
+ catch (adaptiveErr) {
679
+ console.error('[Gateway] adaptive budget update failed (non-fatal):', adaptiveErr);
680
+ }
681
+ }
682
+ // Cleanup MCP config
683
+ cleanupMcpConfig(mcpConfigPath);
684
+ resolve({
685
+ response: fullResponse,
686
+ ttft,
687
+ userMessage,
688
+ assistantMessage,
689
+ segments: collectedSegments,
690
+ debug,
691
+ });
692
+ }
693
+ catch (err) {
694
+ cleanupMcpConfig(mcpConfigPath);
695
+ reject(err);
696
+ }
697
+ };
698
+ claude.on('close', async () => {
699
+ if (buffer.trim()) {
700
+ pendingLines.push(processLine(buffer).catch(() => { }));
701
+ }
702
+ await Promise.all(pendingLines);
703
+ handleCompletion();
704
+ });
705
+ claude.on('error', (err) => {
706
+ cleanupMcpConfig(mcpConfigPath);
707
+ const errorMsg = err.message.includes('ENOENT')
708
+ ? 'Claude CLI not found. Please install it first.'
709
+ : err.message;
710
+ onError?.(errorMsg);
711
+ reject(new Error(errorMsg));
712
+ });
713
+ });
714
+ }
715
+ //# sourceMappingURL=gateway.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway.js","sourceRoot":"","sources":["../../src/lib/gateway.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@luckydraw/cumulus",
3
- "version": "0.9.1",
3
+ "version": "0.10.0",
4
4
  "description": "RLM-based CLI chat wrapper for Claude with external history context management",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",