@vinhnt-sdk/step-executor 0.1.3

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.
Files changed (67) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +29 -0
  3. package/dist/approval-handler.d.ts +18 -0
  4. package/dist/approval-handler.d.ts.map +1 -0
  5. package/dist/approval-handler.js +39 -0
  6. package/dist/approval-handler.js.map +1 -0
  7. package/dist/circuit-breaker.d.ts +48 -0
  8. package/dist/circuit-breaker.d.ts.map +1 -0
  9. package/dist/circuit-breaker.js +171 -0
  10. package/dist/circuit-breaker.js.map +1 -0
  11. package/dist/hooks.d.ts +15 -0
  12. package/dist/hooks.d.ts.map +1 -0
  13. package/dist/hooks.js +2 -0
  14. package/dist/hooks.js.map +1 -0
  15. package/dist/index.d.ts +22 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +22 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/kernel-error.d.ts +10 -0
  20. package/dist/kernel-error.d.ts.map +1 -0
  21. package/dist/kernel-error.js +12 -0
  22. package/dist/kernel-error.js.map +1 -0
  23. package/dist/kernel-utils.d.ts +49 -0
  24. package/dist/kernel-utils.d.ts.map +1 -0
  25. package/dist/kernel-utils.js +117 -0
  26. package/dist/kernel-utils.js.map +1 -0
  27. package/dist/path-policy.d.ts +18 -0
  28. package/dist/path-policy.d.ts.map +1 -0
  29. package/dist/path-policy.js +38 -0
  30. package/dist/path-policy.js.map +1 -0
  31. package/dist/permission-gate.d.ts +93 -0
  32. package/dist/permission-gate.d.ts.map +1 -0
  33. package/dist/permission-gate.js +303 -0
  34. package/dist/permission-gate.js.map +1 -0
  35. package/dist/run-context.d.ts +26 -0
  36. package/dist/run-context.d.ts.map +1 -0
  37. package/dist/run-context.js +13 -0
  38. package/dist/run-context.js.map +1 -0
  39. package/dist/run-state.d.ts +27 -0
  40. package/dist/run-state.d.ts.map +1 -0
  41. package/dist/run-state.js +88 -0
  42. package/dist/run-state.js.map +1 -0
  43. package/dist/self-correction.d.ts +29 -0
  44. package/dist/self-correction.d.ts.map +1 -0
  45. package/dist/self-correction.js +89 -0
  46. package/dist/self-correction.js.map +1 -0
  47. package/dist/step-executor.d.ts +81 -0
  48. package/dist/step-executor.d.ts.map +1 -0
  49. package/dist/step-executor.js +314 -0
  50. package/dist/step-executor.js.map +1 -0
  51. package/dist/termination.d.ts +87 -0
  52. package/dist/termination.d.ts.map +1 -0
  53. package/dist/termination.js +89 -0
  54. package/dist/termination.js.map +1 -0
  55. package/dist/tool-context-builder.d.ts +22 -0
  56. package/dist/tool-context-builder.d.ts.map +1 -0
  57. package/dist/tool-context-builder.js +42 -0
  58. package/dist/tool-context-builder.js.map +1 -0
  59. package/dist/tool-error-router.d.ts +26 -0
  60. package/dist/tool-error-router.d.ts.map +1 -0
  61. package/dist/tool-error-router.js +85 -0
  62. package/dist/tool-error-router.js.map +1 -0
  63. package/dist/tool-result-processor.d.ts +24 -0
  64. package/dist/tool-result-processor.d.ts.map +1 -0
  65. package/dist/tool-result-processor.js +47 -0
  66. package/dist/tool-result-processor.js.map +1 -0
  67. package/package.json +63 -0
@@ -0,0 +1,13 @@
1
+ /** Create a fresh per-run context. */
2
+ export function createRunContext(runId, agent, saga) {
3
+ return {
4
+ runId,
5
+ agent,
6
+ depth: 0,
7
+ agentChain: new Set(),
8
+ saga,
9
+ cachedTools: null,
10
+ cachedToolsAgentId: undefined,
11
+ };
12
+ }
13
+ //# sourceMappingURL=run-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-context.js","sourceRoot":"","sources":["../src/run-context.ts"],"names":[],"mappings":"AAyBA,sCAAsC;AACtC,MAAM,UAAU,gBAAgB,CAC9B,KAAY,EACZ,KAA8B,EAC9B,IAAc;IAEd,OAAO;QACL,KAAK;QACL,KAAK;QACL,KAAK,EAAE,CAAC;QACR,UAAU,EAAE,IAAI,GAAG,EAAE;QACrB,IAAI;QACJ,WAAW,EAAE,IAAI;QACjB,kBAAkB,EAAE,SAAS;KAC9B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,27 @@
1
+ import type { RunId } from "@vinhnt-sdk/schema";
2
+ /** Lifecycle state of a run. */
3
+ export type RunState = "pending" | "running" | "paused" | "completed" | "failed" | "cancelled";
4
+ /** Tracks per-run state, abort signals and input queues. */
5
+ export declare class RunStateMachine {
6
+ private readonly runStates;
7
+ private readonly runAborts;
8
+ private readonly pendingInputs;
9
+ private readonly busySessions;
10
+ private readonly modelForRun;
11
+ private readonly stateSubscribers;
12
+ readonly runIdStack: RunId[];
13
+ getState(runId: RunId): RunState | undefined;
14
+ setState(runId: RunId, state: RunState): void;
15
+ onStateChange(listener: (runId: RunId, state: RunState) => void): () => void;
16
+ createRun(runId: RunId, sessionId?: string, parentRunId?: RunId): AbortController | null;
17
+ getAbort(runId: RunId): AbortController | undefined;
18
+ isAborted(runId: RunId): boolean;
19
+ getSignal(runId: RunId): AbortSignal;
20
+ cleanupRun(runId: RunId, sessionId?: string): void;
21
+ cancelAll(): void;
22
+ sendInput(runId: RunId, text: string): void;
23
+ drainInputs(runId: RunId): string[];
24
+ setModelForRun(runId: RunId, model: unknown): void;
25
+ getModelForRun<T>(runId: RunId): T | undefined;
26
+ }
27
+ //# sourceMappingURL=run-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-state.d.ts","sourceRoot":"","sources":["../src/run-state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAEhD,gCAAgC;AAChC,MAAM,MAAM,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,WAAW,GAAG,QAAQ,GAAG,WAAW,CAAC;AAE/F,4DAA4D;AAC5D,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA8B;IACxD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAqC;IAC/D,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA8B;IAC5D,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAqB;IAClD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA6B;IACzD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAsD;IACvF,QAAQ,CAAC,UAAU,EAAE,KAAK,EAAE,CAAM;IAElC,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,QAAQ,GAAG,SAAS;IAI5C,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,GAAG,IAAI;IAO7C,aAAa,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,KAAK,IAAI,GAAG,MAAM,IAAI;IAK5E,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,KAAK,GAAG,eAAe,GAAG,IAAI;IAoBxF,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,eAAe,GAAG,SAAS;IAInD,SAAS,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO;IAIhC,SAAS,CAAC,KAAK,EAAE,KAAK,GAAG,WAAW;IAIpC,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI;IASlD,SAAS,IAAI,IAAI;IAIjB,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAS3C,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,EAAE;IAMnC,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAIlD,cAAc,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,GAAG,SAAS;CAI/C"}
@@ -0,0 +1,88 @@
1
+ /** Tracks per-run state, abort signals and input queues. */
2
+ export class RunStateMachine {
3
+ runStates = new Map();
4
+ runAborts = new Map();
5
+ pendingInputs = new Map();
6
+ busySessions = new Set();
7
+ modelForRun = new Map();
8
+ stateSubscribers = new Set();
9
+ runIdStack = [];
10
+ getState(runId) {
11
+ return this.runStates.get(runId);
12
+ }
13
+ setState(runId, state) {
14
+ this.runStates.set(runId, state);
15
+ for (const sub of this.stateSubscribers) {
16
+ try {
17
+ sub(runId, state);
18
+ }
19
+ catch { }
20
+ }
21
+ }
22
+ onStateChange(listener) {
23
+ this.stateSubscribers.add(listener);
24
+ return () => { this.stateSubscribers.delete(listener); };
25
+ }
26
+ createRun(runId, sessionId, parentRunId) {
27
+ const abort = new AbortController();
28
+ this.runAborts.set(runId, abort);
29
+ this.setState(runId, "pending");
30
+ if (sessionId) {
31
+ // Parallel sub-agent runs bypass the session busy check
32
+ if (parentRunId && this.runAborts.has(parentRunId)) {
33
+ // Child run — skip busy check, child shares parent session
34
+ }
35
+ else if (this.busySessions.has(sessionId)) {
36
+ this.runAborts.delete(runId);
37
+ return null;
38
+ }
39
+ else {
40
+ this.busySessions.add(sessionId);
41
+ }
42
+ }
43
+ return abort;
44
+ }
45
+ getAbort(runId) {
46
+ return this.runAborts.get(runId);
47
+ }
48
+ isAborted(runId) {
49
+ return this.runAborts.get(runId)?.signal.aborted ?? false;
50
+ }
51
+ getSignal(runId) {
52
+ return this.runAborts.get(runId)?.signal ?? new AbortController().signal;
53
+ }
54
+ cleanupRun(runId, sessionId) {
55
+ this.runAborts.delete(runId);
56
+ this.pendingInputs.delete(runId);
57
+ this.modelForRun.delete(runId);
58
+ if (sessionId)
59
+ this.busySessions.delete(sessionId);
60
+ // Keep the terminal run state so post-mortem getRunState()/UI can still
61
+ // report how the run finished; only volatile resources are freed above.
62
+ }
63
+ cancelAll() {
64
+ for (const a of this.runAborts.values())
65
+ a.abort();
66
+ }
67
+ sendInput(runId, text) {
68
+ const queue = this.pendingInputs.get(runId);
69
+ if (queue) {
70
+ queue.push(text);
71
+ }
72
+ else {
73
+ this.pendingInputs.set(runId, [text]);
74
+ }
75
+ }
76
+ drainInputs(runId) {
77
+ const queue = this.pendingInputs.get(runId);
78
+ this.pendingInputs.delete(runId);
79
+ return queue ?? [];
80
+ }
81
+ setModelForRun(runId, model) {
82
+ this.modelForRun.set(runId, model);
83
+ }
84
+ getModelForRun(runId) {
85
+ return this.modelForRun.get(runId);
86
+ }
87
+ }
88
+ //# sourceMappingURL=run-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-state.js","sourceRoot":"","sources":["../src/run-state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import type { RunId, RequestContext, AgentConfig } from "@vinhnt-sdk/schema";
2
+ import type { ChatMessage } from "@vinhnt-sdk/schema";
3
+ import type { ToolContext } from "@vinhnt-sdk/tools";
4
+ import type { RecentCall } from "./kernel-utils.js";
5
+ import type { ToolExecutionPlan } from "./step-executor.js";
6
+ import type { ModelCaller } from "@vinhnt-sdk/llm";
7
+ import type { ModelProvider } from "@vinhnt-sdk/schema";
8
+ import type { StepExecutorPluginHooks } from "./hooks.js";
9
+ import type { PermissionGate } from "./permission-gate.js";
10
+ /** Dependencies required by {@link runSelfCorrection}. */
11
+ export interface SelfCorrectionDeps {
12
+ readonly store: {
13
+ emitEvent(event: Omit<import("@vinhnt-sdk/schema").KnownRunEvent, "sequence">, persist?: boolean): Promise<void>;
14
+ };
15
+ readonly modelCaller: ModelCaller;
16
+ readonly maxSelfCorrectAttempts: number;
17
+ readonly doomLoopThreshold: number;
18
+ readonly findTool: (name: string, runId?: RunId) => import("@vinhnt-sdk/tools").ToolDefinition | undefined;
19
+ readonly permissionGate: PermissionGate;
20
+ readonly pluginManager: StepExecutorPluginHooks | undefined;
21
+ currentAgent: AgentConfig | undefined;
22
+ }
23
+ /** Token accumulator for a self-correction pass. */
24
+ export interface SelfCorrectionTokens {
25
+ input: number;
26
+ output: number;
27
+ }
28
+ export declare function runSelfCorrection(tc: ToolExecutionPlan, messages: ChatMessage[], recentCalls: RecentCall[], step: number, runId: RunId, ctx: RequestContext, runAbort: AbortController, toolCtx: ToolContext, errorMsg: string, runModel: ModelProvider, deps: SelfCorrectionDeps, selfCorrectTokens: SelfCorrectionTokens): Promise<void>;
29
+ //# sourceMappingURL=self-correction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"self-correction.d.ts","sourceRoot":"","sources":["../src/self-correction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAE7E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAGpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,0DAA0D;AAC1D,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,KAAK,EAAE;QAAE,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,oBAAoB,EAAE,aAAa,EAAE,UAAU,CAAC,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;KAAE,CAAC;IACrI,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAC;IACxC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,KAAK,OAAO,mBAAmB,EAAE,cAAc,GAAG,SAAS,CAAC;IAC3G,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAC;IACxC,QAAQ,CAAC,aAAa,EAAE,uBAAuB,GAAG,SAAS,CAAC;IAC5D,YAAY,EAAE,WAAW,GAAG,SAAS,CAAC;CACvC;AAED,oDAAoD;AACpD,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,iBAAiB,CACrC,EAAE,EAAE,iBAAiB,EACrB,QAAQ,EAAE,WAAW,EAAE,EACvB,WAAW,EAAE,UAAU,EAAE,EACzB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,KAAK,EACZ,GAAG,EAAE,cAAc,EACnB,QAAQ,EAAE,eAAe,EACzB,OAAO,EAAE,WAAW,EACpB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,aAAa,EACvB,IAAI,EAAE,kBAAkB,EACxB,iBAAiB,EAAE,oBAAoB,GACtC,OAAO,CAAC,IAAI,CAAC,CAkGf"}
@@ -0,0 +1,89 @@
1
+ import { getTextContent } from "@vinhnt-sdk/schema";
2
+ import { detectDoomLoop, SELF_CORRECT_PROMPT, raceWithAbort, withToolTimeout } from "./kernel-utils.js";
3
+ import { RunAbortedError } from "@vinhnt-sdk/schema";
4
+ export async function runSelfCorrection(tc, messages, recentCalls, step, runId, ctx, runAbort, toolCtx, errorMsg, runModel, deps, selfCorrectTokens) {
5
+ let corrected = false;
6
+ for (let attempt = 1; attempt <= deps.maxSelfCorrectAttempts; attempt++) {
7
+ await deps.store.emitEvent({
8
+ id: crypto.randomUUID(), runId, type: "tool.self_correcting",
9
+ occurredAt: new Date().toISOString(), traceId: ctx.traceId,
10
+ data: { toolId: tc.toolId, toolName: tc.toolName, error: errorMsg, attempt },
11
+ });
12
+ try {
13
+ const correction = await deps.modelCaller.callModelStream([...messages, { role: "system", content: SELF_CORRECT_PROMPT }], step, runId, ctx, runAbort.signal, deps.currentAgent?.permissions?.maxTokens);
14
+ if (correction.content && runModel?.countTokens) {
15
+ selfCorrectTokens.input += [...messages, { role: "system", content: SELF_CORRECT_PROMPT }]
16
+ .reduce((sum, m) => sum + runModel.countTokens(getTextContent(m.content)), 0);
17
+ selfCorrectTokens.output += runModel.countTokens(correction.content);
18
+ }
19
+ if (correction.toolCalls?.length) {
20
+ messages.push({
21
+ role: "assistant", content: correction.content,
22
+ toolCalls: correction.toolCalls.map((ct) => ({
23
+ id: ct.id, name: ct.name, args: ct.args,
24
+ })),
25
+ });
26
+ for (const ct of correction.toolCalls) {
27
+ if (runAbort.signal.aborted)
28
+ break;
29
+ if (detectDoomLoop(recentCalls, ct.name, ct.args, deps.doomLoopThreshold)) {
30
+ messages.push({ role: "tool", toolCallId: ct.id, content: `Error: Doom loop detected in self-correction for "${ct.name}"` });
31
+ corrected = true;
32
+ break;
33
+ }
34
+ const ctool = deps.findTool(ct.name, runId);
35
+ if (!ctool) {
36
+ messages.push({ role: "tool", toolCallId: ct.id, content: `Error: Tool "${ct.name}" not found` });
37
+ continue;
38
+ }
39
+ const cpermResult = deps.permissionGate.checkTool(ct.name, ctool.risk, ct.args, deps.currentAgent);
40
+ if (!cpermResult.allowed && !cpermResult.needsApproval) {
41
+ messages.push({ role: "tool", toolCallId: ct.id, content: `Error: ${cpermResult.reason}` });
42
+ continue;
43
+ }
44
+ if (cpermResult.needsApproval) {
45
+ if (!deps.permissionGate.checkSavedApproval(ct.name, ct.args, deps.currentAgent?.id)) {
46
+ const reply = await deps.permissionGate.askForTool(ct.name, ct.id, runId, "", cpermResult.reason ?? `Tool "${ct.name}" requires approval for self-correction`, deps.currentAgent?.id ?? "", ctx.traceId, deps.pluginManager, undefined, runAbort.signal);
47
+ if (reply === "reject") {
48
+ messages.push({ role: "tool", toolCallId: ct.id, content: `Error: Tool "${ct.name}" rejected by user` });
49
+ continue;
50
+ }
51
+ }
52
+ }
53
+ try {
54
+ // RV-19: cooperative timeout — signal the correction tool at the
55
+ // deadline so its side effects stop, not just race-and-abandon.
56
+ const cExec = ctool.timeoutMs
57
+ ? withToolTimeout((signal) => ctool.execute(ct.args, { ...toolCtx, signal }), ctool.timeoutMs, runAbort.signal, `Tool "${ct.name}" timed out after ${ctool.timeoutMs}ms`)
58
+ : ctool.execute(ct.args, toolCtx);
59
+ const coutput = await raceWithAbort(cExec, runAbort.signal, runId);
60
+ messages.push({
61
+ role: "tool",
62
+ content: typeof coutput === "string" ? coutput : JSON.stringify(coutput),
63
+ toolCallId: ct.id,
64
+ });
65
+ corrected = true;
66
+ }
67
+ catch (cErr) {
68
+ if (cErr instanceof RunAbortedError)
69
+ throw cErr;
70
+ messages.push({ role: "tool", toolCallId: ct.id, content: `Error: ${cErr instanceof Error ? cErr.message : String(cErr)}` });
71
+ }
72
+ }
73
+ }
74
+ else if (correction.content) {
75
+ messages.push({ role: "assistant", content: correction.content });
76
+ corrected = true;
77
+ }
78
+ }
79
+ catch (err) {
80
+ console.warn(`[kernel] Self-correction attempt ${attempt}/${deps.maxSelfCorrectAttempts} failed:`, err instanceof Error ? err.message : String(err));
81
+ }
82
+ if (corrected)
83
+ break;
84
+ }
85
+ if (!corrected) {
86
+ console.warn(`[kernel] Self-correction exhausted after ${deps.maxSelfCorrectAttempts} attempts for tool "${tc.toolName}"`);
87
+ }
88
+ }
89
+ //# sourceMappingURL=self-correction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"self-correction.js","sourceRoot":"","sources":["../src/self-correction.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,81 @@
1
+ import type { RunId, AgentConfig, RequestContext } from "@vinhnt-sdk/schema";
2
+ import type { ChatMessage } from "@vinhnt-sdk/schema";
3
+ import type { ToolDefinition } from "@vinhnt-sdk/tools";
4
+ import type { StepExecutorPluginHooks } from "./hooks.js";
5
+ import type { PermissionGate } from "./permission-gate.js";
6
+ import type { RecentCall } from "./kernel-utils.js";
7
+ import type { ToolCallOutcome } from "./termination.js";
8
+ import type { KnownRunEvent } from "@vinhnt-sdk/schema";
9
+ import type { ModelCaller } from "@vinhnt-sdk/llm";
10
+ import type { ModelProvider } from "@vinhnt-sdk/schema";
11
+ import type { ToolSaga } from "@vinhnt-sdk/tools";
12
+ /** Dependencies required by {@link StepExecutor}. */
13
+ export interface StepExecutorDeps {
14
+ readonly store: {
15
+ emitEvent(event: Omit<KnownRunEvent, "sequence">, persist?: boolean): Promise<void>;
16
+ };
17
+ readonly addSessionMessage: (sessionId: string | undefined, role: string, content: string, extra?: Record<string, unknown>) => Promise<void>;
18
+ readonly pluginManager: StepExecutorPluginHooks | undefined;
19
+ readonly permissionGate: PermissionGate;
20
+ readonly modelCaller: ModelCaller;
21
+ readonly maxToolCallsPerStep: number;
22
+ readonly maxConcurrentToolCalls?: number;
23
+ readonly maxSelfCorrectAttempts: number;
24
+ readonly selfCorrectOnFailure: boolean;
25
+ currentAgent: AgentConfig | undefined;
26
+ saga: ToolSaga;
27
+ /** Resolve the active agent for a run — used to keep parallel runs isolated. */
28
+ readonly agentForRun?: (runId: RunId) => AgentConfig | undefined;
29
+ /** Resolve the active saga for a run — used to keep parallel runs isolated. */
30
+ readonly sagaForRun?: (runId: RunId) => ToolSaga;
31
+ readonly doomLoopThreshold: number;
32
+ readonly externalDirectoryAccess?: boolean;
33
+ readonly workspaceRoot?: string;
34
+ readonly findTool: (name: string, runId?: RunId) => ToolDefinition | undefined;
35
+ readonly hasTool: (name: string) => boolean;
36
+ }
37
+ /** One planned tool invocation within a step. */
38
+ export interface ToolExecutionPlan {
39
+ toolId: string;
40
+ toolName: string;
41
+ args: unknown;
42
+ }
43
+ /**
44
+ * Executes tool calls within a run step — manages permissions, approval,
45
+ * plugin hooks, doom-loop detection, external-path checking, concurrent
46
+ * execution, self-correction, saga recording, and fallback strategies.
47
+ */
48
+ export declare class StepExecutor {
49
+ private readonly deps;
50
+ constructor(deps: StepExecutorDeps);
51
+ /** Swap the saga reference for per-run saga scoping */
52
+ setSaga(saga: ToolSaga): void;
53
+ /** Swap the current agent reference for per-run agent scoping */
54
+ setCurrentAgent(agent: AgentConfig | undefined): void;
55
+ /** Get the current agent reference (used by kernel to save prev before swap) */
56
+ getCurrentAgent(): AgentConfig | undefined;
57
+ /** Resolve the agent that owns the given run, falling back to the instance default. */
58
+ private agentFor;
59
+ /** Resolve the saga that owns the given run, falling back to the instance default. */
60
+ private sagaFor;
61
+ private runConcurrent;
62
+ /**
63
+ * Execute a batch of tool calls for the current step.
64
+ * Handles permission gating, approval dialogs, plugin hooks, doom-loop
65
+ * detection, external-path checks, concurrent execution with configurable
66
+ * concurrency, self-correction on failure, and saga compensation recording.
67
+ */
68
+ executeToolCalls(toolCalls: ToolExecutionPlan[], messages: ChatMessage[], step: number, runId: RunId, ctx: RequestContext, runAbort: AbortController, sessionId: string | undefined, runModel: ModelProvider): Promise<{
69
+ toolCallCount: number;
70
+ recentCalls: RecentCall[];
71
+ selfCorrectTokens: {
72
+ input: number;
73
+ output: number;
74
+ };
75
+ toolResults: ToolCallOutcome[];
76
+ }>;
77
+ private buildToolContext;
78
+ private handleApproval;
79
+ private runSelfCorrection;
80
+ }
81
+ //# sourceMappingURL=step-executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"step-executor.d.ts","sourceRoot":"","sources":["../src/step-executor.ts"],"names":[],"mappings":"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"}