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,77 +0,0 @@
|
|
|
1
|
-
import fs from 'fs';
|
|
2
|
-
import { query } from '@anthropic-ai/claude-agent-sdk';
|
|
3
|
-
export const BASE_ALLOWED_ORCHESTRATOR_TOOLS = [
|
|
4
|
-
'Glob',
|
|
5
|
-
'Grep',
|
|
6
|
-
'LS',
|
|
7
|
-
'Read',
|
|
8
|
-
'WebFetch',
|
|
9
|
-
'WebSearch',
|
|
10
|
-
'TodoWrite'
|
|
11
|
-
];
|
|
12
|
-
export const BASE_ALLOWED_WORKER_TOOLS = [
|
|
13
|
-
'Task',
|
|
14
|
-
'Bash',
|
|
15
|
-
'Glob',
|
|
16
|
-
'Grep',
|
|
17
|
-
'LS',
|
|
18
|
-
'ExitPlanMode',
|
|
19
|
-
'Read',
|
|
20
|
-
'Edit',
|
|
21
|
-
'MultiEdit',
|
|
22
|
-
'Write',
|
|
23
|
-
'NotebookEdit',
|
|
24
|
-
'WebFetch',
|
|
25
|
-
'TodoWrite',
|
|
26
|
-
'WebSearch',
|
|
27
|
-
'BashOutput',
|
|
28
|
-
'KillBash',
|
|
29
|
-
'Skill',
|
|
30
|
-
'SlashCommand',
|
|
31
|
-
];
|
|
32
|
-
export class AIClient {
|
|
33
|
-
baseOptions;
|
|
34
|
-
constructor(config) {
|
|
35
|
-
const defaultOptions = {
|
|
36
|
-
maxTurns: 100,
|
|
37
|
-
model: 'opus',
|
|
38
|
-
cwd: process.cwd(),
|
|
39
|
-
includePartialMessages: false,
|
|
40
|
-
allowedTools: [...BASE_ALLOWED_ORCHESTRATOR_TOOLS],
|
|
41
|
-
};
|
|
42
|
-
this.baseOptions = {
|
|
43
|
-
...defaultOptions,
|
|
44
|
-
...config?.defaults,
|
|
45
|
-
};
|
|
46
|
-
this.ensureWorkingDirectory(this.baseOptions.cwd);
|
|
47
|
-
}
|
|
48
|
-
async *streamUserMessage(prompt, overrides) {
|
|
49
|
-
const q = this.createQuery(prompt, overrides);
|
|
50
|
-
for await (const message of q) {
|
|
51
|
-
yield message;
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
createQuery(prompt, overrides) {
|
|
55
|
-
const merged = {
|
|
56
|
-
...this.baseOptions,
|
|
57
|
-
...overrides,
|
|
58
|
-
};
|
|
59
|
-
this.ensureWorkingDirectory(merged.cwd);
|
|
60
|
-
return query({
|
|
61
|
-
prompt,
|
|
62
|
-
options: merged,
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
ensureWorkingDirectory(cwd) {
|
|
66
|
-
if (!cwd) {
|
|
67
|
-
return;
|
|
68
|
-
}
|
|
69
|
-
try {
|
|
70
|
-
fs.mkdirSync(cwd, { recursive: true });
|
|
71
|
-
}
|
|
72
|
-
catch (error) {
|
|
73
|
-
console.warn(`Failed to ensure working directory ${cwd}:`, error);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
//# sourceMappingURL=ai-client.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ai-client.js","sourceRoot":"","sources":["../../src/orchestrator/ai-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,KAAK,EAAkE,MAAM,gCAAgC,CAAC;AAWvH,MAAM,CAAC,MAAM,+BAA+B,GAAG;IAC7C,MAAM;IACN,MAAM;IACN,IAAI;IACJ,MAAM;IACN,UAAU;IACV,WAAW;IACX,WAAW;CACH,CAAC;AAEX,MAAM,CAAC,MAAM,yBAAyB,GAAG;IACvC,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,IAAI;IACJ,cAAc;IACd,MAAM;IACN,MAAM;IACN,WAAW;IACX,OAAO;IACP,cAAc;IACd,UAAU;IACV,WAAW;IACX,WAAW;IACX,YAAY;IACZ,UAAU;IACV,OAAO;IACP,cAAc;CACN,CAAC;AAEX,MAAM,OAAO,QAAQ;IACF,WAAW,CAAU;IAEtC,YAAY,MAAuB;QACjC,MAAM,cAAc,GAAY;YAC9B,QAAQ,EAAE,GAAG;YACb,KAAK,EAAE,MAAM;YACb,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;YAClB,sBAAsB,EAAE,KAAK;YAC7B,YAAY,EAAE,CAAC,GAAG,+BAA+B,CAAC;SACnD,CAAC;QAEF,IAAI,CAAC,WAAW,GAAG;YACjB,GAAG,cAAc;YACjB,GAAG,MAAM,EAAE,QAAQ;SACpB,CAAC;QAEF,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACpD,CAAC;IAED,KAAK,CAAC,CAAC,iBAAiB,CACtB,MAAc,EACd,SAA4B;QAE5B,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAC9C,IAAI,KAAK,EAAE,MAAM,OAAO,IAAI,CAAC,EAAE,CAAC;YAC9B,MAAM,OAAO,CAAC;QAChB,CAAC;IACH,CAAC;IAED,WAAW,CAAC,MAA8C,EAAE,SAA4B;QACtF,MAAM,MAAM,GAAY;YACtB,GAAG,IAAI,CAAC,WAAW;YACnB,GAAG,SAAS;SACb,CAAC;QAEF,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAExC,OAAO,KAAK,CAAC;YACX,MAAM;YACN,OAAO,EAAE,MAAM;SAChB,CAAC,CAAC;IACL,CAAC;IAEO,sBAAsB,CAAC,GAAY;QACzC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO;QACT,CAAC;QACD,IAAI,CAAC;YACH,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,sCAAsC,GAAG,GAAG,EAAE,KAAK,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;CACF"}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import fs from 'fs';
|
|
2
|
-
import path from 'path';
|
|
3
|
-
/**
|
|
4
|
-
* System prompt for the main orchestrator agent.
|
|
5
|
-
*
|
|
6
|
-
* The orchestrator's role is to coordinate and delegate work, not to execute tasks directly.
|
|
7
|
-
* It should ALWAYS use workers to handle all implementation work.
|
|
8
|
-
*/
|
|
9
|
-
// Read the prompt from the markdown file
|
|
10
|
-
const promptPath = path.join(import.meta.dirname, './orchestrator-prompt.md');
|
|
11
|
-
export const ORCHESTRATOR_SYSTEM_PROMPT = fs.readFileSync(promptPath, 'utf-8');
|
|
12
|
-
export default ORCHESTRATOR_SYSTEM_PROMPT;
|
|
13
|
-
//# sourceMappingURL=orchestrator-prompt.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"orchestrator-prompt.js","sourceRoot":"","sources":["../../src/orchestrator/orchestrator-prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB;;;;;GAKG;AAEH,yCAAyC;AACzC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,0BAA0B,CAAC,CAAC;AAC9E,MAAM,CAAC,MAAM,0BAA0B,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;AAE/E,eAAe,0BAA0B,CAAC"}
|
|
@@ -1,295 +0,0 @@
|
|
|
1
|
-
import { randomUUID } from 'crypto';
|
|
2
|
-
import { createSessionLogger } from './utils/session-logger.js';
|
|
3
|
-
export class Session {
|
|
4
|
-
id;
|
|
5
|
-
aiClient;
|
|
6
|
-
subscribers = new Map();
|
|
7
|
-
onEmpty;
|
|
8
|
-
onToolUse;
|
|
9
|
-
logger;
|
|
10
|
-
sdkSessionId = null;
|
|
11
|
-
inflight = null;
|
|
12
|
-
lastActivity = Date.now();
|
|
13
|
-
constructor(id, aiClient, onEmpty, onToolUse) {
|
|
14
|
-
this.id = id;
|
|
15
|
-
this.aiClient = aiClient;
|
|
16
|
-
this.onEmpty = onEmpty;
|
|
17
|
-
this.onToolUse = onToolUse;
|
|
18
|
-
this.logger = createSessionLogger(this.id);
|
|
19
|
-
}
|
|
20
|
-
announceInboundMessage(text, origin = 'user', workerId, workerTask) {
|
|
21
|
-
if (!text) {
|
|
22
|
-
return;
|
|
23
|
-
}
|
|
24
|
-
// Only broadcast worker-origin updates. User messages already show up via `chat` frames.
|
|
25
|
-
if (origin !== 'worker') {
|
|
26
|
-
return;
|
|
27
|
-
}
|
|
28
|
-
const message = {
|
|
29
|
-
type: 'user_text',
|
|
30
|
-
sessionId: this.id,
|
|
31
|
-
text,
|
|
32
|
-
origin,
|
|
33
|
-
workerId,
|
|
34
|
-
workerTask,
|
|
35
|
-
messageId: randomUUID(),
|
|
36
|
-
};
|
|
37
|
-
this.broadcast(message);
|
|
38
|
-
}
|
|
39
|
-
get lastActiveAt() {
|
|
40
|
-
return this.lastActivity;
|
|
41
|
-
}
|
|
42
|
-
get sdkSessionIdentifier() {
|
|
43
|
-
return this.sdkSessionId;
|
|
44
|
-
}
|
|
45
|
-
subscribe(subscriber) {
|
|
46
|
-
this.subscribers.set(subscriber.id, subscriber);
|
|
47
|
-
this.safeSend(subscriber, { type: 'session_joined', sessionId: this.id, messageId: randomUUID() });
|
|
48
|
-
}
|
|
49
|
-
unsubscribe(subscriberId) {
|
|
50
|
-
this.subscribers.delete(subscriberId);
|
|
51
|
-
if (!this.hasSubscribers() && !this.inflight) {
|
|
52
|
-
this.onEmpty(this.id);
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
hasSubscribers() {
|
|
56
|
-
return this.subscribers.size > 0;
|
|
57
|
-
}
|
|
58
|
-
close() {
|
|
59
|
-
this.subscribers.clear();
|
|
60
|
-
this.logger.close();
|
|
61
|
-
}
|
|
62
|
-
enqueueUserMessage(text, metadata) {
|
|
63
|
-
this.lastActivity = Date.now();
|
|
64
|
-
const previous = this.inflight;
|
|
65
|
-
const task = async () => {
|
|
66
|
-
if (previous) {
|
|
67
|
-
try {
|
|
68
|
-
await previous;
|
|
69
|
-
}
|
|
70
|
-
catch {
|
|
71
|
-
// Previous error already reported, continue with new message.
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
await this.processUserMessage(text, metadata);
|
|
75
|
-
};
|
|
76
|
-
const promise = task()
|
|
77
|
-
.catch((error) => {
|
|
78
|
-
this.broadcast({
|
|
79
|
-
type: 'error',
|
|
80
|
-
sessionId: this.id,
|
|
81
|
-
message: extractErrorMessage(error),
|
|
82
|
-
messageId: randomUUID(),
|
|
83
|
-
});
|
|
84
|
-
})
|
|
85
|
-
.finally(() => {
|
|
86
|
-
if (this.inflight === promise) {
|
|
87
|
-
this.inflight = null;
|
|
88
|
-
this.lastActivity = Date.now();
|
|
89
|
-
if (!this.hasSubscribers()) {
|
|
90
|
-
this.onEmpty(this.id);
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
});
|
|
94
|
-
this.inflight = promise;
|
|
95
|
-
}
|
|
96
|
-
handleStreamEvent(event) {
|
|
97
|
-
switch (event.type) {
|
|
98
|
-
case 'content_block_delta': {
|
|
99
|
-
const delta = event.delta;
|
|
100
|
-
if (delta?.type === 'text_delta' && delta.text) {
|
|
101
|
-
console.log('[Session] Streaming text delta:', delta.text.substring(0, 50));
|
|
102
|
-
this.broadcast({
|
|
103
|
-
type: 'assistant_text',
|
|
104
|
-
sessionId: this.id,
|
|
105
|
-
text: delta.text,
|
|
106
|
-
messageId: randomUUID(),
|
|
107
|
-
});
|
|
108
|
-
}
|
|
109
|
-
break;
|
|
110
|
-
}
|
|
111
|
-
default:
|
|
112
|
-
break;
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
async processUserMessage(text, metadata) {
|
|
116
|
-
// Broadcast metadata about this generation trigger
|
|
117
|
-
if (metadata?.triggeredBy === 'worker_completion') {
|
|
118
|
-
this.broadcast({
|
|
119
|
-
type: 'system',
|
|
120
|
-
sessionId: this.id,
|
|
121
|
-
subtype: 'generation_triggered',
|
|
122
|
-
metadata: {
|
|
123
|
-
triggeredBy: 'worker_completion',
|
|
124
|
-
workerId: metadata.workerId,
|
|
125
|
-
workerTask: metadata.workerTask,
|
|
126
|
-
},
|
|
127
|
-
messageId: randomUUID(),
|
|
128
|
-
});
|
|
129
|
-
}
|
|
130
|
-
const options = this.sdkSessionId ? { resume: this.sdkSessionId } : undefined;
|
|
131
|
-
for await (const message of this.aiClient.streamUserMessage(text, options)) {
|
|
132
|
-
this.routeSdkMessage(message);
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
routeSdkMessage(message) {
|
|
136
|
-
switch (message.type) {
|
|
137
|
-
case 'assistant':
|
|
138
|
-
this.handleAssistantMessage(message);
|
|
139
|
-
break;
|
|
140
|
-
case 'stream_event':
|
|
141
|
-
this.handleStreamEvent(message.event);
|
|
142
|
-
break;
|
|
143
|
-
case 'result':
|
|
144
|
-
this.handleResultMessage(message);
|
|
145
|
-
break;
|
|
146
|
-
case 'system':
|
|
147
|
-
this.handleSystemMessage(message);
|
|
148
|
-
break;
|
|
149
|
-
case 'user': {
|
|
150
|
-
const textContent = extractUserContent(message.message.content);
|
|
151
|
-
if (textContent) {
|
|
152
|
-
this.broadcast({
|
|
153
|
-
type: 'user_text',
|
|
154
|
-
sessionId: this.id,
|
|
155
|
-
text: textContent,
|
|
156
|
-
messageId: randomUUID(),
|
|
157
|
-
});
|
|
158
|
-
}
|
|
159
|
-
break;
|
|
160
|
-
}
|
|
161
|
-
default:
|
|
162
|
-
break;
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
handleAssistantMessage(message) {
|
|
166
|
-
const content = message.message.content;
|
|
167
|
-
if (!Array.isArray(content)) {
|
|
168
|
-
return;
|
|
169
|
-
}
|
|
170
|
-
console.log('[Session] Processing assistant message with', content.length, 'blocks');
|
|
171
|
-
for (const block of content) {
|
|
172
|
-
if (!block || typeof block !== 'object') {
|
|
173
|
-
continue;
|
|
174
|
-
}
|
|
175
|
-
const typed = block;
|
|
176
|
-
const blockType = typed.type;
|
|
177
|
-
if (blockType === 'text' && typeof typed.text === 'string') {
|
|
178
|
-
if (typed.text.length > 0) {
|
|
179
|
-
console.log('[Session] Broadcasting assistant_text:', typed.text.substring(0, 100));
|
|
180
|
-
this.broadcast({
|
|
181
|
-
type: 'assistant_text',
|
|
182
|
-
sessionId: this.id,
|
|
183
|
-
text: typed.text,
|
|
184
|
-
messageId: randomUUID(),
|
|
185
|
-
});
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
else if (blockType === 'tool_use') {
|
|
189
|
-
const toolUseId = typeof typed.id === 'string' && typed.id ? typed.id : randomUUID();
|
|
190
|
-
console.log('[Session] Broadcasting tool_call:', typed.name, 'id:', toolUseId);
|
|
191
|
-
this.broadcast({
|
|
192
|
-
type: 'tool_call',
|
|
193
|
-
sessionId: this.id,
|
|
194
|
-
toolName: typeof typed.name === 'string' ? typed.name : 'unknown',
|
|
195
|
-
toolUseId,
|
|
196
|
-
input: typed.input,
|
|
197
|
-
messageId: randomUUID(), // Always use a valid UUID for message_id
|
|
198
|
-
});
|
|
199
|
-
this.onToolUse?.(toolUseId, this.id);
|
|
200
|
-
}
|
|
201
|
-
else if (blockType === 'tool_result') {
|
|
202
|
-
const toolResultId = typeof typed.tool_use_id === 'string' && typed.tool_use_id ? typed.tool_use_id : randomUUID();
|
|
203
|
-
console.log('[Session] Broadcasting tool_result:', toolResultId);
|
|
204
|
-
this.broadcast({
|
|
205
|
-
type: 'tool_result',
|
|
206
|
-
sessionId: this.id,
|
|
207
|
-
toolUseId: toolResultId,
|
|
208
|
-
content: typed.content,
|
|
209
|
-
isError: Boolean(typed.is_error),
|
|
210
|
-
messageId: randomUUID(), // Always use a valid UUID for message_id
|
|
211
|
-
});
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
handleResultMessage(message) {
|
|
216
|
-
const success = message.subtype === 'success';
|
|
217
|
-
this.broadcast({
|
|
218
|
-
type: 'agent_complete',
|
|
219
|
-
sessionId: this.id,
|
|
220
|
-
success,
|
|
221
|
-
durationMs: message.duration_ms,
|
|
222
|
-
costUsd: message.total_cost_usd,
|
|
223
|
-
message: success ? message.result : `Error: ${message.subtype}`,
|
|
224
|
-
messageId: randomUUID(),
|
|
225
|
-
});
|
|
226
|
-
}
|
|
227
|
-
handleSystemMessage(message) {
|
|
228
|
-
if (message.subtype === 'init') {
|
|
229
|
-
this.sdkSessionId = message.session_id;
|
|
230
|
-
}
|
|
231
|
-
this.broadcast({
|
|
232
|
-
type: 'system',
|
|
233
|
-
sessionId: this.id,
|
|
234
|
-
subtype: message.subtype,
|
|
235
|
-
messageId: randomUUID(),
|
|
236
|
-
});
|
|
237
|
-
}
|
|
238
|
-
logInbound(payload) {
|
|
239
|
-
this.logger.logInbound(payload);
|
|
240
|
-
}
|
|
241
|
-
broadcast(message) {
|
|
242
|
-
this.logger.logOutbound(message);
|
|
243
|
-
for (const [id, subscriber] of this.subscribers) {
|
|
244
|
-
if (subscriber.canSend && !subscriber.canSend()) {
|
|
245
|
-
this.subscribers.delete(id);
|
|
246
|
-
continue;
|
|
247
|
-
}
|
|
248
|
-
this.safeSend(subscriber, message);
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
safeSend(subscriber, message) {
|
|
252
|
-
try {
|
|
253
|
-
subscriber.send(message);
|
|
254
|
-
}
|
|
255
|
-
catch {
|
|
256
|
-
this.subscribers.delete(subscriber.id);
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
function extractErrorMessage(error) {
|
|
261
|
-
if (error instanceof Error) {
|
|
262
|
-
return error.message;
|
|
263
|
-
}
|
|
264
|
-
if (typeof error === 'string') {
|
|
265
|
-
return error;
|
|
266
|
-
}
|
|
267
|
-
try {
|
|
268
|
-
return JSON.stringify(error);
|
|
269
|
-
}
|
|
270
|
-
catch {
|
|
271
|
-
return 'Unknown error';
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
function extractUserContent(content) {
|
|
275
|
-
if (typeof content === 'string') {
|
|
276
|
-
return content;
|
|
277
|
-
}
|
|
278
|
-
if (Array.isArray(content)) {
|
|
279
|
-
const texts = [];
|
|
280
|
-
for (const part of content) {
|
|
281
|
-
if (part &&
|
|
282
|
-
typeof part === 'object' &&
|
|
283
|
-
'type' in part &&
|
|
284
|
-
part.type === 'text' &&
|
|
285
|
-
typeof part.text === 'string') {
|
|
286
|
-
texts.push(part.text);
|
|
287
|
-
}
|
|
288
|
-
}
|
|
289
|
-
if (texts.length > 0) {
|
|
290
|
-
return texts.join('');
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
return null;
|
|
294
|
-
}
|
|
295
|
-
//# sourceMappingURL=session.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/orchestrator/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import { createSdkMcpServer, tool } from '@anthropic-ai/claude-agent-sdk';
|
|
2
|
-
import { z } from 'zod';
|
|
3
|
-
export function createWorkerStatusMcpServer(onStatusUpdate) {
|
|
4
|
-
return createSdkMcpServer({
|
|
5
|
-
name: 'worker_status',
|
|
6
|
-
version: '1.0.0',
|
|
7
|
-
tools: [
|
|
8
|
-
tool('send_status_update', `Send a status update message to notify about progress.
|
|
9
|
-
|
|
10
|
-
Use this tool to:
|
|
11
|
-
- Report progress on long-running tasks
|
|
12
|
-
- Notify about important milestones or decisions
|
|
13
|
-
- Provide context about what you're currently working on
|
|
14
|
-
- Signal warnings or issues that don't stop execution
|
|
15
|
-
|
|
16
|
-
The status update will be visible to the orchestrator and tracked in your task's progress history.`, {
|
|
17
|
-
message: z.string().min(1, 'message is required').describe('A concise status update message describing current progress or state'),
|
|
18
|
-
metadata: z.record(z.any()).optional().describe('Optional metadata to attach to this status update'),
|
|
19
|
-
}, async (args) => {
|
|
20
|
-
console.log('[StatusTool] send_status_update called:', {
|
|
21
|
-
message: args.message,
|
|
22
|
-
metadata: args.metadata,
|
|
23
|
-
});
|
|
24
|
-
onStatusUpdate({
|
|
25
|
-
message: args.message,
|
|
26
|
-
metadata: args.metadata,
|
|
27
|
-
timestamp: Date.now(),
|
|
28
|
-
});
|
|
29
|
-
return {
|
|
30
|
-
content: [
|
|
31
|
-
{
|
|
32
|
-
type: 'text',
|
|
33
|
-
text: 'Status update sent successfully.',
|
|
34
|
-
},
|
|
35
|
-
],
|
|
36
|
-
};
|
|
37
|
-
}),
|
|
38
|
-
],
|
|
39
|
-
});
|
|
40
|
-
}
|
|
41
|
-
//# sourceMappingURL=worker-status-tool.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"worker-status-tool.js","sourceRoot":"","sources":["../../../src/orchestrator/tools/worker-status-tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,IAAI,EAAE,MAAM,gCAAgC,CAAC;AAC1E,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAUxB,MAAM,UAAU,2BAA2B,CAAC,cAAoC;IAC9E,OAAO,kBAAkB,CAAC;QACxB,IAAI,EAAE,eAAe;QACrB,OAAO,EAAE,OAAO;QAChB,KAAK,EAAE;YACL,IAAI,CACF,oBAAoB,EACpB;;;;;;;;mGAQ2F,EAC3F;gBACE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,qBAAqB,CAAC,CAAC,QAAQ,CAAC,sEAAsE,CAAC;gBAClI,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mDAAmD,CAAC;aACrG,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;gBACb,OAAO,CAAC,GAAG,CAAC,yCAAyC,EAAE;oBACrD,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;iBACxB,CAAC,CAAC;gBAEH,cAAc,CAAC;oBACb,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;oBACvB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;iBACtB,CAAC,CAAC;gBAEH,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,kCAAkC;yBACzC;qBACF;iBACF,CAAC;YACJ,CAAC,CACF;SACF;KACF,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1,149 +0,0 @@
|
|
|
1
|
-
import { createSdkMcpServer, tool } from '@anthropic-ai/claude-agent-sdk';
|
|
2
|
-
import { z } from 'zod';
|
|
3
|
-
export function createWorkerMcpServer(workerManager, context) {
|
|
4
|
-
return createSdkMcpServer({
|
|
5
|
-
name: 'worker',
|
|
6
|
-
version: '1.0.0',
|
|
7
|
-
tools: [
|
|
8
|
-
tool('launch_worker', `Launch a background worker agent to handle tasks autonomously.
|
|
9
|
-
|
|
10
|
-
When to use this tool:
|
|
11
|
-
- Complex tasks requiring multiple steps or operations
|
|
12
|
-
- Searches and exploration of the codebase
|
|
13
|
-
- Tasks that can run in parallel with other work
|
|
14
|
-
- Nearly any coding task - prefer delegation over doing work directly
|
|
15
|
-
|
|
16
|
-
Usage notes:
|
|
17
|
-
- Launch multiple workers concurrently whenever possible for maximum performance (use multiple tool calls in a single turn)
|
|
18
|
-
- Provide detailed, autonomous task descriptions including exactly what information should be returned
|
|
19
|
-
- Workers have full access to: file operations (read, write, edit), search (glob, grep), bash commands, git operations, running tests, and can launch their own sub-workers
|
|
20
|
-
- Worker outputs should be trusted - they have the same capabilities as you
|
|
21
|
-
- The worker's result is returned to you, not the user - you must summarize or forward relevant information
|
|
22
|
-
- Worker progress status is automatically included in your context - you can see their current state without additional tools`, {
|
|
23
|
-
task: z.string().min(1, 'task name is required').describe('A short, unique name for this task (e.g., "FizzBuzz Python", "Search codebase", "Fix bug #123"). Used to identify and track this worker.'),
|
|
24
|
-
prompt: z.string().min(1, 'prompt is required'),
|
|
25
|
-
metadata: z.record(z.any()).optional(),
|
|
26
|
-
}, async (args, extra) => {
|
|
27
|
-
const typedExtra = extra;
|
|
28
|
-
const toolUseIdRaw = typedExtra?._meta?.['claudecode/toolUseId'];
|
|
29
|
-
const toolUseId = typeof toolUseIdRaw === 'string' ? toolUseIdRaw : undefined;
|
|
30
|
-
const sdkSessionId = typedExtra?.sessionId;
|
|
31
|
-
let parentSessionId = context.resolveSessionIdBySdk(sdkSessionId);
|
|
32
|
-
if (!parentSessionId && toolUseId) {
|
|
33
|
-
parentSessionId = context.resolveSessionIdByToolUse(toolUseId);
|
|
34
|
-
}
|
|
35
|
-
const record = workerManager.launchWorker({
|
|
36
|
-
task: args.task,
|
|
37
|
-
prompt: args.prompt,
|
|
38
|
-
originSessionId: parentSessionId,
|
|
39
|
-
metadata: args.metadata,
|
|
40
|
-
});
|
|
41
|
-
return {
|
|
42
|
-
content: [
|
|
43
|
-
{
|
|
44
|
-
type: 'text',
|
|
45
|
-
text: JSON.stringify({
|
|
46
|
-
workerId: record.id,
|
|
47
|
-
status: record.status,
|
|
48
|
-
message: `Worker launched successfully, task ${args.task} in progress. You will be notified for progress updates.`,
|
|
49
|
-
}),
|
|
50
|
-
},
|
|
51
|
-
],
|
|
52
|
-
};
|
|
53
|
-
}),
|
|
54
|
-
tool('message_worker', `Send a message to a running worker to provide additional context, requirements, or steering.
|
|
55
|
-
|
|
56
|
-
Use this tool to:
|
|
57
|
-
- Add new requirements or clarifications to an in-progress task
|
|
58
|
-
- Provide additional context the worker might need
|
|
59
|
-
- Correct or redirect the worker's current approach
|
|
60
|
-
- Answer implicit questions or resolve ambiguities
|
|
61
|
-
|
|
62
|
-
**When to use this tool:**
|
|
63
|
-
- User provides additional requirements while a task is in progress
|
|
64
|
-
- User clarifies or corrects their original request
|
|
65
|
-
- User adds context that would help the running worker
|
|
66
|
-
- A logically related request comes in for an existing task
|
|
67
|
-
|
|
68
|
-
**When to launch a NEW worker instead:**
|
|
69
|
-
- The request is for a completely different, unrelated task
|
|
70
|
-
- The user explicitly requests a separate task
|
|
71
|
-
- The new work would conflict with the current worker's objective
|
|
72
|
-
|
|
73
|
-
**Interrupt parameter:**
|
|
74
|
-
- interrupt=true: Stop current work immediately and redirect (use for critical corrections or significant changes in direction)
|
|
75
|
-
- interrupt=false: Queue message for after current turn completes (use for additions, clarifications, or supplementary context)
|
|
76
|
-
|
|
77
|
-
**Guidelines for interrupt:**
|
|
78
|
-
- Use interrupt=true ONLY if:
|
|
79
|
-
- User explicitly says to stop/interrupt current work
|
|
80
|
-
- The new requirement significantly contradicts the current direction
|
|
81
|
-
- The worker is heading down the wrong path and needs immediate correction
|
|
82
|
-
- Use interrupt=false (default) for:
|
|
83
|
-
- Adding requirements that build on current work
|
|
84
|
-
- Providing helpful context or clarifications
|
|
85
|
-
- Making additions that don't conflict with current progress
|
|
86
|
-
|
|
87
|
-
Example 1 (queue):
|
|
88
|
-
User: "Add authentication to my app"
|
|
89
|
-
Orchestrator: [launches worker: "add auth"]
|
|
90
|
-
User: "Make sure it works with Google OAuth"
|
|
91
|
-
Orchestrator: [message_worker: task="add auth", message="User wants Google OAuth integration", interrupt=false]
|
|
92
|
-
|
|
93
|
-
Example 2 (interrupt):
|
|
94
|
-
User: "Refactor the database layer"
|
|
95
|
-
Orchestrator: [launches worker: "refactor database"]
|
|
96
|
-
User: "Wait, actually don't touch the database - just refactor the API layer instead"
|
|
97
|
-
Orchestrator: [message_worker: task="refactor database", message="User wants to change scope - refactor API layer instead, leave database alone", interrupt=true]`, {
|
|
98
|
-
task: z.string().min(1, 'task name is required').describe('The task name of the worker to message'),
|
|
99
|
-
message: z.string().min(1, 'message is required').describe('The message to send to the worker. Be clear and specific about what has changed or what additional context is being provided.'),
|
|
100
|
-
interrupt: z.boolean().default(false).describe('If true, interrupt current generation immediately; if false (default), queue message for next turn'),
|
|
101
|
-
}, async (args) => {
|
|
102
|
-
const success = await workerManager.messageWorker(args.task, args.message, args.interrupt);
|
|
103
|
-
if (!success) {
|
|
104
|
-
const worker = workerManager.getWorkerByTask(args.task);
|
|
105
|
-
if (!worker) {
|
|
106
|
-
return {
|
|
107
|
-
content: [
|
|
108
|
-
{
|
|
109
|
-
type: 'text',
|
|
110
|
-
text: JSON.stringify({
|
|
111
|
-
success: false,
|
|
112
|
-
error: `No worker found with task name: ${args.task}`,
|
|
113
|
-
}),
|
|
114
|
-
},
|
|
115
|
-
],
|
|
116
|
-
};
|
|
117
|
-
}
|
|
118
|
-
return {
|
|
119
|
-
content: [
|
|
120
|
-
{
|
|
121
|
-
type: 'text',
|
|
122
|
-
text: JSON.stringify({
|
|
123
|
-
success: false,
|
|
124
|
-
error: `Worker "${args.task}" is not running (status: ${worker.status})`,
|
|
125
|
-
}),
|
|
126
|
-
},
|
|
127
|
-
],
|
|
128
|
-
};
|
|
129
|
-
}
|
|
130
|
-
return {
|
|
131
|
-
content: [
|
|
132
|
-
{
|
|
133
|
-
type: 'text',
|
|
134
|
-
text: JSON.stringify({
|
|
135
|
-
success: true,
|
|
136
|
-
task: args.task,
|
|
137
|
-
interrupted: args.interrupt,
|
|
138
|
-
message: args.interrupt
|
|
139
|
-
? `Message sent to worker "${args.task}" (interrupted current work)`
|
|
140
|
-
: `Message queued for worker "${args.task}" (will be delivered after current turn)`,
|
|
141
|
-
}),
|
|
142
|
-
},
|
|
143
|
-
],
|
|
144
|
-
};
|
|
145
|
-
}),
|
|
146
|
-
],
|
|
147
|
-
});
|
|
148
|
-
}
|
|
149
|
-
//# sourceMappingURL=worker-tools.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"worker-tools.js","sourceRoot":"","sources":["../../../src/orchestrator/tools/worker-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import { z } from 'zod';
|
|
2
|
-
export const inboundMessageSchema = z.discriminatedUnion('type', [
|
|
3
|
-
z.object({
|
|
4
|
-
type: z.literal('chat'),
|
|
5
|
-
sessionId: z.string().trim().min(1).optional(),
|
|
6
|
-
text: z.string().min(1, 'text cannot be empty'),
|
|
7
|
-
}),
|
|
8
|
-
z.object({
|
|
9
|
-
type: z.literal('session_init'),
|
|
10
|
-
sessionId: z.string().trim().min(1, 'sessionId is required for session_init'),
|
|
11
|
-
parentSessionId: z.string().trim().min(1).optional(),
|
|
12
|
-
metadata: z.record(z.string(), z.unknown()).optional(),
|
|
13
|
-
}),
|
|
14
|
-
z.object({
|
|
15
|
-
type: z.literal('join'),
|
|
16
|
-
sessionId: z.string().trim().min(1, 'sessionId is required to join'),
|
|
17
|
-
}),
|
|
18
|
-
z.object({
|
|
19
|
-
type: z.literal('leave'),
|
|
20
|
-
sessionId: z.string().trim().min(1, 'sessionId is required to leave'),
|
|
21
|
-
}),
|
|
22
|
-
z.object({
|
|
23
|
-
type: z.literal('ping'),
|
|
24
|
-
}),
|
|
25
|
-
z.object({
|
|
26
|
-
type: z.literal('cancel_worker'),
|
|
27
|
-
workerId: z.string().trim().min(1, 'workerId is required'),
|
|
28
|
-
}),
|
|
29
|
-
]);
|
|
30
|
-
//# sourceMappingURL=types.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/orchestrator/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,kBAAkB,CAAC,MAAM,EAAE;IAC/D,CAAC,CAAC,MAAM,CAAC;QACP,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;QACvB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;QAC9C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,sBAAsB,CAAC;KAChD,CAAC;IACF,CAAC,CAAC,MAAM,CAAC;QACP,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC;QAC/B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,wCAAwC,CAAC;QAC7E,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;QACpD,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE;KACvD,CAAC;IACF,CAAC,CAAC,MAAM,CAAC;QACP,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;QACvB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,+BAA+B,CAAC;KACrE,CAAC;IACF,CAAC,CAAC,MAAM,CAAC;QACP,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;QACxB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,gCAAgC,CAAC;KACtE,CAAC;IACF,CAAC,CAAC,MAAM,CAAC;QACP,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;KACxB,CAAC;IACF,CAAC,CAAC,MAAM,CAAC;QACP,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC;QAChC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,sBAAsB,CAAC;KAC3D,CAAC;CACH,CAAC,CAAC"}
|