funolio-agent 1.0.53 → 1.1.65
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/approval.d.ts +1 -6
- package/dist/approval.d.ts.map +1 -1
- package/dist/approval.js +2 -7
- package/dist/approval.js.map +1 -1
- package/dist/auth/credential-reader.d.ts.map +1 -1
- package/dist/auth/credential-reader.js +4 -3
- package/dist/auth/credential-reader.js.map +1 -1
- package/dist/auth/token-refresh.d.ts +8 -0
- package/dist/auth/token-refresh.d.ts.map +1 -1
- package/dist/auth/token-refresh.js +82 -52
- package/dist/auth/token-refresh.js.map +1 -1
- package/dist/auto-organizer.d.ts.map +1 -1
- package/dist/auto-organizer.js +6 -7
- package/dist/auto-organizer.js.map +1 -1
- package/dist/bench-prefix.d.ts +16 -0
- package/dist/bench-prefix.d.ts.map +1 -0
- package/dist/bench-prefix.js +25 -0
- package/dist/bench-prefix.js.map +1 -0
- package/dist/bot-manager.d.ts +5 -1
- package/dist/bot-manager.d.ts.map +1 -1
- package/dist/bot-manager.js +46 -27
- package/dist/bot-manager.js.map +1 -1
- package/dist/chat-sync.d.ts +42 -0
- package/dist/chat-sync.d.ts.map +1 -0
- package/dist/chat-sync.js +95 -0
- package/dist/chat-sync.js.map +1 -0
- package/dist/clerk-model.d.ts +7 -0
- package/dist/clerk-model.d.ts.map +1 -1
- package/dist/clerk-model.js +42 -8
- package/dist/clerk-model.js.map +1 -1
- package/dist/cli-bootstrap-history.d.ts +10 -0
- package/dist/cli-bootstrap-history.d.ts.map +1 -0
- package/dist/cli-bootstrap-history.js +112 -0
- package/dist/cli-bootstrap-history.js.map +1 -0
- package/dist/cli-models.d.ts +8 -0
- package/dist/cli-models.d.ts.map +1 -0
- package/dist/cli-models.js +91 -0
- package/dist/cli-models.js.map +1 -0
- package/dist/cli-session-epoch.d.ts +13 -3
- package/dist/cli-session-epoch.d.ts.map +1 -1
- package/dist/cli-session-epoch.js +53 -4
- package/dist/cli-session-epoch.js.map +1 -1
- package/dist/cli-session-registry.d.ts +35 -0
- package/dist/cli-session-registry.d.ts.map +1 -0
- package/dist/cli-session-registry.js +177 -0
- package/dist/cli-session-registry.js.map +1 -0
- package/dist/cli.js +62 -0
- package/dist/cli.js.map +1 -1
- package/dist/codex-app-server-manager.d.ts +189 -0
- package/dist/codex-app-server-manager.d.ts.map +1 -0
- package/dist/codex-app-server-manager.js +1468 -0
- package/dist/codex-app-server-manager.js.map +1 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +8 -30
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/pool.d.ts +32 -0
- package/dist/commands/pool.d.ts.map +1 -1
- package/dist/commands/pool.js +145 -66
- package/dist/commands/pool.js.map +1 -1
- package/dist/commands/setup.d.ts +4 -1
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +9 -25
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/start.d.ts +21 -0
- package/dist/commands/start.d.ts.map +1 -1
- package/dist/commands/start.js +559 -63
- package/dist/commands/start.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +5 -2
- package/dist/commands/status.js.map +1 -1
- package/dist/completion-marker.d.ts +7 -0
- package/dist/completion-marker.d.ts.map +1 -0
- package/dist/completion-marker.js +28 -0
- package/dist/completion-marker.js.map +1 -0
- package/dist/config.d.ts +7 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +184 -60
- package/dist/config.js.map +1 -1
- package/dist/context-window.d.ts +37 -1
- package/dist/context-window.d.ts.map +1 -1
- package/dist/context-window.js +210 -17
- package/dist/context-window.js.map +1 -1
- package/dist/live-activity.d.ts +31 -0
- package/dist/live-activity.d.ts.map +1 -0
- package/dist/live-activity.js +36 -0
- package/dist/live-activity.js.map +1 -0
- package/dist/local-chat-execution.d.ts +114 -0
- package/dist/local-chat-execution.d.ts.map +1 -0
- package/dist/local-chat-execution.js +349 -0
- package/dist/local-chat-execution.js.map +1 -0
- package/dist/local-cli-pty-manager.d.ts +186 -0
- package/dist/local-cli-pty-manager.d.ts.map +1 -1
- package/dist/local-cli-pty-manager.js +2581 -164
- package/dist/local-cli-pty-manager.js.map +1 -1
- package/dist/local-conversation-gateway.d.ts +110 -0
- package/dist/local-conversation-gateway.d.ts.map +1 -0
- package/dist/local-conversation-gateway.js +175 -0
- package/dist/local-conversation-gateway.js.map +1 -0
- package/dist/local-data.d.ts +276 -5
- package/dist/local-data.d.ts.map +1 -1
- package/dist/local-data.js +1201 -86
- package/dist/local-data.js.map +1 -1
- package/dist/local-db.d.ts +6 -0
- package/dist/local-db.d.ts.map +1 -1
- package/dist/local-db.js +428 -2
- package/dist/local-db.js.map +1 -1
- package/dist/local-funnel.d.ts.map +1 -1
- package/dist/local-funnel.js +6 -5
- package/dist/local-funnel.js.map +1 -1
- package/dist/local-server.d.ts +55 -0
- package/dist/local-server.d.ts.map +1 -1
- package/dist/local-server.js +3281 -441
- package/dist/local-server.js.map +1 -1
- package/dist/managed-process-registry.d.ts +59 -0
- package/dist/managed-process-registry.d.ts.map +1 -0
- package/dist/managed-process-registry.js +390 -0
- package/dist/managed-process-registry.js.map +1 -0
- package/dist/mcp/claude-config-writer.d.ts +5 -5
- package/dist/mcp/claude-config-writer.d.ts.map +1 -1
- package/dist/mcp/claude-config-writer.js +19 -11
- package/dist/mcp/claude-config-writer.js.map +1 -1
- package/dist/mcp/index.d.ts +4 -2
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/sync-cli-config.d.ts +42 -4
- package/dist/mcp/sync-cli-config.d.ts.map +1 -1
- package/dist/mcp/sync-cli-config.js +497 -17
- package/dist/mcp/sync-cli-config.js.map +1 -1
- package/dist/message-loop.d.ts +6 -0
- package/dist/message-loop.d.ts.map +1 -1
- package/dist/message-loop.js +281 -89
- package/dist/message-loop.js.map +1 -1
- package/dist/mqtt-client.d.ts +44 -1
- package/dist/mqtt-client.d.ts.map +1 -1
- package/dist/mqtt-client.js +284 -46
- package/dist/mqtt-client.js.map +1 -1
- package/dist/mqtt-data-relay.d.ts +44 -0
- package/dist/mqtt-data-relay.d.ts.map +1 -0
- package/dist/mqtt-data-relay.js +106 -0
- package/dist/mqtt-data-relay.js.map +1 -0
- package/dist/oauth.d.ts.map +1 -1
- package/dist/oauth.js +69 -29
- package/dist/oauth.js.map +1 -1
- package/dist/orchestration/capabilities.d.ts +13 -0
- package/dist/orchestration/capabilities.d.ts.map +1 -0
- package/dist/orchestration/capabilities.js +152 -0
- package/dist/orchestration/capabilities.js.map +1 -0
- package/dist/orchestration/dispatch-executor.d.ts +83 -0
- package/dist/orchestration/dispatch-executor.d.ts.map +1 -0
- package/dist/orchestration/dispatch-executor.js +266 -0
- package/dist/orchestration/dispatch-executor.js.map +1 -0
- package/dist/orchestration/dispatch-hint.d.ts +134 -0
- package/dist/orchestration/dispatch-hint.d.ts.map +1 -0
- package/dist/orchestration/dispatch-hint.js +247 -0
- package/dist/orchestration/dispatch-hint.js.map +1 -0
- package/dist/orchestration/dispatch-runner.d.ts +106 -0
- package/dist/orchestration/dispatch-runner.d.ts.map +1 -0
- package/dist/orchestration/dispatch-runner.js +604 -0
- package/dist/orchestration/dispatch-runner.js.map +1 -0
- package/dist/orchestration/dispatch-tools.d.ts +167 -0
- package/dist/orchestration/dispatch-tools.d.ts.map +1 -0
- package/dist/orchestration/dispatch-tools.js +328 -0
- package/dist/orchestration/dispatch-tools.js.map +1 -0
- package/dist/orchestration/front-door-policy.d.ts +35 -10
- package/dist/orchestration/front-door-policy.d.ts.map +1 -1
- package/dist/orchestration/front-door-policy.js +30 -267
- package/dist/orchestration/front-door-policy.js.map +1 -1
- package/dist/orchestration/orchestrator-dispatch-prompt.d.ts +43 -0
- package/dist/orchestration/orchestrator-dispatch-prompt.d.ts.map +1 -0
- package/dist/orchestration/orchestrator-dispatch-prompt.js +267 -0
- package/dist/orchestration/orchestrator-dispatch-prompt.js.map +1 -0
- package/dist/orchestration/orchestrator-operating-prompt.d.ts +15 -0
- package/dist/orchestration/orchestrator-operating-prompt.d.ts.map +1 -1
- package/dist/orchestration/orchestrator-operating-prompt.js +206 -20
- package/dist/orchestration/orchestrator-operating-prompt.js.map +1 -1
- package/dist/orchestration/plan-import.d.ts +39 -0
- package/dist/orchestration/plan-import.d.ts.map +1 -0
- package/dist/orchestration/plan-import.js +547 -0
- package/dist/orchestration/plan-import.js.map +1 -0
- package/dist/orchestration/validation.d.ts +40 -0
- package/dist/orchestration/validation.d.ts.map +1 -0
- package/dist/orchestration/validation.js +203 -0
- package/dist/orchestration/validation.js.map +1 -0
- package/dist/orchestration/worker-operating-prompt.d.ts +2 -0
- package/dist/orchestration/worker-operating-prompt.d.ts.map +1 -1
- package/dist/orchestration/worker-operating-prompt.js +36 -46
- package/dist/orchestration/worker-operating-prompt.js.map +1 -1
- package/dist/orchestrator.d.ts +214 -33
- package/dist/orchestrator.d.ts.map +1 -1
- package/dist/orchestrator.js +2200 -1100
- package/dist/orchestrator.js.map +1 -1
- package/dist/providers/anthropic.d.ts.map +1 -1
- package/dist/providers/anthropic.js +8 -4
- package/dist/providers/anthropic.js.map +1 -1
- package/dist/providers/claude-cli-prompt.d.ts.map +1 -1
- package/dist/providers/claude-cli-prompt.js +49 -5
- package/dist/providers/claude-cli-prompt.js.map +1 -1
- package/dist/providers/claude-cli.d.ts.map +1 -1
- package/dist/providers/claude-cli.js +81 -5
- package/dist/providers/claude-cli.js.map +1 -1
- package/dist/providers/codex-cli.d.ts +10 -6
- package/dist/providers/codex-cli.d.ts.map +1 -1
- package/dist/providers/codex-cli.js +204 -26
- package/dist/providers/codex-cli.js.map +1 -1
- package/dist/providers/google.d.ts.map +1 -1
- package/dist/providers/google.js +15 -5
- package/dist/providers/google.js.map +1 -1
- package/dist/providers/index.d.ts +15 -1
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/openai.d.ts +1 -1
- package/dist/providers/openai.d.ts.map +1 -1
- package/dist/providers/openai.js +13 -5
- package/dist/providers/openai.js.map +1 -1
- package/dist/response-guard.js +1 -1
- package/dist/response-guard.js.map +1 -1
- package/dist/server-adapter.d.ts +8 -0
- package/dist/server-adapter.d.ts.map +1 -1
- package/dist/server-adapter.js +7 -0
- package/dist/server-adapter.js.map +1 -1
- package/dist/service-mode.d.ts +1 -1
- package/dist/service-mode.d.ts.map +1 -1
- package/dist/service-mode.js +64 -1
- package/dist/service-mode.js.map +1 -1
- package/dist/service-setup-only.d.ts +8 -0
- package/dist/service-setup-only.d.ts.map +1 -0
- package/dist/service-setup-only.js +37 -0
- package/dist/service-setup-only.js.map +1 -0
- package/dist/slash-commands.d.ts +21 -0
- package/dist/slash-commands.d.ts.map +1 -0
- package/dist/slash-commands.js +99 -0
- package/dist/slash-commands.js.map +1 -0
- package/dist/subagent/index.d.ts +4 -2
- package/dist/subagent/index.d.ts.map +1 -1
- package/dist/subagent/index.js.map +1 -1
- package/dist/summarization-pipeline.d.ts.map +1 -1
- package/dist/summarization-pipeline.js +1 -9
- package/dist/summarization-pipeline.js.map +1 -1
- package/dist/token-counter.d.ts.map +1 -1
- package/dist/token-counter.js +11 -4
- package/dist/token-counter.js.map +1 -1
- package/dist/tool-filter.d.ts.map +1 -1
- package/dist/tool-filter.js +10 -6
- package/dist/tool-filter.js.map +1 -1
- package/dist/tools/admin-tools.d.ts.map +1 -1
- package/dist/tools/admin-tools.js +20 -5
- package/dist/tools/admin-tools.js.map +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +2 -1
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/run-command.d.ts.map +1 -1
- package/dist/tools/run-command.js +5 -1
- package/dist/tools/run-command.js.map +1 -1
- package/dist/tools/search-conversation-history.d.ts +16 -0
- package/dist/tools/search-conversation-history.d.ts.map +1 -0
- package/dist/tools/search-conversation-history.js +334 -0
- package/dist/tools/search-conversation-history.js.map +1 -0
- package/dist/tools/todo-tasks.d.ts.map +1 -1
- package/dist/tools/todo-tasks.js +77 -5
- package/dist/tools/todo-tasks.js.map +1 -1
- package/dist/usage-log.d.ts +62 -0
- package/dist/usage-log.d.ts.map +1 -0
- package/dist/usage-log.js +98 -0
- package/dist/usage-log.js.map +1 -0
- package/dist/wizard-state.d.ts +20 -0
- package/dist/wizard-state.d.ts.map +1 -1
- package/dist/wizard-state.js +90 -3
- package/dist/wizard-state.js.map +1 -1
- package/dist/wizard-support.d.ts.map +1 -1
- package/dist/wizard-support.js +27 -1
- package/dist/wizard-support.js.map +1 -1
- package/dist/workflow-engine.d.ts +44 -2
- package/dist/workflow-engine.d.ts.map +1 -1
- package/dist/workflow-engine.js +932 -111
- package/dist/workflow-engine.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,604 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.runDispatchTurn = runDispatchTurn;
|
|
37
|
+
exports.extractTextFallbackDispatchCalls = extractTextFallbackDispatchCalls;
|
|
38
|
+
const data = __importStar(require("../local-data"));
|
|
39
|
+
const dispatch_tools_1 = require("./dispatch-tools");
|
|
40
|
+
const dispatch_executor_1 = require("./dispatch-executor");
|
|
41
|
+
const dispatch_hint_1 = require("./dispatch-hint");
|
|
42
|
+
const orchestrator_dispatch_prompt_1 = require("./orchestrator-dispatch-prompt");
|
|
43
|
+
// -----------------------------------------------------------------------------
|
|
44
|
+
// Top-level runner
|
|
45
|
+
// -----------------------------------------------------------------------------
|
|
46
|
+
const MAX_LLM_RETRIES_ON_VALIDATION_FAIL = 1;
|
|
47
|
+
/**
|
|
48
|
+
* Upper bound on LLM turns for multi-turn orchestrator tool use.
|
|
49
|
+
* Each turn either gathers context (executes read-side tools) or ends
|
|
50
|
+
* the dispatch (reply_directly / delegate_single / create_workflow).
|
|
51
|
+
* A single turn should never exceed a few tool calls, and the
|
|
52
|
+
* orchestrator should usually need ≤3 context turns; 8 is generous.
|
|
53
|
+
*/
|
|
54
|
+
const MAX_ORCHESTRATOR_TURNS = 8;
|
|
55
|
+
async function runDispatchTurn(input) {
|
|
56
|
+
const hint = (0, dispatch_hint_1.buildDispatchHint)({
|
|
57
|
+
userPrompt: input.userPrompt,
|
|
58
|
+
conversation: {
|
|
59
|
+
id: input.conversationId,
|
|
60
|
+
title: input.conversationTitle,
|
|
61
|
+
topic_id: input.topicId,
|
|
62
|
+
project_name: input.projectName,
|
|
63
|
+
project_folder: input.projectFolder,
|
|
64
|
+
turn_count: input.turnCount,
|
|
65
|
+
recent_summary: input.recentSummary,
|
|
66
|
+
recent_turns: input.recentTurnsForHint || null,
|
|
67
|
+
bootstrap_history_file: input.bootstrapHistoryFilePath || null,
|
|
68
|
+
},
|
|
69
|
+
activeBots: input.activeBots,
|
|
70
|
+
selectedWorkflowTemplate: input.selectedWorkflowTemplate || null,
|
|
71
|
+
candidateWorkflowPlan: input.candidateWorkflowPlan || null,
|
|
72
|
+
existingTodos: input.existingTodos,
|
|
73
|
+
effectivePolicyText: input.effectivePolicyText,
|
|
74
|
+
});
|
|
75
|
+
const systemPrompt = (0, orchestrator_dispatch_prompt_1.buildOrchestratorDispatchPrompt)({
|
|
76
|
+
hint,
|
|
77
|
+
additionalGuidance: input.additionalGuidance ?? null,
|
|
78
|
+
});
|
|
79
|
+
const validationContext = (0, dispatch_tools_1.buildDispatchValidationContext)(input.activeBots);
|
|
80
|
+
const resolution = buildResolutionContext(input.activeBots, input.existingTodos);
|
|
81
|
+
const executionContext = {
|
|
82
|
+
conversationId: input.conversationId,
|
|
83
|
+
projectId: input.projectId,
|
|
84
|
+
orchestratorActor: input.orchestratorActor || {
|
|
85
|
+
name: input.orchestratorBot?.name || 'Orchestrator',
|
|
86
|
+
actorId: input.orchestratorBot?.id || 'orchestrator',
|
|
87
|
+
},
|
|
88
|
+
resolution,
|
|
89
|
+
// Pass the raw user prompt through so the executor can enforce
|
|
90
|
+
// the position-aware include_user_prompt policy for every step
|
|
91
|
+
// it creates (Codex QA 2026-04-19 caveat on 5b43a736).
|
|
92
|
+
userPrompt: input.userPrompt,
|
|
93
|
+
recentContext: input.recentContext || null,
|
|
94
|
+
};
|
|
95
|
+
// Build the tool set: three dispatch tools + any read-side tools the
|
|
96
|
+
// caller wired. Read-side tools let the orchestrator gather context
|
|
97
|
+
// (read a file, search codebase, web search) directly without
|
|
98
|
+
// delegating simple tasks to workers.
|
|
99
|
+
const orchestratorTools = input.orchestratorTools || [];
|
|
100
|
+
const orchestratorToolMap = new Map(orchestratorTools.map((t) => [t.name, t]));
|
|
101
|
+
const tools = [
|
|
102
|
+
dispatch_tools_1.REPLY_DIRECTLY_SCHEMA,
|
|
103
|
+
dispatch_tools_1.DELEGATE_SINGLE_SCHEMA,
|
|
104
|
+
dispatch_tools_1.CREATE_WORKFLOW_SCHEMA,
|
|
105
|
+
...orchestratorTools.map((t) => ({
|
|
106
|
+
name: t.name,
|
|
107
|
+
description: t.description,
|
|
108
|
+
parameters: t.parameters,
|
|
109
|
+
})),
|
|
110
|
+
];
|
|
111
|
+
const messages = [
|
|
112
|
+
{ role: 'user', content: input.userPrompt },
|
|
113
|
+
];
|
|
114
|
+
let lastError = null;
|
|
115
|
+
let validationRetries = 0;
|
|
116
|
+
// "Non-productive" turns are LLM calls that produced neither a valid
|
|
117
|
+
// dispatch tool call nor a context-gathering tool call (e.g. the LLM
|
|
118
|
+
// just emitted prose with no tools, or called an unknown tool). We
|
|
119
|
+
// give the LLM one retry to recover; a second non-productive turn
|
|
120
|
+
// bails. Matches the prior MAX_LLM_RETRIES_ON_VALIDATION_FAIL=1
|
|
121
|
+
// behavior for those specific paths.
|
|
122
|
+
const MAX_NON_PRODUCTIVE_TURNS = 1;
|
|
123
|
+
let nonProductiveTurns = 0;
|
|
124
|
+
for (let turn = 0; turn < MAX_ORCHESTRATOR_TURNS; turn += 1) {
|
|
125
|
+
let response;
|
|
126
|
+
try {
|
|
127
|
+
response = await input.llm.chat({
|
|
128
|
+
system: systemPrompt,
|
|
129
|
+
messages,
|
|
130
|
+
tools,
|
|
131
|
+
toolChoice: 'required',
|
|
132
|
+
abortSignal: input.abortSignal,
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
catch (err) {
|
|
136
|
+
const candidateMessage = formatCandidateWorkflowFailure(input);
|
|
137
|
+
return {
|
|
138
|
+
userReplyText: candidateMessage
|
|
139
|
+
? `Orchestrator LLM call failed before approving the detected workflow: ${err?.message || err}. ${candidateMessage}`
|
|
140
|
+
: `Orchestrator LLM call failed: ${err?.message || err}. Please try again.`,
|
|
141
|
+
outcome: { kind: 'error', error: String(err?.message || err) },
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
// Partition the native tool calls into dispatch / orchestrator-tool /
|
|
145
|
+
// unknown buckets.
|
|
146
|
+
const allCalls = response?.toolCalls || [];
|
|
147
|
+
let dispatchToolCalls = extractDispatchToolCalls(allCalls);
|
|
148
|
+
const orchestratorCalls = allCalls.filter((c) => orchestratorToolMap.has(c.name));
|
|
149
|
+
const unknownCalls = allCalls.filter((c) => !DISPATCH_TOOL_NAMES.has(c.name) && !orchestratorToolMap.has(c.name));
|
|
150
|
+
// If no native calls at all, try the text fallback (CLI providers
|
|
151
|
+
// that can't emit native tool_use blocks).
|
|
152
|
+
if (allCalls.length === 0 && dispatchToolCalls.length === 0) {
|
|
153
|
+
const fromText = extractTextFallbackDispatchCalls(response?.content || '');
|
|
154
|
+
if (fromText.length > 0)
|
|
155
|
+
dispatchToolCalls = fromText;
|
|
156
|
+
}
|
|
157
|
+
const precreatedCandidateTaskIds = normalizeTaskIds(input.precreatedCandidateTaskIds);
|
|
158
|
+
// Orchestrator context-gathering turn: the LLM called one or more
|
|
159
|
+
// read-side tools (read_file, list_directory, etc.) to gather
|
|
160
|
+
// context. Execute them, feed results back, continue to the next
|
|
161
|
+
// turn. Mixing context-gathering with a dispatch call in the same
|
|
162
|
+
// turn is ambiguous (did it want to dispatch with or without the
|
|
163
|
+
// tool results?) so we reject that combination and retry.
|
|
164
|
+
if (orchestratorCalls.length > 0 && dispatchToolCalls.length === 0 && !input.toolContext) {
|
|
165
|
+
// Tools were advertised but no execution context provided — misuse.
|
|
166
|
+
return {
|
|
167
|
+
userReplyText: 'Orchestrator tool execution is not wired (missing toolContext). This is a configuration bug.',
|
|
168
|
+
outcome: { kind: 'error', error: 'orchestratorTools supplied without toolContext' },
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
if (orchestratorCalls.length > 0 && dispatchToolCalls.length === 0 && input.toolContext) {
|
|
172
|
+
messages.push({
|
|
173
|
+
role: 'assistant',
|
|
174
|
+
content: response?.content || '',
|
|
175
|
+
toolCalls: allCalls,
|
|
176
|
+
});
|
|
177
|
+
for (const call of orchestratorCalls) {
|
|
178
|
+
const def = orchestratorToolMap.get(call.name);
|
|
179
|
+
try {
|
|
180
|
+
const result = await def.execute(call.arguments, input.toolContext);
|
|
181
|
+
const body = result.success
|
|
182
|
+
? result.output
|
|
183
|
+
: `[TOOL ERROR] ${result.error || 'tool execution failed'}`;
|
|
184
|
+
messages.push({
|
|
185
|
+
role: 'tool',
|
|
186
|
+
content: body,
|
|
187
|
+
toolCallId: call.id,
|
|
188
|
+
toolName: call.name,
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
catch (err) {
|
|
192
|
+
messages.push({
|
|
193
|
+
role: 'tool',
|
|
194
|
+
content: `[TOOL ERROR] ${err?.message || String(err)}`,
|
|
195
|
+
toolCallId: call.id,
|
|
196
|
+
toolName: call.name,
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
// Context-gathering is productive — reset the non-productive counter.
|
|
201
|
+
nonProductiveTurns = 0;
|
|
202
|
+
continue;
|
|
203
|
+
}
|
|
204
|
+
if (orchestratorCalls.length > 0 && dispatchToolCalls.length > 0) {
|
|
205
|
+
lastError = 'Context-gathering tools and a dispatch tool were called in the same turn. Call context-gathering tools first, wait for their results, then call exactly one dispatch tool.';
|
|
206
|
+
messages.push({
|
|
207
|
+
role: 'assistant',
|
|
208
|
+
content: response?.content || '',
|
|
209
|
+
toolCalls: allCalls,
|
|
210
|
+
});
|
|
211
|
+
messages.push({
|
|
212
|
+
role: 'user',
|
|
213
|
+
content: `[DISPATCH ERROR]\n${lastError}`,
|
|
214
|
+
});
|
|
215
|
+
continue;
|
|
216
|
+
}
|
|
217
|
+
if (unknownCalls.length > 0 && dispatchToolCalls.length === 0) {
|
|
218
|
+
lastError = `The orchestrator LLM called unknown tool(s): ${unknownCalls.map((c) => c.name).join(', ')}. Only the configured tools are available.`;
|
|
219
|
+
messages.push({
|
|
220
|
+
role: 'assistant',
|
|
221
|
+
content: response?.content || '',
|
|
222
|
+
toolCalls: allCalls,
|
|
223
|
+
});
|
|
224
|
+
messages.push({
|
|
225
|
+
role: 'user',
|
|
226
|
+
content: `[DISPATCH ERROR]\n${lastError}`,
|
|
227
|
+
});
|
|
228
|
+
continue;
|
|
229
|
+
}
|
|
230
|
+
if (dispatchToolCalls.length === 0) {
|
|
231
|
+
if (precreatedCandidateTaskIds.length > 0) {
|
|
232
|
+
const approval = parsePrecreatedCandidateApproval(response?.content || '');
|
|
233
|
+
if (approval === 'approve') {
|
|
234
|
+
return buildPrecreatedWorkflowResult(input, precreatedCandidateTaskIds);
|
|
235
|
+
}
|
|
236
|
+
if (approval === 'reject') {
|
|
237
|
+
deletePrecreatedCandidateTasks(precreatedCandidateTaskIds, input);
|
|
238
|
+
return {
|
|
239
|
+
userReplyText: response?.content?.trim() || 'The proposed workflow was rejected by the orchestrator.',
|
|
240
|
+
outcome: { kind: 'reply_directly' },
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
lastError = precreatedCandidateTaskIds.length > 0
|
|
245
|
+
? 'The orchestrator LLM did not approve, reject, or modify the proposed workflow.'
|
|
246
|
+
: 'The orchestrator LLM did not return any of the expected dispatch tool calls (reply_directly / delegate_single / create_workflow).';
|
|
247
|
+
nonProductiveTurns += 1;
|
|
248
|
+
if (nonProductiveTurns > MAX_NON_PRODUCTIVE_TURNS)
|
|
249
|
+
break;
|
|
250
|
+
messages.push({
|
|
251
|
+
role: 'assistant',
|
|
252
|
+
content: response?.content || '',
|
|
253
|
+
toolCalls: allCalls,
|
|
254
|
+
});
|
|
255
|
+
messages.push({
|
|
256
|
+
role: 'user',
|
|
257
|
+
content: precreatedCandidateTaskIds.length > 0
|
|
258
|
+
? `[DISPATCH ERROR]\n${lastError}\nReply with APPROVE_PROPOSED_WORKFLOW, REJECT_PROPOSED_WORKFLOW, or call create_workflow with a modified plan.`
|
|
259
|
+
: `[DISPATCH ERROR]\n${lastError}\nCall exactly one of the three dispatch tools and try again.`,
|
|
260
|
+
});
|
|
261
|
+
continue;
|
|
262
|
+
}
|
|
263
|
+
if (dispatchToolCalls.length > 1) {
|
|
264
|
+
// Per Codex QA 2026-04-18 (finding #3): reject multiple dispatch
|
|
265
|
+
// calls. Persisting the first and ignoring the rest could create
|
|
266
|
+
// a partial or unintended plan. Surface the error and retry.
|
|
267
|
+
lastError = `The orchestrator LLM emitted ${dispatchToolCalls.length} dispatch tool calls (${dispatchToolCalls
|
|
268
|
+
.map((c) => c.name)
|
|
269
|
+
.join(', ')}). Exactly one is required.`;
|
|
270
|
+
nonProductiveTurns += 1;
|
|
271
|
+
if (nonProductiveTurns > MAX_NON_PRODUCTIVE_TURNS)
|
|
272
|
+
break;
|
|
273
|
+
messages.push({
|
|
274
|
+
role: 'assistant',
|
|
275
|
+
content: response?.content || '',
|
|
276
|
+
toolCalls: allCalls,
|
|
277
|
+
});
|
|
278
|
+
messages.push({
|
|
279
|
+
role: 'user',
|
|
280
|
+
content: `[DISPATCH ERROR]\n${lastError}\nCall exactly one dispatch tool and try again.`,
|
|
281
|
+
});
|
|
282
|
+
continue;
|
|
283
|
+
}
|
|
284
|
+
const toolCall = dispatchToolCalls[0];
|
|
285
|
+
if (precreatedCandidateTaskIds.length > 0 && toolCall.name === 'reply_directly') {
|
|
286
|
+
const text = String(toolCall.arguments?.text || '');
|
|
287
|
+
const approval = parsePrecreatedCandidateApproval(text);
|
|
288
|
+
if (approval === 'approve') {
|
|
289
|
+
return buildPrecreatedWorkflowResult(input, precreatedCandidateTaskIds);
|
|
290
|
+
}
|
|
291
|
+
deletePrecreatedCandidateTasks(precreatedCandidateTaskIds, input);
|
|
292
|
+
}
|
|
293
|
+
const validation = validateToolCall(toolCall, validationContext);
|
|
294
|
+
if (!validation.ok) {
|
|
295
|
+
if (validationRetries >= MAX_LLM_RETRIES_ON_VALIDATION_FAIL) {
|
|
296
|
+
lastError = validation.error;
|
|
297
|
+
break;
|
|
298
|
+
}
|
|
299
|
+
validationRetries += 1;
|
|
300
|
+
lastError = validation.error;
|
|
301
|
+
messages.push({
|
|
302
|
+
role: 'assistant',
|
|
303
|
+
content: response?.content || '',
|
|
304
|
+
toolCalls: allCalls,
|
|
305
|
+
});
|
|
306
|
+
messages.push({
|
|
307
|
+
role: 'tool',
|
|
308
|
+
content: `[VALIDATION ERROR]\n${validation.error}\nRetry with corrected arguments.`,
|
|
309
|
+
toolCallId: toolCall.id,
|
|
310
|
+
toolName: toolCall.name,
|
|
311
|
+
});
|
|
312
|
+
continue;
|
|
313
|
+
}
|
|
314
|
+
const titleValidation = validateCandidatePlanTitles(toolCall, input);
|
|
315
|
+
if (!titleValidation.ok) {
|
|
316
|
+
if (validationRetries >= MAX_LLM_RETRIES_ON_VALIDATION_FAIL) {
|
|
317
|
+
lastError = titleValidation.error;
|
|
318
|
+
break;
|
|
319
|
+
}
|
|
320
|
+
validationRetries += 1;
|
|
321
|
+
lastError = titleValidation.error;
|
|
322
|
+
messages.push({
|
|
323
|
+
role: 'assistant',
|
|
324
|
+
content: response?.content || '',
|
|
325
|
+
toolCalls: allCalls,
|
|
326
|
+
});
|
|
327
|
+
messages.push({
|
|
328
|
+
role: 'tool',
|
|
329
|
+
content: `[VALIDATION ERROR]\n${titleValidation.error}\nRetry with corrected titles.`,
|
|
330
|
+
toolCallId: toolCall.id,
|
|
331
|
+
toolName: toolCall.name,
|
|
332
|
+
});
|
|
333
|
+
continue;
|
|
334
|
+
}
|
|
335
|
+
if (precreatedCandidateTaskIds.length > 0 && toolCall.name !== 'reply_directly') {
|
|
336
|
+
deletePrecreatedCandidateTasks(precreatedCandidateTaskIds, input);
|
|
337
|
+
}
|
|
338
|
+
const executed = executeDispatchCall(toolCall, executionContext);
|
|
339
|
+
return buildRunnerResult(executed, toolCall);
|
|
340
|
+
}
|
|
341
|
+
// Exhausted retries.
|
|
342
|
+
const candidateMessage = formatCandidateWorkflowFailure(input);
|
|
343
|
+
const surfaced = lastError || 'Orchestrator could not produce a valid dispatch plan after retries.';
|
|
344
|
+
return {
|
|
345
|
+
userReplyText: candidateMessage
|
|
346
|
+
? `Orchestrator couldn't verify the proposed workflow — please clarify:\n${surfaced}\n${candidateMessage}`
|
|
347
|
+
: `Orchestrator couldn't produce a valid plan — please clarify:\n${surfaced}`,
|
|
348
|
+
outcome: { kind: 'error', error: surfaced },
|
|
349
|
+
};
|
|
350
|
+
}
|
|
351
|
+
// -----------------------------------------------------------------------------
|
|
352
|
+
// Helpers
|
|
353
|
+
// -----------------------------------------------------------------------------
|
|
354
|
+
const DISPATCH_TOOL_NAMES = new Set(['reply_directly', 'delegate_single', 'create_workflow']);
|
|
355
|
+
function extractDispatchToolCalls(calls) {
|
|
356
|
+
return calls.filter((call) => DISPATCH_TOOL_NAMES.has(call.name));
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Parse fenced JSON dispatch blocks from an LLM text response. Used when
|
|
360
|
+
* the provider can't return native tool calls (Claude CLI, Codex CLI, or
|
|
361
|
+
* any other text-only interface). The prompt instructs the LLM to emit
|
|
362
|
+
* exactly one fenced block of the form:
|
|
363
|
+
*
|
|
364
|
+
* ```json
|
|
365
|
+
* {"tool": "delegate_single", "arguments": { ... }}
|
|
366
|
+
* ```
|
|
367
|
+
*
|
|
368
|
+
* Blocks that are malformed JSON, not objects, or whose `tool` is not one
|
|
369
|
+
* of the three dispatch tools are silently skipped — the caller's
|
|
370
|
+
* zero/many rejection logic will flag the overall turn appropriately.
|
|
371
|
+
*/
|
|
372
|
+
function extractTextFallbackDispatchCalls(content) {
|
|
373
|
+
if (!content)
|
|
374
|
+
return [];
|
|
375
|
+
const results = [];
|
|
376
|
+
const fenceRe = /```(?:json)?\s*\n?([\s\S]*?)```/g;
|
|
377
|
+
let match;
|
|
378
|
+
let idx = 0;
|
|
379
|
+
while ((match = fenceRe.exec(content)) !== null) {
|
|
380
|
+
const raw = match[1].trim();
|
|
381
|
+
if (!raw)
|
|
382
|
+
continue;
|
|
383
|
+
let parsed;
|
|
384
|
+
try {
|
|
385
|
+
parsed = JSON.parse(raw);
|
|
386
|
+
}
|
|
387
|
+
catch {
|
|
388
|
+
continue;
|
|
389
|
+
}
|
|
390
|
+
if (!parsed || typeof parsed !== 'object')
|
|
391
|
+
continue;
|
|
392
|
+
const obj = parsed;
|
|
393
|
+
const toolName = typeof obj.tool === 'string' ? obj.tool : null;
|
|
394
|
+
if (!toolName || !DISPATCH_TOOL_NAMES.has(toolName))
|
|
395
|
+
continue;
|
|
396
|
+
const args = obj.arguments && typeof obj.arguments === 'object'
|
|
397
|
+
? obj.arguments
|
|
398
|
+
: {};
|
|
399
|
+
results.push({
|
|
400
|
+
id: `text-fallback-${idx}`,
|
|
401
|
+
name: toolName,
|
|
402
|
+
arguments: args,
|
|
403
|
+
});
|
|
404
|
+
idx += 1;
|
|
405
|
+
}
|
|
406
|
+
return results;
|
|
407
|
+
}
|
|
408
|
+
function validateToolCall(toolCall, ctx) {
|
|
409
|
+
switch (toolCall.name) {
|
|
410
|
+
case 'reply_directly':
|
|
411
|
+
return (0, dispatch_tools_1.validateReplyDirectly)(toolCall.arguments);
|
|
412
|
+
case 'delegate_single':
|
|
413
|
+
return (0, dispatch_tools_1.validateDelegateSingle)(toolCall.arguments, ctx);
|
|
414
|
+
case 'create_workflow':
|
|
415
|
+
return (0, dispatch_tools_1.validateCreateWorkflow)(toolCall.arguments, ctx);
|
|
416
|
+
default:
|
|
417
|
+
return { ok: false, error: `Unexpected tool call "${toolCall.name}".` };
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
function validateCandidatePlanTitles(toolCall, input) {
|
|
421
|
+
const requiresTitles = Boolean(input.selectedWorkflowTemplate || input.candidateWorkflowPlan);
|
|
422
|
+
if (!requiresTitles)
|
|
423
|
+
return { ok: true };
|
|
424
|
+
if (toolCall.name !== 'create_workflow')
|
|
425
|
+
return { ok: true };
|
|
426
|
+
const args = toolCall.arguments;
|
|
427
|
+
const steps = Array.isArray(args?.steps) ? args.steps : [];
|
|
428
|
+
for (let i = 0; i < steps.length; i += 1) {
|
|
429
|
+
const title = String(steps[i]?.title || '').trim();
|
|
430
|
+
const botName = String(steps[i]?.bot_name || '').trim();
|
|
431
|
+
if (!isSpecificTaskTitle(title, botName)) {
|
|
432
|
+
return {
|
|
433
|
+
ok: false,
|
|
434
|
+
error: `Workflow step ${i + 1} needs a specific TODO title written from the user's request. Do not use generic labels like "Coding", "QA", "Verify", or "Complete ${botName || 'worker'}'s workflow step".`,
|
|
435
|
+
};
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
return { ok: true };
|
|
439
|
+
}
|
|
440
|
+
function isSpecificTaskTitle(rawTitle, botName) {
|
|
441
|
+
const trimmed = rawTitle.trim();
|
|
442
|
+
if (!trimmed || trimmed.length < 6)
|
|
443
|
+
return false;
|
|
444
|
+
const withoutBot = botName && trimmed.toLowerCase().startsWith(`${botName.toLowerCase()}:`)
|
|
445
|
+
? trimmed.slice(botName.length + 1).trim()
|
|
446
|
+
: trimmed;
|
|
447
|
+
const normalized = withoutBot.toLowerCase().replace(/\s+/g, ' ').trim();
|
|
448
|
+
if (!normalized || normalized.length < 6)
|
|
449
|
+
return false;
|
|
450
|
+
if (/^complete .+ workflow step\.?$/.test(normalized))
|
|
451
|
+
return false;
|
|
452
|
+
if (/\bworkflow step\b/.test(normalized))
|
|
453
|
+
return false;
|
|
454
|
+
const generic = new Set([
|
|
455
|
+
'coding',
|
|
456
|
+
'code',
|
|
457
|
+
'build',
|
|
458
|
+
'building',
|
|
459
|
+
'implementation',
|
|
460
|
+
'implement',
|
|
461
|
+
'qa',
|
|
462
|
+
'quality assurance',
|
|
463
|
+
'review',
|
|
464
|
+
'verify',
|
|
465
|
+
'verification',
|
|
466
|
+
'research',
|
|
467
|
+
'planning',
|
|
468
|
+
'plan',
|
|
469
|
+
'do task',
|
|
470
|
+
'handle request',
|
|
471
|
+
'assigned task',
|
|
472
|
+
]);
|
|
473
|
+
return !generic.has(normalized);
|
|
474
|
+
}
|
|
475
|
+
function normalizeTaskIds(ids) {
|
|
476
|
+
return (ids || [])
|
|
477
|
+
.map((id) => Number(id))
|
|
478
|
+
.filter((id) => Number.isFinite(id) && id > 0);
|
|
479
|
+
}
|
|
480
|
+
function parsePrecreatedCandidateApproval(content) {
|
|
481
|
+
const text = String(content || '').trim();
|
|
482
|
+
if (!text)
|
|
483
|
+
return null;
|
|
484
|
+
if (/\b(REJECT_PROPOSED_WORKFLOW|reject|rejected|do not start|do not run|wrong workflow|needs clarification|clarify)\b/i.test(text)) {
|
|
485
|
+
return 'reject';
|
|
486
|
+
}
|
|
487
|
+
if (/\b(APPROVE_PROPOSED_WORKFLOW|approve|approved|agree|agreed|valid|looks good|correct|yes|ok|okay|go ahead|start|run it|use this workflow)\b/i.test(text)) {
|
|
488
|
+
return 'approve';
|
|
489
|
+
}
|
|
490
|
+
return null;
|
|
491
|
+
}
|
|
492
|
+
function buildPrecreatedWorkflowResult(input, taskIds) {
|
|
493
|
+
const tasks = taskIds
|
|
494
|
+
.map((id) => data.getTodoTask(id, 'active'))
|
|
495
|
+
.filter((task) => Boolean(task));
|
|
496
|
+
const ownerNames = tasks.map((task) => task.owner_name || '').filter(Boolean);
|
|
497
|
+
return {
|
|
498
|
+
userReplyText: `Approved proposed workflow: ${ownerNames.join(' -> ') || taskIds.join(' -> ')}.`,
|
|
499
|
+
outcome: { kind: 'create_workflow', taskIds, ownerNames },
|
|
500
|
+
};
|
|
501
|
+
}
|
|
502
|
+
function deletePrecreatedCandidateTasks(taskIds, input) {
|
|
503
|
+
const actor = input.orchestratorActor || {
|
|
504
|
+
name: input.orchestratorBot?.name || 'Orchestrator',
|
|
505
|
+
actorId: input.orchestratorBot?.id || 'orchestrator',
|
|
506
|
+
};
|
|
507
|
+
for (const taskId of taskIds) {
|
|
508
|
+
try {
|
|
509
|
+
data.deleteTodoTask(taskId, {
|
|
510
|
+
actor: { actorType: 'orchestrator', actorId: actor.actorId },
|
|
511
|
+
});
|
|
512
|
+
}
|
|
513
|
+
catch {
|
|
514
|
+
// Best effort. If a user touched the proposed task concurrently, leave it.
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
function formatCandidateWorkflowFailure(input) {
|
|
519
|
+
const candidate = input.candidateWorkflowPlan;
|
|
520
|
+
if (!candidate?.steps?.length)
|
|
521
|
+
return null;
|
|
522
|
+
const names = candidate.steps.map((step) => String(step.bot_name || '').trim()).filter(Boolean);
|
|
523
|
+
if (names.length === 0)
|
|
524
|
+
return null;
|
|
525
|
+
const precreated = normalizeTaskIds(input.precreatedCandidateTaskIds).length > 0;
|
|
526
|
+
return precreated
|
|
527
|
+
? `Proposed TODOs are visible for: ${names.join(' -> ')}. No workers were started.`
|
|
528
|
+
: `Detected workflow candidate: ${names.join(' -> ')}. No workers were started. Please try again.`;
|
|
529
|
+
}
|
|
530
|
+
function executeDispatchCall(toolCall, ctx) {
|
|
531
|
+
switch (toolCall.name) {
|
|
532
|
+
case 'reply_directly':
|
|
533
|
+
return (0, dispatch_executor_1.executeReplyDirectly)(toolCall.arguments);
|
|
534
|
+
case 'delegate_single':
|
|
535
|
+
return (0, dispatch_executor_1.executeDelegateSingle)(toolCall.arguments, ctx);
|
|
536
|
+
case 'create_workflow':
|
|
537
|
+
return (0, dispatch_executor_1.executeCreateWorkflow)(toolCall.arguments, ctx);
|
|
538
|
+
default:
|
|
539
|
+
return { kind: 'error', error: `Unexpected tool call "${toolCall.name}".` };
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
function buildRunnerResult(executed, toolCall) {
|
|
543
|
+
if (executed.kind === 'error') {
|
|
544
|
+
return {
|
|
545
|
+
userReplyText: `Dispatch failed: ${executed.error}`,
|
|
546
|
+
outcome: { kind: 'error', error: executed.error },
|
|
547
|
+
};
|
|
548
|
+
}
|
|
549
|
+
if (executed.kind === 'reply_directly') {
|
|
550
|
+
return {
|
|
551
|
+
userReplyText: executed.text,
|
|
552
|
+
outcome: { kind: 'reply_directly' },
|
|
553
|
+
};
|
|
554
|
+
}
|
|
555
|
+
if (executed.kind === 'delegate_single') {
|
|
556
|
+
return {
|
|
557
|
+
userReplyText: summarizeDelegate(executed.task.title, executed.assignedBot.name),
|
|
558
|
+
outcome: {
|
|
559
|
+
kind: 'delegate_single',
|
|
560
|
+
taskId: executed.task.id,
|
|
561
|
+
ownerName: executed.assignedBot.name,
|
|
562
|
+
},
|
|
563
|
+
};
|
|
564
|
+
}
|
|
565
|
+
// create_workflow
|
|
566
|
+
return {
|
|
567
|
+
userReplyText: summarizeWorkflow(executed.tasks, executed.assignedBots),
|
|
568
|
+
outcome: {
|
|
569
|
+
kind: 'create_workflow',
|
|
570
|
+
taskIds: executed.tasks.map((t) => t.id),
|
|
571
|
+
ownerNames: executed.assignedBots.map((b) => b.name),
|
|
572
|
+
},
|
|
573
|
+
};
|
|
574
|
+
}
|
|
575
|
+
function summarizeDelegate(title, botName) {
|
|
576
|
+
return `Delegated to ${botName}: ${title}`;
|
|
577
|
+
}
|
|
578
|
+
function summarizeWorkflow(tasks, bots) {
|
|
579
|
+
const lines = [
|
|
580
|
+
`Queued a ${tasks.length}-step workflow:`,
|
|
581
|
+
...tasks.map((t, i) => ` ${i + 1}. ${bots[i]?.name || 'unknown'} — ${t.title}`),
|
|
582
|
+
];
|
|
583
|
+
return lines.join('\n');
|
|
584
|
+
}
|
|
585
|
+
/**
|
|
586
|
+
* Build the role-resolution context used by dispatch-executor. Includes the
|
|
587
|
+
* set of bots that already have active (non-completed) TODOs in this
|
|
588
|
+
* conversation, for the tie-break rule in Decision 2.
|
|
589
|
+
*/
|
|
590
|
+
function buildResolutionContext(activeBots, existingTodos) {
|
|
591
|
+
const busy = new Set();
|
|
592
|
+
for (const t of existingTodos) {
|
|
593
|
+
if (!t.owner_name)
|
|
594
|
+
continue;
|
|
595
|
+
const status = (t.status || '').toLowerCase();
|
|
596
|
+
// "active" meaning not completed/cancelled/blocked. Keep this in sync with
|
|
597
|
+
// whatever statuses the TODO system considers terminal.
|
|
598
|
+
if (status === 'completed' || status === 'cancelled' || status === 'done')
|
|
599
|
+
continue;
|
|
600
|
+
busy.add(t.owner_name);
|
|
601
|
+
}
|
|
602
|
+
return { activeBots, botsWithActiveTodos: busy };
|
|
603
|
+
}
|
|
604
|
+
//# sourceMappingURL=dispatch-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatch-runner.js","sourceRoot":"","sources":["../../src/orchestration/dispatch-runner.ts"],"names":[],"mappings":"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"}
|