openhorse 0.2.5 → 0.2.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/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +139 -2
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/types.d.ts +21 -0
- package/dist/commands/types.d.ts.map +1 -1
- package/dist/commands/types.js.map +1 -1
- package/dist/core/tool-artifacts.d.ts +38 -0
- package/dist/core/tool-artifacts.d.ts.map +1 -0
- package/dist/core/tool-artifacts.js +134 -0
- package/dist/core/tool-artifacts.js.map +1 -0
- package/dist/core/warn-dedup.d.ts +39 -0
- package/dist/core/warn-dedup.d.ts.map +1 -0
- package/dist/core/warn-dedup.js +80 -0
- package/dist/core/warn-dedup.js.map +1 -0
- package/dist/framework/index.d.ts +2 -0
- package/dist/framework/index.d.ts.map +1 -1
- package/dist/framework/index.js +5 -1
- package/dist/framework/index.js.map +1 -1
- package/dist/framework/query.d.ts +4 -0
- package/dist/framework/query.d.ts.map +1 -1
- package/dist/framework/query.js +55 -139
- package/dist/framework/query.js.map +1 -1
- package/dist/framework/tool-scheduler.d.ts +103 -0
- package/dist/framework/tool-scheduler.d.ts.map +1 -0
- package/dist/framework/tool-scheduler.js +242 -0
- package/dist/framework/tool-scheduler.js.map +1 -0
- package/dist/framework/tool-state.d.ts +13 -0
- package/dist/framework/tool-state.d.ts.map +1 -1
- package/dist/framework/tool-state.js +1 -0
- package/dist/framework/tool-state.js.map +1 -1
- package/dist/framework/tool.d.ts +13 -0
- package/dist/framework/tool.d.ts.map +1 -1
- package/dist/framework/tool.js.map +1 -1
- package/dist/harness/context-harness.d.ts +1 -0
- package/dist/harness/context-harness.d.ts.map +1 -1
- package/dist/harness/context-harness.js +9 -10
- package/dist/harness/context-harness.js.map +1 -1
- package/dist/harness/ledger.d.ts +1 -0
- package/dist/harness/ledger.d.ts.map +1 -1
- package/dist/harness/ledger.js +2 -1
- package/dist/harness/ledger.js.map +1 -1
- package/dist/ink-ui/screens/ReplScreen.d.ts.map +1 -1
- package/dist/ink-ui/screens/ReplScreen.js +29 -0
- package/dist/ink-ui/screens/ReplScreen.js.map +1 -1
- package/dist/print-ui/launch.d.ts.map +1 -1
- package/dist/print-ui/launch.js +7 -0
- package/dist/print-ui/launch.js.map +1 -1
- package/dist/runtime/agent-runtime-controller.js +1 -1
- package/dist/runtime/agent-runtime-controller.js.map +1 -1
- package/dist/runtime/agent-runtime-protocol.d.ts +4 -1
- package/dist/runtime/agent-runtime-protocol.d.ts.map +1 -1
- package/dist/runtime/agent-runtime-protocol.js +6 -0
- package/dist/runtime/agent-runtime-protocol.js.map +1 -1
- package/dist/runtime/chat-controller.d.ts +1 -0
- package/dist/runtime/chat-controller.d.ts.map +1 -1
- package/dist/runtime/chat-controller.js +47 -9
- package/dist/runtime/chat-controller.js.map +1 -1
- package/dist/runtime/ui-events.d.ts +17 -0
- package/dist/runtime/ui-events.d.ts.map +1 -1
- package/dist/services/llm.d.ts +17 -0
- package/dist/services/llm.d.ts.map +1 -1
- package/dist/services/llm.js +11 -0
- package/dist/services/llm.js.map +1 -1
- package/dist/services/session-index.d.ts +5 -0
- package/dist/services/session-index.d.ts.map +1 -1
- package/dist/services/session-index.js +19 -10
- package/dist/services/session-index.js.map +1 -1
- package/dist/services/session-storage.d.ts +10 -0
- package/dist/services/session-storage.d.ts.map +1 -1
- package/dist/services/session-storage.js +58 -0
- package/dist/services/session-storage.js.map +1 -1
- package/dist/services/web-search-adapters.d.ts.map +1 -1
- package/dist/services/web-search-adapters.js +20 -1
- package/dist/services/web-search-adapters.js.map +1 -1
- package/dist/services/web-search-mcp.d.ts.map +1 -1
- package/dist/services/web-search-mcp.js +20 -1
- package/dist/services/web-search-mcp.js.map +1 -1
- package/dist/skills/loader.d.ts.map +1 -1
- package/dist/skills/loader.js +4 -3
- package/dist/skills/loader.js.map +1 -1
- package/dist/terminal-ui/launch.d.ts.map +1 -1
- package/dist/terminal-ui/launch.js +40 -18
- package/dist/terminal-ui/launch.js.map +1 -1
- package/dist/tools/index.d.ts +10 -2
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +145 -19
- package/dist/tools/index.js.map +1 -1
- package/dist/tui-ui/layout.js +22 -0
- package/dist/tui-ui/layout.js.map +1 -1
- package/dist/tui-ui/runner.d.ts.map +1 -1
- package/dist/tui-ui/runner.js +21 -0
- package/dist/tui-ui/runner.js.map +1 -1
- package/dist/tui-ui/state.d.ts +8 -1
- package/dist/tui-ui/state.d.ts.map +1 -1
- package/dist/tui-ui/state.js +8 -0
- package/dist/tui-ui/state.js.map +1 -1
- package/dist/ui-v2/components/edit-preview-picker.d.ts +26 -0
- package/dist/ui-v2/components/edit-preview-picker.d.ts.map +1 -0
- package/dist/ui-v2/components/edit-preview-picker.js +79 -0
- package/dist/ui-v2/components/edit-preview-picker.js.map +1 -0
- package/dist/ui-v2/index.d.ts +1 -0
- package/dist/ui-v2/index.d.ts.map +1 -1
- package/dist/ui-v2/index.js +1 -0
- package/dist/ui-v2/index.js.map +1 -1
- package/dist/ui-v2/types.d.ts +1 -1
- package/dist/ui-v2/types.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/framework/query.js
CHANGED
|
@@ -14,6 +14,7 @@ exports.query = query;
|
|
|
14
14
|
const tool_1 = require("./tool");
|
|
15
15
|
const strategy_tracker_1 = require("../core/strategy-tracker");
|
|
16
16
|
const auto_compact_1 = require("../services/compact/auto-compact");
|
|
17
|
+
const tool_scheduler_1 = require("./tool-scheduler");
|
|
17
18
|
function isAborted(signal) {
|
|
18
19
|
return signal?.aborted === true;
|
|
19
20
|
}
|
|
@@ -89,175 +90,90 @@ async function* query(params) {
|
|
|
89
90
|
harness?.recordAssistantResponse(response);
|
|
90
91
|
// Handle tool calls
|
|
91
92
|
if (response.toolCalls && response.toolCalls.length > 0) {
|
|
93
|
+
const toolCalls = response.toolCalls;
|
|
92
94
|
yield {
|
|
93
95
|
type: 'assistant_tool_calls',
|
|
94
96
|
content: response.content,
|
|
95
|
-
toolCalls
|
|
97
|
+
toolCalls,
|
|
96
98
|
};
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
// Re-serialize arguments to ensure valid JSON for next API call
|
|
115
|
-
tc.function.arguments = JSON.stringify(args);
|
|
116
|
-
// Start tracking this approach
|
|
117
|
-
const attemptId = strategyTracker.startApproach(tc.function.name);
|
|
118
|
-
strategyTracker.addTool(attemptId, tc.function.name);
|
|
99
|
+
const preparedCalls = (0, tool_scheduler_1.prepareToolCalls)({
|
|
100
|
+
toolCalls,
|
|
101
|
+
tools,
|
|
102
|
+
toolExecutor,
|
|
103
|
+
permissionMode: params.permissionMode,
|
|
104
|
+
toolConfirmation: params.toolConfirmation,
|
|
105
|
+
confirmToolUse: params.confirmToolUse,
|
|
106
|
+
toolContext: params.toolContext,
|
|
107
|
+
abortSignal,
|
|
108
|
+
startApproach: (toolName) => strategyTracker.startApproach(toolName),
|
|
109
|
+
addToolToTracker: (attemptId, toolName) => strategyTracker.addTool(attemptId, toolName),
|
|
110
|
+
harnessDriftCheck: harness ? ({ name, args }) => harness.beforeToolUse({ name, args }) : undefined,
|
|
111
|
+
harnessBlockedResult: harness ? (drift) => harness.asToolBlockedResult(drift) : undefined,
|
|
112
|
+
});
|
|
113
|
+
for (const prepared of preparedCalls) {
|
|
119
114
|
yield {
|
|
120
115
|
type: 'tool_call',
|
|
121
|
-
name: tc.function.name,
|
|
122
|
-
args,
|
|
123
|
-
callId: tc.id,
|
|
124
|
-
batchCount:
|
|
125
|
-
batchIndex:
|
|
126
|
-
};
|
|
127
|
-
const start = Date.now();
|
|
128
|
-
const drift = harness?.beforeToolUse({ name: tc.function.name, args });
|
|
129
|
-
// Permission check before execution
|
|
130
|
-
let result;
|
|
131
|
-
const tool = tools.find(t => t.name === tc.function.name);
|
|
132
|
-
const executeToolCall = async () => {
|
|
133
|
-
try {
|
|
134
|
-
return await toolExecutor(tc.function.name, args, abortSignal);
|
|
135
|
-
}
|
|
136
|
-
catch (err) {
|
|
137
|
-
return JSON.stringify({
|
|
138
|
-
success: false,
|
|
139
|
-
error: `Tool execution error: ${err.message}`,
|
|
140
|
-
});
|
|
141
|
-
}
|
|
116
|
+
name: prepared.tc.function.name,
|
|
117
|
+
args: prepared.args,
|
|
118
|
+
callId: prepared.tc.id,
|
|
119
|
+
batchCount: toolCalls.length,
|
|
120
|
+
batchIndex: prepared.index,
|
|
142
121
|
};
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
const confirmation = params.toolConfirmation ?? 'ask';
|
|
156
|
-
if (confirmation === 'allow') {
|
|
157
|
-
result = await executeToolCall();
|
|
158
|
-
}
|
|
159
|
-
else if (params.confirmToolUse && confirmation === 'ask') {
|
|
160
|
-
const approved = await params.confirmToolUse({
|
|
161
|
-
name: tc.function.name,
|
|
162
|
-
args,
|
|
163
|
-
reason: perm.reason,
|
|
164
|
-
abortSignal,
|
|
165
|
-
});
|
|
166
|
-
result = approved
|
|
167
|
-
? await executeToolCall()
|
|
168
|
-
: JSON.stringify({
|
|
169
|
-
success: false,
|
|
170
|
-
error: `Tool ${tc.function.name} requires user confirmation and was denied by user.`,
|
|
171
|
-
});
|
|
172
|
-
}
|
|
173
|
-
else {
|
|
174
|
-
result = JSON.stringify({
|
|
175
|
-
success: false,
|
|
176
|
-
error: confirmation === 'deny'
|
|
177
|
-
? `Tool ${tc.function.name} requires user confirmation and was denied by toolConfirmation=deny.`
|
|
178
|
-
: `Tool ${tc.function.name} requires user confirmation.`,
|
|
179
|
-
});
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
else {
|
|
183
|
-
// Issue #32 #3.2: 透传 abortSignal
|
|
184
|
-
result = await executeToolCall();
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
else {
|
|
188
|
-
// Issue #32 #3.2: 透传 abortSignal
|
|
189
|
-
result = await executeToolCall();
|
|
190
|
-
}
|
|
191
|
-
const duration = Date.now() - start;
|
|
192
|
-
// Issue #21 修复:解析结果,提取 success/error 字段
|
|
193
|
-
let toolSuccess = true;
|
|
194
|
-
let toolError;
|
|
195
|
-
let toolSummary;
|
|
196
|
-
let toolOutputBytes;
|
|
197
|
-
let strategyResult = 'success';
|
|
198
|
-
let errorMsg;
|
|
199
|
-
try {
|
|
200
|
-
const parsed = JSON.parse(result);
|
|
201
|
-
toolSuccess = parsed.success === true;
|
|
202
|
-
toolError = parsed.error;
|
|
203
|
-
toolSummary = typeof parsed.summary === 'string' ? parsed.summary : undefined;
|
|
204
|
-
toolOutputBytes = typeof parsed.outputBytes === 'number' ? parsed.outputBytes : undefined;
|
|
205
|
-
if (parsed.success === false) {
|
|
206
|
-
strategyResult = 'failed';
|
|
207
|
-
errorMsg = parsed.error || 'Unknown error';
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
catch {
|
|
211
|
-
strategyResult = 'failed';
|
|
212
|
-
errorMsg = 'Invalid result';
|
|
213
|
-
toolSuccess = false;
|
|
214
|
-
toolError = 'Invalid JSON result';
|
|
122
|
+
}
|
|
123
|
+
for await (const executed of (0, tool_scheduler_1.executeToolCalls)(preparedCalls, {
|
|
124
|
+
toolExecutor,
|
|
125
|
+
abortSignal,
|
|
126
|
+
confirmToolUse: params.confirmToolUse,
|
|
127
|
+
permissionMode: params.permissionMode,
|
|
128
|
+
toolConfirmation: params.toolConfirmation,
|
|
129
|
+
harnessBlockedResult: harness ? (drift) => harness.asToolBlockedResult(drift) : undefined,
|
|
130
|
+
})) {
|
|
131
|
+
if (isAborted(abortSignal)) {
|
|
132
|
+
yield cancelledEvent(llm);
|
|
133
|
+
return;
|
|
215
134
|
}
|
|
216
|
-
|
|
135
|
+
const { prepared } = executed;
|
|
136
|
+
const { tc, args, attemptId } = prepared;
|
|
137
|
+
strategyTracker.recordResult(attemptId, executed.strategyResult, executed.strategyError, executed.duration);
|
|
217
138
|
harness?.recordToolResult({
|
|
218
139
|
name: tc.function.name,
|
|
219
140
|
args,
|
|
220
|
-
result,
|
|
221
|
-
duration,
|
|
222
|
-
success:
|
|
223
|
-
error:
|
|
141
|
+
result: executed.result,
|
|
142
|
+
duration: executed.duration,
|
|
143
|
+
success: executed.success,
|
|
144
|
+
error: executed.error,
|
|
145
|
+
summary: executed.summary,
|
|
224
146
|
});
|
|
225
147
|
yield {
|
|
226
148
|
type: 'tool_result',
|
|
227
149
|
name: tc.function.name,
|
|
228
150
|
args,
|
|
229
151
|
callId: tc.id,
|
|
230
|
-
result,
|
|
231
|
-
duration,
|
|
232
|
-
success:
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
152
|
+
result: executed.result,
|
|
153
|
+
duration: executed.duration,
|
|
154
|
+
success: executed.success,
|
|
155
|
+
artifactRef: executed.artifactRef,
|
|
156
|
+
error: executed.error,
|
|
157
|
+
summary: executed.summary,
|
|
158
|
+
outputBytes: executed.outputBytes,
|
|
159
|
+
batchCount: toolCalls.length,
|
|
160
|
+
batchIndex: prepared.index,
|
|
238
161
|
};
|
|
239
|
-
if (isAborted(abortSignal)) {
|
|
240
|
-
yield cancelledEvent(llm);
|
|
241
|
-
return;
|
|
242
|
-
}
|
|
243
162
|
messages.push({
|
|
244
163
|
role: 'tool',
|
|
245
|
-
content: result,
|
|
164
|
+
content: executed.result,
|
|
246
165
|
tool_call_id: tc.id,
|
|
247
166
|
});
|
|
248
|
-
|
|
249
|
-
if (!toolSuccess) {
|
|
167
|
+
if (!executed.success) {
|
|
250
168
|
messages.push({
|
|
251
169
|
role: 'user',
|
|
252
|
-
content: `[System] Tool ${tc.function.name} failed: ${
|
|
170
|
+
content: `[System] Tool ${tc.function.name} failed: ${executed.error}. Consider alternative approaches or inform the user.`,
|
|
253
171
|
});
|
|
254
172
|
}
|
|
255
|
-
// Check if strategy exhausted - suggest alternatives
|
|
256
173
|
if (strategyTracker.isExhausted()) {
|
|
257
174
|
const suggestion = strategyTracker.suggestAlternative();
|
|
258
175
|
if (suggestion) {
|
|
259
176
|
yield { type: 'strategy_exhausted', suggestion };
|
|
260
|
-
// Add suggestion to messages for LLM to consider
|
|
261
177
|
messages.push({
|
|
262
178
|
role: 'user',
|
|
263
179
|
content: suggestion,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.js","sourceRoot":"","sources":["../../src/framework/query.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;
|
|
1
|
+
{"version":3,"file":"query.js","sourceRoot":"","sources":["../../src/framework/query.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* openhorse - Tool Scheduler
|
|
3
|
+
*
|
|
4
|
+
* Extracts tool grouping, permission checks, concurrent execution, and
|
|
5
|
+
* ordered result emission from query.ts into a testable module.
|
|
6
|
+
*
|
|
7
|
+
* Input: tool calls from LLM + tool registry + permission context + abort signal
|
|
8
|
+
* Output: execution results in original call order
|
|
9
|
+
*/
|
|
10
|
+
import type { OpenHorseTool, PermissionResult, ToolContext } from './tool';
|
|
11
|
+
import type { Message } from '../services/llm';
|
|
12
|
+
import type { DriftCheckResult } from '../harness/types';
|
|
13
|
+
type ToolCallRecord = NonNullable<Message['tool_calls']>[number];
|
|
14
|
+
export interface PreparedToolCall {
|
|
15
|
+
index: number;
|
|
16
|
+
tc: ToolCallRecord;
|
|
17
|
+
args: Record<string, unknown>;
|
|
18
|
+
tool: OpenHorseTool | undefined;
|
|
19
|
+
attemptId: string;
|
|
20
|
+
drift: DriftCheckResult | undefined;
|
|
21
|
+
permission: PermissionResult | undefined;
|
|
22
|
+
canRunConcurrently: boolean;
|
|
23
|
+
}
|
|
24
|
+
export interface ExecutedToolCall {
|
|
25
|
+
prepared: PreparedToolCall;
|
|
26
|
+
result: string;
|
|
27
|
+
duration: number;
|
|
28
|
+
success: boolean;
|
|
29
|
+
error?: string;
|
|
30
|
+
summary?: string;
|
|
31
|
+
outputBytes?: number;
|
|
32
|
+
artifactRef?: {
|
|
33
|
+
id: string;
|
|
34
|
+
outputBytes: number;
|
|
35
|
+
};
|
|
36
|
+
strategyResult: 'success' | 'failed';
|
|
37
|
+
strategyError?: string;
|
|
38
|
+
}
|
|
39
|
+
export interface ToolSchedule {
|
|
40
|
+
parallel: PreparedToolCall[];
|
|
41
|
+
serial: PreparedToolCall[];
|
|
42
|
+
}
|
|
43
|
+
export interface ToolSchedulerOptions {
|
|
44
|
+
/** Tool calls from the LLM response */
|
|
45
|
+
toolCalls: NonNullable<Message['tool_calls']>;
|
|
46
|
+
/** Available tool registry */
|
|
47
|
+
tools: OpenHorseTool[];
|
|
48
|
+
/** Tool executor: (name, args, abortSignal?) => result string */
|
|
49
|
+
toolExecutor: (name: string, args: Record<string, unknown>, abortSignal?: AbortSignal) => Promise<string>;
|
|
50
|
+
/** Permission mode */
|
|
51
|
+
permissionMode?: string;
|
|
52
|
+
/** Fallback for permission checks that would need an interactive prompt */
|
|
53
|
+
toolConfirmation?: string;
|
|
54
|
+
/** Optional UI confirmation hook for tools whose permission check returns ask */
|
|
55
|
+
confirmToolUse?: (request: {
|
|
56
|
+
name: string;
|
|
57
|
+
args: Record<string, unknown>;
|
|
58
|
+
reason?: string;
|
|
59
|
+
abortSignal?: AbortSignal;
|
|
60
|
+
}) => Promise<boolean>;
|
|
61
|
+
/** Tool execution context */
|
|
62
|
+
toolContext?: ToolContext;
|
|
63
|
+
/** Abort signal */
|
|
64
|
+
abortSignal?: AbortSignal;
|
|
65
|
+
/** Start a tracking approach for strategy tracker (returns attemptId) */
|
|
66
|
+
startApproach?: (toolName: string) => string;
|
|
67
|
+
/** Add tool to strategy tracker */
|
|
68
|
+
addToolToTracker?: (attemptId: string, toolName: string) => void;
|
|
69
|
+
/** Harness drift check callback */
|
|
70
|
+
harnessDriftCheck?: (params: {
|
|
71
|
+
name: string;
|
|
72
|
+
args: Record<string, unknown>;
|
|
73
|
+
}) => DriftCheckResult | undefined;
|
|
74
|
+
/** Harness blocked result formatter */
|
|
75
|
+
harnessBlockedResult?: (drift: DriftCheckResult) => string;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Prepare tool calls: parse args, check drift, check permissions, determine concurrency.
|
|
79
|
+
* Re-serializes tc.function.arguments to ensure valid JSON.
|
|
80
|
+
*/
|
|
81
|
+
export declare function prepareToolCalls(options: ToolSchedulerOptions): PreparedToolCall[];
|
|
82
|
+
/**
|
|
83
|
+
* Execute prepared tool calls, respecting concurrency flags.
|
|
84
|
+
* Parallel-safe tools run concurrently; unsafe tools run serially.
|
|
85
|
+
* Results are returned in original call order.
|
|
86
|
+
*
|
|
87
|
+
* Returns an async generator that yields each result as it completes.
|
|
88
|
+
*/
|
|
89
|
+
export declare function executeToolCalls(preparedCalls: PreparedToolCall[], options: {
|
|
90
|
+
toolExecutor: ToolSchedulerOptions['toolExecutor'];
|
|
91
|
+
abortSignal?: AbortSignal;
|
|
92
|
+
confirmToolUse?: ToolSchedulerOptions['confirmToolUse'];
|
|
93
|
+
permissionMode?: string;
|
|
94
|
+
toolConfirmation?: string;
|
|
95
|
+
harnessBlockedResult?: ToolSchedulerOptions['harnessBlockedResult'];
|
|
96
|
+
}): AsyncGenerator<ExecutedToolCall>;
|
|
97
|
+
/**
|
|
98
|
+
* Inspect how prepared tool calls would be scheduled.
|
|
99
|
+
* Returns parallel and serial groups without executing.
|
|
100
|
+
*/
|
|
101
|
+
export declare function inspectSchedule(preparedCalls: PreparedToolCall[]): ToolSchedule;
|
|
102
|
+
export {};
|
|
103
|
+
//# sourceMappingURL=tool-scheduler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-scheduler.d.ts","sourceRoot":"","sources":["../../src/framework/tool-scheduler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* openhorse - Tool Scheduler
|
|
4
|
+
*
|
|
5
|
+
* Extracts tool grouping, permission checks, concurrent execution, and
|
|
6
|
+
* ordered result emission from query.ts into a testable module.
|
|
7
|
+
*
|
|
8
|
+
* Input: tool calls from LLM + tool registry + permission context + abort signal
|
|
9
|
+
* Output: execution results in original call order
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.prepareToolCalls = prepareToolCalls;
|
|
13
|
+
exports.executeToolCalls = executeToolCalls;
|
|
14
|
+
exports.inspectSchedule = inspectSchedule;
|
|
15
|
+
// ============================================================================
|
|
16
|
+
// Preparation
|
|
17
|
+
// ============================================================================
|
|
18
|
+
function parseToolArgs(tc) {
|
|
19
|
+
const rawArgs = tc.function.arguments || '';
|
|
20
|
+
if (!rawArgs)
|
|
21
|
+
return {};
|
|
22
|
+
try {
|
|
23
|
+
return JSON.parse(rawArgs);
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return {};
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Prepare tool calls: parse args, check drift, check permissions, determine concurrency.
|
|
31
|
+
* Re-serializes tc.function.arguments to ensure valid JSON.
|
|
32
|
+
*/
|
|
33
|
+
function prepareToolCalls(options) {
|
|
34
|
+
const { toolCalls, tools } = options;
|
|
35
|
+
const preparedCalls = [];
|
|
36
|
+
for (let i = 0; i < toolCalls.length; i++) {
|
|
37
|
+
const tc = toolCalls[i];
|
|
38
|
+
const args = parseToolArgs(tc);
|
|
39
|
+
// Re-serialize to ensure valid JSON for next API call
|
|
40
|
+
tc.function.arguments = JSON.stringify(args);
|
|
41
|
+
const attemptId = options.startApproach?.(tc.function.name) ?? `tool-${i}`;
|
|
42
|
+
options.addToolToTracker?.(attemptId, tc.function.name);
|
|
43
|
+
const tool = tools.find(t => t.name === tc.function.name);
|
|
44
|
+
const drift = options.harnessDriftCheck?.({ name: tc.function.name, args });
|
|
45
|
+
const permission = tool?.checkPermissions && options.toolContext
|
|
46
|
+
? tool.checkPermissions(args, options.toolContext)
|
|
47
|
+
: undefined;
|
|
48
|
+
const confirmation = options.toolConfirmation ?? 'ask';
|
|
49
|
+
const needsInteractiveConfirmation = permission?.behavior === 'ask'
|
|
50
|
+
&& options.permissionMode === 'default'
|
|
51
|
+
&& confirmation === 'ask'
|
|
52
|
+
&& Boolean(options.confirmToolUse);
|
|
53
|
+
const canRunConcurrently = tool?.isConcurrencySafe?.(args) === true
|
|
54
|
+
&& drift?.status !== 'block'
|
|
55
|
+
&& permission?.behavior !== 'deny'
|
|
56
|
+
&& !needsInteractiveConfirmation;
|
|
57
|
+
preparedCalls.push({
|
|
58
|
+
index: i,
|
|
59
|
+
tc,
|
|
60
|
+
args,
|
|
61
|
+
tool,
|
|
62
|
+
attemptId,
|
|
63
|
+
drift,
|
|
64
|
+
permission,
|
|
65
|
+
canRunConcurrently,
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
return preparedCalls;
|
|
69
|
+
}
|
|
70
|
+
// ============================================================================
|
|
71
|
+
// Execution
|
|
72
|
+
// ============================================================================
|
|
73
|
+
function isArtifactRef(value) {
|
|
74
|
+
if (!value || typeof value !== 'object')
|
|
75
|
+
return false;
|
|
76
|
+
const record = value;
|
|
77
|
+
return typeof record.id === 'string' && typeof record.outputBytes === 'number';
|
|
78
|
+
}
|
|
79
|
+
function parseToolResult(result) {
|
|
80
|
+
try {
|
|
81
|
+
const parsed = JSON.parse(result);
|
|
82
|
+
const success = parsed.success === true;
|
|
83
|
+
const outputBytes = typeof parsed.outputBytes === 'number' ? parsed.outputBytes : undefined;
|
|
84
|
+
const artifactRef = isArtifactRef(parsed.artifactRef) ? parsed.artifactRef : undefined;
|
|
85
|
+
return {
|
|
86
|
+
success,
|
|
87
|
+
error: typeof parsed.error === 'string' ? parsed.error : undefined,
|
|
88
|
+
summary: typeof parsed.summary === 'string' ? parsed.summary : undefined,
|
|
89
|
+
outputBytes,
|
|
90
|
+
artifactRef,
|
|
91
|
+
strategyResult: success ? 'success' : 'failed',
|
|
92
|
+
strategyError: success ? undefined : parsed.error || 'Unknown error',
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
return {
|
|
97
|
+
success: true,
|
|
98
|
+
summary: result,
|
|
99
|
+
outputBytes: Buffer.byteLength(result, 'utf8'),
|
|
100
|
+
strategyResult: 'success',
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
function failedExecution(prepared, err) {
|
|
105
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
106
|
+
const result = JSON.stringify({
|
|
107
|
+
success: false,
|
|
108
|
+
error: `Tool execution error: ${message}`,
|
|
109
|
+
});
|
|
110
|
+
return {
|
|
111
|
+
prepared,
|
|
112
|
+
result,
|
|
113
|
+
duration: 0,
|
|
114
|
+
success: false,
|
|
115
|
+
error: `Tool execution error: ${message}`,
|
|
116
|
+
strategyResult: 'failed',
|
|
117
|
+
strategyError: message,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
function executePreparedTool(prepared, toolExecutor, abortSignal, confirmToolUse, permissionMode, toolConfirmation, harnessBlockedResult) {
|
|
121
|
+
const start = Date.now();
|
|
122
|
+
const { tc, args, drift, permission } = prepared;
|
|
123
|
+
const exec = async () => {
|
|
124
|
+
try {
|
|
125
|
+
return await toolExecutor(tc.function.name, args, abortSignal);
|
|
126
|
+
}
|
|
127
|
+
catch (err) {
|
|
128
|
+
return JSON.stringify({
|
|
129
|
+
success: false,
|
|
130
|
+
error: `Tool execution error: ${err.message}`,
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
const run = async () => {
|
|
135
|
+
if (drift?.status === 'block') {
|
|
136
|
+
return harnessBlockedResult
|
|
137
|
+
? harnessBlockedResult(drift)
|
|
138
|
+
: JSON.stringify({ success: false, error: 'Blocked by Context Harness' });
|
|
139
|
+
}
|
|
140
|
+
if (permission?.behavior === 'deny') {
|
|
141
|
+
return JSON.stringify({
|
|
142
|
+
success: false,
|
|
143
|
+
error: permission.reason || 'Permission denied',
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
if (permission?.behavior === 'ask' && permissionMode === 'default') {
|
|
147
|
+
const confirmation = toolConfirmation ?? 'ask';
|
|
148
|
+
if (confirmation === 'allow') {
|
|
149
|
+
return exec();
|
|
150
|
+
}
|
|
151
|
+
if (confirmToolUse && confirmation === 'ask') {
|
|
152
|
+
const approved = await confirmToolUse({
|
|
153
|
+
name: tc.function.name,
|
|
154
|
+
args,
|
|
155
|
+
reason: permission.reason,
|
|
156
|
+
abortSignal,
|
|
157
|
+
});
|
|
158
|
+
return approved
|
|
159
|
+
? await exec()
|
|
160
|
+
: JSON.stringify({
|
|
161
|
+
success: false,
|
|
162
|
+
error: `Tool ${tc.function.name} requires user confirmation and was denied by user.`,
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
return JSON.stringify({
|
|
166
|
+
success: false,
|
|
167
|
+
error: confirmation === 'deny'
|
|
168
|
+
? `Tool ${tc.function.name} requires user confirmation and was denied by toolConfirmation=deny.`
|
|
169
|
+
: `Tool ${tc.function.name} requires user confirmation.`,
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
return exec();
|
|
173
|
+
};
|
|
174
|
+
return run().then(result => {
|
|
175
|
+
const duration = Date.now() - start;
|
|
176
|
+
return {
|
|
177
|
+
prepared,
|
|
178
|
+
result,
|
|
179
|
+
duration,
|
|
180
|
+
...parseToolResult(result),
|
|
181
|
+
};
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Execute prepared tool calls, respecting concurrency flags.
|
|
186
|
+
* Parallel-safe tools run concurrently; unsafe tools run serially.
|
|
187
|
+
* Results are returned in original call order.
|
|
188
|
+
*
|
|
189
|
+
* Returns an async generator that yields each result as it completes.
|
|
190
|
+
*/
|
|
191
|
+
async function* executeToolCalls(preparedCalls, options) {
|
|
192
|
+
let parallelGroup = [];
|
|
193
|
+
const runParallelGroup = async (group) => {
|
|
194
|
+
const settled = await Promise.allSettled(group.map(call => executePreparedTool(call, options.toolExecutor, options.abortSignal, options.confirmToolUse, options.permissionMode, options.toolConfirmation, options.harnessBlockedResult)));
|
|
195
|
+
return settled.map((result, index) => result.status === 'fulfilled' ? result.value : failedExecution(group[index], result.reason));
|
|
196
|
+
};
|
|
197
|
+
for (const prepared of preparedCalls) {
|
|
198
|
+
if (prepared.canRunConcurrently) {
|
|
199
|
+
parallelGroup.push(prepared);
|
|
200
|
+
continue;
|
|
201
|
+
}
|
|
202
|
+
if (parallelGroup.length > 0) {
|
|
203
|
+
const executedGroup = await runParallelGroup(parallelGroup);
|
|
204
|
+
// Sort by original index to maintain order
|
|
205
|
+
executedGroup.sort((a, b) => a.prepared.index - b.prepared.index);
|
|
206
|
+
for (const executed of executedGroup) {
|
|
207
|
+
yield executed;
|
|
208
|
+
}
|
|
209
|
+
parallelGroup = [];
|
|
210
|
+
}
|
|
211
|
+
const executed = await executePreparedTool(prepared, options.toolExecutor, options.abortSignal, options.confirmToolUse, options.permissionMode, options.toolConfirmation, options.harnessBlockedResult).catch(err => failedExecution(prepared, err));
|
|
212
|
+
yield executed;
|
|
213
|
+
}
|
|
214
|
+
if (parallelGroup.length > 0) {
|
|
215
|
+
const executedGroup = await runParallelGroup(parallelGroup);
|
|
216
|
+
executedGroup.sort((a, b) => a.prepared.index - b.prepared.index);
|
|
217
|
+
for (const executed of executedGroup) {
|
|
218
|
+
yield executed;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
// ============================================================================
|
|
223
|
+
// Schedule inspection (for testing)
|
|
224
|
+
// ============================================================================
|
|
225
|
+
/**
|
|
226
|
+
* Inspect how prepared tool calls would be scheduled.
|
|
227
|
+
* Returns parallel and serial groups without executing.
|
|
228
|
+
*/
|
|
229
|
+
function inspectSchedule(preparedCalls) {
|
|
230
|
+
const parallel = [];
|
|
231
|
+
const serial = [];
|
|
232
|
+
for (const call of preparedCalls) {
|
|
233
|
+
if (call.canRunConcurrently) {
|
|
234
|
+
parallel.push(call);
|
|
235
|
+
}
|
|
236
|
+
else {
|
|
237
|
+
serial.push(call);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
return { parallel, serial };
|
|
241
|
+
}
|
|
242
|
+
//# sourceMappingURL=tool-scheduler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-scheduler.js","sourceRoot":"","sources":["../../src/framework/tool-scheduler.ts"],"names":[],"mappings":"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"}
|