orchestrator-client 5.6.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.
package/dist/index.cjs ADDED
@@ -0,0 +1,1523 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/index.ts
31
+ var index_exports = {};
32
+ __export(index_exports, {
33
+ EVENT_ERROR_EVENT_RECORDED: () => EVENT_ERROR_EVENT_RECORDED,
34
+ EVENT_MESSAGE_ADDED: () => EVENT_MESSAGE_ADDED,
35
+ EVENT_MESSAGE_STREAMING: () => EVENT_MESSAGE_STREAMING,
36
+ EVENT_MESSAGE_SUMMARY_GENERATED: () => EVENT_MESSAGE_SUMMARY_GENERATED,
37
+ EVENT_MESSAGE_TRANSLATION_READY: () => EVENT_MESSAGE_TRANSLATION_READY,
38
+ EVENT_TASK_CREATED: () => EVENT_TASK_CREATED,
39
+ EVENT_TASK_DELETED: () => EVENT_TASK_DELETED,
40
+ EVENT_TASK_INSIGHT_UPDATED: () => EVENT_TASK_INSIGHT_UPDATED,
41
+ EVENT_TASK_ITERATION_CHANGED: () => EVENT_TASK_ITERATION_CHANGED,
42
+ EVENT_TASK_RESULT_UPDATED: () => EVENT_TASK_RESULT_UPDATED,
43
+ EVENT_TASK_STATUS_CHANGED: () => EVENT_TASK_STATUS_CHANGED,
44
+ Orchestrator: () => Orchestrator,
45
+ OrchestratorAPIError: () => OrchestratorAPIError,
46
+ OrchestratorAsync: () => OrchestratorAsync,
47
+ OrchestratorAuthError: () => OrchestratorAuthError,
48
+ OrchestratorConfigError: () => OrchestratorConfigError,
49
+ OrchestratorConnectionError: () => OrchestratorConnectionError,
50
+ OrchestratorError: () => OrchestratorError,
51
+ OrchestratorNotFoundError: () => OrchestratorNotFoundError,
52
+ RealtimeClient: () => RealtimeClient,
53
+ VERSION: () => VERSION,
54
+ createInsecureFetch: () => createInsecureFetch,
55
+ loadConfig: () => loadConfig
56
+ });
57
+ module.exports = __toCommonJS(index_exports);
58
+
59
+ // src/errors.ts
60
+ var OrchestratorError = class extends Error {
61
+ constructor(message, opts) {
62
+ super(message);
63
+ this.name = "OrchestratorError";
64
+ this.statusCode = opts?.statusCode ?? null;
65
+ this.errorCode = opts?.errorCode ?? null;
66
+ this.details = opts?.details ?? {};
67
+ }
68
+ };
69
+ var OrchestratorConnectionError = class extends OrchestratorError {
70
+ constructor(message) {
71
+ super(message, { statusCode: null });
72
+ this.name = "OrchestratorConnectionError";
73
+ }
74
+ };
75
+ var OrchestratorAuthError = class extends OrchestratorError {
76
+ constructor(message, statusCode = 401) {
77
+ super(message, { statusCode });
78
+ this.name = "OrchestratorAuthError";
79
+ }
80
+ };
81
+ var OrchestratorNotFoundError = class extends OrchestratorError {
82
+ constructor(resourceType, resourceId, message) {
83
+ super(message ?? `${resourceType} not found: ${resourceId}`, {
84
+ statusCode: 404
85
+ });
86
+ this.name = "OrchestratorNotFoundError";
87
+ this.resourceType = resourceType;
88
+ this.resourceId = resourceId;
89
+ }
90
+ };
91
+ var OrchestratorAPIError = class extends OrchestratorError {
92
+ constructor(message, statusCode, errorCode, details) {
93
+ super(message, { statusCode, errorCode, details });
94
+ this.name = "OrchestratorAPIError";
95
+ }
96
+ };
97
+ var OrchestratorConfigError = class extends OrchestratorError {
98
+ constructor(message) {
99
+ super(message, { statusCode: null });
100
+ this.name = "OrchestratorConfigError";
101
+ }
102
+ };
103
+
104
+ // src/client.ts
105
+ var RETRY_BACKOFF_BASE = 500;
106
+ var DEFAULT_TIMEOUT_MS = 3e4;
107
+ var DEFAULT_MAX_RETRIES = 3;
108
+ function buildPagination(data) {
109
+ const p = data.pagination ?? {};
110
+ return {
111
+ currentPage: p.currentPage ?? 1,
112
+ perPage: p.perPage ?? 25,
113
+ totalItems: p.totalItems ?? 0,
114
+ totalPages: p.totalPages ?? 1,
115
+ hasNext: p.hasNext ?? false,
116
+ hasPrev: p.hasPrev ?? false
117
+ };
118
+ }
119
+ function buildTaskSummary(t) {
120
+ return {
121
+ id: t.id ?? "",
122
+ status: t.status ?? "",
123
+ workflowId: t.workflowId ?? t.workflow_id ?? "",
124
+ iteration: t.iteration ?? 0,
125
+ maxIterations: t.maxIterations ?? t.max_iterations ?? 0,
126
+ goalPrompt: t.goalPrompt ?? t.goal_prompt ?? "",
127
+ result: t.result ?? "",
128
+ resultLocalized: t.resultLocalized ?? t.result_localized ?? null,
129
+ approvalReason: t.approvalReason ?? t.approval_reason ?? "",
130
+ ticketId: t.ticketId ?? t.ticket_id ?? null,
131
+ availableTools: t.availableTools ?? t.available_tools ?? null,
132
+ insight: t.insight ?? null,
133
+ insightLocalized: t.insightLocalized ?? t.insight_localized ?? null,
134
+ createdAt: t.createdAt ?? t.created_at ?? "",
135
+ updatedAt: t.updatedAt ?? t.updated_at ?? "",
136
+ pendingTranslationsForLocales: t.pendingTranslationsForLocales ?? t.pending_translations_for_locales ?? null
137
+ };
138
+ }
139
+ var OrchestratorAsync = class {
140
+ constructor(opts = {}) {
141
+ this._abortController = null;
142
+ this._insecure = false;
143
+ this._baseUrl = (opts.baseUrl ?? "http://localhost:8080").replace(/\/+$/, "");
144
+ this._apiKey = opts.apiKey;
145
+ this._getToken = opts.getToken;
146
+ this._timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;
147
+ this._maxRetries = opts.maxRetries ?? DEFAULT_MAX_RETRIES;
148
+ this._fetch = opts.fetch ?? globalThis.fetch;
149
+ if (opts.insecure && !opts.fetch && typeof process !== "undefined" && process.versions?.node) {
150
+ this._insecure = true;
151
+ }
152
+ }
153
+ async close() {
154
+ this._abortController?.abort();
155
+ }
156
+ // ------------------------------------------------------------------
157
+ // Internal helpers
158
+ // ------------------------------------------------------------------
159
+ _makeUrl(path) {
160
+ return `${this._baseUrl}${path}`;
161
+ }
162
+ async _resolveHeaders() {
163
+ const headers = {};
164
+ if (this._apiKey) {
165
+ headers["Authorization"] = `Bearer ${this._apiKey}`;
166
+ } else if (this._getToken) {
167
+ const token = await this._getToken();
168
+ if (token) {
169
+ headers["Authorization"] = `Bearer ${token}`;
170
+ }
171
+ }
172
+ return headers;
173
+ }
174
+ async _request(method, path, opts) {
175
+ const url = new URL(this._makeUrl(path));
176
+ if (opts?.params) {
177
+ for (const [key, value] of Object.entries(opts.params)) {
178
+ if (value !== void 0) {
179
+ url.searchParams.set(key, String(value));
180
+ }
181
+ }
182
+ }
183
+ const extraHeaders = await this._resolveHeaders();
184
+ const mergedHeaders = {
185
+ ...extraHeaders,
186
+ ...opts?.headers ?? {}
187
+ };
188
+ if (opts?.jsonBody !== void 0 && !mergedHeaders["Content-Type"]) {
189
+ mergedHeaders["Content-Type"] = "application/json";
190
+ }
191
+ for (let attempt = 1; attempt <= this._maxRetries; attempt++) {
192
+ try {
193
+ const controller = new AbortController();
194
+ const timeoutId = setTimeout(() => controller.abort(), this._timeoutMs);
195
+ const signal = opts?.signal ? combineSignals(opts.signal, controller.signal) : controller.signal;
196
+ const response = await this._fetch(url.toString(), {
197
+ method,
198
+ headers: mergedHeaders,
199
+ body: opts?.jsonBody !== void 0 ? JSON.stringify(opts.jsonBody) : void 0,
200
+ signal
201
+ });
202
+ clearTimeout(timeoutId);
203
+ if (response.status === 401) {
204
+ throw new OrchestratorAuthError(
205
+ `Authentication failed for ${method} ${path}`,
206
+ 401
207
+ );
208
+ }
209
+ if (response.status === 403) {
210
+ throw new OrchestratorAuthError(
211
+ `Access denied for ${method} ${path}`,
212
+ 403
213
+ );
214
+ }
215
+ if (response.status === 404) {
216
+ throw new OrchestratorNotFoundError(
217
+ "resource",
218
+ path,
219
+ `Endpoint returned 404: ${method} ${path}`
220
+ );
221
+ }
222
+ if (response.status >= 500) {
223
+ if (attempt === this._maxRetries) {
224
+ } else {
225
+ const delay = RETRY_BACKOFF_BASE * 2 ** (attempt - 1);
226
+ console.warn(
227
+ `Server error ${response.status} (attempt ${attempt}/${this._maxRetries}), retrying in ${delay}ms`
228
+ );
229
+ await sleep(delay);
230
+ continue;
231
+ }
232
+ }
233
+ if (opts?.rawResponse) {
234
+ return response;
235
+ }
236
+ if (response.ok) {
237
+ const contentType = response.headers.get("content-type") ?? "";
238
+ if (contentType.includes("application/json")) {
239
+ return response.json();
240
+ }
241
+ return { _text: await response.text() };
242
+ }
243
+ let errorMessage;
244
+ let errorCode = null;
245
+ let errorDetails = null;
246
+ try {
247
+ const body = await response.json();
248
+ const error = body.error ?? body;
249
+ errorCode = error.code ?? null;
250
+ errorMessage = error.message ?? await response.text();
251
+ errorDetails = error.details ?? null;
252
+ } catch {
253
+ errorMessage = await response.text();
254
+ }
255
+ throw new OrchestratorAPIError(
256
+ errorMessage,
257
+ response.status,
258
+ errorCode,
259
+ errorDetails ?? void 0
260
+ );
261
+ } catch (err) {
262
+ if (err instanceof OrchestratorAPIError || err instanceof OrchestratorAuthError || err instanceof OrchestratorNotFoundError) {
263
+ throw err;
264
+ }
265
+ if (err instanceof OrchestratorConnectionError) {
266
+ throw err;
267
+ }
268
+ if (err instanceof DOMException && err.name === "AbortError") {
269
+ if (attempt === this._maxRetries) {
270
+ throw new OrchestratorConnectionError(
271
+ `Request timed out after ${this._timeoutMs}ms (${this._maxRetries} attempts): ${method} ${path}`
272
+ );
273
+ }
274
+ const delay = RETRY_BACKOFF_BASE * 2 ** (attempt - 1);
275
+ console.warn(
276
+ `Request timed out (attempt ${attempt}/${this._maxRetries}), retrying in ${delay}ms`
277
+ );
278
+ await sleep(delay);
279
+ continue;
280
+ }
281
+ if (err instanceof TypeError) {
282
+ if (attempt === this._maxRetries) {
283
+ throw new OrchestratorConnectionError(
284
+ `Orchestrator unreachable after ${this._maxRetries} attempts: ${err.message}`
285
+ );
286
+ }
287
+ const delay = RETRY_BACKOFF_BASE * 2 ** (attempt - 1);
288
+ console.warn(
289
+ `Request failed (attempt ${attempt}/${this._maxRetries}), retrying in ${delay}ms: ${err.message}`
290
+ );
291
+ await sleep(delay);
292
+ continue;
293
+ }
294
+ throw err;
295
+ }
296
+ }
297
+ throw new OrchestratorConnectionError(
298
+ `Request failed after ${this._maxRetries} attempts: ${method} ${path}`
299
+ );
300
+ }
301
+ async _get(path, params) {
302
+ return await this._request("GET", path, { params });
303
+ }
304
+ async _post(path, body) {
305
+ return await this._request("POST", path, { jsonBody: body });
306
+ }
307
+ async _put(path, body) {
308
+ return await this._request("PUT", path, { jsonBody: body });
309
+ }
310
+ async _delete(path) {
311
+ return await this._request("DELETE", path);
312
+ }
313
+ // ------------------------------------------------------------------
314
+ // Tasks
315
+ // ------------------------------------------------------------------
316
+ async listTasks(params) {
317
+ const data = await this._get("/tasks", {
318
+ workflow_id: params?.workflowId,
319
+ status: params?.status,
320
+ limit: params?.limit,
321
+ offset: params?.offset,
322
+ sort_by: params?.sortBy,
323
+ sort_order: params?.sortOrder
324
+ });
325
+ const tasks = (data.tasks ?? []).map(buildTaskSummary);
326
+ return { tasks, pagination: buildPagination(data) };
327
+ }
328
+ async createTask(params) {
329
+ const data = await this._post("/tasks", {
330
+ workflow_id: params.workflowId,
331
+ goal_prompt: params.goalPrompt,
332
+ max_iterations: params.maxIterations,
333
+ options: params.options,
334
+ ticket_id: params.ticketId,
335
+ title: params.title,
336
+ model_id: params.modelId
337
+ });
338
+ return {
339
+ taskId: data.taskId ?? data.task_id ?? "",
340
+ status: data.status ?? ""
341
+ };
342
+ }
343
+ async getTaskStatus(taskId) {
344
+ const data = await this._get(`/tasks/${taskId}`);
345
+ return {
346
+ ...buildTaskSummary(data),
347
+ subtaskIds: data.subtaskIds ?? data.subtask_ids ?? [],
348
+ workflowData: data.workflowData ?? data.workflow_data ?? null,
349
+ options: data.options ?? null
350
+ };
351
+ }
352
+ async getTaskConversation(taskId) {
353
+ const data = await this._get(`/tasks/${taskId}/conversation`);
354
+ return {
355
+ taskId: data.taskId ?? data.task_id ?? taskId,
356
+ conversation: (data.conversation ?? []).map(
357
+ (m) => m
358
+ )
359
+ };
360
+ }
361
+ async getArchivedMessageContent(taskId, messageId) {
362
+ return this._get(
363
+ `/tasks/${taskId}/conversation/messages/${messageId}/archived`
364
+ );
365
+ }
366
+ async getTaskCompactions(taskId) {
367
+ const data = await this._get(`/tasks/${taskId}/compactions`);
368
+ return data.compactions ?? [];
369
+ }
370
+ async getTaskJournal(taskId) {
371
+ const data = await this._get(`/tasks/${taskId}/journal`);
372
+ return {
373
+ taskId: data.taskId ?? data.task_id ?? taskId,
374
+ exists: data.exists ?? false,
375
+ content: data.content ?? null,
376
+ updatedAt: data.updated_at ?? data.updatedAt ?? null,
377
+ version: data.version ?? null,
378
+ sectionsOverBudget: data.sections_over_budget ?? data.sectionsOverBudget ?? null
379
+ };
380
+ }
381
+ async cancelTask(taskId) {
382
+ const data = await this._post(`/tasks/${taskId}/cancel`);
383
+ return { message: data.message ?? "" };
384
+ }
385
+ async deleteTask(taskId) {
386
+ const data = await this._delete(`/tasks/${taskId}`);
387
+ return {
388
+ deletedTasks: data.deletedTasks ?? data.deleted_tasks ?? [],
389
+ failedTasks: data.failedTasks ?? data.failed_tasks ?? [],
390
+ totalDeleted: data.totalDeleted ?? data.total_deleted ?? 0,
391
+ totalFailed: data.totalFailed ?? data.total_failed ?? 0
392
+ };
393
+ }
394
+ async deleteTasks(taskIds) {
395
+ const data = await this._post("/tasks/delete", { task_ids: taskIds });
396
+ return {
397
+ deletedTasks: data.deletedTasks ?? data.deleted_tasks ?? [],
398
+ failedTasks: data.failedTasks ?? data.failed_tasks ?? [],
399
+ totalDeleted: data.totalDeleted ?? data.total_deleted ?? 0,
400
+ totalFailed: data.totalFailed ?? data.total_failed ?? 0
401
+ };
402
+ }
403
+ // ------------------------------------------------------------------
404
+ // Attachments
405
+ // ------------------------------------------------------------------
406
+ async uploadAttachment(taskId, file, filename) {
407
+ const formData = new FormData();
408
+ formData.append("file", file, filename);
409
+ const headers = await this._resolveHeaders();
410
+ const response = await this._fetch(this._makeUrl(`/tasks/${taskId}/attachments`), {
411
+ method: "POST",
412
+ headers: { ...headers },
413
+ body: formData
414
+ });
415
+ if (!response.ok) {
416
+ throw new OrchestratorAPIError(
417
+ `Attachment upload failed: ${response.statusText}`,
418
+ response.status
419
+ );
420
+ }
421
+ const data = await response.json();
422
+ return {
423
+ id: data.id ?? "",
424
+ filename: data.filename ?? "",
425
+ mimeType: data.mimeType ?? data.mime_type ?? "",
426
+ size: data.size ?? 0,
427
+ width: data.width ?? null,
428
+ height: data.height ?? null,
429
+ tokenCount: data.tokenCount ?? data.token_count ?? null
430
+ };
431
+ }
432
+ async downloadAttachment(taskId, attachmentId) {
433
+ const headers = await this._resolveHeaders();
434
+ const response = await this._fetch(this._makeUrl(`/tasks/${taskId}/attachments/${attachmentId}`), {
435
+ headers
436
+ });
437
+ if (!response.ok) {
438
+ throw new OrchestratorAPIError(
439
+ `Attachment download failed: ${response.statusText}`,
440
+ response.status
441
+ );
442
+ }
443
+ return response.blob();
444
+ }
445
+ // ------------------------------------------------------------------
446
+ // Interactive workflow
447
+ // ------------------------------------------------------------------
448
+ async sendInteractiveMessage(taskId, content) {
449
+ const data = await this._post(`/tasks/${taskId}/interactive/message`, {
450
+ content
451
+ });
452
+ return { message: data.message ?? "" };
453
+ }
454
+ async markInteractiveComplete(taskId) {
455
+ const data = await this._post(`/tasks/${taskId}/interactive/complete`);
456
+ return { message: data.message ?? "" };
457
+ }
458
+ async markInteractiveFailed(taskId) {
459
+ const data = await this._post(`/tasks/${taskId}/interactive/failed`);
460
+ return { message: data.message ?? "" };
461
+ }
462
+ async approveInteractiveAction(taskId) {
463
+ const data = await this._post(`/tasks/${taskId}/interactive/approve`);
464
+ return { message: data.message ?? "" };
465
+ }
466
+ // ------------------------------------------------------------------
467
+ // Proactive workflow
468
+ // ------------------------------------------------------------------
469
+ async sendProactiveGuide(taskId, guide) {
470
+ const data = await this._post(`/tasks/${taskId}/proactive/guide`, {
471
+ guide
472
+ });
473
+ return { message: data.message ?? "" };
474
+ }
475
+ async respondProactiveHelp(taskId, response) {
476
+ const data = await this._post(`/tasks/${taskId}/proactive/respond`, {
477
+ response
478
+ });
479
+ return { message: data.message ?? "" };
480
+ }
481
+ async approveProactiveAction(taskId) {
482
+ const data = await this._post(`/tasks/${taskId}/proactive/approve`);
483
+ return { message: data.message ?? "" };
484
+ }
485
+ // ------------------------------------------------------------------
486
+ // Ticket workflow
487
+ // ------------------------------------------------------------------
488
+ async sendTicketGuide(taskId, guide) {
489
+ const data = await this._post(`/tasks/${taskId}/ticket/guide`, {
490
+ guide
491
+ });
492
+ return { message: data.message ?? "" };
493
+ }
494
+ async respondTicketHelp(taskId, response) {
495
+ const data = await this._post(`/tasks/${taskId}/ticket/respond`, {
496
+ response
497
+ });
498
+ return { message: data.message ?? "" };
499
+ }
500
+ async approveTicketAction(taskId) {
501
+ const data = await this._post(`/tasks/${taskId}/ticket/approve`);
502
+ return { message: data.message ?? "" };
503
+ }
504
+ async wakeTicket(taskId) {
505
+ const data = await this._post(`/tasks/${taskId}/ticket/wake`);
506
+ return { message: data.message ?? "" };
507
+ }
508
+ // ------------------------------------------------------------------
509
+ // Matrix workflow
510
+ // ------------------------------------------------------------------
511
+ async sendMatrixMessage(taskId, content) {
512
+ const data = await this._post(`/tasks/${taskId}/matrix/message`, {
513
+ content
514
+ });
515
+ return { message: data.message ?? "" };
516
+ }
517
+ async markMatrixComplete(taskId) {
518
+ const data = await this._post(`/tasks/${taskId}/matrix/complete`);
519
+ return { message: data.message ?? "" };
520
+ }
521
+ async markMatrixFailed(taskId) {
522
+ const data = await this._post(`/tasks/${taskId}/matrix/failed`);
523
+ return { message: data.message ?? "" };
524
+ }
525
+ async approveMatrixAction(taskId) {
526
+ const data = await this._post(`/tasks/${taskId}/matrix/approve`);
527
+ return { message: data.message ?? "" };
528
+ }
529
+ async getMatrixConversation(taskId) {
530
+ const data = await this._get(`/tasks/${taskId}/matrix/conversation`);
531
+ return {
532
+ taskId: data.taskId ?? data.task_id ?? taskId,
533
+ conversation: (data.conversation ?? []).map(
534
+ (m) => m
535
+ )
536
+ };
537
+ }
538
+ // ------------------------------------------------------------------
539
+ // VSA workflow
540
+ // ------------------------------------------------------------------
541
+ async createVSATask(params) {
542
+ const data = await this._post("/tasks/vsa", {
543
+ goal_prompt: params.goalPrompt,
544
+ title: params.title,
545
+ model_id: params.modelId
546
+ });
547
+ return {
548
+ taskId: data.taskId ?? data.task_id ?? "",
549
+ status: data.status ?? ""
550
+ };
551
+ }
552
+ async sendVSAMessage(taskId, content) {
553
+ const data = await this._post(`/tasks/${taskId}/vsa/message`, {
554
+ content
555
+ });
556
+ return { message: data.message ?? "" };
557
+ }
558
+ async renameVSATask(taskId, title) {
559
+ const data = await this._post(`/tasks/${taskId}/vsa/rename`, {
560
+ title
561
+ });
562
+ return { message: data.message ?? "" };
563
+ }
564
+ async regenerateVSATitle(taskId) {
565
+ const data = await this._post(`/tasks/${taskId}/vsa/regenerate-title`);
566
+ return { message: data.message ?? "" };
567
+ }
568
+ async markVSAComplete(taskId) {
569
+ const data = await this._post(`/tasks/${taskId}/vsa/complete`);
570
+ return { message: data.message ?? "" };
571
+ }
572
+ async markVSAFailed(taskId) {
573
+ const data = await this._post(`/tasks/${taskId}/vsa/failed`);
574
+ return { message: data.message ?? "" };
575
+ }
576
+ async stopVSA(taskId) {
577
+ const data = await this._post(`/tasks/${taskId}/vsa/stop`);
578
+ return { message: data.message ?? "" };
579
+ }
580
+ async deleteVSA(taskId) {
581
+ const data = await this._delete(`/tasks/${taskId}/vsa`);
582
+ return { message: data.message ?? "" };
583
+ }
584
+ async listVSATasks(params) {
585
+ const data = await this._get("/tasks/vsa", {
586
+ status: params?.status,
587
+ limit: params?.limit,
588
+ offset: params?.offset
589
+ });
590
+ const tasks = (data.tasks ?? []).map(buildTaskSummary);
591
+ return { tasks, pagination: buildPagination(data) };
592
+ }
593
+ async searchVSATasks(query) {
594
+ const data = await this._get("/tasks/vsa/search", { q: query });
595
+ const tasks = (data.tasks ?? []).map(buildTaskSummary);
596
+ return { tasks, pagination: buildPagination(data) };
597
+ }
598
+ async deleteVSATasksBulk(taskIds) {
599
+ const data = await this._post("/tasks/vsa/delete-bulk", {
600
+ task_ids: taskIds
601
+ });
602
+ return { message: data.message ?? "" };
603
+ }
604
+ // ------------------------------------------------------------------
605
+ // MIO workflow
606
+ // ------------------------------------------------------------------
607
+ async sendMioMessage(taskId, content) {
608
+ const data = await this._post(`/tasks/${taskId}/mio/message`, {
609
+ content
610
+ });
611
+ return { message: data.message ?? "" };
612
+ }
613
+ async approveMioAction(taskId) {
614
+ const data = await this._post(`/tasks/${taskId}/mio/approve`);
615
+ return { message: data.message ?? "" };
616
+ }
617
+ async wakeMio(taskId) {
618
+ const data = await this._post(`/tasks/${taskId}/mio/wake`);
619
+ return { message: data.message ?? "" };
620
+ }
621
+ async sendMioUserAway(taskId) {
622
+ const data = await this._post(`/tasks/${taskId}/mio/user-away`);
623
+ return { message: data.message ?? "" };
624
+ }
625
+ async markMioComplete(taskId) {
626
+ const data = await this._post(`/tasks/${taskId}/mio/complete`);
627
+ return { message: data.message ?? "" };
628
+ }
629
+ async markMioFailed(taskId) {
630
+ const data = await this._post(`/tasks/${taskId}/mio/failed`);
631
+ return { message: data.message ?? "" };
632
+ }
633
+ async archiveMio(taskId) {
634
+ const data = await this._post(`/tasks/${taskId}/mio/archive`);
635
+ return { message: data.message ?? "" };
636
+ }
637
+ async getMioContext(taskId) {
638
+ const data = await this._get(`/tasks/${taskId}/mio/context`);
639
+ return {
640
+ taskId: data.taskId ?? data.task_id ?? taskId,
641
+ currentTokens: data.currentTokens ?? data.current_tokens ?? 0,
642
+ contextLimit: data.contextLimit ?? data.context_limit ?? 0,
643
+ usagePercentage: data.usagePercentage ?? data.usage_percentage ?? 0,
644
+ archivedCount: data.archivedCount ?? data.archived_count ?? 0,
645
+ activeCount: data.activeCount ?? data.active_count ?? 0
646
+ };
647
+ }
648
+ // ------------------------------------------------------------------
649
+ // Tools
650
+ // ------------------------------------------------------------------
651
+ async listTools() {
652
+ const data = await this._get("/tools");
653
+ return {
654
+ tools: (data.tools ?? data.tools ?? []).map(
655
+ (t) => t
656
+ ),
657
+ totalTools: data.totalTools ?? data.total_tools ?? 0,
658
+ servers: data.servers ?? []
659
+ };
660
+ }
661
+ // ------------------------------------------------------------------
662
+ // Debug / Admin
663
+ // ------------------------------------------------------------------
664
+ async getWorkflowStates() {
665
+ const data = await this._get("/debug/workflow-states");
666
+ return {
667
+ validStates: data.validStates ?? data.valid_states ?? {},
668
+ processableStates: data.processableStates ?? data.processable_states ?? {},
669
+ waitingStates: data.waitingStates ?? data.waiting_states ?? {},
670
+ stoppedStates: data.stoppedStates ?? data.stopped_states ?? {},
671
+ intermediateStates: data.intermediateStates ?? data.intermediate_states ?? {}
672
+ };
673
+ }
674
+ async updateTaskModels(taskId, models) {
675
+ const data = await this._post(`/tasks/${taskId}/models`, {
676
+ agent: models.agent,
677
+ orchestrator: models.orchestrator
678
+ });
679
+ return { message: data.message ?? "" };
680
+ }
681
+ async updateTaskIteration(taskId, iteration) {
682
+ const data = await this._post(`/tasks/${taskId}/iteration`, {
683
+ iteration
684
+ });
685
+ return { message: data.message ?? "" };
686
+ }
687
+ async updateTaskWorkflowData(taskId, workflowData) {
688
+ const data = await this._post(`/tasks/${taskId}/workflow-data`, {
689
+ workflow_data: workflowData
690
+ });
691
+ return { message: data.message ?? "" };
692
+ }
693
+ async deleteMessage(taskId, messageId) {
694
+ const data = await this._delete(
695
+ `/tasks/${taskId}/conversation/messages/${messageId}`
696
+ );
697
+ return { message: data.message ?? "" };
698
+ }
699
+ async deleteMessages(taskId, messageIds) {
700
+ const data = await this._post(
701
+ `/tasks/${taskId}/conversation/messages/delete`,
702
+ { message_ids: messageIds }
703
+ );
704
+ return { message: data.message ?? "" };
705
+ }
706
+ async updateMessage(taskId, messageId, update) {
707
+ const data = await this._put(
708
+ `/tasks/${taskId}/conversation/messages/${messageId}`,
709
+ update
710
+ );
711
+ return { message: data.message ?? "" };
712
+ }
713
+ async resetMatrixToPhase(taskId, phase) {
714
+ const data = await this._post(
715
+ `/tasks/${taskId}/matrix/reset`,
716
+ { phase }
717
+ );
718
+ return { message: data.message ?? "" };
719
+ }
720
+ async getMessageTranslations(taskId, messageId, locale) {
721
+ const params = {};
722
+ if (locale) params.locale = locale;
723
+ const data = await this._get(
724
+ `/tasks/${taskId}/conversation/messages/${messageId}/translations`,
725
+ params
726
+ );
727
+ return {
728
+ messageId: data.messageId ?? data.message_id ?? messageId,
729
+ translations: (data.translations ?? []).map(
730
+ (t) => t
731
+ )
732
+ };
733
+ }
734
+ // ------------------------------------------------------------------
735
+ // Error events
736
+ // ------------------------------------------------------------------
737
+ async listErrors(params) {
738
+ const queryParams = {};
739
+ if (params?.since) queryParams.since = params.since;
740
+ if (params?.severity) queryParams.severity = params.severity;
741
+ if (params?.source) queryParams.source = params.source;
742
+ if (params?.limit) queryParams.limit = params.limit;
743
+ if (params?.offset) queryParams.offset = params.offset;
744
+ const data = await this._get("/errors", queryParams);
745
+ return (data.errors ?? []).map(
746
+ (e) => e
747
+ );
748
+ }
749
+ async getErrorDetail(errorId) {
750
+ return this._get(`/errors/${errorId}`);
751
+ }
752
+ async getErrorStats(since) {
753
+ const params = {};
754
+ if (since) params.since = since;
755
+ return this._get("/errors/stats", params);
756
+ }
757
+ async countErrors(since) {
758
+ const params = {};
759
+ if (since) params.since = since;
760
+ return this._get("/errors/count", params);
761
+ }
762
+ async purgeErrors() {
763
+ return this._delete("/errors");
764
+ }
765
+ // ------------------------------------------------------------------
766
+ // Health / Metrics
767
+ // ------------------------------------------------------------------
768
+ async health() {
769
+ return this._get("/health");
770
+ }
771
+ async healthDetailed() {
772
+ return this._get("/health/detail");
773
+ }
774
+ async ready() {
775
+ return this._get("/ready");
776
+ }
777
+ async healthLeader() {
778
+ return this._get("/leader");
779
+ }
780
+ async getMetrics(types) {
781
+ const params = {};
782
+ if (types) params.types = types;
783
+ return this._get("/metrics", params);
784
+ }
785
+ // ------------------------------------------------------------------
786
+ // Configuration
787
+ // ------------------------------------------------------------------
788
+ async getSystemStatus() {
789
+ return this._get("/config/status");
790
+ }
791
+ async updateSettings(settings) {
792
+ return this._post("/config/settings", settings);
793
+ }
794
+ async getConfigurationStatus() {
795
+ return this._get("/config");
796
+ }
797
+ async setAgentModel(model) {
798
+ const data = await this._post("/config/models/agent", { model });
799
+ return { message: data.message ?? "" };
800
+ }
801
+ async setOrchestratorModel(model) {
802
+ const data = await this._post("/config/models/orchestrator", { model });
803
+ return { message: data.message ?? "" };
804
+ }
805
+ async getLLMBackendStatus() {
806
+ return this._get("/config/llmbackends");
807
+ }
808
+ async addLLMBackend(host, apiKey) {
809
+ const data = await this._post("/config/llmbackends", {
810
+ host,
811
+ api_key: apiKey
812
+ });
813
+ return { message: data.message ?? "" };
814
+ }
815
+ async removeLLMBackend(host) {
816
+ const data = await this._delete(`/config/llmbackends/${encodeURIComponent(host)}`);
817
+ return { message: data.message ?? "" };
818
+ }
819
+ async getMCPServerStatus() {
820
+ return this._get("/config/mcpservers");
821
+ }
822
+ async addMCPServer(host, apiKey) {
823
+ const data = await this._post("/config/mcpservers", {
824
+ host,
825
+ api_key: apiKey
826
+ });
827
+ return { message: data.message ?? "" };
828
+ }
829
+ async removeMCPServer(host) {
830
+ const data = await this._delete(`/config/mcpservers/${encodeURIComponent(host)}`);
831
+ return { message: data.message ?? "" };
832
+ }
833
+ async getTaskHandlerStatus() {
834
+ return this._get("/config/taskhandler");
835
+ }
836
+ async getTaskHandlerStatusLocal() {
837
+ return this._get("/config/taskhandler/local");
838
+ }
839
+ async setConcurrentTasksPerReplica(maxTasks) {
840
+ const data = await this._post("/config/taskhandler/concurrency", {
841
+ max_tasks: maxTasks
842
+ });
843
+ return { message: data.message ?? "" };
844
+ }
845
+ async getSummaryWorkerStatus() {
846
+ return this._get("/config/summary-worker");
847
+ }
848
+ async setCompactorModel(modelName) {
849
+ const data = await this._post("/config/models/compactor", {
850
+ model_name: modelName
851
+ });
852
+ return { message: data.message ?? "" };
853
+ }
854
+ async setTranslateModel(modelName) {
855
+ const data = await this._post("/config/models/translate", {
856
+ model_name: modelName
857
+ });
858
+ return { message: data.message ?? "" };
859
+ }
860
+ async getTokenWorkerStatus() {
861
+ return this._get("/config/token-worker");
862
+ }
863
+ async getSlotsStatus() {
864
+ return this._get("/config/slots");
865
+ }
866
+ // ------------------------------------------------------------------
867
+ // Auth / WebSocket status
868
+ // ------------------------------------------------------------------
869
+ async getAuthConfig() {
870
+ return this._get("/auth/config");
871
+ }
872
+ async getWebSocketStatus() {
873
+ return this._get("/websocket/status");
874
+ }
875
+ // ------------------------------------------------------------------
876
+ // SSE stream
877
+ // ------------------------------------------------------------------
878
+ async *streamTaskStatus(taskId) {
879
+ const headers = await this._resolveHeaders();
880
+ headers["Accept"] = "text/event-stream";
881
+ const response = await this._fetch(this._makeUrl(`/tasks/${taskId}/stream`), {
882
+ headers
883
+ });
884
+ if (!response.ok) {
885
+ throw new OrchestratorAPIError(
886
+ `Stream connection failed: ${response.statusText}`,
887
+ response.status
888
+ );
889
+ }
890
+ const reader = response.body?.getReader();
891
+ if (!reader) {
892
+ throw new OrchestratorConnectionError("Stream body is not readable");
893
+ }
894
+ const decoder = new TextDecoder();
895
+ let buffer = "";
896
+ while (true) {
897
+ const { done, value } = await reader.read();
898
+ if (done) break;
899
+ buffer += decoder.decode(value, { stream: true });
900
+ const lines = buffer.split("\n");
901
+ buffer = lines.pop() ?? "";
902
+ for (const line of lines) {
903
+ if (line.startsWith("data: ")) {
904
+ try {
905
+ yield JSON.parse(line.slice(6));
906
+ } catch {
907
+ }
908
+ }
909
+ }
910
+ }
911
+ }
912
+ };
913
+ function sleep(ms) {
914
+ return new Promise((resolve) => setTimeout(resolve, ms));
915
+ }
916
+ function combineSignals(...signals) {
917
+ const controller = new AbortController();
918
+ for (const signal of signals) {
919
+ if (signal.aborted) {
920
+ controller.abort(signal.reason);
921
+ return controller.signal;
922
+ }
923
+ signal.addEventListener("abort", () => controller.abort(signal.reason), { once: true });
924
+ }
925
+ return controller.signal;
926
+ }
927
+
928
+ // src/sync-client.ts
929
+ var Orchestrator = class {
930
+ constructor(opts = {}) {
931
+ this._async = new OrchestratorAsync(opts);
932
+ }
933
+ /** Close the underlying resources. */
934
+ close() {
935
+ this._async.close().catch(() => {
936
+ });
937
+ }
938
+ // ------------------------------------------------------------------
939
+ // Tasks
940
+ // ------------------------------------------------------------------
941
+ listTasks(params) {
942
+ return runSync(this._async.listTasks(params));
943
+ }
944
+ createTask(params) {
945
+ return runSync(this._async.createTask(params));
946
+ }
947
+ getTaskStatus(taskId) {
948
+ return runSync(this._async.getTaskStatus(taskId));
949
+ }
950
+ getTaskConversation(taskId) {
951
+ return runSync(this._async.getTaskConversation(taskId));
952
+ }
953
+ getArchivedMessageContent(taskId, messageId) {
954
+ return runSync(this._async.getArchivedMessageContent(taskId, messageId));
955
+ }
956
+ getTaskCompactions(taskId) {
957
+ return runSync(this._async.getTaskCompactions(taskId));
958
+ }
959
+ getTaskJournal(taskId) {
960
+ return runSync(this._async.getTaskJournal(taskId));
961
+ }
962
+ cancelTask(taskId) {
963
+ return runSync(this._async.cancelTask(taskId));
964
+ }
965
+ deleteTask(taskId) {
966
+ return runSync(this._async.deleteTask(taskId));
967
+ }
968
+ deleteTasks(taskIds) {
969
+ return runSync(this._async.deleteTasks(taskIds));
970
+ }
971
+ // ------------------------------------------------------------------
972
+ // Attachments
973
+ // ------------------------------------------------------------------
974
+ uploadAttachment(taskId, file, filename) {
975
+ return runSync(this._async.uploadAttachment(taskId, file, filename));
976
+ }
977
+ downloadAttachment(taskId, attachmentId) {
978
+ return runSync(this._async.downloadAttachment(taskId, attachmentId));
979
+ }
980
+ // ------------------------------------------------------------------
981
+ // Interactive workflow
982
+ // ------------------------------------------------------------------
983
+ sendInteractiveMessage(taskId, content) {
984
+ return runSync(this._async.sendInteractiveMessage(taskId, content));
985
+ }
986
+ markInteractiveComplete(taskId) {
987
+ return runSync(this._async.markInteractiveComplete(taskId));
988
+ }
989
+ markInteractiveFailed(taskId) {
990
+ return runSync(this._async.markInteractiveFailed(taskId));
991
+ }
992
+ approveInteractiveAction(taskId) {
993
+ return runSync(this._async.approveInteractiveAction(taskId));
994
+ }
995
+ // ------------------------------------------------------------------
996
+ // Proactive workflow
997
+ // ------------------------------------------------------------------
998
+ sendProactiveGuide(taskId, guide) {
999
+ return runSync(this._async.sendProactiveGuide(taskId, guide));
1000
+ }
1001
+ respondProactiveHelp(taskId, response) {
1002
+ return runSync(this._async.respondProactiveHelp(taskId, response));
1003
+ }
1004
+ approveProactiveAction(taskId) {
1005
+ return runSync(this._async.approveProactiveAction(taskId));
1006
+ }
1007
+ // ------------------------------------------------------------------
1008
+ // Ticket workflow
1009
+ // ------------------------------------------------------------------
1010
+ sendTicketGuide(taskId, guide) {
1011
+ return runSync(this._async.sendTicketGuide(taskId, guide));
1012
+ }
1013
+ respondTicketHelp(taskId, response) {
1014
+ return runSync(this._async.respondTicketHelp(taskId, response));
1015
+ }
1016
+ approveTicketAction(taskId) {
1017
+ return runSync(this._async.approveTicketAction(taskId));
1018
+ }
1019
+ wakeTicket(taskId) {
1020
+ return runSync(this._async.wakeTicket(taskId));
1021
+ }
1022
+ // ------------------------------------------------------------------
1023
+ // Matrix workflow
1024
+ // ------------------------------------------------------------------
1025
+ sendMatrixMessage(taskId, content) {
1026
+ return runSync(this._async.sendMatrixMessage(taskId, content));
1027
+ }
1028
+ markMatrixComplete(taskId) {
1029
+ return runSync(this._async.markMatrixComplete(taskId));
1030
+ }
1031
+ markMatrixFailed(taskId) {
1032
+ return runSync(this._async.markMatrixFailed(taskId));
1033
+ }
1034
+ approveMatrixAction(taskId) {
1035
+ return runSync(this._async.approveMatrixAction(taskId));
1036
+ }
1037
+ getMatrixConversation(taskId) {
1038
+ return runSync(this._async.getMatrixConversation(taskId));
1039
+ }
1040
+ // ------------------------------------------------------------------
1041
+ // VSA workflow
1042
+ // ------------------------------------------------------------------
1043
+ createVSATask(params) {
1044
+ return runSync(this._async.createVSATask(params));
1045
+ }
1046
+ sendVSAMessage(taskId, content) {
1047
+ return runSync(this._async.sendVSAMessage(taskId, content));
1048
+ }
1049
+ renameVSATask(taskId, title) {
1050
+ return runSync(this._async.renameVSATask(taskId, title));
1051
+ }
1052
+ regenerateVSATitle(taskId) {
1053
+ return runSync(this._async.regenerateVSATitle(taskId));
1054
+ }
1055
+ markVSAComplete(taskId) {
1056
+ return runSync(this._async.markVSAComplete(taskId));
1057
+ }
1058
+ markVSAFailed(taskId) {
1059
+ return runSync(this._async.markVSAFailed(taskId));
1060
+ }
1061
+ stopVSA(taskId) {
1062
+ return runSync(this._async.stopVSA(taskId));
1063
+ }
1064
+ deleteVSA(taskId) {
1065
+ return runSync(this._async.deleteVSA(taskId));
1066
+ }
1067
+ listVSATasks(params) {
1068
+ return runSync(this._async.listVSATasks(params));
1069
+ }
1070
+ searchVSATasks(query) {
1071
+ return runSync(this._async.searchVSATasks(query));
1072
+ }
1073
+ deleteVSATasksBulk(taskIds) {
1074
+ return runSync(this._async.deleteVSATasksBulk(taskIds));
1075
+ }
1076
+ // ------------------------------------------------------------------
1077
+ // MIO workflow
1078
+ // ------------------------------------------------------------------
1079
+ sendMioMessage(taskId, content) {
1080
+ return runSync(this._async.sendMioMessage(taskId, content));
1081
+ }
1082
+ approveMioAction(taskId) {
1083
+ return runSync(this._async.approveMioAction(taskId));
1084
+ }
1085
+ wakeMio(taskId) {
1086
+ return runSync(this._async.wakeMio(taskId));
1087
+ }
1088
+ sendMioUserAway(taskId) {
1089
+ return runSync(this._async.sendMioUserAway(taskId));
1090
+ }
1091
+ markMioComplete(taskId) {
1092
+ return runSync(this._async.markMioComplete(taskId));
1093
+ }
1094
+ markMioFailed(taskId) {
1095
+ return runSync(this._async.markMioFailed(taskId));
1096
+ }
1097
+ archiveMio(taskId) {
1098
+ return runSync(this._async.archiveMio(taskId));
1099
+ }
1100
+ getMioContext(taskId) {
1101
+ return runSync(this._async.getMioContext(taskId));
1102
+ }
1103
+ // ------------------------------------------------------------------
1104
+ // Tools
1105
+ // ------------------------------------------------------------------
1106
+ listTools() {
1107
+ return runSync(this._async.listTools());
1108
+ }
1109
+ // ------------------------------------------------------------------
1110
+ // Debug / Admin
1111
+ // ------------------------------------------------------------------
1112
+ getWorkflowStates() {
1113
+ return runSync(this._async.getWorkflowStates());
1114
+ }
1115
+ updateTaskModels(taskId, models) {
1116
+ return runSync(this._async.updateTaskModels(taskId, models));
1117
+ }
1118
+ updateTaskIteration(taskId, iteration) {
1119
+ return runSync(this._async.updateTaskIteration(taskId, iteration));
1120
+ }
1121
+ updateTaskWorkflowData(taskId, workflowData) {
1122
+ return runSync(this._async.updateTaskWorkflowData(taskId, workflowData));
1123
+ }
1124
+ deleteMessage(taskId, messageId) {
1125
+ return runSync(this._async.deleteMessage(taskId, messageId));
1126
+ }
1127
+ deleteMessages(taskId, messageIds) {
1128
+ return runSync(this._async.deleteMessages(taskId, messageIds));
1129
+ }
1130
+ updateMessage(taskId, messageId, update) {
1131
+ return runSync(this._async.updateMessage(taskId, messageId, update));
1132
+ }
1133
+ resetMatrixToPhase(taskId, phase) {
1134
+ return runSync(this._async.resetMatrixToPhase(taskId, phase));
1135
+ }
1136
+ getMessageTranslations(taskId, messageId, locale) {
1137
+ return runSync(this._async.getMessageTranslations(taskId, messageId, locale));
1138
+ }
1139
+ // ------------------------------------------------------------------
1140
+ // Error events
1141
+ // ------------------------------------------------------------------
1142
+ listErrors(params) {
1143
+ return runSync(this._async.listErrors(params));
1144
+ }
1145
+ getErrorDetail(errorId) {
1146
+ return runSync(this._async.getErrorDetail(errorId));
1147
+ }
1148
+ getErrorStats(since) {
1149
+ return runSync(this._async.getErrorStats(since));
1150
+ }
1151
+ countErrors(since) {
1152
+ return runSync(this._async.countErrors(since));
1153
+ }
1154
+ purgeErrors() {
1155
+ return runSync(this._async.purgeErrors());
1156
+ }
1157
+ // ------------------------------------------------------------------
1158
+ // Health / Metrics
1159
+ // ------------------------------------------------------------------
1160
+ health() {
1161
+ return runSync(this._async.health());
1162
+ }
1163
+ healthDetailed() {
1164
+ return runSync(this._async.healthDetailed());
1165
+ }
1166
+ ready() {
1167
+ return runSync(this._async.ready());
1168
+ }
1169
+ healthLeader() {
1170
+ return runSync(this._async.healthLeader());
1171
+ }
1172
+ getMetrics(types) {
1173
+ return runSync(this._async.getMetrics(types));
1174
+ }
1175
+ // ------------------------------------------------------------------
1176
+ // Configuration
1177
+ // ------------------------------------------------------------------
1178
+ getSystemStatus() {
1179
+ return runSync(this._async.getSystemStatus());
1180
+ }
1181
+ updateSettings(settings) {
1182
+ return runSync(this._async.updateSettings(settings));
1183
+ }
1184
+ getConfigurationStatus() {
1185
+ return runSync(this._async.getConfigurationStatus());
1186
+ }
1187
+ setAgentModel(model) {
1188
+ return runSync(this._async.setAgentModel(model));
1189
+ }
1190
+ setOrchestratorModel(model) {
1191
+ return runSync(this._async.setOrchestratorModel(model));
1192
+ }
1193
+ getLLMBackendStatus() {
1194
+ return runSync(this._async.getLLMBackendStatus());
1195
+ }
1196
+ addLLMBackend(host, apiKey) {
1197
+ return runSync(this._async.addLLMBackend(host, apiKey));
1198
+ }
1199
+ removeLLMBackend(host) {
1200
+ return runSync(this._async.removeLLMBackend(host));
1201
+ }
1202
+ getMCPServerStatus() {
1203
+ return runSync(this._async.getMCPServerStatus());
1204
+ }
1205
+ addMCPServer(host, apiKey) {
1206
+ return runSync(this._async.addMCPServer(host, apiKey));
1207
+ }
1208
+ removeMCPServer(host) {
1209
+ return runSync(this._async.removeMCPServer(host));
1210
+ }
1211
+ getTaskHandlerStatus() {
1212
+ return runSync(this._async.getTaskHandlerStatus());
1213
+ }
1214
+ getTaskHandlerStatusLocal() {
1215
+ return runSync(this._async.getTaskHandlerStatusLocal());
1216
+ }
1217
+ setConcurrentTasksPerReplica(maxTasks) {
1218
+ return runSync(this._async.setConcurrentTasksPerReplica(maxTasks));
1219
+ }
1220
+ getSummaryWorkerStatus() {
1221
+ return runSync(this._async.getSummaryWorkerStatus());
1222
+ }
1223
+ setCompactorModel(modelName) {
1224
+ return runSync(this._async.setCompactorModel(modelName));
1225
+ }
1226
+ setTranslateModel(modelName) {
1227
+ return runSync(this._async.setTranslateModel(modelName));
1228
+ }
1229
+ getTokenWorkerStatus() {
1230
+ return runSync(this._async.getTokenWorkerStatus());
1231
+ }
1232
+ getSlotsStatus() {
1233
+ return runSync(this._async.getSlotsStatus());
1234
+ }
1235
+ // ------------------------------------------------------------------
1236
+ // Auth / WebSocket status
1237
+ // ------------------------------------------------------------------
1238
+ getAuthConfig() {
1239
+ return runSync(this._async.getAuthConfig());
1240
+ }
1241
+ getWebSocketStatus() {
1242
+ return runSync(this._async.getWebSocketStatus());
1243
+ }
1244
+ // ------------------------------------------------------------------
1245
+ // SSE stream (collects all events into an array)
1246
+ // ------------------------------------------------------------------
1247
+ streamTaskStatus(_taskId) {
1248
+ const events = [];
1249
+ return events;
1250
+ }
1251
+ };
1252
+ function runSync(promise) {
1253
+ let result;
1254
+ let error;
1255
+ let done = false;
1256
+ promise.then(
1257
+ (r) => {
1258
+ result = r;
1259
+ done = true;
1260
+ },
1261
+ (e) => {
1262
+ error = e;
1263
+ done = true;
1264
+ }
1265
+ );
1266
+ if (!done) {
1267
+ const start = Date.now();
1268
+ while (!done && Date.now() - start < 1e4) {
1269
+ }
1270
+ }
1271
+ if (!done) {
1272
+ throw new Error("Orchestrator sync: operation timed out");
1273
+ }
1274
+ if (error) throw error;
1275
+ return result;
1276
+ }
1277
+
1278
+ // src/config.ts
1279
+ var DEFAULTS = {
1280
+ baseUrl: "http://localhost:8080",
1281
+ apiKey: void 0,
1282
+ timeoutMs: 3e4,
1283
+ maxRetries: 3
1284
+ };
1285
+ function loadConfig(overrides) {
1286
+ return {
1287
+ baseUrl: (process.env.ORCHESTRATOR_URL ?? overrides?.baseUrl ?? DEFAULTS.baseUrl).replace(/\/+$/, ""),
1288
+ apiKey: process.env.ORCHESTRATOR_API_KEY ?? overrides?.apiKey ?? DEFAULTS.apiKey,
1289
+ timeoutMs: Number(
1290
+ process.env.ORCHESTRATOR_TIMEOUT_MS ?? overrides?.timeoutMs ?? DEFAULTS.timeoutMs
1291
+ ),
1292
+ maxRetries: Number(
1293
+ process.env.ORCHESTRATOR_MAX_RETRIES ?? overrides?.maxRetries ?? DEFAULTS.maxRetries
1294
+ )
1295
+ };
1296
+ }
1297
+
1298
+ // src/fetch.ts
1299
+ var _insecureFetch;
1300
+ async function createInsecureFetch() {
1301
+ if (_insecureFetch) return _insecureFetch;
1302
+ if (typeof process === "undefined" || process.versions?.node == null) {
1303
+ _insecureFetch = globalThis.fetch;
1304
+ return _insecureFetch;
1305
+ }
1306
+ const https = await import("https");
1307
+ const http = await import("http");
1308
+ const agent = new https.Agent({ rejectUnauthorized: false });
1309
+ _insecureFetch = async (input, init) => {
1310
+ const urlStr = typeof input === "string" ? input : input.toString();
1311
+ const urlObj = new URL(urlStr);
1312
+ const isHttps = urlObj.protocol === "https:";
1313
+ return new Promise((resolve, reject) => {
1314
+ const mod = isHttps ? https : http;
1315
+ const req = mod.request(
1316
+ urlStr,
1317
+ {
1318
+ method: init?.method ?? "GET",
1319
+ headers: init?.headers,
1320
+ rejectUnauthorized: false,
1321
+ agent: isHttps ? agent : void 0
1322
+ },
1323
+ (res) => {
1324
+ const chunks = [];
1325
+ res.on("data", (chunk) => chunks.push(chunk));
1326
+ res.on("end", () => {
1327
+ const body = Buffer.concat(chunks);
1328
+ const headers = new Headers();
1329
+ const resHeaders = res.headers;
1330
+ if (resHeaders) {
1331
+ for (const [key, value] of Object.entries(resHeaders)) {
1332
+ if (value != null) {
1333
+ if (Array.isArray(value)) {
1334
+ for (const v of value) headers.append(key, v);
1335
+ } else {
1336
+ headers.set(key, value);
1337
+ }
1338
+ }
1339
+ }
1340
+ }
1341
+ resolve(
1342
+ new Response(body, {
1343
+ status: res.statusCode,
1344
+ statusText: res.statusMessage,
1345
+ headers
1346
+ })
1347
+ );
1348
+ });
1349
+ }
1350
+ );
1351
+ req.on("error", reject);
1352
+ if (init?.body != null) {
1353
+ req.write(init.body);
1354
+ }
1355
+ req.end();
1356
+ });
1357
+ };
1358
+ return _insecureFetch;
1359
+ }
1360
+
1361
+ // src/socketio.ts
1362
+ var EVENT_TASK_CREATED = "task_created";
1363
+ var EVENT_TASK_STATUS_CHANGED = "task_status_changed";
1364
+ var EVENT_TASK_ITERATION_CHANGED = "task_iteration_changed";
1365
+ var EVENT_TASK_DELETED = "task_deleted";
1366
+ var EVENT_TASK_RESULT_UPDATED = "task_result_updated";
1367
+ var EVENT_TASK_INSIGHT_UPDATED = "task_insight_updated";
1368
+ var EVENT_MESSAGE_ADDED = "message_added";
1369
+ var EVENT_MESSAGE_STREAMING = "message_streaming";
1370
+ var EVENT_MESSAGE_SUMMARY_GENERATED = "message_summary_generated";
1371
+ var EVENT_MESSAGE_TRANSLATION_READY = "message_translation_ready";
1372
+ var EVENT_ERROR_EVENT_RECORDED = "error_event_recorded";
1373
+ var RealtimeClient = class {
1374
+ constructor(baseUrl, opts) {
1375
+ this._socket = null;
1376
+ this._handlers = /* @__PURE__ */ new Map();
1377
+ this._connected = false;
1378
+ this._baseUrl = baseUrl.replace(/\/+$/, "");
1379
+ this._socketOptions = opts.socketOptions ?? {};
1380
+ this._getToken = opts.getToken;
1381
+ if (opts.autoConnect) {
1382
+ this.connect();
1383
+ }
1384
+ }
1385
+ get connected() {
1386
+ return this._connected;
1387
+ }
1388
+ async connect() {
1389
+ const auth = {};
1390
+ if (this._getToken) {
1391
+ auth.token = typeof this._getToken === "function" ? await this._getToken() : this._getToken;
1392
+ }
1393
+ const { io } = await import("socket.io-client");
1394
+ this._socket = io(this._baseUrl, {
1395
+ path: "/socket.io",
1396
+ auth,
1397
+ transports: ["websocket", "polling"],
1398
+ ...this._socketOptions
1399
+ });
1400
+ this._socket.on("connect", () => {
1401
+ this._connected = true;
1402
+ });
1403
+ this._socket.on("disconnect", () => {
1404
+ this._connected = false;
1405
+ });
1406
+ return new Promise((resolve, reject) => {
1407
+ const socket = this._socket;
1408
+ socket.on("connect", () => resolve());
1409
+ socket.on("connect_error", (err) => reject(err));
1410
+ if (socket.connected) {
1411
+ resolve();
1412
+ }
1413
+ });
1414
+ }
1415
+ async disconnect() {
1416
+ if (this._socket) {
1417
+ this._socket.disconnect();
1418
+ this._socket = null;
1419
+ }
1420
+ this._connected = false;
1421
+ }
1422
+ /**
1423
+ * Subscribe to realtime events for a specific task.
1424
+ */
1425
+ async subscribeTask(taskId) {
1426
+ if (!this._socket) throw new Error("RealtimeClient not connected");
1427
+ return new Promise((resolve, reject) => {
1428
+ this._socket.emit("subscribe", { task_id: taskId }, (response) => {
1429
+ if (response.ok) resolve();
1430
+ else reject(new Error(response.error ?? "Subscription failed"));
1431
+ });
1432
+ });
1433
+ }
1434
+ /**
1435
+ * Unsubscribe from realtime events for a specific task.
1436
+ */
1437
+ async unsubscribeTask(taskId) {
1438
+ if (!this._socket) throw new Error("RealtimeClient not connected");
1439
+ return new Promise((resolve, reject) => {
1440
+ this._socket.emit("unsubscribe", { task_id: taskId }, (response) => {
1441
+ if (response.ok) resolve();
1442
+ else reject(new Error(response.error ?? "Unsubscription failed"));
1443
+ });
1444
+ });
1445
+ }
1446
+ /**
1447
+ * Register a handler for a specific event type.
1448
+ */
1449
+ on(event, handler) {
1450
+ if (!this._handlers.has(event)) {
1451
+ this._handlers.set(event, /* @__PURE__ */ new Set());
1452
+ if (this._socket) {
1453
+ this._socket.on(event, (...args) => {
1454
+ const handlers = this._handlers.get(event);
1455
+ if (handlers) {
1456
+ for (const h of handlers) {
1457
+ h(...args);
1458
+ }
1459
+ }
1460
+ });
1461
+ }
1462
+ }
1463
+ this._handlers.get(event).add(handler);
1464
+ }
1465
+ /**
1466
+ * Remove a registered handler.
1467
+ */
1468
+ off(event, handler) {
1469
+ const handlers = this._handlers.get(event);
1470
+ if (handlers) {
1471
+ handlers.delete(handler);
1472
+ if (handlers.size === 0) {
1473
+ this._handlers.delete(event);
1474
+ if (this._socket) {
1475
+ this._socket.off(event);
1476
+ }
1477
+ }
1478
+ }
1479
+ }
1480
+ /**
1481
+ * Wait for the connection to close (for long-running listeners).
1482
+ */
1483
+ wait() {
1484
+ return new Promise((resolve) => {
1485
+ const socket = this._socket;
1486
+ if (!socket) {
1487
+ resolve();
1488
+ return;
1489
+ }
1490
+ socket.on("disconnect", () => resolve());
1491
+ });
1492
+ }
1493
+ };
1494
+
1495
+ // src/index.ts
1496
+ var VERSION = "5.6.0";
1497
+ // Annotate the CommonJS export names for ESM import in node:
1498
+ 0 && (module.exports = {
1499
+ EVENT_ERROR_EVENT_RECORDED,
1500
+ EVENT_MESSAGE_ADDED,
1501
+ EVENT_MESSAGE_STREAMING,
1502
+ EVENT_MESSAGE_SUMMARY_GENERATED,
1503
+ EVENT_MESSAGE_TRANSLATION_READY,
1504
+ EVENT_TASK_CREATED,
1505
+ EVENT_TASK_DELETED,
1506
+ EVENT_TASK_INSIGHT_UPDATED,
1507
+ EVENT_TASK_ITERATION_CHANGED,
1508
+ EVENT_TASK_RESULT_UPDATED,
1509
+ EVENT_TASK_STATUS_CHANGED,
1510
+ Orchestrator,
1511
+ OrchestratorAPIError,
1512
+ OrchestratorAsync,
1513
+ OrchestratorAuthError,
1514
+ OrchestratorConfigError,
1515
+ OrchestratorConnectionError,
1516
+ OrchestratorError,
1517
+ OrchestratorNotFoundError,
1518
+ RealtimeClient,
1519
+ VERSION,
1520
+ createInsecureFetch,
1521
+ loadConfig
1522
+ });
1523
+ //# sourceMappingURL=index.cjs.map