openhorse 0.2.4 → 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 +141 -3
- 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 +6 -0
- package/dist/framework/query.d.ts.map +1 -1
- package/dist/framework/query.js +56 -133
- 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/harness.d.ts +4 -42
- package/dist/harness/harness.d.ts.map +1 -1
- package/dist/harness/harness.js +7 -48
- package/dist/harness/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/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.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 +50 -11
- 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/compact/auto-compact.d.ts +3 -0
- package/dist/services/compact/auto-compact.d.ts.map +1 -1
- package/dist/services/compact/auto-compact.js +5 -0
- package/dist/services/compact/auto-compact.js.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 +81 -11
- 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 +196 -74
- 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,169 +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 strategyResult = 'success';
|
|
196
|
-
let errorMsg;
|
|
197
|
-
try {
|
|
198
|
-
const parsed = JSON.parse(result);
|
|
199
|
-
toolSuccess = parsed.success === true;
|
|
200
|
-
toolError = parsed.error;
|
|
201
|
-
if (parsed.success === false) {
|
|
202
|
-
strategyResult = 'failed';
|
|
203
|
-
errorMsg = parsed.error || 'Unknown error';
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
catch {
|
|
207
|
-
strategyResult = 'failed';
|
|
208
|
-
errorMsg = 'Invalid result';
|
|
209
|
-
toolSuccess = false;
|
|
210
|
-
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;
|
|
211
134
|
}
|
|
212
|
-
|
|
135
|
+
const { prepared } = executed;
|
|
136
|
+
const { tc, args, attemptId } = prepared;
|
|
137
|
+
strategyTracker.recordResult(attemptId, executed.strategyResult, executed.strategyError, executed.duration);
|
|
213
138
|
harness?.recordToolResult({
|
|
214
139
|
name: tc.function.name,
|
|
215
140
|
args,
|
|
216
|
-
result,
|
|
217
|
-
duration,
|
|
218
|
-
success:
|
|
219
|
-
error:
|
|
141
|
+
result: executed.result,
|
|
142
|
+
duration: executed.duration,
|
|
143
|
+
success: executed.success,
|
|
144
|
+
error: executed.error,
|
|
145
|
+
summary: executed.summary,
|
|
220
146
|
});
|
|
221
147
|
yield {
|
|
222
148
|
type: 'tool_result',
|
|
223
149
|
name: tc.function.name,
|
|
224
150
|
args,
|
|
225
151
|
callId: tc.id,
|
|
226
|
-
result,
|
|
227
|
-
duration,
|
|
228
|
-
success:
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
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,
|
|
232
161
|
};
|
|
233
|
-
if (isAborted(abortSignal)) {
|
|
234
|
-
yield cancelledEvent(llm);
|
|
235
|
-
return;
|
|
236
|
-
}
|
|
237
162
|
messages.push({
|
|
238
163
|
role: 'tool',
|
|
239
|
-
content: result,
|
|
164
|
+
content: executed.result,
|
|
240
165
|
tool_call_id: tc.id,
|
|
241
166
|
});
|
|
242
|
-
|
|
243
|
-
if (!toolSuccess) {
|
|
167
|
+
if (!executed.success) {
|
|
244
168
|
messages.push({
|
|
245
169
|
role: 'user',
|
|
246
|
-
content: `[System] Tool ${tc.function.name} failed: ${
|
|
170
|
+
content: `[System] Tool ${tc.function.name} failed: ${executed.error}. Consider alternative approaches or inform the user.`,
|
|
247
171
|
});
|
|
248
172
|
}
|
|
249
|
-
// Check if strategy exhausted - suggest alternatives
|
|
250
173
|
if (strategyTracker.isExhausted()) {
|
|
251
174
|
const suggestion = strategyTracker.suggestAlternative();
|
|
252
175
|
if (suggestion) {
|
|
253
176
|
yield { type: 'strategy_exhausted', suggestion };
|
|
254
|
-
// Add suggestion to messages for LLM to consider
|
|
255
177
|
messages.push({
|
|
256
178
|
role: 'user',
|
|
257
179
|
content: suggestion,
|
|
@@ -280,6 +202,7 @@ async function* query(params) {
|
|
|
280
202
|
modelId: response.model || llm.getModel(),
|
|
281
203
|
getContextCapsule: harness ? () => harness.getCapsule() : undefined,
|
|
282
204
|
getHarnessState: harness ? () => harness.toJSON() : undefined,
|
|
205
|
+
llm,
|
|
283
206
|
});
|
|
284
207
|
const compacted = await autoCompact.checkAndCompact(messages, totalTokens);
|
|
285
208
|
if (compacted.length < messages.length) {
|
|
@@ -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":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAC3E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAMzD,KAAK,cAAc,GAAG,WAAW,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AAEjE,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,cAAc,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,IAAI,EAAE,aAAa,GAAG,SAAS,CAAC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,gBAAgB,GAAG,SAAS,CAAC;IACpC,UAAU,EAAE,gBAAgB,GAAG,SAAS,CAAC;IACzC,kBAAkB,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAClD,cAAc,EAAE,SAAS,GAAG,QAAQ,CAAC;IACrC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,MAAM,EAAE,gBAAgB,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,oBAAoB;IACnC,uCAAuC;IACvC,SAAS,EAAE,WAAW,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC;IAC9C,8BAA8B;IAC9B,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,iEAAiE;IACjE,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1G,sBAAsB;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,2EAA2E;IAC3E,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iFAAiF;IACjF,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE;QACzB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,WAAW,CAAC,EAAE,WAAW,CAAC;KAC3B,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACvB,6BAA6B;IAC7B,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,mBAAmB;IACnB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,yEAAyE;IACzE,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC;IAC7C,mCAAmC;IACnC,gBAAgB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACjE,mCAAmC;IACnC,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,KAAK,gBAAgB,GAAG,SAAS,CAAC;IAC9G,uCAAuC;IACvC,oBAAoB,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,MAAM,CAAC;CAC5D;AAgBD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,oBAAoB,GAAG,gBAAgB,EAAE,CAwClF;AAoID;;;;;;GAMG;AACH,wBAAuB,gBAAgB,CACrC,aAAa,EAAE,gBAAgB,EAAE,EACjC,OAAO,EAAE;IACP,YAAY,EAAE,oBAAoB,CAAC,cAAc,CAAC,CAAC;IACnD,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,cAAc,CAAC,EAAE,oBAAoB,CAAC,gBAAgB,CAAC,CAAC;IACxD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,oBAAoB,CAAC,EAAE,oBAAoB,CAAC,sBAAsB,CAAC,CAAC;CACrE,GACA,cAAc,CAAC,gBAAgB,CAAC,CAuDlC;AAMD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,aAAa,EAAE,gBAAgB,EAAE,GAAG,YAAY,CAW/E"}
|
|
@@ -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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"}
|