omnara 0.1.4 → 0.1.6

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 (86) hide show
  1. package/README.md +1 -1
  2. package/dist/cli.js +6357 -50
  3. package/dist/cli.js.map +7 -1
  4. package/dist/orchestrator/agent-orchestrator.d.ts +4 -1
  5. package/dist/orchestrator/orchestrator-prompt.d.ts +8 -2
  6. package/dist/orchestrator/{types.d.ts → orchestrator-types.d.ts} +14 -0
  7. package/dist/orchestrator/session.d.ts +1 -1
  8. package/dist/orchestrator/tools/worker-tools.d.ts +1 -0
  9. package/dist/orchestrator/utils/session-logger.d.ts +1 -1
  10. package/dist/relay/relay-bridge.d.ts +1 -0
  11. package/dist/utils/browser.d.ts +1 -0
  12. package/dist/utils/claude-code-check.d.ts +21 -0
  13. package/dist/utils/logger.d.ts +127 -0
  14. package/dist/utils/version-check.d.ts +9 -0
  15. package/package.json +12 -5
  16. package/scripts/preinstall.js +141 -0
  17. package/scripts/test-preinstall.js +125 -0
  18. package/dist/auth/auth-provider.js +0 -56
  19. package/dist/auth/auth-provider.js.map +0 -1
  20. package/dist/auth/cli-auth-service.js +0 -44
  21. package/dist/auth/cli-auth-service.js.map +0 -1
  22. package/dist/auth/credential-manager.js +0 -71
  23. package/dist/auth/credential-manager.js.map +0 -1
  24. package/dist/auth/credentials-store.js +0 -69
  25. package/dist/auth/credentials-store.js.map +0 -1
  26. package/dist/auth/login-flow.js +0 -196
  27. package/dist/auth/login-flow.js.map +0 -1
  28. package/dist/auth/loopback-listener.js +0 -155
  29. package/dist/auth/loopback-listener.js.map +0 -1
  30. package/dist/auth/pkce.js +0 -15
  31. package/dist/auth/pkce.js.map +0 -1
  32. package/dist/auth/supabase-client.js +0 -10
  33. package/dist/auth/supabase-client.js.map +0 -1
  34. package/dist/auth/supabase-config.js +0 -21
  35. package/dist/auth/supabase-config.js.map +0 -1
  36. package/dist/commands/agent.js +0 -172
  37. package/dist/commands/agent.js.map +0 -1
  38. package/dist/commands/auth.js +0 -84
  39. package/dist/commands/auth.js.map +0 -1
  40. package/dist/commands/index.js +0 -3
  41. package/dist/commands/index.js.map +0 -1
  42. package/dist/http/api-client.js +0 -118
  43. package/dist/http/api-client.js.map +0 -1
  44. package/dist/http/user-sessions.js +0 -9
  45. package/dist/http/user-sessions.js.map +0 -1
  46. package/dist/orchestrator/agent-orchestrator.js +0 -592
  47. package/dist/orchestrator/agent-orchestrator.js.map +0 -1
  48. package/dist/orchestrator/ai-client.js +0 -77
  49. package/dist/orchestrator/ai-client.js.map +0 -1
  50. package/dist/orchestrator/orchestrator-prompt.js +0 -13
  51. package/dist/orchestrator/orchestrator-prompt.js.map +0 -1
  52. package/dist/orchestrator/session.js +0 -295
  53. package/dist/orchestrator/session.js.map +0 -1
  54. package/dist/orchestrator/tools/worker-status-tool.js +0 -41
  55. package/dist/orchestrator/tools/worker-status-tool.js.map +0 -1
  56. package/dist/orchestrator/tools/worker-tools.js +0 -149
  57. package/dist/orchestrator/tools/worker-tools.js.map +0 -1
  58. package/dist/orchestrator/types.js +0 -30
  59. package/dist/orchestrator/types.js.map +0 -1
  60. package/dist/orchestrator/utils/async-queue.js +0 -70
  61. package/dist/orchestrator/utils/async-queue.js.map +0 -1
  62. package/dist/orchestrator/utils/session-logger.js +0 -47
  63. package/dist/orchestrator/utils/session-logger.js.map +0 -1
  64. package/dist/orchestrator/worker-manager.js +0 -418
  65. package/dist/orchestrator/worker-manager.js.map +0 -1
  66. package/dist/relay/relay-bridge.js +0 -601
  67. package/dist/relay/relay-bridge.js.map +0 -1
  68. package/dist/relay/relay-service.js +0 -23
  69. package/dist/relay/relay-service.js.map +0 -1
  70. package/dist/repl/terminal-repl.js +0 -262
  71. package/dist/repl/terminal-repl.js.map +0 -1
  72. package/dist/schemas/generated.d.ts +0 -244
  73. package/dist/schemas/generated.js +0 -5
  74. package/dist/schemas/generated.js.map +0 -1
  75. package/dist/schemas/index.js +0 -2
  76. package/dist/schemas/index.js.map +0 -1
  77. package/dist/scripts/generate-schema-types.d.ts +0 -1
  78. package/dist/scripts/generate-schema-types.js +0 -53
  79. package/dist/scripts/generate-schema-types.js.map +0 -1
  80. package/dist/scripts/sync-schemas.d.ts +0 -1
  81. package/dist/scripts/sync-schemas.js +0 -28
  82. package/dist/scripts/sync-schemas.js.map +0 -1
  83. package/dist/utils/prompt.js +0 -13
  84. package/dist/utils/prompt.js.map +0 -1
  85. package/dist/voice/voice-service.js +0 -25
  86. package/dist/voice/voice-service.js.map +0 -1
@@ -1,70 +0,0 @@
1
- /**
2
- * A simple async queue for streaming messages to workers.
3
- * Allows pushing messages and consuming them via async iteration.
4
- */
5
- export class AsyncQueue {
6
- queue = [];
7
- resolvers = [];
8
- closed = false;
9
- /**
10
- * Push a new item to the queue.
11
- * If there are waiting consumers, resolve them immediately.
12
- */
13
- push(item) {
14
- if (this.closed) {
15
- throw new Error('Cannot push to a closed queue');
16
- }
17
- if (this.resolvers.length > 0) {
18
- const resolve = this.resolvers.shift();
19
- resolve?.({ value: item, done: false });
20
- }
21
- else {
22
- this.queue.push(item);
23
- }
24
- }
25
- /**
26
- * Close the queue, signaling that no more items will be added.
27
- */
28
- close() {
29
- this.closed = true;
30
- // Resolve all waiting consumers with done: true
31
- while (this.resolvers.length > 0) {
32
- const resolve = this.resolvers.shift();
33
- resolve?.({ value: undefined, done: true });
34
- }
35
- }
36
- /**
37
- * Check if the queue is closed.
38
- */
39
- isClosed() {
40
- return this.closed;
41
- }
42
- /**
43
- * Async iterator implementation for consuming items from the queue.
44
- */
45
- async *[Symbol.asyncIterator]() {
46
- while (true) {
47
- // If there are items in the queue, yield them
48
- if (this.queue.length > 0) {
49
- const item = this.queue.shift();
50
- if (item !== undefined) {
51
- yield item;
52
- }
53
- continue;
54
- }
55
- // If the queue is closed and empty, we're done
56
- if (this.closed) {
57
- return;
58
- }
59
- // Wait for a new item or close
60
- const result = await new Promise((resolve) => {
61
- this.resolvers.push(resolve);
62
- });
63
- if (result.done) {
64
- return;
65
- }
66
- yield result.value;
67
- }
68
- }
69
- }
70
- //# sourceMappingURL=async-queue.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"async-queue.js","sourceRoot":"","sources":["../../../src/orchestrator/utils/async-queue.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,OAAO,UAAU;IACb,KAAK,GAAQ,EAAE,CAAC;IAChB,SAAS,GAA8C,EAAE,CAAC;IAC1D,MAAM,GAAG,KAAK,CAAC;IAEvB;;;OAGG;IACH,IAAI,CAAC,IAAO;QACV,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACnD,CAAC;QAED,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;YACvC,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAC1C,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,gDAAgD;QAChD,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;YACvC,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,SAAgB,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC;QAC3B,OAAO,IAAI,EAAE,CAAC;YACZ,8CAA8C;YAC9C,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;gBAChC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;oBACvB,MAAM,IAAI,CAAC;gBACb,CAAC;gBACD,SAAS;YACX,CAAC;YAED,+CAA+C;YAC/C,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAChB,OAAO;YACT,CAAC;YAED,+BAA+B;YAC/B,MAAM,MAAM,GAAG,MAAM,IAAI,OAAO,CAAoB,CAAC,OAAO,EAAE,EAAE;gBAC9D,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC/B,CAAC,CAAC,CAAC;YAEH,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;gBAChB,OAAO;YACT,CAAC;YAED,MAAM,MAAM,CAAC,KAAK,CAAC;QACrB,CAAC;IACH,CAAC;CACF"}
@@ -1,47 +0,0 @@
1
- import fs from 'fs';
2
- import path from 'path';
3
- import os from 'os';
4
- function getLogDir() {
5
- return process.env.OMNARA_LOG_DIR ?? path.join(os.homedir(), '.omnara', 'omnara-voice');
6
- }
7
- function ensureLogDir() {
8
- const dir = getLogDir();
9
- try {
10
- fs.mkdirSync(dir, { recursive: true });
11
- }
12
- catch {
13
- // ignore
14
- }
15
- return dir;
16
- }
17
- export function createSessionLogger(sessionId) {
18
- const dir = ensureLogDir();
19
- const filePath = path.join(dir, `${sessionId}.log`);
20
- const stream = fs.createWriteStream(filePath, { flags: 'a' });
21
- const logLine = (direction, payload) => {
22
- const timestamp = new Date().toISOString();
23
- const serialized = safeStringify(payload);
24
- stream.write(`${timestamp} [${direction}] ${serialized}\n`);
25
- };
26
- return {
27
- logInbound: (payload) => logLine('in', payload),
28
- logOutbound: (message) => logLine('out', message),
29
- close: () => {
30
- try {
31
- stream.end();
32
- }
33
- catch {
34
- // ignore close errors
35
- }
36
- },
37
- };
38
- }
39
- function safeStringify(value) {
40
- try {
41
- return JSON.stringify(value);
42
- }
43
- catch {
44
- return String(value);
45
- }
46
- }
47
- //# sourceMappingURL=session-logger.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"session-logger.js","sourceRoot":"","sources":["../../../src/orchestrator/utils/session-logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AAGpB,SAAS,SAAS;IAChB,OAAO,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;AAC1F,CAAC;AAED,SAAS,YAAY;IACnB,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;IACxB,IAAI,CAAC;QACH,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,SAAS;IACX,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAQD,MAAM,UAAU,mBAAmB,CAAC,SAAiB;IACnD,MAAM,GAAG,GAAG,YAAY,EAAE,CAAC;IAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,MAAM,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,EAAE,CAAC,iBAAiB,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;IAE9D,MAAM,OAAO,GAAG,CAAC,SAAuB,EAAE,OAAgB,EAAE,EAAE;QAC5D,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC3C,MAAM,UAAU,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;QAC1C,MAAM,CAAC,KAAK,CAAC,GAAG,SAAS,KAAK,SAAS,KAAK,UAAU,IAAI,CAAC,CAAC;IAC9D,CAAC,CAAC;IAEF,OAAO;QACL,UAAU,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;QAC/C,WAAW,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC;QACjD,KAAK,EAAE,GAAG,EAAE;YACV,IAAI,CAAC;gBACH,MAAM,CAAC,GAAG,EAAE,CAAC;YACf,CAAC;YAAC,MAAM,CAAC;gBACP,sBAAsB;YACxB,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;AACH,CAAC"}
@@ -1,418 +0,0 @@
1
- import { EventEmitter } from 'events';
2
- import { randomUUID } from 'crypto';
3
- import { createWorkerStatusMcpServer } from './tools/worker-status-tool.js';
4
- import { AsyncQueue } from './utils/async-queue.js';
5
- export class WorkerManager extends EventEmitter {
6
- options;
7
- workers = new Map();
8
- runningQueries = new Map();
9
- constructor(options) {
10
- super();
11
- this.options = options;
12
- }
13
- listWorkers() {
14
- return Array.from(this.workers.values());
15
- }
16
- getWorker(id) {
17
- return this.workers.get(id);
18
- }
19
- getWorkerByTask(task) {
20
- for (const worker of this.workers.values()) {
21
- if (worker.task === task) {
22
- return worker;
23
- }
24
- }
25
- return undefined;
26
- }
27
- /**
28
- * Get a formatted summary of all current worker statuses for inclusion in system prompts.
29
- * Returns a string describing all active workers and their current state.
30
- */
31
- getWorkerStatusSummary() {
32
- const workers = this.listWorkers();
33
- if (workers.length === 0) {
34
- return 'No active workers.';
35
- }
36
- const lines = ['## Current Worker Status'];
37
- lines.push('');
38
- for (const worker of workers) {
39
- const latestMsg = worker.progress.length > 0
40
- ? worker.progress[worker.progress.length - 1]?.message
41
- : undefined;
42
- lines.push(`**Task: "${worker.task}"**`);
43
- lines.push(`- Status: ${worker.status}`);
44
- lines.push(`- Worker ID: ${worker.id}`);
45
- if (worker.status === 'completed' && worker.result) {
46
- lines.push(`- Result: ${worker.result}`);
47
- }
48
- else if (worker.status === 'error' && worker.error) {
49
- lines.push(`- Error: ${worker.error}`);
50
- }
51
- else if (latestMsg) {
52
- lines.push(`- Latest: ${latestMsg}`);
53
- }
54
- lines.push('');
55
- }
56
- return lines.join('\n');
57
- }
58
- launchWorker({ task, prompt, originSessionId, metadata }) {
59
- // Use a single UUID for both worker ID and session ID to unify them
60
- const sessionId = randomUUID();
61
- const resolvedOriginSessionId = originSessionId;
62
- const record = {
63
- id: sessionId, // Worker ID is the same as session ID
64
- task,
65
- prompt,
66
- status: 'running',
67
- sessionId,
68
- startedAt: Date.now(),
69
- lastUpdateAt: Date.now(),
70
- originSessionId: resolvedOriginSessionId,
71
- progress: [],
72
- metadata,
73
- messageQueue: new AsyncQueue(),
74
- };
75
- this.workers.set(sessionId, record);
76
- this.emit('session_start', { ...record });
77
- this.emitUpdate(record);
78
- void this.runWorker(record, prompt);
79
- return record;
80
- }
81
- cancelWorker(id) {
82
- const record = this.workers.get(id);
83
- if (!record) {
84
- return false;
85
- }
86
- if (record.status !== 'running') {
87
- return false;
88
- }
89
- record.status = 'canceled';
90
- record.lastUpdateAt = Date.now();
91
- record.progress.push({
92
- timestamp: Date.now(),
93
- message: 'Worker canceled by user request.',
94
- });
95
- this.emitUpdate(record);
96
- this.emit('message', {
97
- record,
98
- messageType: 'assistant_complete',
99
- success: false,
100
- text: 'Worker canceled by user request.',
101
- });
102
- const query = this.runningQueries.get(id);
103
- if (query) {
104
- void query.interrupt().catch(() => {
105
- // Ignore interrupt errors; status already updated.
106
- });
107
- }
108
- // Close the message queue
109
- record.messageQueue.close();
110
- return true;
111
- }
112
- /**
113
- * Send a message to a running worker.
114
- *
115
- * @param task - The task name of the worker to message
116
- * @param message - The message content to send
117
- * @param interrupt - If true, interrupt current generation; if false, queue for next turn
118
- * @returns true if message was sent, false if worker not found or not running
119
- */
120
- async messageWorker(task, message, interrupt) {
121
- const record = this.getWorkerByTask(task);
122
- if (!record) {
123
- return false;
124
- }
125
- if (record.status !== 'running') {
126
- return false;
127
- }
128
- // Log the message being sent to progress for internal tracking
129
- // Note: We don't emit an update here because the user already sees the message_worker tool call.
130
- // We only emit updates when the worker's actual state changes (status, completion, etc.)
131
- record.progress.push({
132
- timestamp: Date.now(),
133
- message: `[ORCHESTRATOR MESSAGE${interrupt ? ' - INTERRUPT' : ''}]: ${message}`,
134
- });
135
- record.lastUpdateAt = Date.now();
136
- // If interrupt is requested, interrupt the current query
137
- if (interrupt) {
138
- const query = this.runningQueries.get(record.id);
139
- if (query) {
140
- try {
141
- await query.interrupt();
142
- }
143
- catch (error) {
144
- console.error('[WorkerManager] Failed to interrupt worker:', error);
145
- }
146
- }
147
- }
148
- // Create SDK user message and push to queue
149
- const userMessage = {
150
- session_id: record.sessionId,
151
- type: 'user',
152
- message: {
153
- role: 'user',
154
- content: message,
155
- },
156
- parent_tool_use_id: null,
157
- isSynthetic: true,
158
- };
159
- try {
160
- record.messageQueue.push(userMessage);
161
- return true;
162
- }
163
- catch (error) {
164
- console.error('[WorkerManager] Failed to queue message:', error);
165
- return false;
166
- }
167
- }
168
- emitUpdate(record) {
169
- this.emit('update', { ...record });
170
- }
171
- emitCompleted(record) {
172
- this.emit('completed', { ...record });
173
- }
174
- handleStatusUpdate(record, event) {
175
- console.log('[WorkerManager] Status update received:', {
176
- workerId: record.id,
177
- task: record.task,
178
- message: event.message,
179
- metadata: event.metadata,
180
- });
181
- record.progress.push({
182
- timestamp: event.timestamp,
183
- message: event.message,
184
- });
185
- record.lastUpdateAt = event.timestamp;
186
- this.emitUpdate(record);
187
- }
188
- /**
189
- * Create an async iterable stream of user messages for the worker.
190
- * Yields the initial prompt, then streams any additional messages from the queue.
191
- */
192
- async *createMessageStream(initialPrompt, sessionId, messageQueue) {
193
- // Yield initial prompt as first message
194
- yield {
195
- session_id: sessionId,
196
- type: 'user',
197
- message: {
198
- role: 'user',
199
- content: initialPrompt,
200
- },
201
- parent_tool_use_id: null,
202
- };
203
- // Continue yielding messages from the queue
204
- for await (const message of messageQueue) {
205
- yield message;
206
- }
207
- }
208
- async runWorker(record, prompt) {
209
- // Create status update MCP server for this worker
210
- const statusMcpServer = createWorkerStatusMcpServer((event) => {
211
- this.handleStatusUpdate(record, event);
212
- });
213
- console.log('[WorkerManager] Creating worker client with status MCP server:', {
214
- workerId: record.id,
215
- task: record.task,
216
- hasMcpServer: !!statusMcpServer,
217
- });
218
- // Create client with status MCP server
219
- const client = this.options.createClient({
220
- worker_status: statusMcpServer,
221
- });
222
- // Wrap the prompt with worker instructions
223
- const workerPrompt = this.wrapPrompt(prompt);
224
- // Create message stream that includes initial prompt and any future messages
225
- const messageStream = this.createMessageStream(workerPrompt, record.sessionId, record.messageQueue);
226
- // Create query with the message stream for continuous message support
227
- const query = client.createQuery(messageStream);
228
- // Store the query reference for interrupt support
229
- this.runningQueries.set(record.id, query);
230
- const summarizedChunks = [];
231
- try {
232
- for await (const message of query) {
233
- this.handleMessage(record, message, summarizedChunks);
234
- }
235
- if (record.status === 'running') {
236
- record.status = 'completed';
237
- record.result =
238
- summarizedChunks.join('\n').trim() || 'Worker completed without additional details.';
239
- record.lastUpdateAt = Date.now();
240
- this.emitUpdate(record);
241
- this.emit('message', {
242
- record,
243
- messageType: 'assistant_complete',
244
- success: true,
245
- text: record.result,
246
- });
247
- this.emitCompleted(record);
248
- }
249
- }
250
- catch (error) {
251
- if (record.status === 'canceled') {
252
- this.emitCompleted(record);
253
- return;
254
- }
255
- record.status = 'error';
256
- record.error = this.extractError(error);
257
- record.lastUpdateAt = Date.now();
258
- record.progress.push({
259
- timestamp: Date.now(),
260
- message: `Worker failed: ${record.error}`,
261
- });
262
- this.emitUpdate(record);
263
- this.emit('message', {
264
- record,
265
- messageType: 'assistant_complete',
266
- success: false,
267
- text: record.error,
268
- });
269
- this.emitCompleted(record);
270
- }
271
- finally {
272
- // Close the message queue to signal no more messages
273
- record.messageQueue.close();
274
- this.runningQueries.delete(record.id);
275
- }
276
- }
277
- handleMessage(record, message, summarizedChunks) {
278
- switch (message.type) {
279
- case 'assistant': {
280
- // Extract text content
281
- const text = this.extractAssistantText(message);
282
- if (text) {
283
- summarizedChunks.push(text);
284
- record.progress.push({
285
- timestamp: Date.now(),
286
- message: text,
287
- });
288
- record.lastUpdateAt = Date.now();
289
- this.emit('message', {
290
- record,
291
- messageType: 'assistant_text',
292
- text,
293
- });
294
- }
295
- // Extract tool uses from assistant message content
296
- const content = message.message.content;
297
- let hasToolUse = false;
298
- if (Array.isArray(content)) {
299
- for (const block of content) {
300
- if (block && typeof block === 'object' && 'type' in block) {
301
- if (block.type === 'tool_use' && 'name' in block && 'id' in block) {
302
- hasToolUse = true;
303
- this.emit('message', {
304
- record,
305
- messageType: 'tool_call',
306
- toolName: block.name,
307
- toolUseId: block.id,
308
- toolInput: 'input' in block ? block.input : undefined,
309
- });
310
- }
311
- }
312
- }
313
- }
314
- // If the assistant message has no tool uses, the conversation is likely done
315
- // Close the message queue to signal to SDK that no more messages are coming
316
- // This allows the SDK to emit the final 'result' message and complete the query
317
- if (!hasToolUse && !record.messageQueue.isClosed()) {
318
- console.log('[WorkerManager] Assistant message without tool use - closing message queue to signal completion');
319
- record.messageQueue.close();
320
- }
321
- break;
322
- }
323
- case 'stream_event': {
324
- const text = this.extractDeltaText(message);
325
- if (text) {
326
- record.progress.push({
327
- timestamp: Date.now(),
328
- message: text,
329
- });
330
- record.lastUpdateAt = Date.now();
331
- }
332
- break;
333
- }
334
- case 'result': {
335
- const success = message.subtype === 'success';
336
- if (!success && record.status === 'running') {
337
- record.status = 'error';
338
- record.error = message.subtype;
339
- record.lastUpdateAt = Date.now();
340
- this.emitUpdate(record);
341
- this.emitCompleted(record);
342
- this.emit('message', {
343
- record,
344
- messageType: 'assistant_complete',
345
- success: false,
346
- text: record.error ?? message.subtype,
347
- });
348
- }
349
- break;
350
- }
351
- default:
352
- break;
353
- }
354
- }
355
- extractAssistantText(message) {
356
- if (message.type !== 'assistant') {
357
- return null;
358
- }
359
- const content = message.message.content;
360
- if (typeof content === 'string') {
361
- return content.trim();
362
- }
363
- if (Array.isArray(content)) {
364
- const texts = [];
365
- for (const block of content) {
366
- if (block &&
367
- typeof block === 'object' &&
368
- block.type === 'text' &&
369
- typeof block.text === 'string') {
370
- const trimmed = block.text.trim();
371
- if (trimmed.length > 0) {
372
- texts.push(trimmed);
373
- }
374
- }
375
- }
376
- if (texts.length > 0) {
377
- return texts.join('\n');
378
- }
379
- }
380
- return null;
381
- }
382
- extractDeltaText(message) {
383
- if (message.type !== 'stream_event') {
384
- return null;
385
- }
386
- const event = message.event;
387
- if (!event || typeof event !== 'object') {
388
- return null;
389
- }
390
- if (event.type === 'content_block_delta') {
391
- const delta = event.delta;
392
- if (delta?.type === 'text_delta' && typeof delta.text === 'string') {
393
- const raw = delta.text.trim();
394
- return raw.length > 0 ? raw : null;
395
- }
396
- }
397
- return null;
398
- }
399
- extractError(error) {
400
- if (error instanceof Error) {
401
- return error.message;
402
- }
403
- if (typeof error === 'string') {
404
- return error;
405
- }
406
- try {
407
- return JSON.stringify(error);
408
- }
409
- catch {
410
- return 'Unknown worker error';
411
- }
412
- }
413
- wrapPrompt(userPrompt) {
414
- const directive = `\n\nIMPORTANT:\n- Use the mcp__worker_status__send_status_update tool to report progress as you work.\n- When finished, output a final summary.\n- Do not include raw diffs or large file dumps unless explicitly asked.\n`;
415
- return `${userPrompt.trim()}\n${directive}`;
416
- }
417
- }
418
- //# sourceMappingURL=worker-manager.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"worker-manager.js","sourceRoot":"","sources":["../../src/orchestrator/worker-manager.ts"],"names":[],"mappings":"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"}