plugin-agent-orchestrator 1.0.17 → 1.0.18
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/client/AIEmployeeSelect.d.ts +11 -0
- package/dist/client/AIEmployeesContext.d.ts +30 -0
- package/dist/client/AgentRunsTab.d.ts +2 -0
- package/dist/client/HarnessProfilesTab.d.ts +2 -0
- package/dist/client/OrchestratorSettings.d.ts +3 -0
- package/dist/client/RulesTab.d.ts +2 -0
- package/dist/client/TracingTab.d.ts +2 -0
- package/dist/client/index.d.ts +1 -0
- package/dist/client/index.js +1 -1
- package/dist/client/plugin.d.ts +6 -0
- package/dist/client/skill-hub/components/ExecutionHistory.d.ts +2 -0
- package/dist/client/skill-hub/components/ExecutionProgress.d.ts +20 -0
- package/dist/client/skill-hub/components/GitSkillImport.d.ts +7 -0
- package/dist/client/skill-hub/components/LoopSettings.d.ts +2 -0
- package/dist/client/skill-hub/components/SkillEditor.d.ts +7 -0
- package/dist/client/skill-hub/components/SkillManager.d.ts +2 -0
- package/dist/client/skill-hub/components/SkillMetrics.d.ts +2 -0
- package/dist/client/skill-hub/components/SkillTestPanel.d.ts +7 -0
- package/dist/client/skill-hub/index.d.ts +11 -0
- package/dist/client/skill-hub/locale.d.ts +3 -0
- package/dist/client/skill-hub/tools/InteractionSchemasProvider.d.ts +6 -0
- package/dist/client/skill-hub/tools/SkillHubCard.d.ts +3 -0
- package/dist/client/skill-hub/tools/loopTemplates.d.ts +22 -0
- package/dist/client/skill-hub/tools/registerSkillLoopCards.d.ts +1 -0
- package/dist/client/skill-hub/utils/jsonFields.d.ts +3 -0
- package/dist/client/tools/PlanApprovalCard.d.ts +3 -0
- package/dist/client/tools/registerOrchestratorCards.d.ts +1 -0
- package/dist/externalVersion.js +6 -6
- package/dist/index.d.ts +2 -0
- package/dist/server/collections/agent-execution-spans.d.ts +9 -0
- package/dist/server/collections/agent-harness-profiles.d.ts +2 -0
- package/dist/server/collections/agent-harness-profiles.js +89 -0
- package/dist/server/collections/agent-loop-events.d.ts +2 -0
- package/dist/server/collections/agent-loop-events.js +101 -0
- package/dist/server/collections/agent-loop-runs.d.ts +2 -0
- package/dist/server/collections/agent-loop-runs.js +188 -0
- package/dist/server/collections/agent-loop-steps.d.ts +2 -0
- package/dist/server/collections/agent-loop-steps.js +174 -0
- package/dist/server/collections/orchestrator-config.d.ts +2 -0
- package/dist/server/collections/orchestrator-config.js +7 -0
- package/dist/server/collections/orchestrator-logs.d.ts +8 -0
- package/dist/server/collections/skill-definitions.d.ts +3 -0
- package/dist/server/collections/skill-executions.d.ts +3 -0
- package/dist/server/collections/skill-executions.js +12 -0
- package/dist/server/collections/skill-loop-configs.d.ts +3 -0
- package/dist/server/collections/skill-loop-configs.js +94 -0
- package/dist/server/collections/skill-worker-configs.d.ts +3 -0
- package/dist/server/index.d.ts +1 -0
- package/dist/server/migrations/20260423000000-add-progress-fields.d.ts +4 -0
- package/dist/server/migrations/20260425000000-add-interaction-schema.d.ts +4 -0
- package/dist/server/migrations/20260427000000-add-tracing-detail-fields.d.ts +7 -0
- package/dist/server/migrations/20260427000000-change-packages-to-text.d.ts +4 -0
- package/dist/server/migrations/20260427000001-change-other-json-to-text.d.ts +4 -0
- package/dist/server/migrations/20260429000000-add-llm-fields.d.ts +7 -0
- package/dist/server/migrations/20260429000000-fix-inputargs-json-to-text.d.ts +16 -0
- package/dist/server/migrations/20260503000000-add-orchestrator-trace-fields.d.ts +7 -0
- package/dist/server/migrations/20260524000000-add-agent-loop-fields-to-skill-executions.d.ts +7 -0
- package/dist/server/migrations/20260524000000-add-agent-loop-fields-to-skill-executions.js +55 -0
- package/dist/server/migrations/20260524001000-add-plan-approval-and-harness-profiles.d.ts +12 -0
- package/dist/server/migrations/20260524001000-add-plan-approval-and-harness-profiles.js +162 -0
- package/dist/server/plugin.d.ts +16 -0
- package/dist/server/plugin.js +13 -0
- package/dist/server/resources/agent-loop.d.ts +3 -0
- package/dist/server/resources/agent-loop.js +205 -0
- package/dist/server/resources/tracing.d.ts +7 -0
- package/dist/server/services/AgentHarness.d.ts +42 -0
- package/dist/server/services/AgentHarness.js +565 -0
- package/dist/server/services/AgentLoopController.d.ts +205 -0
- package/dist/server/services/AgentLoopController.js +940 -0
- package/dist/server/services/AgentLoopRepository.d.ts +20 -0
- package/dist/server/services/AgentLoopRepository.js +210 -0
- package/dist/server/services/AgentLoopService.d.ts +149 -0
- package/dist/server/services/AgentLoopService.js +133 -0
- package/dist/server/services/AgentPlanValidator.d.ts +4 -0
- package/dist/server/services/AgentPlanValidator.js +99 -0
- package/dist/server/services/AgentPlannerService.d.ts +8 -0
- package/dist/server/services/AgentPlannerService.js +119 -0
- package/dist/server/services/AgentRegistryService.d.ts +13 -0
- package/dist/server/services/AgentRegistryService.js +178 -0
- package/dist/server/services/CodeValidator.d.ts +32 -0
- package/dist/server/services/ExecutionSpanService.d.ts +46 -0
- package/dist/server/services/FileManager.d.ts +28 -0
- package/dist/server/services/SandboxRunner.d.ts +41 -0
- package/dist/server/services/SkillManager.d.ts +6 -0
- package/dist/server/services/SkillRepositoryService.d.ts +22 -0
- package/dist/server/services/WorkerEnvManager.d.ts +26 -0
- package/dist/server/skill-hub/actions/git-import.d.ts +21 -0
- package/dist/server/skill-hub/mcp/McpController.d.ts +15 -0
- package/dist/server/skill-hub/plugin.d.ts +61 -0
- package/dist/server/skill-hub/plugin.js +137 -54
- package/dist/server/skill-hub/tasks/SkillExecutionTask.d.ts +16 -0
- package/dist/server/skill-hub/utils/json-fields.d.ts +7 -0
- package/dist/server/tools/agent-loop.d.ts +235 -0
- package/dist/server/tools/agent-loop.js +406 -0
- package/dist/server/tools/delegate-task.d.ts +19 -0
- package/dist/server/tools/delegate-task.js +19 -368
- package/dist/server/tools/external-rag-search.d.ts +42 -0
- package/dist/server/tools/orchestrator-plan.d.ts +205 -0
- package/dist/server/tools/orchestrator-plan.js +291 -0
- package/dist/server/tools/skill-execute.d.ts +36 -0
- package/dist/server/tools/skill-execute.js +2 -0
- package/package.json +1 -1
- package/src/client/AgentRunsTab.tsx +764 -0
- package/src/client/HarnessProfilesTab.tsx +247 -0
- package/src/client/OrchestratorSettings.tsx +40 -2
- package/src/client/RulesTab.tsx +103 -6
- package/src/client/plugin.tsx +27 -54
- package/src/client/skill-hub/components/LoopSettings.tsx +331 -0
- package/src/client/skill-hub/index.tsx +51 -75
- package/src/client/skill-hub/tools/InteractionSchemasProvider.tsx +56 -16
- package/src/client/skill-hub/tools/SkillHubCard.tsx +35 -4
- package/src/client/skill-hub/tools/loopTemplates.ts +52 -0
- package/src/client/skill-hub/tools/registerSkillLoopCards.ts +58 -0
- package/src/client/tools/PlanApprovalCard.tsx +175 -0
- package/src/client/tools/registerOrchestratorCards.ts +7 -0
- package/src/server/collections/agent-harness-profiles.ts +59 -0
- package/src/server/collections/agent-loop-events.ts +71 -0
- package/src/server/collections/agent-loop-runs.ts +158 -0
- package/src/server/collections/agent-loop-steps.ts +144 -0
- package/src/server/collections/orchestrator-config.ts +7 -0
- package/src/server/collections/skill-executions.ts +63 -51
- package/src/server/collections/skill-loop-configs.ts +65 -0
- package/src/server/migrations/20260524000000-add-agent-loop-fields-to-skill-executions.ts +30 -0
- package/src/server/migrations/20260524001000-add-plan-approval-and-harness-profiles.ts +142 -0
- package/src/server/plugin.ts +15 -0
- package/src/server/resources/agent-loop.ts +183 -0
- package/src/server/services/AgentHarness.ts +663 -0
- package/src/server/services/AgentLoopController.ts +1128 -0
- package/src/server/services/AgentLoopRepository.ts +194 -0
- package/src/server/services/AgentLoopService.ts +161 -0
- package/src/server/services/AgentPlanValidator.ts +73 -0
- package/src/server/services/AgentPlannerService.ts +93 -0
- package/src/server/services/AgentRegistryService.ts +169 -0
- package/src/server/services/ExecutionSpanService.ts +2 -0
- package/src/server/skill-hub/plugin.ts +881 -771
- package/src/server/tools/agent-loop.ts +399 -0
- package/src/server/tools/delegate-task.ts +23 -485
- package/src/server/tools/orchestrator-plan.ts +279 -0
- package/src/server/tools/skill-execute.ts +68 -64
|
@@ -0,0 +1,399 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { AgentLoopPlanStepInput, AgentLoopService } from '../services/AgentLoopService';
|
|
3
|
+
import { getOrchestratorTraceContext, setOrchestratorTraceContext } from '../services/ExecutionSpanService';
|
|
4
|
+
|
|
5
|
+
const stepSchema = z.object({
|
|
6
|
+
id: z.string().optional(),
|
|
7
|
+
key: z.string().optional(),
|
|
8
|
+
planKey: z.string().optional(),
|
|
9
|
+
parentStepId: z.union([z.string(), z.number()]).optional(),
|
|
10
|
+
title: z.string().optional(),
|
|
11
|
+
description: z.string().optional(),
|
|
12
|
+
type: z.enum(['reasoning', 'skill', 'tool', 'sub_agent', 'verification']).optional(),
|
|
13
|
+
target: z.string().optional(),
|
|
14
|
+
input: z.any().optional(),
|
|
15
|
+
dependsOn: z.array(z.string()).optional(),
|
|
16
|
+
maxAttempts: z.number().int().min(1).max(10).optional(),
|
|
17
|
+
metadata: z.any().optional(),
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
const policySchema = z
|
|
21
|
+
.object({
|
|
22
|
+
maxIterations: z.number().int().min(1).max(100).optional(),
|
|
23
|
+
maxStepAttempts: z.number().int().min(1).max(10).optional(),
|
|
24
|
+
allowReplan: z.boolean().optional(),
|
|
25
|
+
requireVerification: z.boolean().optional(),
|
|
26
|
+
stopOnApprovalRequired: z.boolean().optional(),
|
|
27
|
+
})
|
|
28
|
+
.optional();
|
|
29
|
+
|
|
30
|
+
function toolResult(status: 'success' | 'error', payload: any) {
|
|
31
|
+
return {
|
|
32
|
+
status,
|
|
33
|
+
content: typeof payload === 'string' ? payload : JSON.stringify(payload),
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function valuesFromCtx(ctx: any) {
|
|
38
|
+
return ctx?.action?.params?.values || {};
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function currentUserId(ctx: any) {
|
|
42
|
+
return ctx?.state?.currentUser?.id || ctx?.auth?.user?.id;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function resolveSessionId(ctx: any, args: any) {
|
|
46
|
+
const values = valuesFromCtx(ctx);
|
|
47
|
+
return args?.sessionId || values.sessionId || ctx?.action?.params?.sessionId || ctx?.state?.sessionId;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function resolveMessageId(ctx: any, args: any) {
|
|
51
|
+
const values = valuesFromCtx(ctx);
|
|
52
|
+
return args?.messageId || values.messageId || ctx?.action?.params?.messageId;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function normalizeEmployeeUsername(raw: any) {
|
|
56
|
+
if (!raw) return null;
|
|
57
|
+
if (typeof raw === 'string') return raw;
|
|
58
|
+
return raw.username || raw.aiEmployeeUsername || raw.name || null;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
async function resolveLeaderUsername(ctx: any, plugin: any, args: any) {
|
|
62
|
+
const values = valuesFromCtx(ctx);
|
|
63
|
+
const direct = normalizeEmployeeUsername(
|
|
64
|
+
args?.leaderUsername ||
|
|
65
|
+
ctx?._currentAIEmployee ||
|
|
66
|
+
ctx?.state?.currentAIEmployee ||
|
|
67
|
+
ctx?.runtime?.context?.currentAIEmployee ||
|
|
68
|
+
values.aiEmployee,
|
|
69
|
+
);
|
|
70
|
+
if (direct) return direct;
|
|
71
|
+
|
|
72
|
+
const sessionId = resolveSessionId(ctx, args);
|
|
73
|
+
if (!sessionId) return undefined;
|
|
74
|
+
try {
|
|
75
|
+
const repo = ctx?.db?.getRepository?.('aiConversations') || plugin.db.getRepository('aiConversations');
|
|
76
|
+
const conversation = await repo.findOne({ filter: { sessionId } });
|
|
77
|
+
return normalizeEmployeeUsername(conversation?.aiEmployeeUsername || conversation?.get?.('aiEmployeeUsername'));
|
|
78
|
+
} catch {
|
|
79
|
+
return undefined;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function setLoopTraceContext(ctx: any, snapshot: any, step?: any) {
|
|
84
|
+
if (!ctx || !snapshot?.run) return;
|
|
85
|
+
const existing: any = getOrchestratorTraceContext(ctx) || {};
|
|
86
|
+
setOrchestratorTraceContext(ctx, {
|
|
87
|
+
...existing,
|
|
88
|
+
rootRunId: snapshot.run.rootRunId || existing.rootRunId,
|
|
89
|
+
leaderUsername: snapshot.run.leaderUsername || existing.leaderUsername,
|
|
90
|
+
agentLoopRunId: String(snapshot.run.id),
|
|
91
|
+
agentLoopStepId: step?.id ? String(step.id) : undefined,
|
|
92
|
+
} as any);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function planFromArgs(plan: AgentLoopPlanStepInput[] | undefined) {
|
|
96
|
+
return Array.isArray(plan) ? plan : [];
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export function createAgentLoopTools(plugin: any, service: AgentLoopService) {
|
|
100
|
+
return [
|
|
101
|
+
{
|
|
102
|
+
scope: 'CUSTOM' as const,
|
|
103
|
+
execution: 'backend' as const,
|
|
104
|
+
defaultPermission: 'ALLOW' as const,
|
|
105
|
+
introduction: {
|
|
106
|
+
title: 'Agent Loop - Start',
|
|
107
|
+
about: 'Create a persistent agent loop run and initial plan for a user goal.',
|
|
108
|
+
},
|
|
109
|
+
definition: {
|
|
110
|
+
name: 'agent_loop_start',
|
|
111
|
+
description:
|
|
112
|
+
'Start a persistent agent loop run. Use this first when the user asks for a multi-step task. Provide a concrete plan with small executable steps before calling other tools.',
|
|
113
|
+
schema: z.object({
|
|
114
|
+
goal: z.string().min(1).describe('The user goal to complete.'),
|
|
115
|
+
leaderUsername: z
|
|
116
|
+
.string()
|
|
117
|
+
.optional()
|
|
118
|
+
.describe('Leader AI employee username. Usually omit; inferred from chat.'),
|
|
119
|
+
sessionId: z.string().optional(),
|
|
120
|
+
messageId: z.string().optional(),
|
|
121
|
+
policy: policySchema,
|
|
122
|
+
metadata: z.any().optional(),
|
|
123
|
+
plan: z
|
|
124
|
+
.array(stepSchema)
|
|
125
|
+
.optional()
|
|
126
|
+
.describe('Initial plan steps. Use stable planKey values for dependencies.'),
|
|
127
|
+
}),
|
|
128
|
+
},
|
|
129
|
+
invoke: async (ctx: any, args: any) => {
|
|
130
|
+
try {
|
|
131
|
+
const leaderUsername = await resolveLeaderUsername(ctx, plugin, args);
|
|
132
|
+
const snapshot = await service.createRun({
|
|
133
|
+
goal: args.goal,
|
|
134
|
+
leaderUsername,
|
|
135
|
+
sessionId: resolveSessionId(ctx, args),
|
|
136
|
+
messageId: resolveMessageId(ctx, args),
|
|
137
|
+
userId: currentUserId(ctx),
|
|
138
|
+
policy: args.policy,
|
|
139
|
+
metadata: args.metadata,
|
|
140
|
+
plan: planFromArgs(args.plan),
|
|
141
|
+
});
|
|
142
|
+
setLoopTraceContext(ctx, snapshot, snapshot.nextStep);
|
|
143
|
+
return toolResult('success', snapshot);
|
|
144
|
+
} catch (error: any) {
|
|
145
|
+
return toolResult('error', error?.message || String(error));
|
|
146
|
+
}
|
|
147
|
+
},
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
scope: 'CUSTOM' as const,
|
|
151
|
+
execution: 'backend' as const,
|
|
152
|
+
defaultPermission: 'ALLOW' as const,
|
|
153
|
+
introduction: {
|
|
154
|
+
title: 'Agent Loop - Status',
|
|
155
|
+
about: 'Read the current run, steps, and next executable step.',
|
|
156
|
+
},
|
|
157
|
+
definition: {
|
|
158
|
+
name: 'agent_loop_status',
|
|
159
|
+
description:
|
|
160
|
+
'Fetch an agent loop run. Call this before executing the next step so subsequent skill/tool calls can be linked to the current loop step.',
|
|
161
|
+
schema: z.object({
|
|
162
|
+
runId: z.union([z.string(), z.number()]),
|
|
163
|
+
}),
|
|
164
|
+
},
|
|
165
|
+
invoke: async (ctx: any, args: any) => {
|
|
166
|
+
try {
|
|
167
|
+
const snapshot = await service.getRunSnapshot(args.runId);
|
|
168
|
+
setLoopTraceContext(ctx, snapshot, snapshot.nextStep);
|
|
169
|
+
return toolResult('success', snapshot);
|
|
170
|
+
} catch (error: any) {
|
|
171
|
+
return toolResult('error', error?.message || String(error));
|
|
172
|
+
}
|
|
173
|
+
},
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
scope: 'CUSTOM' as const,
|
|
177
|
+
execution: 'backend' as const,
|
|
178
|
+
defaultPermission: 'ALLOW' as const,
|
|
179
|
+
introduction: {
|
|
180
|
+
title: 'Agent Loop - Update Step',
|
|
181
|
+
about: 'Move a plan step through running, succeeded, failed, or skipped states.',
|
|
182
|
+
},
|
|
183
|
+
definition: {
|
|
184
|
+
name: 'agent_loop_update_step',
|
|
185
|
+
description:
|
|
186
|
+
'Update one plan step after executing the corresponding skill/tool/sub-agent action. Use status="running" before the action and status="succeeded" or "failed" after it.',
|
|
187
|
+
schema: z.object({
|
|
188
|
+
stepId: z.union([z.string(), z.number()]),
|
|
189
|
+
status: z.enum(['running', 'succeeded', 'failed', 'skipped']),
|
|
190
|
+
output: z.any().optional(),
|
|
191
|
+
error: z.string().optional(),
|
|
192
|
+
reason: z.string().optional(),
|
|
193
|
+
skillExecutionId: z.union([z.string(), z.number()]).optional(),
|
|
194
|
+
agentExecutionSpanId: z.union([z.string(), z.number()]).optional(),
|
|
195
|
+
metadata: z.any().optional(),
|
|
196
|
+
}),
|
|
197
|
+
},
|
|
198
|
+
invoke: async (ctx: any, args: any) => {
|
|
199
|
+
try {
|
|
200
|
+
let snapshot;
|
|
201
|
+
if (args.status === 'running') {
|
|
202
|
+
snapshot = await service.startStep(args.stepId, {
|
|
203
|
+
userId: currentUserId(ctx),
|
|
204
|
+
agentExecutionSpanId: args.agentExecutionSpanId,
|
|
205
|
+
});
|
|
206
|
+
const currentStep = snapshot.steps.find((step: any) => String(step.id) === String(args.stepId));
|
|
207
|
+
setLoopTraceContext(ctx, snapshot, currentStep);
|
|
208
|
+
} else if (args.status === 'succeeded') {
|
|
209
|
+
snapshot = await service.completeStep(args.stepId, args.output === undefined ? {} : args.output, {
|
|
210
|
+
userId: currentUserId(ctx),
|
|
211
|
+
skillExecutionId: args.skillExecutionId,
|
|
212
|
+
agentExecutionSpanId: args.agentExecutionSpanId,
|
|
213
|
+
metadata: args.metadata,
|
|
214
|
+
});
|
|
215
|
+
setLoopTraceContext(ctx, snapshot, snapshot.nextStep);
|
|
216
|
+
} else if (args.status === 'failed') {
|
|
217
|
+
snapshot = await service.failStep(args.stepId, args.error || 'Step failed.', {
|
|
218
|
+
userId: currentUserId(ctx),
|
|
219
|
+
metadata: args.metadata,
|
|
220
|
+
});
|
|
221
|
+
setLoopTraceContext(ctx, snapshot, snapshot.nextStep);
|
|
222
|
+
} else {
|
|
223
|
+
snapshot = await service.skipStep(args.stepId, args.reason || 'Skipped.', {
|
|
224
|
+
userId: currentUserId(ctx),
|
|
225
|
+
});
|
|
226
|
+
setLoopTraceContext(ctx, snapshot, snapshot.nextStep);
|
|
227
|
+
}
|
|
228
|
+
return toolResult('success', snapshot);
|
|
229
|
+
} catch (error: any) {
|
|
230
|
+
return toolResult('error', error?.message || String(error));
|
|
231
|
+
}
|
|
232
|
+
},
|
|
233
|
+
},
|
|
234
|
+
{
|
|
235
|
+
scope: 'CUSTOM' as const,
|
|
236
|
+
execution: 'backend' as const,
|
|
237
|
+
defaultPermission: 'ALLOW' as const,
|
|
238
|
+
introduction: {
|
|
239
|
+
title: 'Agent Loop - Replan',
|
|
240
|
+
about: 'Replace pending work or append new plan steps when execution needs a new path.',
|
|
241
|
+
},
|
|
242
|
+
definition: {
|
|
243
|
+
name: 'agent_loop_replan',
|
|
244
|
+
description:
|
|
245
|
+
'Update the plan when a step fails, required context is missing, or a better execution path is discovered.',
|
|
246
|
+
schema: z.object({
|
|
247
|
+
runId: z.union([z.string(), z.number()]),
|
|
248
|
+
reason: z.string().optional(),
|
|
249
|
+
mode: z.enum(['replace_pending', 'append']).optional(),
|
|
250
|
+
plan: z.array(stepSchema).min(1),
|
|
251
|
+
}),
|
|
252
|
+
},
|
|
253
|
+
invoke: async (ctx: any, args: any) => {
|
|
254
|
+
try {
|
|
255
|
+
await service.replan(args.runId, args.plan, {
|
|
256
|
+
reason: args.reason,
|
|
257
|
+
mode: args.mode || 'replace_pending',
|
|
258
|
+
userId: currentUserId(ctx),
|
|
259
|
+
});
|
|
260
|
+
const snapshot = await service.getRunSnapshot(args.runId);
|
|
261
|
+
setLoopTraceContext(ctx, snapshot, snapshot.nextStep);
|
|
262
|
+
return toolResult('success', snapshot);
|
|
263
|
+
} catch (error: any) {
|
|
264
|
+
return toolResult('error', error?.message || String(error));
|
|
265
|
+
}
|
|
266
|
+
},
|
|
267
|
+
},
|
|
268
|
+
{
|
|
269
|
+
scope: 'CUSTOM' as const,
|
|
270
|
+
execution: 'backend' as const,
|
|
271
|
+
defaultPermission: 'ALLOW' as const,
|
|
272
|
+
introduction: {
|
|
273
|
+
title: 'Agent Loop - Request Approval',
|
|
274
|
+
about: 'Pause a run and request user approval or edited input for a step.',
|
|
275
|
+
},
|
|
276
|
+
definition: {
|
|
277
|
+
name: 'agent_loop_request_approval',
|
|
278
|
+
description:
|
|
279
|
+
'Pause the loop when a step needs user approval, user-edited input, or an ASK/human-review tool cannot run headlessly.',
|
|
280
|
+
schema: z.object({
|
|
281
|
+
stepId: z.union([z.string(), z.number()]),
|
|
282
|
+
reason: z.string().optional(),
|
|
283
|
+
approval: z.any().optional(),
|
|
284
|
+
}),
|
|
285
|
+
},
|
|
286
|
+
invoke: async (ctx: any, args: any) => {
|
|
287
|
+
try {
|
|
288
|
+
const snapshot = await service.requestApproval(args.stepId, args.approval || {}, {
|
|
289
|
+
reason: args.reason,
|
|
290
|
+
userId: currentUserId(ctx),
|
|
291
|
+
});
|
|
292
|
+
setLoopTraceContext(ctx, snapshot, snapshot.nextStep);
|
|
293
|
+
return toolResult('success', snapshot);
|
|
294
|
+
} catch (error: any) {
|
|
295
|
+
return toolResult('error', error?.message || String(error));
|
|
296
|
+
}
|
|
297
|
+
},
|
|
298
|
+
},
|
|
299
|
+
{
|
|
300
|
+
scope: 'CUSTOM' as const,
|
|
301
|
+
execution: 'backend' as const,
|
|
302
|
+
defaultPermission: 'ALLOW' as const,
|
|
303
|
+
introduction: {
|
|
304
|
+
title: 'Agent Loop - Resume',
|
|
305
|
+
about: 'Resume a waiting run after user approval or rejection.',
|
|
306
|
+
},
|
|
307
|
+
definition: {
|
|
308
|
+
name: 'agent_loop_resume',
|
|
309
|
+
description:
|
|
310
|
+
'Resume a run that is waiting for user approval. Pass editedInput when the user changed step input.',
|
|
311
|
+
schema: z.object({
|
|
312
|
+
runId: z.union([z.string(), z.number()]),
|
|
313
|
+
stepId: z.union([z.string(), z.number()]).optional(),
|
|
314
|
+
approved: z.boolean(),
|
|
315
|
+
editedInput: z.any().optional(),
|
|
316
|
+
}),
|
|
317
|
+
},
|
|
318
|
+
invoke: async (ctx: any, args: any) => {
|
|
319
|
+
try {
|
|
320
|
+
const snapshot = await service.resumeRun(args.runId, {
|
|
321
|
+
stepId: args.stepId,
|
|
322
|
+
approved: args.approved,
|
|
323
|
+
editedInput: args.editedInput,
|
|
324
|
+
userId: currentUserId(ctx),
|
|
325
|
+
ctx,
|
|
326
|
+
});
|
|
327
|
+
setLoopTraceContext(ctx, snapshot, snapshot.nextStep);
|
|
328
|
+
return toolResult('success', snapshot);
|
|
329
|
+
} catch (error: any) {
|
|
330
|
+
return toolResult('error', error?.message || String(error));
|
|
331
|
+
}
|
|
332
|
+
},
|
|
333
|
+
},
|
|
334
|
+
{
|
|
335
|
+
scope: 'CUSTOM' as const,
|
|
336
|
+
execution: 'backend' as const,
|
|
337
|
+
defaultPermission: 'ALLOW' as const,
|
|
338
|
+
introduction: {
|
|
339
|
+
title: 'Agent Loop - Finish',
|
|
340
|
+
about: 'Finish a run with final answer and optional evidence.',
|
|
341
|
+
},
|
|
342
|
+
definition: {
|
|
343
|
+
name: 'agent_loop_finish',
|
|
344
|
+
description:
|
|
345
|
+
'Finish the agent loop after all required steps and verification are complete. Use status="failed" if the goal cannot be completed.',
|
|
346
|
+
schema: z.object({
|
|
347
|
+
runId: z.union([z.string(), z.number()]),
|
|
348
|
+
finalAnswer: z.string().optional(),
|
|
349
|
+
status: z.enum(['succeeded', 'failed']).optional(),
|
|
350
|
+
summary: z.string().optional(),
|
|
351
|
+
evidence: z.any().optional(),
|
|
352
|
+
}),
|
|
353
|
+
},
|
|
354
|
+
invoke: async (ctx: any, args: any) => {
|
|
355
|
+
try {
|
|
356
|
+
const snapshot = await service.finishRun(args.runId, args.finalAnswer || '', {
|
|
357
|
+
status: args.status || 'succeeded',
|
|
358
|
+
summary: args.summary,
|
|
359
|
+
evidence: args.evidence,
|
|
360
|
+
userId: currentUserId(ctx),
|
|
361
|
+
});
|
|
362
|
+
setLoopTraceContext(ctx, snapshot);
|
|
363
|
+
return toolResult('success', snapshot);
|
|
364
|
+
} catch (error: any) {
|
|
365
|
+
return toolResult('error', error?.message || String(error));
|
|
366
|
+
}
|
|
367
|
+
},
|
|
368
|
+
},
|
|
369
|
+
{
|
|
370
|
+
scope: 'CUSTOM' as const,
|
|
371
|
+
execution: 'backend' as const,
|
|
372
|
+
defaultPermission: 'ALLOW' as const,
|
|
373
|
+
introduction: {
|
|
374
|
+
title: 'Agent Loop - Cancel',
|
|
375
|
+
about: 'Cancel a run and skip unfinished steps.',
|
|
376
|
+
},
|
|
377
|
+
definition: {
|
|
378
|
+
name: 'agent_loop_cancel',
|
|
379
|
+
description: 'Cancel an agent loop run. Use this when the user stops the task or the goal is no longer valid.',
|
|
380
|
+
schema: z.object({
|
|
381
|
+
runId: z.union([z.string(), z.number()]),
|
|
382
|
+
reason: z.string().optional(),
|
|
383
|
+
}),
|
|
384
|
+
},
|
|
385
|
+
invoke: async (ctx: any, args: any) => {
|
|
386
|
+
try {
|
|
387
|
+
const snapshot = await service.cancelRun(args.runId, {
|
|
388
|
+
reason: args.reason,
|
|
389
|
+
userId: currentUserId(ctx),
|
|
390
|
+
});
|
|
391
|
+
setLoopTraceContext(ctx, snapshot);
|
|
392
|
+
return toolResult('success', snapshot);
|
|
393
|
+
} catch (error: any) {
|
|
394
|
+
return toolResult('error', error?.message || String(error));
|
|
395
|
+
}
|
|
396
|
+
},
|
|
397
|
+
},
|
|
398
|
+
];
|
|
399
|
+
}
|