@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.
Files changed (47) hide show
  1. package/dist/agent-manager.d.ts +19 -5
  2. package/dist/agent-manager.d.ts.map +1 -1
  3. package/dist/agent-manager.js +153 -16
  4. package/dist/agent-manager.js.map +1 -1
  5. package/dist/cli.js +21 -2
  6. package/dist/cli.js.map +1 -1
  7. package/dist/config.d.ts +7 -3
  8. package/dist/config.d.ts.map +1 -1
  9. package/dist/config.js +35 -8
  10. package/dist/config.js.map +1 -1
  11. package/dist/engines/claude-engine.d.ts +12 -0
  12. package/dist/engines/claude-engine.d.ts.map +1 -0
  13. package/dist/engines/claude-engine.js +208 -0
  14. package/dist/engines/claude-engine.js.map +1 -0
  15. package/dist/engines/claude-sdk-engine.d.ts +19 -0
  16. package/dist/engines/claude-sdk-engine.d.ts.map +1 -0
  17. package/dist/engines/claude-sdk-engine.js +288 -0
  18. package/dist/engines/claude-sdk-engine.js.map +1 -0
  19. package/dist/engines/engine-manager.d.ts +31 -0
  20. package/dist/engines/engine-manager.d.ts.map +1 -0
  21. package/dist/engines/engine-manager.js +60 -0
  22. package/dist/engines/engine-manager.js.map +1 -0
  23. package/dist/engines/index.d.ts +15 -0
  24. package/dist/engines/index.d.ts.map +1 -0
  25. package/dist/engines/index.js +23 -0
  26. package/dist/engines/index.js.map +1 -0
  27. package/dist/engines/letta-engine.d.ts +32 -0
  28. package/dist/engines/letta-engine.d.ts.map +1 -0
  29. package/dist/engines/letta-engine.js +249 -0
  30. package/dist/engines/letta-engine.js.map +1 -0
  31. package/dist/engines/nuum-engine.d.ts +14 -0
  32. package/dist/engines/nuum-engine.d.ts.map +1 -0
  33. package/dist/engines/nuum-engine.js +270 -0
  34. package/dist/engines/nuum-engine.js.map +1 -0
  35. package/dist/engines/types.d.ts +72 -0
  36. package/dist/engines/types.d.ts.map +1 -0
  37. package/dist/engines/types.js +13 -0
  38. package/dist/engines/types.js.map +1 -0
  39. package/dist/runtime-client.d.ts +29 -0
  40. package/dist/runtime-client.d.ts.map +1 -1
  41. package/dist/runtime-client.js +71 -0
  42. package/dist/runtime-client.js.map +1 -1
  43. package/dist/tymbal-bridge.js +10 -10
  44. package/dist/tymbal-bridge.js.map +1 -1
  45. package/dist/types.d.ts +20 -0
  46. package/dist/types.d.ts.map +1 -1
  47. 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":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,KAAK,EAAqB,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAS5B,gFAAgF;AAChF,uBAAuB;AACvB,gFAAgF;AAEhF,SAAS,WAAW,CAAC,KAAkB;IACrC,OAAO;QACL,CAAC,EAAE,IAAI,EAAE;QACT,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QAC3B,CAAC,EAAE,KAAK;KACT,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,QAAgB,EAAE,OAAe;IACzD,OAAO,WAAW,CAAC;QACjB,IAAI,EAAE,OAAO;QACb,MAAM,EAAE,QAAQ;QAChB,UAAU,EAAE,OAAO;QACnB,OAAO;KACR,CAAC,CAAC;AACL,CAAC;AAED,SAAS,mBAAmB,CAC1B,QAAgB,EAChB,UAAkB,EAClB,IAAY,EACZ,IAA6B;IAE7B,OAAO,WAAW,CAAC;QACjB,IAAI,EAAE,WAAW;QACjB,MAAM,EAAE,QAAQ;QAChB,UAAU,EAAE,OAAO;QACnB,UAAU;QACV,IAAI;QACJ,IAAI;KACL,CAAC,CAAC;AACL,CAAC;AAED,SAAS,qBAAqB,CAC5B,QAAgB,EAChB,UAAkB,EAClB,OAAgB,EAChB,OAAgB;IAEhB,OAAO,WAAW,CAAC;QACjB,IAAI,EAAE,aAAa;QACnB,MAAM,EAAE,QAAQ;QAChB,UAAU,EAAE,OAAO;QACnB,UAAU;QACV,OAAO;QACP,OAAO;KACR,CAAC,CAAC;AACL,CAAC;AAED,SAAS,eAAe,CAAC,QAAgB;IACvC,OAAO,WAAW,CAAC;QACjB,IAAI,EAAE,MAAM;QACZ,MAAM,EAAE,QAAQ;QAChB,UAAU,EAAE,OAAO;KACpB,CAAC,CAAC;AACL,CAAC;AAgDD,gFAAgF;AAChF,eAAe;AACf,gFAAgF;AAEhF,MAAM,OAAO,WAAW;IACb,IAAI,GAAG,OAAO,CAAC;IAEhB,YAAY,GAAwB,IAAI,CAAC;IACzC,YAAY,GAAkB,IAAI,CAAC;IACnC,mBAAmB,GAAkB,IAAI,CAAC;IAElD,gEAAgE;IACxD,cAAc,GAAW,EAAE,CAAC;IAC5B,gBAAgB,GAAW,EAAE,CAAC;IAEtC,KAAK,CAAC,OAAO,CACX,OAAe,EACf,MAA2B,EAC3B,SAA0B;QAE1B,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC;QACrE,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC;QAElD,qCAAqC;QACrC,MAAM,MAAM,GAAG,WAAW,CAAC,aAAa,CAAC;QACzC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAC;YAC5F,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACzB,SAAS,CAAC,UAAU,EAAE,CAAC;YACvB,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,CAAC;QAC7B,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,wCAAwC,OAAO,EAAE,CAAC,CAAC;QAC/D,OAAO,CAAC,GAAG,CAAC,oCAAoC,aAAa,EAAE,CAAC,CAAC;QAEjE,4BAA4B;QAC5B,MAAM,IAAI,GAAG;YACX,IAAI,EAAG,gBAAgB;YACvB,gBAAgB,EAAE,aAAa;YAC/B,iBAAiB,EAAE,aAAa;YAChC,QAAQ,EAAG,iDAAiD;SAC7D,CAAC;QAEF,wEAAwE;QACxE,qEAAqE;QACrE,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;QAC1C,CAAC;QACD,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC7B,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC;QACxD,CAAC;aAAM,CAAC;YACN,iDAAiD;YACjD,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACzB,IAAI,YAAY,EAAE,CAAC;gBACjB,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,YAAY,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;QAED,sBAAsB;QACtB,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE;YAChC,GAAG,EAAE,aAAa;YAClB,GAAG,EAAE;gBACH,GAAG,OAAO,CAAC,GAAG;gBACd,GAAG,WAAW;gBACd,aAAa,EAAE,MAAM;aACtB;YACD,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;SAChC,CAAC,CAAC;QAEH,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QAEzB,yBAAyB;QACzB,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YAC/B,OAAO,CAAC,KAAK,CAAC,yBAAyB,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;QAEH,sBAAsB;QACtB,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;YAC/B,OAAO,CAAC,GAAG,CAAC,0CAA0C,IAAI,YAAY,MAAM,EAAE,CAAC,CAAC;YAChF,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QAC3B,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YACzB,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAC;YACrD,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC3B,CAAC,CAAC,CAAC;QAEH,8CAA8C;QAC9C,MAAM,QAAQ,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,MAAO,EAAE,CAAC,CAAC;QAE1D,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YAC3B,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;gBAAE,OAAO;YAEzB,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAiB,CAAC;gBACjD,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;YACnD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,uCAAuC,IAAI,EAAE,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACxB,OAAO,CAAC,GAAG,CAAC,mCAAmC,OAAO,EAAE,CAAC,CAAC;YAC1D,SAAS,CAAC,OAAO,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC7C,SAAS,CAAC,UAAU,EAAE,CAAC;QACzB,CAAC,CAAC,CAAC;QAEH,wBAAwB;QACxB,MAAM,WAAW,GAAG;YAClB,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE;SACnC,CAAC;QACF,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,CAAC;QAEtD,oBAAoB;QACpB,OAAO;YACL,WAAW,EAAE,CAAC,GAAW,EAAE,EAAE;gBAC3B,IAAI,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC;oBACzB,MAAM,OAAO,GAAG;wBACd,IAAI,EAAE,MAAM;wBACZ,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE;qBACxC,CAAC;oBACF,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;gBACnD,CAAC;YACH,CAAC;YACD,KAAK,EAAE,GAAG,EAAE;gBACV,OAAO,CAAC,GAAG,CAAC,qCAAqC,OAAO,EAAE,CAAC,CAAC;gBAC5D,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC;YACpB,CAAC;SACF,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,aAAa,CACnB,OAAqB,EACrB,QAAgB,EAChB,SAA0B;QAE1B,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;YACrB,KAAK,QAAQ;gBACX,IAAI,OAAO,CAAC,OAAO,KAAK,MAAM,EAAE,CAAC;oBAC/B,sDAAsD;oBACtD,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC;oBACrC,IAAI,CAAC,mBAAmB,GAAG,OAAO,CAAC,eAAe,CAAC;oBACnD,OAAO,CAAC,GAAG,CAAC,oCAAoC,IAAI,CAAC,YAAY,kBAAkB,IAAI,CAAC,mBAAmB,EAAE,CAAC,CAAC;gBACjH,CAAC;gBACD,MAAM;YAER,KAAK,SAAS;gBACZ,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;gBACvD,MAAM;YAER,KAAK,QAAQ;gBACX,IAAI,OAAO,CAAC,OAAO,KAAK,OAAO,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;oBACjD,SAAS,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC9C,CAAC;gBACD,yDAAyD;gBACzD,MAAM;QACV,CAAC;IACH,CAAC;IAED;;;OAGG;IACK,mBAAmB,CACzB,OAA2B,EAC3B,QAAgB,EAChB,SAA0B;QAE1B,QAAQ,OAAO,CAAC,YAAY,EAAE,CAAC;YAC7B,KAAK,mBAAmB;gBACtB,kDAAkD;gBAClD,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;oBACtB,IAAI,CAAC,gBAAgB,IAAI,OAAO,CAAC,SAAS,CAAC;gBAC7C,CAAC;gBACD,MAAM;YAER,KAAK,mBAAmB;gBACtB,0DAA0D;gBAC1D,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;oBACpB,IAAI,CAAC,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;gBACzC,CAAC;gBACD,MAAM;YAER,KAAK,WAAW;gBACd,4CAA4C;gBAC5C,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;oBACtB,MAAM,IAAI,GAAG,OAAO,OAAO,CAAC,SAAS,CAAC,SAAS,KAAK,QAAQ;wBAC1D,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC;wBACzC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC;oBAChC,SAAS,CAAC,OAAO,CACf,mBAAmB,CACjB,QAAQ,EACR,OAAO,CAAC,SAAS,CAAC,EAAE,EACpB,OAAO,CAAC,SAAS,CAAC,IAAI,EACtB,IAAI,CACL,CACF,CAAC;gBACJ,CAAC;gBACD,MAAM;YAER,KAAK,aAAa;gBAChB,8CAA8C;gBAC9C,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;oBACxB,SAAS,CAAC,OAAO,CACf,qBAAqB,CACnB,QAAQ,EACR,OAAO,CAAC,WAAW,CAAC,EAAE,EACtB,OAAO,CAAC,WAAW,CAAC,MAAM,EAC1B,OAAO,CAAC,WAAW,CAAC,QAAQ,IAAI,KAAK,CACtC,CACF,CAAC;gBACJ,CAAC;gBACD,MAAM;YAER,KAAK,aAAa;gBAChB,sDAAsD;gBACtD,OAAO,CAAC,GAAG,CAAC,8BAA8B,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;gBAEjE,gCAAgC;gBAChC,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;oBAC1B,SAAS,CAAC,OAAO,CAAC,gBAAgB,CAAC,QAAQ,EAAE,cAAc,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC;oBACrF,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC;gBAC7B,CAAC;gBAED,wCAAwC;gBACxC,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;oBACxB,SAAS,CAAC,OAAO,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;oBACnE,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;gBAC3B,CAAC;gBACD,MAAM;YAER,KAAK,kBAAkB;gBACrB,wBAAwB;gBACxB,MAAM;QACV,CAAC;IACH,CAAC;CACF"}
@@ -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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"}