@miriad-systems/backend 0.1.2 → 0.1.3
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/agent-manager.d.ts +19 -5
- package/dist/agent-manager.d.ts.map +1 -1
- package/dist/agent-manager.js +153 -16
- package/dist/agent-manager.js.map +1 -1
- package/dist/cli.js +21 -2
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +7 -3
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +35 -8
- package/dist/config.js.map +1 -1
- package/dist/engines/claude-engine.d.ts +12 -0
- package/dist/engines/claude-engine.d.ts.map +1 -0
- package/dist/engines/claude-engine.js +208 -0
- package/dist/engines/claude-engine.js.map +1 -0
- package/dist/engines/claude-sdk-engine.d.ts +19 -0
- package/dist/engines/claude-sdk-engine.d.ts.map +1 -0
- package/dist/engines/claude-sdk-engine.js +288 -0
- package/dist/engines/claude-sdk-engine.js.map +1 -0
- package/dist/engines/engine-manager.d.ts +31 -0
- package/dist/engines/engine-manager.d.ts.map +1 -0
- package/dist/engines/engine-manager.js +60 -0
- package/dist/engines/engine-manager.js.map +1 -0
- package/dist/engines/index.d.ts +15 -0
- package/dist/engines/index.d.ts.map +1 -0
- package/dist/engines/index.js +23 -0
- package/dist/engines/index.js.map +1 -0
- package/dist/engines/letta-engine.d.ts +32 -0
- package/dist/engines/letta-engine.d.ts.map +1 -0
- package/dist/engines/letta-engine.js +249 -0
- package/dist/engines/letta-engine.js.map +1 -0
- package/dist/engines/nuum-engine.d.ts +14 -0
- package/dist/engines/nuum-engine.d.ts.map +1 -0
- package/dist/engines/nuum-engine.js +270 -0
- package/dist/engines/nuum-engine.js.map +1 -0
- package/dist/engines/types.d.ts +72 -0
- package/dist/engines/types.d.ts.map +1 -0
- package/dist/engines/types.js +13 -0
- package/dist/engines/types.js.map +1 -0
- package/dist/runtime-client.d.ts +29 -0
- package/dist/runtime-client.d.ts.map +1 -1
- package/dist/runtime-client.js +71 -0
- package/dist/runtime-client.js.map +1 -1
- package/dist/tymbal-bridge.js +10 -10
- package/dist/tymbal-bridge.js.map +1 -1
- package/dist/types.d.ts +20 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +8 -8
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Engines
|
|
3
|
+
*
|
|
4
|
+
* Pluggable engine system for running different agent implementations.
|
|
5
|
+
*/
|
|
6
|
+
export * from './types.js';
|
|
7
|
+
export { EngineManager } from './engine-manager.js';
|
|
8
|
+
export { ClaudeSDKEngine, startClaudeSDKProcess } from './claude-sdk-engine.js';
|
|
9
|
+
export { NuumEngine } from './nuum-engine.js';
|
|
10
|
+
import { EngineManager } from './engine-manager.js';
|
|
11
|
+
import { ClaudeSDKEngine } from './claude-sdk-engine.js';
|
|
12
|
+
import { NuumEngine } from './nuum-engine.js';
|
|
13
|
+
/**
|
|
14
|
+
* Create and configure the default engine manager with all available engines.
|
|
15
|
+
*/
|
|
16
|
+
export function createEngineManager() {
|
|
17
|
+
const manager = new EngineManager();
|
|
18
|
+
// Register default engines
|
|
19
|
+
manager.register(new ClaudeSDKEngine());
|
|
20
|
+
manager.register(new NuumEngine());
|
|
21
|
+
return manager;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/engines/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAChF,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C;;GAEG;AACH,MAAM,UAAU,mBAAmB;IACjC,MAAM,OAAO,GAAG,IAAI,aAAa,EAAE,CAAC;IAEpC,2BAA2B;IAC3B,OAAO,CAAC,QAAQ,CAAC,IAAI,eAAe,EAAE,CAAC,CAAC;IACxC,OAAO,CAAC,QAAQ,CAAC,IAAI,UAAU,EAAE,CAAC,CAAC;IAEnC,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Letta Engine
|
|
3
|
+
*
|
|
4
|
+
* Implementation of AgentEngine using Letta Code CLI in headless mode.
|
|
5
|
+
* Spawns `letta` process with bidirectional JSON streaming.
|
|
6
|
+
*
|
|
7
|
+
* Architecture matches Claude Code:
|
|
8
|
+
* - Spawn CLI process with --input-format stream-json --output-format stream-json
|
|
9
|
+
* - Send user messages via stdin
|
|
10
|
+
* - Receive streaming responses via stdout
|
|
11
|
+
* - MCP tools handled locally by Letta Code
|
|
12
|
+
*/
|
|
13
|
+
import type { AgentEngine, EngineSessionConfig, EngineCallbacks, EngineController } from './types.js';
|
|
14
|
+
export declare class LettaEngine implements AgentEngine {
|
|
15
|
+
readonly name = "letta";
|
|
16
|
+
private lettaProcess;
|
|
17
|
+
private lettaAgentId;
|
|
18
|
+
private lettaConversationId;
|
|
19
|
+
private pendingContent;
|
|
20
|
+
private pendingReasoning;
|
|
21
|
+
process(content: string, config: EngineSessionConfig, callbacks: EngineCallbacks): Promise<EngineController>;
|
|
22
|
+
/**
|
|
23
|
+
* Handle a message from Letta CLI and emit appropriate Tymbal frames.
|
|
24
|
+
*/
|
|
25
|
+
private handleMessage;
|
|
26
|
+
/**
|
|
27
|
+
* Handle streaming message types.
|
|
28
|
+
* Quick path: accumulate content and emit set frames only when complete.
|
|
29
|
+
*/
|
|
30
|
+
private handleStreamMessage;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=letta-engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"letta-engine.d.ts","sourceRoot":"","sources":["../../src/engines/letta-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,OAAO,KAAK,EACV,WAAW,EACX,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EACjB,MAAM,YAAY,CAAC;AAkHpB,qBAAa,WAAY,YAAW,WAAW;IAC7C,QAAQ,CAAC,IAAI,WAAW;IAExB,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,mBAAmB,CAAuB;IAGlD,OAAO,CAAC,cAAc,CAAc;IACpC,OAAO,CAAC,gBAAgB,CAAc;IAEhC,OAAO,CACX,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,mBAAmB,EAC3B,SAAS,EAAE,eAAe,GACzB,OAAO,CAAC,gBAAgB,CAAC;IAiH5B;;OAEG;IACH,OAAO,CAAC,aAAa;IA4BrB;;;OAGG;IACH,OAAO,CAAC,mBAAmB;CAyE5B"}
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Letta Engine
|
|
3
|
+
*
|
|
4
|
+
* Implementation of AgentEngine using Letta Code CLI in headless mode.
|
|
5
|
+
* Spawns `letta` process with bidirectional JSON streaming.
|
|
6
|
+
*
|
|
7
|
+
* Architecture matches Claude Code:
|
|
8
|
+
* - Spawn CLI process with --input-format stream-json --output-format stream-json
|
|
9
|
+
* - Send user messages via stdin
|
|
10
|
+
* - Receive streaming responses via stdout
|
|
11
|
+
* - MCP tools handled locally by Letta Code
|
|
12
|
+
*/
|
|
13
|
+
import { spawn } from 'node:child_process';
|
|
14
|
+
import { createInterface } from 'node:readline';
|
|
15
|
+
import { ulid } from 'ulid';
|
|
16
|
+
// =============================================================================
|
|
17
|
+
// Tymbal Frame Helpers
|
|
18
|
+
// =============================================================================
|
|
19
|
+
function createFrame(value) {
|
|
20
|
+
return {
|
|
21
|
+
i: ulid(),
|
|
22
|
+
t: new Date().toISOString(),
|
|
23
|
+
v: value,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
function createAgentFrame(callsign, content) {
|
|
27
|
+
return createFrame({
|
|
28
|
+
type: 'agent',
|
|
29
|
+
sender: callsign,
|
|
30
|
+
senderType: 'agent',
|
|
31
|
+
content,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
function createToolCallFrame(callsign, toolCallId, name, args) {
|
|
35
|
+
return createFrame({
|
|
36
|
+
type: 'tool_call',
|
|
37
|
+
sender: callsign,
|
|
38
|
+
senderType: 'agent',
|
|
39
|
+
toolCallId,
|
|
40
|
+
name,
|
|
41
|
+
args,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
function createToolResultFrame(callsign, toolCallId, content, isError) {
|
|
45
|
+
return createFrame({
|
|
46
|
+
type: 'tool_result',
|
|
47
|
+
sender: callsign,
|
|
48
|
+
senderType: 'agent',
|
|
49
|
+
toolCallId,
|
|
50
|
+
content,
|
|
51
|
+
isError,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
function createIdleFrame(callsign) {
|
|
55
|
+
return createFrame({
|
|
56
|
+
type: 'idle',
|
|
57
|
+
sender: callsign,
|
|
58
|
+
senderType: 'agent',
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
// =============================================================================
|
|
62
|
+
// Letta Engine
|
|
63
|
+
// =============================================================================
|
|
64
|
+
export class LettaEngine {
|
|
65
|
+
name = 'letta';
|
|
66
|
+
lettaProcess = null;
|
|
67
|
+
lettaAgentId = null;
|
|
68
|
+
lettaConversationId = null;
|
|
69
|
+
// Accumulate content for set frames (quick path - no streaming)
|
|
70
|
+
pendingContent = '';
|
|
71
|
+
pendingReasoning = '';
|
|
72
|
+
async process(content, config, callbacks) {
|
|
73
|
+
const { agentId, workspacePath, systemPrompt, environment } = config;
|
|
74
|
+
const callsign = agentId.split(':')[2] ?? agentId;
|
|
75
|
+
// Get Letta API key from environment
|
|
76
|
+
const apiKey = environment.LETTA_API_KEY;
|
|
77
|
+
if (!apiKey) {
|
|
78
|
+
const error = new Error('LETTA_API_KEY not configured. Add it in Settings → Integrations.');
|
|
79
|
+
callbacks.onError(error);
|
|
80
|
+
callbacks.onComplete();
|
|
81
|
+
return { close: () => { } };
|
|
82
|
+
}
|
|
83
|
+
console.log(`[LettaEngine] Processing message for ${agentId}`);
|
|
84
|
+
console.log(`[LettaEngine] Working directory: ${workspacePath}`);
|
|
85
|
+
// Build letta CLI arguments
|
|
86
|
+
const args = [
|
|
87
|
+
'-p', // Headless mode
|
|
88
|
+
'--input-format', 'stream-json',
|
|
89
|
+
'--output-format', 'stream-json',
|
|
90
|
+
'--yolo', // Auto-approve tool use (container is sandboxed)
|
|
91
|
+
];
|
|
92
|
+
// Use existing agent/conversation if we have them, otherwise create new
|
|
93
|
+
// TODO: Store agentId/conversationId in roster.props for persistence
|
|
94
|
+
if (this.lettaAgentId) {
|
|
95
|
+
args.push('--agent', this.lettaAgentId);
|
|
96
|
+
}
|
|
97
|
+
if (this.lettaConversationId) {
|
|
98
|
+
args.push('--conversation', this.lettaConversationId);
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
// First run: create new agent with system prompt
|
|
102
|
+
args.push('--new-agent');
|
|
103
|
+
if (systemPrompt) {
|
|
104
|
+
args.push('--system-append', systemPrompt);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
// Spawn letta process
|
|
108
|
+
const proc = spawn('letta', args, {
|
|
109
|
+
cwd: workspacePath,
|
|
110
|
+
env: {
|
|
111
|
+
...process.env,
|
|
112
|
+
...environment,
|
|
113
|
+
LETTA_API_KEY: apiKey,
|
|
114
|
+
},
|
|
115
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
116
|
+
});
|
|
117
|
+
this.lettaProcess = proc;
|
|
118
|
+
// Handle stderr (log it)
|
|
119
|
+
proc.stderr?.on('data', (data) => {
|
|
120
|
+
console.error(`[LettaEngine] stderr: ${data.toString()}`);
|
|
121
|
+
});
|
|
122
|
+
// Handle process exit
|
|
123
|
+
proc.on('exit', (code, signal) => {
|
|
124
|
+
console.log(`[LettaEngine] Process exited with code ${code}, signal ${signal}`);
|
|
125
|
+
this.lettaProcess = null;
|
|
126
|
+
});
|
|
127
|
+
proc.on('error', (error) => {
|
|
128
|
+
console.error(`[LettaEngine] Process error:`, error);
|
|
129
|
+
callbacks.onError(error);
|
|
130
|
+
});
|
|
131
|
+
// Process stdout line by line (JSON-per-line)
|
|
132
|
+
const readline = createInterface({ input: proc.stdout });
|
|
133
|
+
readline.on('line', (line) => {
|
|
134
|
+
if (!line.trim())
|
|
135
|
+
return;
|
|
136
|
+
try {
|
|
137
|
+
const message = JSON.parse(line);
|
|
138
|
+
this.handleMessage(message, callsign, callbacks);
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
console.warn(`[LettaEngine] Failed to parse line: ${line}`);
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
readline.on('close', () => {
|
|
145
|
+
console.log(`[LettaEngine] Stream closed for ${agentId}`);
|
|
146
|
+
callbacks.onFrame(createIdleFrame(callsign));
|
|
147
|
+
callbacks.onComplete();
|
|
148
|
+
});
|
|
149
|
+
// Send the user message
|
|
150
|
+
const userMessage = {
|
|
151
|
+
type: 'user',
|
|
152
|
+
message: { role: 'user', content },
|
|
153
|
+
};
|
|
154
|
+
proc.stdin?.write(JSON.stringify(userMessage) + '\n');
|
|
155
|
+
// Return controller
|
|
156
|
+
return {
|
|
157
|
+
pushMessage: (msg) => {
|
|
158
|
+
if (proc.stdin?.writable) {
|
|
159
|
+
const userMsg = {
|
|
160
|
+
type: 'user',
|
|
161
|
+
message: { role: 'user', content: msg },
|
|
162
|
+
};
|
|
163
|
+
proc.stdin.write(JSON.stringify(userMsg) + '\n');
|
|
164
|
+
}
|
|
165
|
+
},
|
|
166
|
+
close: () => {
|
|
167
|
+
console.log(`[LettaEngine] Closing process for ${agentId}`);
|
|
168
|
+
proc.stdin?.end();
|
|
169
|
+
},
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Handle a message from Letta CLI and emit appropriate Tymbal frames.
|
|
174
|
+
*/
|
|
175
|
+
handleMessage(message, callsign, callbacks) {
|
|
176
|
+
switch (message.type) {
|
|
177
|
+
case 'system':
|
|
178
|
+
if (message.subtype === 'init') {
|
|
179
|
+
// Store agent/conversation IDs for session continuity
|
|
180
|
+
this.lettaAgentId = message.agent_id;
|
|
181
|
+
this.lettaConversationId = message.conversation_id;
|
|
182
|
+
console.log(`[LettaEngine] Initialized: agent=${this.lettaAgentId}, conversation=${this.lettaConversationId}`);
|
|
183
|
+
}
|
|
184
|
+
break;
|
|
185
|
+
case 'message':
|
|
186
|
+
this.handleStreamMessage(message, callsign, callbacks);
|
|
187
|
+
break;
|
|
188
|
+
case 'result':
|
|
189
|
+
if (message.subtype === 'error' && message.error) {
|
|
190
|
+
callbacks.onError(new Error(message.error));
|
|
191
|
+
}
|
|
192
|
+
// Result marks end of turn - we'll get close event after
|
|
193
|
+
break;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Handle streaming message types.
|
|
198
|
+
* Quick path: accumulate content and emit set frames only when complete.
|
|
199
|
+
*/
|
|
200
|
+
handleStreamMessage(message, callsign, callbacks) {
|
|
201
|
+
switch (message.message_type) {
|
|
202
|
+
case 'reasoning_message':
|
|
203
|
+
// Accumulate reasoning (will emit when turn ends)
|
|
204
|
+
if (message.reasoning) {
|
|
205
|
+
this.pendingReasoning += message.reasoning;
|
|
206
|
+
}
|
|
207
|
+
break;
|
|
208
|
+
case 'assistant_message':
|
|
209
|
+
// Accumulate assistant content (will emit when turn ends)
|
|
210
|
+
if (message.content) {
|
|
211
|
+
this.pendingContent += message.content;
|
|
212
|
+
}
|
|
213
|
+
break;
|
|
214
|
+
case 'tool_call':
|
|
215
|
+
// Tool calls emit immediately as set frames
|
|
216
|
+
if (message.tool_call) {
|
|
217
|
+
const args = typeof message.tool_call.arguments === 'string'
|
|
218
|
+
? JSON.parse(message.tool_call.arguments)
|
|
219
|
+
: message.tool_call.arguments;
|
|
220
|
+
callbacks.onFrame(createToolCallFrame(callsign, message.tool_call.id, message.tool_call.name, args));
|
|
221
|
+
}
|
|
222
|
+
break;
|
|
223
|
+
case 'tool_result':
|
|
224
|
+
// Tool results emit immediately as set frames
|
|
225
|
+
if (message.tool_result) {
|
|
226
|
+
callbacks.onFrame(createToolResultFrame(callsign, message.tool_result.id, message.tool_result.output, message.tool_result.is_error ?? false));
|
|
227
|
+
}
|
|
228
|
+
break;
|
|
229
|
+
case 'stop_reason':
|
|
230
|
+
// Turn ended - emit accumulated content as set frames
|
|
231
|
+
console.log(`[LettaEngine] Stop reason: ${message.stop_reason}`);
|
|
232
|
+
// Emit reasoning if we have any
|
|
233
|
+
if (this.pendingReasoning) {
|
|
234
|
+
callbacks.onFrame(createAgentFrame(callsign, `[thinking] ${this.pendingReasoning}`));
|
|
235
|
+
this.pendingReasoning = '';
|
|
236
|
+
}
|
|
237
|
+
// Emit assistant content if we have any
|
|
238
|
+
if (this.pendingContent) {
|
|
239
|
+
callbacks.onFrame(createAgentFrame(callsign, this.pendingContent));
|
|
240
|
+
this.pendingContent = '';
|
|
241
|
+
}
|
|
242
|
+
break;
|
|
243
|
+
case 'usage_statistics':
|
|
244
|
+
// Could log usage stats
|
|
245
|
+
break;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
//# sourceMappingURL=letta-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"letta-engine.js","sourceRoot":"","sources":["../../src/engines/letta-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Nuum Engine
|
|
3
|
+
*
|
|
4
|
+
* Subprocess engine running @miriad-systems/nuum via bunx.
|
|
5
|
+
* Communicates via NDJSON over stdin/stdout, translates to SDKMessage format.
|
|
6
|
+
*/
|
|
7
|
+
import type { AgentEngine, EngineConfig, EngineProcess } from './types.js';
|
|
8
|
+
export declare class NuumEngine implements AgentEngine {
|
|
9
|
+
readonly engineId = "nuum";
|
|
10
|
+
readonly displayName = "Nuum (Miriad Code)";
|
|
11
|
+
isAvailable(): Promise<boolean>;
|
|
12
|
+
spawn(config: EngineConfig): Promise<EngineProcess>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=nuum-engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nuum-engine.d.ts","sourceRoot":"","sources":["../../src/engines/nuum-engine.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EACV,WAAW,EACX,YAAY,EACZ,aAAa,EAGd,MAAM,YAAY,CAAC;AA+SpB,qBAAa,UAAW,YAAW,WAAW;IAC5C,QAAQ,CAAC,QAAQ,UAAU;IAC3B,QAAQ,CAAC,WAAW,wBAAwB;IAEtC,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAW/B,KAAK,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC;CAK1D"}
|
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Nuum Engine
|
|
3
|
+
*
|
|
4
|
+
* Subprocess engine running @miriad-systems/nuum via bunx.
|
|
5
|
+
* Communicates via NDJSON over stdin/stdout, translates to SDKMessage format.
|
|
6
|
+
*/
|
|
7
|
+
import { spawn } from 'node:child_process';
|
|
8
|
+
import { join } from 'node:path';
|
|
9
|
+
import { createInterface } from 'node:readline';
|
|
10
|
+
// =============================================================================
|
|
11
|
+
// Nuum Engine Process
|
|
12
|
+
// =============================================================================
|
|
13
|
+
class NuumProcess {
|
|
14
|
+
config;
|
|
15
|
+
proc = null;
|
|
16
|
+
_state = 'starting';
|
|
17
|
+
exitHandlers = [];
|
|
18
|
+
outputQueue = [];
|
|
19
|
+
outputResolve = null;
|
|
20
|
+
outputDone = false;
|
|
21
|
+
sessionId = null;
|
|
22
|
+
constructor(config) {
|
|
23
|
+
this.config = config;
|
|
24
|
+
}
|
|
25
|
+
get pid() {
|
|
26
|
+
return this.proc?.pid ?? null;
|
|
27
|
+
}
|
|
28
|
+
get state() {
|
|
29
|
+
return this._state;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Spawn the Nuum subprocess.
|
|
33
|
+
*/
|
|
34
|
+
async spawn() {
|
|
35
|
+
const dbPath = join(this.config.workspacePath, '.nuum', 'agent.db');
|
|
36
|
+
console.log(`[NuumProcess] Spawning for ${this.config.agentId}`);
|
|
37
|
+
console.log(`[NuumProcess] DB path: ${dbPath}`);
|
|
38
|
+
console.log(`[NuumProcess] Working directory: ${this.config.workspacePath}`);
|
|
39
|
+
// Build environment
|
|
40
|
+
const env = {
|
|
41
|
+
...process.env,
|
|
42
|
+
...this.config.environment,
|
|
43
|
+
};
|
|
44
|
+
// Pass initial MCP config via environment
|
|
45
|
+
if (this.config.mcpServers && this.config.mcpServers.length > 0) {
|
|
46
|
+
env.MIRIAD_MCP_CONFIG = JSON.stringify({
|
|
47
|
+
mcpServers: Object.fromEntries(this.config.mcpServers.map(s => [s.name, s])),
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
this.proc = spawn('bunx', [
|
|
51
|
+
'@miriad-systems/nuum@latest',
|
|
52
|
+
'--stdio',
|
|
53
|
+
'--db', dbPath,
|
|
54
|
+
], {
|
|
55
|
+
cwd: this.config.workspacePath,
|
|
56
|
+
env,
|
|
57
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
58
|
+
});
|
|
59
|
+
// Handle stdout (NDJSON messages)
|
|
60
|
+
const rl = createInterface({ input: this.proc.stdout });
|
|
61
|
+
rl.on('line', (line) => {
|
|
62
|
+
this.handleLine(line);
|
|
63
|
+
});
|
|
64
|
+
// Handle stderr (logging)
|
|
65
|
+
this.proc.stderr?.on('data', (data) => {
|
|
66
|
+
const text = data.toString().trim();
|
|
67
|
+
if (text) {
|
|
68
|
+
console.log(`[NuumProcess:${this.config.agentId}] ${text}`);
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
// Handle exit
|
|
72
|
+
this.proc.on('exit', (code) => {
|
|
73
|
+
console.log(`[NuumProcess] Exited with code ${code}`);
|
|
74
|
+
this._state = 'terminated';
|
|
75
|
+
this.finishOutput();
|
|
76
|
+
for (const handler of this.exitHandlers) {
|
|
77
|
+
handler(code);
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
this.proc.on('error', (error) => {
|
|
81
|
+
console.error(`[NuumProcess] Spawn error:`, error);
|
|
82
|
+
this._state = 'terminated';
|
|
83
|
+
this.finishOutput();
|
|
84
|
+
});
|
|
85
|
+
// Wait for init message
|
|
86
|
+
await this.waitForInit();
|
|
87
|
+
}
|
|
88
|
+
async waitForInit() {
|
|
89
|
+
return new Promise((resolve, reject) => {
|
|
90
|
+
const timeout = setTimeout(() => {
|
|
91
|
+
reject(new Error('Timeout waiting for Nuum init message'));
|
|
92
|
+
}, 30000);
|
|
93
|
+
const checkInit = () => {
|
|
94
|
+
if (this._state === 'ready') {
|
|
95
|
+
clearTimeout(timeout);
|
|
96
|
+
resolve();
|
|
97
|
+
}
|
|
98
|
+
else if (this._state === 'terminated') {
|
|
99
|
+
clearTimeout(timeout);
|
|
100
|
+
reject(new Error('Nuum process terminated before init'));
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
setTimeout(checkInit, 100);
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
checkInit();
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
handleLine(line) {
|
|
110
|
+
if (!line.trim())
|
|
111
|
+
return;
|
|
112
|
+
let msg;
|
|
113
|
+
try {
|
|
114
|
+
msg = JSON.parse(line);
|
|
115
|
+
}
|
|
116
|
+
catch (e) {
|
|
117
|
+
console.warn(`[NuumProcess] Invalid JSON: ${line}`);
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
console.log(`[NuumProcess] Received: ${JSON.stringify(msg).slice(0, 200)}`);
|
|
121
|
+
// Handle init message
|
|
122
|
+
if (msg.type === 'system' && msg.subtype === 'init') {
|
|
123
|
+
const initMsg = msg;
|
|
124
|
+
this.sessionId = initMsg.session_id ?? null;
|
|
125
|
+
this._state = 'ready';
|
|
126
|
+
console.log(`[NuumProcess] Initialized, session: ${this.sessionId}`);
|
|
127
|
+
// Don't emit init to output - it's internal
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
// Handle result message (turn complete)
|
|
131
|
+
if (msg.type === 'result') {
|
|
132
|
+
this._state = 'ready';
|
|
133
|
+
}
|
|
134
|
+
// Translate and emit
|
|
135
|
+
const translated = this.translateMessage(msg);
|
|
136
|
+
if (translated) {
|
|
137
|
+
this.emitOutput(translated);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Translate Nuum message to SDK format.
|
|
142
|
+
* Most messages are already SDK-compatible, we just pass them through.
|
|
143
|
+
* The TymbalBridge handles the actual translation to Tymbal frames.
|
|
144
|
+
*/
|
|
145
|
+
translateMessage(msg) {
|
|
146
|
+
// Nuum emits SDK-compatible messages, pass through as-is
|
|
147
|
+
// The TymbalBridge will handle any missing fields gracefully
|
|
148
|
+
return msg;
|
|
149
|
+
}
|
|
150
|
+
emitOutput(message) {
|
|
151
|
+
if (this.outputResolve) {
|
|
152
|
+
this.outputResolve({ value: message, done: false });
|
|
153
|
+
this.outputResolve = null;
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
this.outputQueue.push(message);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
finishOutput() {
|
|
160
|
+
this.outputDone = true;
|
|
161
|
+
if (this.outputResolve) {
|
|
162
|
+
this.outputResolve({ value: undefined, done: true });
|
|
163
|
+
this.outputResolve = null;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
send(message) {
|
|
167
|
+
if (!this.proc?.stdin?.writable) {
|
|
168
|
+
console.warn('[NuumProcess] Cannot send: stdin not writable');
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
if (message.type === 'user' && message.content) {
|
|
172
|
+
const formatted = message.sender
|
|
173
|
+
? `--- @${message.sender} says:\n${message.content}`
|
|
174
|
+
: message.content;
|
|
175
|
+
const nuumMsg = {
|
|
176
|
+
type: 'user',
|
|
177
|
+
message: { role: 'user', content: formatted },
|
|
178
|
+
session_id: this.sessionId ?? undefined,
|
|
179
|
+
};
|
|
180
|
+
// Include per-turn overrides if provided
|
|
181
|
+
if (message.systemPrompt) {
|
|
182
|
+
nuumMsg.system_prompt = message.systemPrompt;
|
|
183
|
+
}
|
|
184
|
+
if (message.mcpServers && message.mcpServers.length > 0) {
|
|
185
|
+
// Convert array to object keyed by name (Nuum's expected format)
|
|
186
|
+
nuumMsg.mcp_servers = Object.fromEntries(message.mcpServers.map(s => [s.name, s]));
|
|
187
|
+
}
|
|
188
|
+
this._state = 'busy';
|
|
189
|
+
console.log(`[NuumProcess] Sending user message: ${formatted.slice(0, 100)}...`);
|
|
190
|
+
this.proc.stdin.write(JSON.stringify(nuumMsg) + '\n');
|
|
191
|
+
}
|
|
192
|
+
else if (message.type === 'control') {
|
|
193
|
+
const nuumMsg = {
|
|
194
|
+
type: 'control',
|
|
195
|
+
action: message.action,
|
|
196
|
+
};
|
|
197
|
+
this.proc.stdin.write(JSON.stringify(nuumMsg) + '\n');
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
get output() {
|
|
201
|
+
const self = this;
|
|
202
|
+
return {
|
|
203
|
+
[Symbol.asyncIterator]() {
|
|
204
|
+
return {
|
|
205
|
+
async next() {
|
|
206
|
+
if (self.outputQueue.length > 0) {
|
|
207
|
+
return { value: self.outputQueue.shift(), done: false };
|
|
208
|
+
}
|
|
209
|
+
if (self.outputDone) {
|
|
210
|
+
return { value: undefined, done: true };
|
|
211
|
+
}
|
|
212
|
+
return new Promise((resolve) => {
|
|
213
|
+
self.outputResolve = resolve;
|
|
214
|
+
});
|
|
215
|
+
},
|
|
216
|
+
};
|
|
217
|
+
},
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
async terminate(reason) {
|
|
221
|
+
console.log(`[NuumProcess] Terminating: ${reason ?? 'no reason'}`);
|
|
222
|
+
if (this.proc && !this.proc.killed) {
|
|
223
|
+
// Send SIGTERM for graceful shutdown
|
|
224
|
+
this.proc.kill('SIGTERM');
|
|
225
|
+
// Wait a bit, then force kill if needed
|
|
226
|
+
await new Promise((resolve) => {
|
|
227
|
+
const timeout = setTimeout(() => {
|
|
228
|
+
if (this.proc && !this.proc.killed) {
|
|
229
|
+
console.log('[NuumProcess] Force killing after timeout');
|
|
230
|
+
this.proc.kill('SIGKILL');
|
|
231
|
+
}
|
|
232
|
+
resolve();
|
|
233
|
+
}, 5000);
|
|
234
|
+
this.proc.once('exit', () => {
|
|
235
|
+
clearTimeout(timeout);
|
|
236
|
+
resolve();
|
|
237
|
+
});
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
this._state = 'terminated';
|
|
241
|
+
this.finishOutput();
|
|
242
|
+
}
|
|
243
|
+
onExit(handler) {
|
|
244
|
+
this.exitHandlers.push(handler);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
// =============================================================================
|
|
248
|
+
// Nuum Engine
|
|
249
|
+
// =============================================================================
|
|
250
|
+
export class NuumEngine {
|
|
251
|
+
engineId = 'nuum';
|
|
252
|
+
displayName = 'Nuum (Miriad Code)';
|
|
253
|
+
async isAvailable() {
|
|
254
|
+
try {
|
|
255
|
+
// Check if bunx is available
|
|
256
|
+
const { execSync } = await import('node:child_process');
|
|
257
|
+
execSync('bunx --version', { stdio: 'ignore' });
|
|
258
|
+
return true;
|
|
259
|
+
}
|
|
260
|
+
catch {
|
|
261
|
+
return false;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
async spawn(config) {
|
|
265
|
+
const process = new NuumProcess(config);
|
|
266
|
+
await process.spawn();
|
|
267
|
+
return process;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
//# sourceMappingURL=nuum-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nuum-engine.js","sourceRoot":"","sources":["../../src/engines/nuum-engine.ts"],"names":[],"mappings":"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"}
|