opencode-orchestrator 0.6.4 → 0.6.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/dist/core/notification/presets.d.ts +9 -0
- package/dist/index.js +221 -130
- package/package.json +1 -1
|
@@ -6,9 +6,18 @@ export declare const presets: {
|
|
|
6
6
|
taskCompleted: (taskId: string, agent: string) => import("./types.js").ToastMessage;
|
|
7
7
|
taskFailed: (taskId: string, error: string) => import("./types.js").ToastMessage;
|
|
8
8
|
allTasksComplete: (count: number) => import("./types.js").ToastMessage;
|
|
9
|
+
sessionCreated: (sessionId: string, agent: string) => import("./types.js").ToastMessage;
|
|
10
|
+
sessionResumed: (sessionId: string, agent: string) => import("./types.js").ToastMessage;
|
|
11
|
+
sessionCompleted: (sessionId: string, duration: string) => import("./types.js").ToastMessage;
|
|
12
|
+
parallelTasksLaunched: (count: number, agents: string[]) => import("./types.js").ToastMessage;
|
|
13
|
+
concurrencyAcquired: (agent: string, slot: string) => import("./types.js").ToastMessage;
|
|
14
|
+
concurrencyReleased: (agent: string) => import("./types.js").ToastMessage;
|
|
9
15
|
missionComplete: (summary: string) => import("./types.js").ToastMessage;
|
|
16
|
+
missionStarted: (description: string) => import("./types.js").ToastMessage;
|
|
17
|
+
toolExecuted: (toolName: string, target: string) => import("./types.js").ToastMessage;
|
|
10
18
|
documentCached: (filename: string) => import("./types.js").ToastMessage;
|
|
11
19
|
researchStarted: (topic: string) => import("./types.js").ToastMessage;
|
|
12
20
|
warningRateLimited: () => import("./types.js").ToastMessage;
|
|
13
21
|
errorRecovery: (action: string) => import("./types.js").ToastMessage;
|
|
22
|
+
warningMaxDepth: (depth: number) => import("./types.js").ToastMessage;
|
|
14
23
|
};
|
package/dist/index.js
CHANGED
|
@@ -14290,6 +14290,182 @@ Use \`get_task_result({ taskId: "task_xxx" })\` to retrieve results.
|
|
|
14290
14290
|
</system-notification>`;
|
|
14291
14291
|
}
|
|
14292
14292
|
|
|
14293
|
+
// src/core/notification/toast-core.ts
|
|
14294
|
+
var tuiClient = null;
|
|
14295
|
+
function initToastClient(client) {
|
|
14296
|
+
tuiClient = client;
|
|
14297
|
+
}
|
|
14298
|
+
var toasts = [];
|
|
14299
|
+
var MAX_HISTORY = 50;
|
|
14300
|
+
var handlers = [];
|
|
14301
|
+
function show(options) {
|
|
14302
|
+
const toast = {
|
|
14303
|
+
id: `toast_${Date.now()}_${Math.random().toString(36).slice(2, 6)}`,
|
|
14304
|
+
title: options.title,
|
|
14305
|
+
message: options.message,
|
|
14306
|
+
variant: options.variant || "info",
|
|
14307
|
+
timestamp: /* @__PURE__ */ new Date(),
|
|
14308
|
+
duration: options.duration ?? 5e3,
|
|
14309
|
+
dismissed: false
|
|
14310
|
+
};
|
|
14311
|
+
toasts.push(toast);
|
|
14312
|
+
if (toasts.length > MAX_HISTORY) {
|
|
14313
|
+
toasts.shift();
|
|
14314
|
+
}
|
|
14315
|
+
for (const handler of handlers) {
|
|
14316
|
+
try {
|
|
14317
|
+
handler(toast);
|
|
14318
|
+
} catch (error45) {
|
|
14319
|
+
}
|
|
14320
|
+
}
|
|
14321
|
+
if (tuiClient) {
|
|
14322
|
+
const client = tuiClient;
|
|
14323
|
+
if (client.tui?.showToast) {
|
|
14324
|
+
client.tui.showToast({
|
|
14325
|
+
body: {
|
|
14326
|
+
title: toast.title,
|
|
14327
|
+
message: toast.message,
|
|
14328
|
+
variant: toast.variant,
|
|
14329
|
+
duration: toast.duration
|
|
14330
|
+
}
|
|
14331
|
+
}).catch(() => {
|
|
14332
|
+
});
|
|
14333
|
+
}
|
|
14334
|
+
}
|
|
14335
|
+
return toast;
|
|
14336
|
+
}
|
|
14337
|
+
|
|
14338
|
+
// src/core/notification/presets.ts
|
|
14339
|
+
var presets = {
|
|
14340
|
+
// =========================================
|
|
14341
|
+
// Task Lifecycle
|
|
14342
|
+
// =========================================
|
|
14343
|
+
taskStarted: (taskId, agent) => show({
|
|
14344
|
+
title: "\u26A1 Task Started",
|
|
14345
|
+
message: `${agent}: ${taskId}`,
|
|
14346
|
+
variant: "info",
|
|
14347
|
+
duration: 3e3
|
|
14348
|
+
}),
|
|
14349
|
+
taskCompleted: (taskId, agent) => show({
|
|
14350
|
+
title: "\u2705 Task Completed",
|
|
14351
|
+
message: `${agent}: ${taskId}`,
|
|
14352
|
+
variant: "success",
|
|
14353
|
+
duration: 3e3
|
|
14354
|
+
}),
|
|
14355
|
+
taskFailed: (taskId, error45) => show({
|
|
14356
|
+
title: "\u274C Task Failed",
|
|
14357
|
+
message: `${taskId}: ${error45}`,
|
|
14358
|
+
variant: "error",
|
|
14359
|
+
duration: 0
|
|
14360
|
+
// Persistent
|
|
14361
|
+
}),
|
|
14362
|
+
allTasksComplete: (count) => show({
|
|
14363
|
+
title: "\u{1F389} All Tasks Complete",
|
|
14364
|
+
message: `${count} tasks finished successfully`,
|
|
14365
|
+
variant: "success",
|
|
14366
|
+
duration: 5e3
|
|
14367
|
+
}),
|
|
14368
|
+
// =========================================
|
|
14369
|
+
// Session Management
|
|
14370
|
+
// =========================================
|
|
14371
|
+
sessionCreated: (sessionId, agent) => show({
|
|
14372
|
+
title: "\u{1F4CC} Session Created",
|
|
14373
|
+
message: `${agent} \u2192 ${sessionId.slice(0, 12)}...`,
|
|
14374
|
+
variant: "info",
|
|
14375
|
+
duration: 2e3
|
|
14376
|
+
}),
|
|
14377
|
+
sessionResumed: (sessionId, agent) => show({
|
|
14378
|
+
title: "\u{1F504} Session Resumed",
|
|
14379
|
+
message: `${agent} \u2192 ${sessionId.slice(0, 12)}...`,
|
|
14380
|
+
variant: "info",
|
|
14381
|
+
duration: 2e3
|
|
14382
|
+
}),
|
|
14383
|
+
sessionCompleted: (sessionId, duration3) => show({
|
|
14384
|
+
title: "\u2705 Session Completed",
|
|
14385
|
+
message: `${sessionId.slice(0, 12)}... (${duration3})`,
|
|
14386
|
+
variant: "success",
|
|
14387
|
+
duration: 3e3
|
|
14388
|
+
}),
|
|
14389
|
+
// =========================================
|
|
14390
|
+
// Parallel Processing
|
|
14391
|
+
// =========================================
|
|
14392
|
+
parallelTasksLaunched: (count, agents) => show({
|
|
14393
|
+
title: "\u{1F680} Parallel Tasks Launched",
|
|
14394
|
+
message: `${count} tasks: ${agents.join(", ")}`,
|
|
14395
|
+
variant: "info",
|
|
14396
|
+
duration: 4e3
|
|
14397
|
+
}),
|
|
14398
|
+
concurrencyAcquired: (agent, slot) => show({
|
|
14399
|
+
title: "\u{1F512} Concurrency Slot",
|
|
14400
|
+
message: `${agent} acquired ${slot}`,
|
|
14401
|
+
variant: "info",
|
|
14402
|
+
duration: 2e3
|
|
14403
|
+
}),
|
|
14404
|
+
concurrencyReleased: (agent) => show({
|
|
14405
|
+
title: "\u{1F513} Slot Released",
|
|
14406
|
+
message: agent,
|
|
14407
|
+
variant: "info",
|
|
14408
|
+
duration: 1500
|
|
14409
|
+
}),
|
|
14410
|
+
// =========================================
|
|
14411
|
+
// Mission & Progress
|
|
14412
|
+
// =========================================
|
|
14413
|
+
missionComplete: (summary) => show({
|
|
14414
|
+
title: "\u{1F389} Mission Complete",
|
|
14415
|
+
message: summary,
|
|
14416
|
+
variant: "success",
|
|
14417
|
+
duration: 0
|
|
14418
|
+
}),
|
|
14419
|
+
missionStarted: (description) => show({
|
|
14420
|
+
title: "\u{1F3AF} Mission Started",
|
|
14421
|
+
message: description.slice(0, 100),
|
|
14422
|
+
variant: "info",
|
|
14423
|
+
duration: 4e3
|
|
14424
|
+
}),
|
|
14425
|
+
// =========================================
|
|
14426
|
+
// Tools & Research
|
|
14427
|
+
// =========================================
|
|
14428
|
+
toolExecuted: (toolName, target) => show({
|
|
14429
|
+
title: `\u{1F527} ${toolName}`,
|
|
14430
|
+
message: target.slice(0, 80),
|
|
14431
|
+
variant: "info",
|
|
14432
|
+
duration: 2e3
|
|
14433
|
+
}),
|
|
14434
|
+
documentCached: (filename) => show({
|
|
14435
|
+
title: "\u{1F4C4} Document Cached",
|
|
14436
|
+
message: `.cache/docs/${filename}`,
|
|
14437
|
+
variant: "info",
|
|
14438
|
+
duration: 2e3
|
|
14439
|
+
}),
|
|
14440
|
+
researchStarted: (topic) => show({
|
|
14441
|
+
title: "\u{1F52C} Research Started",
|
|
14442
|
+
message: topic,
|
|
14443
|
+
variant: "info",
|
|
14444
|
+
duration: 3e3
|
|
14445
|
+
}),
|
|
14446
|
+
// =========================================
|
|
14447
|
+
// Warnings & Errors
|
|
14448
|
+
// =========================================
|
|
14449
|
+
warningRateLimited: () => show({
|
|
14450
|
+
title: "\u26A0\uFE0F Rate Limited",
|
|
14451
|
+
message: "Waiting before retry...",
|
|
14452
|
+
variant: "warning",
|
|
14453
|
+
duration: 5e3
|
|
14454
|
+
}),
|
|
14455
|
+
errorRecovery: (action) => show({
|
|
14456
|
+
title: "\u26A0\uFE0F Error Recovery",
|
|
14457
|
+
message: `Attempting: ${action}`,
|
|
14458
|
+
variant: "warning",
|
|
14459
|
+
duration: 3e3
|
|
14460
|
+
}),
|
|
14461
|
+
warningMaxDepth: (depth) => show({
|
|
14462
|
+
title: "\u26A0\uFE0F Max Depth Reached",
|
|
14463
|
+
message: `Recursion blocked at depth ${depth}`,
|
|
14464
|
+
variant: "warning",
|
|
14465
|
+
duration: 5e3
|
|
14466
|
+
})
|
|
14467
|
+
};
|
|
14468
|
+
|
|
14293
14469
|
// src/core/agents/manager/task-launcher.ts
|
|
14294
14470
|
var TaskLauncher = class {
|
|
14295
14471
|
constructor(client, directory, store, concurrency, onTaskError, startPolling) {
|
|
@@ -14350,6 +14526,7 @@ var TaskLauncher = class {
|
|
|
14350
14526
|
log2(`Prompt error for ${taskId}:`, error45);
|
|
14351
14527
|
this.onTaskError(taskId, error45);
|
|
14352
14528
|
});
|
|
14529
|
+
presets.sessionCreated(sessionID, input.agent);
|
|
14353
14530
|
log2(`Launched ${taskId} in session ${sessionID}`);
|
|
14354
14531
|
return task;
|
|
14355
14532
|
} catch (error45) {
|
|
@@ -14495,7 +14672,9 @@ var TaskPoller = class {
|
|
|
14495
14672
|
this.store.queueNotification(task);
|
|
14496
14673
|
await this.notifyParentIfAllComplete(task.parentSessionID);
|
|
14497
14674
|
this.scheduleCleanup(task.id);
|
|
14498
|
-
|
|
14675
|
+
const duration3 = formatDuration(task.startedAt, task.completedAt);
|
|
14676
|
+
presets.sessionCompleted(task.sessionID, duration3);
|
|
14677
|
+
log2(`Completed ${task.id} (${duration3})`);
|
|
14499
14678
|
}
|
|
14500
14679
|
async updateTaskProgress(task) {
|
|
14501
14680
|
try {
|
|
@@ -16136,110 +16315,6 @@ ${r.content}
|
|
|
16136
16315
|
}
|
|
16137
16316
|
});
|
|
16138
16317
|
|
|
16139
|
-
// src/core/notification/toast-core.ts
|
|
16140
|
-
var tuiClient = null;
|
|
16141
|
-
function initToastClient(client) {
|
|
16142
|
-
tuiClient = client;
|
|
16143
|
-
}
|
|
16144
|
-
var toasts = [];
|
|
16145
|
-
var MAX_HISTORY = 50;
|
|
16146
|
-
var handlers = [];
|
|
16147
|
-
function show(options) {
|
|
16148
|
-
const toast = {
|
|
16149
|
-
id: `toast_${Date.now()}_${Math.random().toString(36).slice(2, 6)}`,
|
|
16150
|
-
title: options.title,
|
|
16151
|
-
message: options.message,
|
|
16152
|
-
variant: options.variant || "info",
|
|
16153
|
-
timestamp: /* @__PURE__ */ new Date(),
|
|
16154
|
-
duration: options.duration ?? 5e3,
|
|
16155
|
-
dismissed: false
|
|
16156
|
-
};
|
|
16157
|
-
toasts.push(toast);
|
|
16158
|
-
if (toasts.length > MAX_HISTORY) {
|
|
16159
|
-
toasts.shift();
|
|
16160
|
-
}
|
|
16161
|
-
for (const handler of handlers) {
|
|
16162
|
-
try {
|
|
16163
|
-
handler(toast);
|
|
16164
|
-
} catch (error45) {
|
|
16165
|
-
}
|
|
16166
|
-
}
|
|
16167
|
-
if (tuiClient) {
|
|
16168
|
-
const client = tuiClient;
|
|
16169
|
-
if (client.tui?.showToast) {
|
|
16170
|
-
client.tui.showToast({
|
|
16171
|
-
body: {
|
|
16172
|
-
title: toast.title,
|
|
16173
|
-
message: toast.message,
|
|
16174
|
-
variant: toast.variant,
|
|
16175
|
-
duration: toast.duration
|
|
16176
|
-
}
|
|
16177
|
-
}).catch(() => {
|
|
16178
|
-
});
|
|
16179
|
-
}
|
|
16180
|
-
}
|
|
16181
|
-
return toast;
|
|
16182
|
-
}
|
|
16183
|
-
|
|
16184
|
-
// src/core/notification/presets.ts
|
|
16185
|
-
var presets = {
|
|
16186
|
-
taskStarted: (taskId, agent) => show({
|
|
16187
|
-
title: "Task Started",
|
|
16188
|
-
message: `${agent}: ${taskId}`,
|
|
16189
|
-
variant: "info",
|
|
16190
|
-
duration: 3e3
|
|
16191
|
-
}),
|
|
16192
|
-
taskCompleted: (taskId, agent) => show({
|
|
16193
|
-
title: "Task Completed",
|
|
16194
|
-
message: `${agent}: ${taskId}`,
|
|
16195
|
-
variant: "success",
|
|
16196
|
-
duration: 3e3
|
|
16197
|
-
}),
|
|
16198
|
-
taskFailed: (taskId, error45) => show({
|
|
16199
|
-
title: "Task Failed",
|
|
16200
|
-
message: `${taskId}: ${error45}`,
|
|
16201
|
-
variant: "error",
|
|
16202
|
-
duration: 0
|
|
16203
|
-
// Persistent
|
|
16204
|
-
}),
|
|
16205
|
-
allTasksComplete: (count) => show({
|
|
16206
|
-
title: "All Tasks Complete",
|
|
16207
|
-
message: `${count} tasks finished successfully`,
|
|
16208
|
-
variant: "success",
|
|
16209
|
-
duration: 5e3
|
|
16210
|
-
}),
|
|
16211
|
-
missionComplete: (summary) => show({
|
|
16212
|
-
title: "\u{1F389} Mission Complete",
|
|
16213
|
-
message: summary,
|
|
16214
|
-
variant: "success",
|
|
16215
|
-
duration: 0
|
|
16216
|
-
}),
|
|
16217
|
-
documentCached: (filename) => show({
|
|
16218
|
-
title: "Document Cached",
|
|
16219
|
-
message: `.cache/docs/${filename}`,
|
|
16220
|
-
variant: "info",
|
|
16221
|
-
duration: 2e3
|
|
16222
|
-
}),
|
|
16223
|
-
researchStarted: (topic) => show({
|
|
16224
|
-
title: "Research Started",
|
|
16225
|
-
message: topic,
|
|
16226
|
-
variant: "info",
|
|
16227
|
-
duration: 3e3
|
|
16228
|
-
}),
|
|
16229
|
-
warningRateLimited: () => show({
|
|
16230
|
-
title: "Rate Limited",
|
|
16231
|
-
message: "Waiting before retry...",
|
|
16232
|
-
variant: "warning",
|
|
16233
|
-
duration: 5e3
|
|
16234
|
-
}),
|
|
16235
|
-
errorRecovery: (action) => show({
|
|
16236
|
-
title: "Error Recovery",
|
|
16237
|
-
message: `Attempting: ${action}`,
|
|
16238
|
-
variant: "warning",
|
|
16239
|
-
duration: 3e3
|
|
16240
|
-
})
|
|
16241
|
-
};
|
|
16242
|
-
|
|
16243
16318
|
// src/core/notification/event-integration.ts
|
|
16244
16319
|
function enableAutoToasts() {
|
|
16245
16320
|
const unsubscribers = [];
|
|
@@ -16535,34 +16610,50 @@ var OrchestratorPlugin = async (input) => {
|
|
|
16535
16610
|
const sessionID = msgInput.sessionID;
|
|
16536
16611
|
const agentName = (msgInput.agent || "").toLowerCase();
|
|
16537
16612
|
log2("[index.ts] chat.message hook", { sessionID, agent: agentName, textLength: originalText.length });
|
|
16538
|
-
if (agentName === AGENT_NAMES.COMMANDER
|
|
16539
|
-
|
|
16540
|
-
|
|
16541
|
-
|
|
16542
|
-
|
|
16543
|
-
|
|
16544
|
-
|
|
16545
|
-
|
|
16546
|
-
|
|
16547
|
-
|
|
16548
|
-
|
|
16549
|
-
|
|
16550
|
-
|
|
16551
|
-
|
|
16552
|
-
|
|
16553
|
-
|
|
16554
|
-
|
|
16555
|
-
|
|
16556
|
-
|
|
16557
|
-
|
|
16558
|
-
|
|
16559
|
-
|
|
16560
|
-
|
|
16561
|
-
|
|
16613
|
+
if (agentName === AGENT_NAMES.COMMANDER) {
|
|
16614
|
+
if (!sessions.has(sessionID)) {
|
|
16615
|
+
const now = Date.now();
|
|
16616
|
+
sessions.set(sessionID, {
|
|
16617
|
+
active: true,
|
|
16618
|
+
step: 0,
|
|
16619
|
+
maxSteps: DEFAULT_MAX_STEPS,
|
|
16620
|
+
timestamp: now,
|
|
16621
|
+
startTime: now,
|
|
16622
|
+
lastStepTime: now
|
|
16623
|
+
});
|
|
16624
|
+
state.missionActive = true;
|
|
16625
|
+
state.sessions.set(sessionID, {
|
|
16626
|
+
enabled: true,
|
|
16627
|
+
iterations: 0,
|
|
16628
|
+
taskRetries: /* @__PURE__ */ new Map(),
|
|
16629
|
+
currentTask: "",
|
|
16630
|
+
anomalyCount: 0
|
|
16631
|
+
});
|
|
16632
|
+
startSession(sessionID);
|
|
16633
|
+
emit(TASK_EVENTS.STARTED, {
|
|
16634
|
+
taskId: sessionID,
|
|
16635
|
+
agent: AGENT_NAMES.COMMANDER,
|
|
16636
|
+
description: "Mission started"
|
|
16637
|
+
});
|
|
16638
|
+
}
|
|
16639
|
+
if (!parsed || parsed.command !== "task") {
|
|
16640
|
+
const taskTemplate = COMMANDS["task"].template;
|
|
16641
|
+
const userMessage = parsed?.args || originalText;
|
|
16642
|
+
parts[textPartIndex].text = taskTemplate.replace(
|
|
16643
|
+
/\$ARGUMENTS/g,
|
|
16644
|
+
userMessage || PROMPTS.CONTINUE
|
|
16645
|
+
);
|
|
16646
|
+
log2("[index.ts] Auto-applied mission mode", { originalLength: originalText.length });
|
|
16647
|
+
}
|
|
16562
16648
|
}
|
|
16563
16649
|
if (parsed) {
|
|
16564
16650
|
const command = COMMANDS[parsed.command];
|
|
16565
|
-
if (command) {
|
|
16651
|
+
if (command && agentName !== AGENT_NAMES.COMMANDER) {
|
|
16652
|
+
parts[textPartIndex].text = command.template.replace(
|
|
16653
|
+
/\$ARGUMENTS/g,
|
|
16654
|
+
parsed.args || PROMPTS.CONTINUE
|
|
16655
|
+
);
|
|
16656
|
+
} else if (command && parsed.command === "task") {
|
|
16566
16657
|
parts[textPartIndex].text = command.template.replace(
|
|
16567
16658
|
/\$ARGUMENTS/g,
|
|
16568
16659
|
parsed.args || PROMPTS.CONTINUE
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "opencode-orchestrator",
|
|
3
3
|
"displayName": "OpenCode Orchestrator",
|
|
4
4
|
"description": "Distributed Cognitive Architecture for OpenCode. Turns simple prompts into specialized multi-agent workflows (Planner, Coder, Reviewer).",
|
|
5
|
-
"version": "0.6.
|
|
5
|
+
"version": "0.6.6",
|
|
6
6
|
"author": "agnusdei1207",
|
|
7
7
|
"license": "MIT",
|
|
8
8
|
"repository": {
|