omnara 0.1.0

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 (111) hide show
  1. package/README.md +20 -0
  2. package/bin/omnara.js +16 -0
  3. package/dist/auth/auth-provider.d.ts +18 -0
  4. package/dist/auth/auth-provider.js +58 -0
  5. package/dist/auth/auth-provider.js.map +1 -0
  6. package/dist/auth/cli-auth-service.d.ts +18 -0
  7. package/dist/auth/cli-auth-service.js +30 -0
  8. package/dist/auth/cli-auth-service.js.map +1 -0
  9. package/dist/auth/credential-manager.d.ts +6 -0
  10. package/dist/auth/credential-manager.js +73 -0
  11. package/dist/auth/credential-manager.js.map +1 -0
  12. package/dist/auth/credentials-store.d.ts +14 -0
  13. package/dist/auth/credentials-store.js +75 -0
  14. package/dist/auth/credentials-store.js.map +1 -0
  15. package/dist/auth/login-flow.d.ts +15 -0
  16. package/dist/auth/login-flow.js +107 -0
  17. package/dist/auth/login-flow.js.map +1 -0
  18. package/dist/auth/supabase-client.d.ts +3 -0
  19. package/dist/auth/supabase-client.js +13 -0
  20. package/dist/auth/supabase-client.js.map +1 -0
  21. package/dist/auth/supabase-config.d.ts +5 -0
  22. package/dist/auth/supabase-config.js +24 -0
  23. package/dist/auth/supabase-config.js.map +1 -0
  24. package/dist/cli.d.ts +3 -0
  25. package/dist/cli.js +53 -0
  26. package/dist/cli.js.map +1 -0
  27. package/dist/commands/agent.d.ts +7 -0
  28. package/dist/commands/agent.js +174 -0
  29. package/dist/commands/agent.js.map +1 -0
  30. package/dist/commands/auth.d.ts +2 -0
  31. package/dist/commands/auth.js +87 -0
  32. package/dist/commands/auth.js.map +1 -0
  33. package/dist/commands/hello.d.ts +2 -0
  34. package/dist/commands/hello.js +12 -0
  35. package/dist/commands/hello.js.map +1 -0
  36. package/dist/commands/index.d.ts +2 -0
  37. package/dist/commands/index.js +9 -0
  38. package/dist/commands/index.js.map +1 -0
  39. package/dist/generated/relay.d.ts +240 -0
  40. package/dist/generated/relay.js +2376 -0
  41. package/dist/generated/relay.js.map +1 -0
  42. package/dist/http/api-client.d.ts +24 -0
  43. package/dist/http/api-client.js +122 -0
  44. package/dist/http/api-client.js.map +1 -0
  45. package/dist/messaging/proto-codec.d.ts +5 -0
  46. package/dist/messaging/proto-codec.js +387 -0
  47. package/dist/messaging/proto-codec.js.map +1 -0
  48. package/dist/orchestrator/agent-orchestrator.d.ts +57 -0
  49. package/dist/orchestrator/agent-orchestrator.js +401 -0
  50. package/dist/orchestrator/agent-orchestrator.js.map +1 -0
  51. package/dist/orchestrator/ai-client.d.ts +16 -0
  52. package/dist/orchestrator/ai-client.js +74 -0
  53. package/dist/orchestrator/ai-client.js.map +1 -0
  54. package/dist/orchestrator/session.d.ts +37 -0
  55. package/dist/orchestrator/session.js +260 -0
  56. package/dist/orchestrator/session.js.map +1 -0
  57. package/dist/orchestrator/tools/worker-tools.d.ts +7 -0
  58. package/dist/orchestrator/tools/worker-tools.js +58 -0
  59. package/dist/orchestrator/tools/worker-tools.js.map +1 -0
  60. package/dist/orchestrator/types.d.ts +140 -0
  61. package/dist/orchestrator/types.js +33 -0
  62. package/dist/orchestrator/types.js.map +1 -0
  63. package/dist/orchestrator/utils/session-logger.d.ts +7 -0
  64. package/dist/orchestrator/utils/session-logger.js +53 -0
  65. package/dist/orchestrator/utils/session-logger.js.map +1 -0
  66. package/dist/orchestrator/worker-manager.d.ts +65 -0
  67. package/dist/orchestrator/worker-manager.js +241 -0
  68. package/dist/orchestrator/worker-manager.js.map +1 -0
  69. package/dist/relay/relay-bridge.d.ts +35 -0
  70. package/dist/relay/relay-bridge.js +306 -0
  71. package/dist/relay/relay-bridge.js.map +1 -0
  72. package/dist/relay/relay-service.d.ts +20 -0
  73. package/dist/relay/relay-service.js +28 -0
  74. package/dist/relay/relay-service.js.map +1 -0
  75. package/dist/repl/terminal-repl.d.ts +9 -0
  76. package/dist/repl/terminal-repl.js +258 -0
  77. package/dist/repl/terminal-repl.js.map +1 -0
  78. package/dist/server/agent-server.d.ts +46 -0
  79. package/dist/server/agent-server.js +429 -0
  80. package/dist/server/agent-server.js.map +1 -0
  81. package/dist/server/ai-client.d.ts +16 -0
  82. package/dist/server/ai-client.js +74 -0
  83. package/dist/server/ai-client.js.map +1 -0
  84. package/dist/server/session.d.ts +35 -0
  85. package/dist/server/session.js +272 -0
  86. package/dist/server/session.js.map +1 -0
  87. package/dist/server/subagents.d.ts +19 -0
  88. package/dist/server/subagents.js +42 -0
  89. package/dist/server/subagents.js.map +1 -0
  90. package/dist/server/tools/worker-tools.d.ts +2 -0
  91. package/dist/server/tools/worker-tools.js +37 -0
  92. package/dist/server/tools/worker-tools.js.map +1 -0
  93. package/dist/server/types.d.ts +120 -0
  94. package/dist/server/types.js +29 -0
  95. package/dist/server/types.js.map +1 -0
  96. package/dist/server/utils/session-logger.d.ts +7 -0
  97. package/dist/server/utils/session-logger.js +53 -0
  98. package/dist/server/utils/session-logger.js.map +1 -0
  99. package/dist/server/worker-manager.d.ts +67 -0
  100. package/dist/server/worker-manager.js +207 -0
  101. package/dist/server/worker-manager.js.map +1 -0
  102. package/dist/test-agent.d.ts +1 -0
  103. package/dist/test-agent.js +63 -0
  104. package/dist/test-agent.js.map +1 -0
  105. package/dist/utils/prompt.d.ts +1 -0
  106. package/dist/utils/prompt.js +19 -0
  107. package/dist/utils/prompt.js.map +1 -0
  108. package/dist/voice/voice-service.d.ts +19 -0
  109. package/dist/voice/voice-service.js +27 -0
  110. package/dist/voice/voice-service.js.map +1 -0
  111. package/package.json +58 -0
@@ -0,0 +1,260 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Session = void 0;
4
+ const session_logger_1 = require("./utils/session-logger");
5
+ class Session {
6
+ constructor(id, aiClient, onEmpty, onToolUse) {
7
+ this.subscribers = new Map();
8
+ this.sdkSessionId = null;
9
+ this.inflight = null;
10
+ this.lastActivity = Date.now();
11
+ this.id = id;
12
+ this.aiClient = aiClient;
13
+ this.onEmpty = onEmpty;
14
+ this.onToolUse = onToolUse;
15
+ this.logger = (0, session_logger_1.createSessionLogger)(this.id);
16
+ }
17
+ announceInboundMessage(text, origin = 'user') {
18
+ if (!text) {
19
+ return;
20
+ }
21
+ // Only broadcast worker-origin updates. User messages already show up via `chat` frames.
22
+ if (origin !== 'worker') {
23
+ return;
24
+ }
25
+ const message = {
26
+ type: 'user_text',
27
+ sessionId: this.id,
28
+ text,
29
+ origin,
30
+ };
31
+ this.broadcast(message);
32
+ }
33
+ get lastActiveAt() {
34
+ return this.lastActivity;
35
+ }
36
+ get sdkSessionIdentifier() {
37
+ return this.sdkSessionId;
38
+ }
39
+ subscribe(subscriber) {
40
+ this.subscribers.set(subscriber.id, subscriber);
41
+ this.safeSend(subscriber, { type: 'session_joined', sessionId: this.id });
42
+ }
43
+ unsubscribe(subscriberId) {
44
+ this.subscribers.delete(subscriberId);
45
+ if (!this.hasSubscribers() && !this.inflight) {
46
+ this.onEmpty(this.id);
47
+ }
48
+ }
49
+ hasSubscribers() {
50
+ return this.subscribers.size > 0;
51
+ }
52
+ close() {
53
+ this.subscribers.clear();
54
+ this.logger.close();
55
+ }
56
+ enqueueUserMessage(text) {
57
+ this.lastActivity = Date.now();
58
+ const previous = this.inflight;
59
+ const task = async () => {
60
+ if (previous) {
61
+ try {
62
+ await previous;
63
+ }
64
+ catch {
65
+ // Previous error already reported, continue with new message.
66
+ }
67
+ }
68
+ await this.processUserMessage(text);
69
+ };
70
+ const promise = task()
71
+ .catch((error) => {
72
+ this.broadcast({
73
+ type: 'error',
74
+ sessionId: this.id,
75
+ message: extractErrorMessage(error),
76
+ });
77
+ })
78
+ .finally(() => {
79
+ if (this.inflight === promise) {
80
+ this.inflight = null;
81
+ this.lastActivity = Date.now();
82
+ if (!this.hasSubscribers()) {
83
+ this.onEmpty(this.id);
84
+ }
85
+ }
86
+ });
87
+ this.inflight = promise;
88
+ }
89
+ handleStreamEvent(event) {
90
+ switch (event.type) {
91
+ case 'content_block_delta': {
92
+ const delta = event.delta;
93
+ if (delta?.type === 'text_delta' && delta.text) {
94
+ this.broadcast({
95
+ type: 'assistant_text',
96
+ sessionId: this.id,
97
+ text: delta.text,
98
+ });
99
+ }
100
+ break;
101
+ }
102
+ default:
103
+ break;
104
+ }
105
+ }
106
+ async processUserMessage(text) {
107
+ const options = this.sdkSessionId ? { resume: this.sdkSessionId } : undefined;
108
+ for await (const message of this.aiClient.streamUserMessage(text, options)) {
109
+ this.routeSdkMessage(message);
110
+ }
111
+ }
112
+ routeSdkMessage(message) {
113
+ switch (message.type) {
114
+ case 'assistant':
115
+ this.handleAssistantMessage(message);
116
+ break;
117
+ case 'stream_event':
118
+ this.handleStreamEvent(message.event);
119
+ break;
120
+ case 'result':
121
+ this.handleResultMessage(message);
122
+ break;
123
+ case 'system':
124
+ this.handleSystemMessage(message);
125
+ break;
126
+ case 'user': {
127
+ const textContent = extractUserContent(message.message.content);
128
+ if (textContent) {
129
+ this.broadcast({
130
+ type: 'user_text',
131
+ sessionId: this.id,
132
+ text: textContent,
133
+ });
134
+ }
135
+ break;
136
+ }
137
+ default:
138
+ break;
139
+ }
140
+ }
141
+ handleAssistantMessage(message) {
142
+ const content = message.message.content;
143
+ if (!Array.isArray(content)) {
144
+ return;
145
+ }
146
+ for (const block of content) {
147
+ if (!block || typeof block !== 'object') {
148
+ continue;
149
+ }
150
+ const typed = block;
151
+ const blockType = typed.type;
152
+ if (blockType === 'text' && typeof typed.text === 'string') {
153
+ if (typed.text.length > 0) {
154
+ this.broadcast({
155
+ type: 'assistant_text',
156
+ sessionId: this.id,
157
+ text: typed.text,
158
+ });
159
+ }
160
+ }
161
+ else if (blockType === 'tool_use') {
162
+ const toolUseId = typeof typed.id === 'string' ? typed.id : undefined;
163
+ this.broadcast({
164
+ type: 'tool_call',
165
+ sessionId: this.id,
166
+ toolName: typeof typed.name === 'string' ? typed.name : 'unknown',
167
+ toolUseId: toolUseId ?? 'unknown',
168
+ input: typed.input,
169
+ });
170
+ if (toolUseId) {
171
+ this.onToolUse?.(toolUseId, this.id);
172
+ }
173
+ }
174
+ else if (blockType === 'tool_result') {
175
+ this.broadcast({
176
+ type: 'tool_result',
177
+ sessionId: this.id,
178
+ toolUseId: typeof typed.tool_use_id === 'string' ? typed.tool_use_id : 'unknown',
179
+ content: typed.content,
180
+ isError: Boolean(typed.is_error),
181
+ });
182
+ }
183
+ }
184
+ }
185
+ handleResultMessage(message) {
186
+ void message;
187
+ this.broadcast({
188
+ type: 'assistant_complete',
189
+ sessionId: this.id,
190
+ });
191
+ }
192
+ handleSystemMessage(message) {
193
+ if (message.subtype === 'init') {
194
+ this.sdkSessionId = message.session_id;
195
+ }
196
+ this.broadcast({
197
+ type: 'system',
198
+ sessionId: this.id,
199
+ subtype: message.subtype,
200
+ });
201
+ }
202
+ logInbound(payload) {
203
+ this.logger.logInbound(payload);
204
+ }
205
+ broadcast(message) {
206
+ this.logger.logOutbound(message);
207
+ for (const [id, subscriber] of this.subscribers) {
208
+ if (subscriber.canSend && !subscriber.canSend()) {
209
+ this.subscribers.delete(id);
210
+ continue;
211
+ }
212
+ this.safeSend(subscriber, message);
213
+ }
214
+ }
215
+ safeSend(subscriber, message) {
216
+ try {
217
+ subscriber.send(message);
218
+ }
219
+ catch {
220
+ this.subscribers.delete(subscriber.id);
221
+ }
222
+ }
223
+ }
224
+ exports.Session = Session;
225
+ function extractErrorMessage(error) {
226
+ if (error instanceof Error) {
227
+ return error.message;
228
+ }
229
+ if (typeof error === 'string') {
230
+ return error;
231
+ }
232
+ try {
233
+ return JSON.stringify(error);
234
+ }
235
+ catch {
236
+ return 'Unknown error';
237
+ }
238
+ }
239
+ function extractUserContent(content) {
240
+ if (typeof content === 'string') {
241
+ return content;
242
+ }
243
+ if (Array.isArray(content)) {
244
+ const texts = [];
245
+ for (const part of content) {
246
+ if (part &&
247
+ typeof part === 'object' &&
248
+ 'type' in part &&
249
+ part.type === 'text' &&
250
+ typeof part.text === 'string') {
251
+ texts.push(part.text);
252
+ }
253
+ }
254
+ if (texts.length > 0) {
255
+ return texts.join('');
256
+ }
257
+ }
258
+ return null;
259
+ }
260
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/orchestrator/session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { WorkerManager } from '../worker-manager';
2
+ interface WorkerMcpContext {
3
+ resolveSessionIdBySdk: (sdkSessionId?: string) => string | undefined;
4
+ resolveSessionIdByToolUse: (toolUseId: string) => string | undefined;
5
+ }
6
+ export declare function createWorkerMcpServer(workerManager: WorkerManager, context: WorkerMcpContext): import("@anthropic-ai/claude-agent-sdk").McpSdkServerConfigWithInstance;
7
+ export {};
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createWorkerMcpServer = createWorkerMcpServer;
4
+ const claude_agent_sdk_1 = require("@anthropic-ai/claude-agent-sdk");
5
+ const zod_1 = require("zod");
6
+ function createWorkerMcpServer(workerManager, context) {
7
+ return (0, claude_agent_sdk_1.createSdkMcpServer)({
8
+ name: 'worker',
9
+ version: '1.0.0',
10
+ tools: [
11
+ (0, claude_agent_sdk_1.tool)('launch_worker', `Launch a background worker agent to handle tasks autonomously.
12
+
13
+ When to use this tool:
14
+ - Complex tasks requiring multiple steps or operations
15
+ - Searches and exploration of the codebase
16
+ - Tasks that can run in parallel with other work
17
+ - Nearly any coding task - prefer delegation over doing work directly
18
+
19
+ Usage notes:
20
+ - Launch multiple workers concurrently whenever possible for maximum performance (use multiple tool calls in a single turn)
21
+ - Provide detailed, autonomous task descriptions including exactly what information should be returned
22
+ - 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
23
+ - Worker outputs should be trusted - they have the same capabilities as you
24
+ - The worker's result is returned to you, not the user - you must summarize or forward relevant information
25
+ - Worker progress status is automatically included in your context - you can see their current state without additional tools`, {
26
+ prompt: zod_1.z.string().min(1, 'prompt is required'),
27
+ metadata: zod_1.z.record(zod_1.z.any()).optional(),
28
+ }, async (args, extra) => {
29
+ const typedExtra = extra;
30
+ const toolUseIdRaw = typedExtra?._meta?.['claudecode/toolUseId'];
31
+ const toolUseId = typeof toolUseIdRaw === 'string' ? toolUseIdRaw : undefined;
32
+ const sdkSessionId = typedExtra?.sessionId;
33
+ let parentSessionId = context.resolveSessionIdBySdk(sdkSessionId);
34
+ if (!parentSessionId && toolUseId) {
35
+ parentSessionId = context.resolveSessionIdByToolUse(toolUseId);
36
+ }
37
+ const record = workerManager.launchWorker({
38
+ prompt: args.prompt,
39
+ originSessionId: parentSessionId,
40
+ metadata: args.metadata,
41
+ });
42
+ return {
43
+ content: [
44
+ {
45
+ type: 'text',
46
+ text: JSON.stringify({
47
+ workerId: record.id,
48
+ status: record.status,
49
+ message: 'Worker launched successfully. Monitor progress via worker updates.',
50
+ }),
51
+ },
52
+ ],
53
+ };
54
+ }),
55
+ ],
56
+ });
57
+ }
58
+ //# sourceMappingURL=worker-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-tools.js","sourceRoot":"","sources":["../../../src/orchestrator/tools/worker-tools.ts"],"names":[],"mappings":";;AAeA,sDA8DC;AA7ED,qEAA0E;AAC1E,6BAAwB;AAcxB,SAAgB,qBAAqB,CACnC,aAA4B,EAC5B,OAAyB;IAEzB,OAAO,IAAA,qCAAkB,EAAC;QACxB,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,OAAO;QAChB,KAAK,EAAE;YACL,IAAA,uBAAI,EACF,eAAe,EACf;;;;;;;;;;;;;;8HAcsH,EACtH;gBACE,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,oBAAoB,CAAC;gBAC/C,QAAQ,EAAE,OAAC,CAAC,MAAM,CAAC,OAAC,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,EAAE;aACvC,EACD,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE;gBACpB,MAAM,UAAU,GAAG,KAA8B,CAAC;gBAClD,MAAM,YAAY,GAAG,UAAU,EAAE,KAAK,EAAE,CAAC,sBAAsB,CAAC,CAAC;gBACjE,MAAM,SAAS,GAAG,OAAO,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC;gBAE9E,MAAM,YAAY,GAAG,UAAU,EAAE,SAAS,CAAC;gBAC3C,IAAI,eAAe,GAAG,OAAO,CAAC,qBAAqB,CAAC,YAAY,CAAC,CAAC;gBAClE,IAAI,CAAC,eAAe,IAAI,SAAS,EAAE,CAAC;oBAClC,eAAe,GAAG,OAAO,CAAC,yBAAyB,CAAC,SAAS,CAAC,CAAC;gBACjE,CAAC;gBAED,MAAM,MAAM,GAAG,aAAa,CAAC,YAAY,CAAC;oBACxC,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,eAAe,EAAE,eAAe;oBAChC,QAAQ,EAAE,IAAI,CAAC,QAAQ;iBACxB,CAAC,CAAC;gBAEH,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gCACnB,QAAQ,EAAE,MAAM,CAAC,EAAE;gCACnB,MAAM,EAAE,MAAM,CAAC,MAAM;gCACrB,OAAO,EAAE,oEAAoE;6BAC9E,CAAC;yBACH;qBACF;iBACF,CAAC;YACJ,CAAC,CACF;SACF;KACF,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,140 @@
1
+ import { z } from 'zod';
2
+ export declare const inboundMessageSchema: z.ZodDiscriminatedUnion<"type", [z.ZodObject<{
3
+ type: z.ZodLiteral<"chat">;
4
+ sessionId: z.ZodOptional<z.ZodString>;
5
+ text: z.ZodString;
6
+ }, "strip", z.ZodTypeAny, {
7
+ type: "chat";
8
+ text: string;
9
+ sessionId?: string | undefined;
10
+ }, {
11
+ type: "chat";
12
+ text: string;
13
+ sessionId?: string | undefined;
14
+ }>, z.ZodObject<{
15
+ type: z.ZodLiteral<"session_init">;
16
+ sessionId: z.ZodString;
17
+ parentSessionId: z.ZodOptional<z.ZodString>;
18
+ metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
19
+ }, "strip", z.ZodTypeAny, {
20
+ type: "session_init";
21
+ sessionId: string;
22
+ parentSessionId?: string | undefined;
23
+ metadata?: Record<string, unknown> | undefined;
24
+ }, {
25
+ type: "session_init";
26
+ sessionId: string;
27
+ parentSessionId?: string | undefined;
28
+ metadata?: Record<string, unknown> | undefined;
29
+ }>, z.ZodObject<{
30
+ type: z.ZodLiteral<"join">;
31
+ sessionId: z.ZodString;
32
+ }, "strip", z.ZodTypeAny, {
33
+ type: "join";
34
+ sessionId: string;
35
+ }, {
36
+ type: "join";
37
+ sessionId: string;
38
+ }>, z.ZodObject<{
39
+ type: z.ZodLiteral<"leave">;
40
+ sessionId: z.ZodString;
41
+ }, "strip", z.ZodTypeAny, {
42
+ type: "leave";
43
+ sessionId: string;
44
+ }, {
45
+ type: "leave";
46
+ sessionId: string;
47
+ }>, z.ZodObject<{
48
+ type: z.ZodLiteral<"ping">;
49
+ }, "strip", z.ZodTypeAny, {
50
+ type: "ping";
51
+ }, {
52
+ type: "ping";
53
+ }>, z.ZodObject<{
54
+ type: z.ZodLiteral<"cancel_worker">;
55
+ workerId: z.ZodString;
56
+ }, "strip", z.ZodTypeAny, {
57
+ type: "cancel_worker";
58
+ workerId: string;
59
+ }, {
60
+ type: "cancel_worker";
61
+ workerId: string;
62
+ }>]>;
63
+ export type InboundMessage = z.infer<typeof inboundMessageSchema>;
64
+ export type OutboundMessage = {
65
+ type: 'session_created';
66
+ sessionId: string;
67
+ } | {
68
+ type: 'session_joined';
69
+ sessionId: string;
70
+ } | {
71
+ type: 'session_init';
72
+ sessionId: string;
73
+ parentSessionId?: string | null;
74
+ metadata?: Record<string, unknown>;
75
+ } | {
76
+ type: 'session_initialized';
77
+ sessionId: string;
78
+ parentSessionId?: string | null;
79
+ } | {
80
+ type: 'user_text';
81
+ sessionId: string;
82
+ text: string;
83
+ origin?: 'user' | 'worker';
84
+ } | {
85
+ type: 'assistant_text';
86
+ sessionId: string;
87
+ text: string;
88
+ } | {
89
+ type: 'assistant_complete';
90
+ sessionId: string;
91
+ } | {
92
+ type: 'tool_call';
93
+ sessionId: string;
94
+ toolName: string;
95
+ toolUseId: string;
96
+ input: unknown;
97
+ } | {
98
+ type: 'tool_result';
99
+ sessionId: string;
100
+ toolUseId: string;
101
+ content: unknown;
102
+ isError?: boolean;
103
+ } | {
104
+ type: 'system';
105
+ sessionId: string;
106
+ subtype: string;
107
+ } | {
108
+ type: 'error';
109
+ sessionId?: string;
110
+ message: string;
111
+ } | {
112
+ type: 'worker_update';
113
+ worker: WorkerUpdatePayload;
114
+ sessionId?: string;
115
+ } | {
116
+ type: 'pong';
117
+ } | {
118
+ type: 'result';
119
+ sessionId: string;
120
+ success: boolean;
121
+ durationMs?: number;
122
+ costUsd?: number;
123
+ message?: string;
124
+ };
125
+ export interface SessionSubscriber {
126
+ id: string;
127
+ send: (message: OutboundMessage) => void;
128
+ canSend?: () => boolean;
129
+ }
130
+ export interface WorkerUpdatePayload {
131
+ id: string;
132
+ status: string;
133
+ prompt: string;
134
+ lastUpdateAt: number;
135
+ latestMessage?: string;
136
+ result?: string;
137
+ error?: string;
138
+ originSessionId?: string;
139
+ sessionId: string;
140
+ }
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.inboundMessageSchema = void 0;
4
+ const zod_1 = require("zod");
5
+ exports.inboundMessageSchema = zod_1.z.discriminatedUnion('type', [
6
+ zod_1.z.object({
7
+ type: zod_1.z.literal('chat'),
8
+ sessionId: zod_1.z.string().trim().min(1).optional(),
9
+ text: zod_1.z.string().min(1, 'text cannot be empty'),
10
+ }),
11
+ zod_1.z.object({
12
+ type: zod_1.z.literal('session_init'),
13
+ sessionId: zod_1.z.string().trim().min(1, 'sessionId is required for session_init'),
14
+ parentSessionId: zod_1.z.string().trim().min(1).optional(),
15
+ metadata: zod_1.z.record(zod_1.z.string(), zod_1.z.unknown()).optional(),
16
+ }),
17
+ zod_1.z.object({
18
+ type: zod_1.z.literal('join'),
19
+ sessionId: zod_1.z.string().trim().min(1, 'sessionId is required to join'),
20
+ }),
21
+ zod_1.z.object({
22
+ type: zod_1.z.literal('leave'),
23
+ sessionId: zod_1.z.string().trim().min(1, 'sessionId is required to leave'),
24
+ }),
25
+ zod_1.z.object({
26
+ type: zod_1.z.literal('ping'),
27
+ }),
28
+ zod_1.z.object({
29
+ type: zod_1.z.literal('cancel_worker'),
30
+ workerId: zod_1.z.string().trim().min(1, 'workerId is required'),
31
+ }),
32
+ ]);
33
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/orchestrator/types.ts"],"names":[],"mappings":";;;AAAA,6BAAwB;AAEX,QAAA,oBAAoB,GAAG,OAAC,CAAC,kBAAkB,CAAC,MAAM,EAAE;IAC/D,OAAC,CAAC,MAAM,CAAC;QACP,IAAI,EAAE,OAAC,CAAC,OAAO,CAAC,MAAM,CAAC;QACvB,SAAS,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;QAC9C,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,sBAAsB,CAAC;KAChD,CAAC;IACF,OAAC,CAAC,MAAM,CAAC;QACP,IAAI,EAAE,OAAC,CAAC,OAAO,CAAC,cAAc,CAAC;QAC/B,SAAS,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,wCAAwC,CAAC;QAC7E,eAAe,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;QACpD,QAAQ,EAAE,OAAC,CAAC,MAAM,CAAC,OAAC,CAAC,MAAM,EAAE,EAAE,OAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE;KACvD,CAAC;IACF,OAAC,CAAC,MAAM,CAAC;QACP,IAAI,EAAE,OAAC,CAAC,OAAO,CAAC,MAAM,CAAC;QACvB,SAAS,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,+BAA+B,CAAC;KACrE,CAAC;IACF,OAAC,CAAC,MAAM,CAAC;QACP,IAAI,EAAE,OAAC,CAAC,OAAO,CAAC,OAAO,CAAC;QACxB,SAAS,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,gCAAgC,CAAC;KACtE,CAAC;IACF,OAAC,CAAC,MAAM,CAAC;QACP,IAAI,EAAE,OAAC,CAAC,OAAO,CAAC,MAAM,CAAC;KACxB,CAAC;IACF,OAAC,CAAC,MAAM,CAAC;QACP,IAAI,EAAE,OAAC,CAAC,OAAO,CAAC,eAAe,CAAC;QAChC,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,sBAAsB,CAAC;KAC3D,CAAC;CACH,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { OutboundMessage } from '../types';
2
+ export type SessionLogger = {
3
+ logInbound: (payload: unknown) => void;
4
+ logOutbound: (message: OutboundMessage) => void;
5
+ close: () => void;
6
+ };
7
+ export declare function createSessionLogger(sessionId: string): SessionLogger;
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.createSessionLogger = createSessionLogger;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const os_1 = __importDefault(require("os"));
10
+ function getLogDir() {
11
+ return process.env.OMNARA_LOG_DIR ?? path_1.default.join(os_1.default.homedir(), '.omnara', 'omnara-voice');
12
+ }
13
+ function ensureLogDir() {
14
+ const dir = getLogDir();
15
+ try {
16
+ fs_1.default.mkdirSync(dir, { recursive: true });
17
+ }
18
+ catch {
19
+ // ignore
20
+ }
21
+ return dir;
22
+ }
23
+ function createSessionLogger(sessionId) {
24
+ const dir = ensureLogDir();
25
+ const filePath = path_1.default.join(dir, `${sessionId}.log`);
26
+ const stream = fs_1.default.createWriteStream(filePath, { flags: 'a' });
27
+ const logLine = (direction, payload) => {
28
+ const timestamp = new Date().toISOString();
29
+ const serialized = safeStringify(payload);
30
+ stream.write(`${timestamp} [${direction}] ${serialized}\n`);
31
+ };
32
+ return {
33
+ logInbound: (payload) => logLine('in', payload),
34
+ logOutbound: (message) => logLine('out', message),
35
+ close: () => {
36
+ try {
37
+ stream.end();
38
+ }
39
+ catch {
40
+ // ignore close errors
41
+ }
42
+ },
43
+ };
44
+ }
45
+ function safeStringify(value) {
46
+ try {
47
+ return JSON.stringify(value);
48
+ }
49
+ catch {
50
+ return String(value);
51
+ }
52
+ }
53
+ //# sourceMappingURL=session-logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-logger.js","sourceRoot":"","sources":["../../../src/orchestrator/utils/session-logger.ts"],"names":[],"mappings":";;;;;AAyBA,kDAsBC;AA/CD,4CAAoB;AACpB,gDAAwB;AACxB,4CAAoB;AAGpB,SAAS,SAAS;IAChB,OAAO,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,cAAI,CAAC,IAAI,CAAC,YAAE,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,YAAE,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,SAAgB,mBAAmB,CAAC,SAAiB;IACnD,MAAM,GAAG,GAAG,YAAY,EAAE,CAAC;IAC3B,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,MAAM,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,YAAE,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"}
@@ -0,0 +1,65 @@
1
+ import { EventEmitter } from 'events';
2
+ import type { AgentClient } from './ai-client';
3
+ export type WorkerStatus = 'running' | 'completed' | 'error' | 'canceled';
4
+ export interface WorkerProgressEntry {
5
+ timestamp: number;
6
+ message: string;
7
+ }
8
+ export interface WorkerRecord {
9
+ id: string;
10
+ prompt: string;
11
+ sessionId: string;
12
+ status: WorkerStatus;
13
+ startedAt: number;
14
+ lastUpdateAt: number;
15
+ originSessionId?: string;
16
+ progress: WorkerProgressEntry[];
17
+ result?: string;
18
+ error?: string;
19
+ metadata?: Record<string, unknown>;
20
+ }
21
+ export interface WorkerUpdatePayload {
22
+ id: string;
23
+ status: WorkerStatus;
24
+ prompt: string;
25
+ lastUpdateAt: number;
26
+ result?: string;
27
+ error?: string;
28
+ latestMessage?: string;
29
+ originSessionId?: string;
30
+ sessionId: string;
31
+ }
32
+ export interface WorkerMessageEvent {
33
+ record: WorkerRecord;
34
+ messageType: 'assistant_text' | 'assistant_complete';
35
+ text?: string;
36
+ success?: boolean;
37
+ }
38
+ interface LaunchWorkerOptions {
39
+ prompt: string;
40
+ originSessionId?: string;
41
+ metadata?: Record<string, unknown>;
42
+ }
43
+ interface WorkerManagerOptions {
44
+ createClient: () => AgentClient;
45
+ resolveSessionIdBySdk?: (sdkSessionId?: string) => string | undefined;
46
+ }
47
+ export declare class WorkerManager extends EventEmitter {
48
+ private readonly options;
49
+ private readonly workers;
50
+ private readonly runningQueries;
51
+ constructor(options: WorkerManagerOptions);
52
+ listWorkers(): WorkerRecord[];
53
+ getWorker(id: string): WorkerRecord | undefined;
54
+ launchWorker({ prompt, originSessionId, metadata }: LaunchWorkerOptions): WorkerRecord;
55
+ cancelWorker(id: string): boolean;
56
+ private emitUpdate;
57
+ private emitCompleted;
58
+ private runWorker;
59
+ private handleMessage;
60
+ private extractAssistantText;
61
+ private extractDeltaText;
62
+ private extractError;
63
+ private wrapPrompt;
64
+ }
65
+ export {};