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.
- package/README.md +1 -1
- package/dist/cli.js +6357 -50
- package/dist/cli.js.map +7 -1
- package/dist/orchestrator/agent-orchestrator.d.ts +4 -1
- package/dist/orchestrator/orchestrator-prompt.d.ts +8 -2
- package/dist/orchestrator/{types.d.ts → orchestrator-types.d.ts} +14 -0
- package/dist/orchestrator/session.d.ts +1 -1
- package/dist/orchestrator/tools/worker-tools.d.ts +1 -0
- package/dist/orchestrator/utils/session-logger.d.ts +1 -1
- package/dist/relay/relay-bridge.d.ts +1 -0
- package/dist/utils/browser.d.ts +1 -0
- package/dist/utils/claude-code-check.d.ts +21 -0
- package/dist/utils/logger.d.ts +127 -0
- package/dist/utils/version-check.d.ts +9 -0
- package/package.json +12 -5
- package/scripts/preinstall.js +141 -0
- package/scripts/test-preinstall.js +125 -0
- package/dist/auth/auth-provider.js +0 -56
- package/dist/auth/auth-provider.js.map +0 -1
- package/dist/auth/cli-auth-service.js +0 -44
- package/dist/auth/cli-auth-service.js.map +0 -1
- package/dist/auth/credential-manager.js +0 -71
- package/dist/auth/credential-manager.js.map +0 -1
- package/dist/auth/credentials-store.js +0 -69
- package/dist/auth/credentials-store.js.map +0 -1
- package/dist/auth/login-flow.js +0 -196
- package/dist/auth/login-flow.js.map +0 -1
- package/dist/auth/loopback-listener.js +0 -155
- package/dist/auth/loopback-listener.js.map +0 -1
- package/dist/auth/pkce.js +0 -15
- package/dist/auth/pkce.js.map +0 -1
- package/dist/auth/supabase-client.js +0 -10
- package/dist/auth/supabase-client.js.map +0 -1
- package/dist/auth/supabase-config.js +0 -21
- package/dist/auth/supabase-config.js.map +0 -1
- package/dist/commands/agent.js +0 -172
- package/dist/commands/agent.js.map +0 -1
- package/dist/commands/auth.js +0 -84
- package/dist/commands/auth.js.map +0 -1
- package/dist/commands/index.js +0 -3
- package/dist/commands/index.js.map +0 -1
- package/dist/http/api-client.js +0 -118
- package/dist/http/api-client.js.map +0 -1
- package/dist/http/user-sessions.js +0 -9
- package/dist/http/user-sessions.js.map +0 -1
- package/dist/orchestrator/agent-orchestrator.js +0 -592
- package/dist/orchestrator/agent-orchestrator.js.map +0 -1
- package/dist/orchestrator/ai-client.js +0 -77
- package/dist/orchestrator/ai-client.js.map +0 -1
- package/dist/orchestrator/orchestrator-prompt.js +0 -13
- package/dist/orchestrator/orchestrator-prompt.js.map +0 -1
- package/dist/orchestrator/session.js +0 -295
- package/dist/orchestrator/session.js.map +0 -1
- package/dist/orchestrator/tools/worker-status-tool.js +0 -41
- package/dist/orchestrator/tools/worker-status-tool.js.map +0 -1
- package/dist/orchestrator/tools/worker-tools.js +0 -149
- package/dist/orchestrator/tools/worker-tools.js.map +0 -1
- package/dist/orchestrator/types.js +0 -30
- package/dist/orchestrator/types.js.map +0 -1
- package/dist/orchestrator/utils/async-queue.js +0 -70
- package/dist/orchestrator/utils/async-queue.js.map +0 -1
- package/dist/orchestrator/utils/session-logger.js +0 -47
- package/dist/orchestrator/utils/session-logger.js.map +0 -1
- package/dist/orchestrator/worker-manager.js +0 -418
- package/dist/orchestrator/worker-manager.js.map +0 -1
- package/dist/relay/relay-bridge.js +0 -601
- package/dist/relay/relay-bridge.js.map +0 -1
- package/dist/relay/relay-service.js +0 -23
- package/dist/relay/relay-service.js.map +0 -1
- package/dist/repl/terminal-repl.js +0 -262
- package/dist/repl/terminal-repl.js.map +0 -1
- package/dist/schemas/generated.d.ts +0 -244
- package/dist/schemas/generated.js +0 -5
- package/dist/schemas/generated.js.map +0 -1
- package/dist/schemas/index.js +0 -2
- package/dist/schemas/index.js.map +0 -1
- package/dist/scripts/generate-schema-types.d.ts +0 -1
- package/dist/scripts/generate-schema-types.js +0 -53
- package/dist/scripts/generate-schema-types.js.map +0 -1
- package/dist/scripts/sync-schemas.d.ts +0 -1
- package/dist/scripts/sync-schemas.js +0 -28
- package/dist/scripts/sync-schemas.js.map +0 -1
- package/dist/utils/prompt.js +0 -13
- package/dist/utils/prompt.js.map +0 -1
- package/dist/voice/voice-service.js +0 -25
- 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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"}
|