@dexto/agent-management 1.5.7 → 1.6.0
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/AgentFactory.cjs +5 -9
- package/dist/AgentFactory.d.ts +6 -5
- package/dist/AgentFactory.d.ts.map +1 -1
- package/dist/AgentFactory.js +5 -9
- package/dist/AgentManager.cjs +2 -2
- package/dist/AgentManager.d.ts +1 -1
- package/dist/AgentManager.d.ts.map +1 -1
- package/dist/AgentManager.js +4 -4
- package/dist/agent-creation.cjs +95 -0
- package/dist/agent-creation.d.ts +15 -0
- package/dist/agent-creation.d.ts.map +1 -0
- package/dist/agent-creation.js +78 -0
- package/dist/config/config-enrichment.cjs +2 -12
- package/dist/config/config-enrichment.d.ts +1 -1
- package/dist/config/config-enrichment.d.ts.map +1 -1
- package/dist/config/config-enrichment.js +2 -12
- package/dist/config/config-manager.cjs +4 -4
- package/dist/config/config-manager.d.ts +1 -1
- package/dist/config/config-manager.d.ts.map +1 -1
- package/dist/config/config-manager.js +3 -1
- package/dist/config/loader.d.ts +3 -3
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/images/image-store.cjs +256 -0
- package/dist/images/image-store.d.ts +70 -0
- package/dist/images/image-store.d.ts.map +1 -0
- package/dist/images/image-store.js +210 -0
- package/dist/index.cjs +43 -2
- package/dist/index.d.ts +5 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +43 -1
- package/dist/models/custom-models.cjs +1 -1
- package/dist/models/custom-models.d.ts +7 -7
- package/dist/models/custom-models.d.ts.map +1 -1
- package/dist/models/custom-models.js +1 -1
- package/dist/plugins/discover-plugins.cjs +15 -31
- package/dist/plugins/discover-plugins.d.ts.map +1 -1
- package/dist/plugins/discover-plugins.js +15 -31
- package/dist/plugins/discover-skills.cjs +4 -0
- package/dist/plugins/discover-skills.d.ts +6 -3
- package/dist/plugins/discover-skills.d.ts.map +1 -1
- package/dist/plugins/discover-skills.js +4 -0
- package/dist/plugins/index.cjs +0 -2
- package/dist/plugins/index.d.ts +5 -6
- package/dist/plugins/index.d.ts.map +1 -1
- package/dist/plugins/index.js +0 -2
- package/dist/plugins/list-plugins.cjs +3 -1
- package/dist/plugins/list-plugins.d.ts.map +1 -1
- package/dist/plugins/list-plugins.js +3 -1
- package/dist/plugins/load-plugin.cjs +0 -13
- package/dist/plugins/load-plugin.d.ts +3 -5
- package/dist/plugins/load-plugin.d.ts.map +1 -1
- package/dist/plugins/load-plugin.js +0 -13
- package/dist/plugins/schemas.cjs +1 -11
- package/dist/plugins/schemas.d.ts +14 -69
- package/dist/plugins/schemas.d.ts.map +1 -1
- package/dist/plugins/schemas.js +1 -10
- package/dist/plugins/types.d.ts +2 -20
- package/dist/plugins/types.d.ts.map +1 -1
- package/dist/plugins/validate-plugin.cjs +7 -37
- package/dist/plugins/validate-plugin.d.ts +6 -24
- package/dist/plugins/validate-plugin.d.ts.map +1 -1
- package/dist/plugins/validate-plugin.js +8 -38
- package/dist/preferences/errors.cjs +11 -0
- package/dist/preferences/errors.d.ts +1 -0
- package/dist/preferences/errors.d.ts.map +1 -1
- package/dist/preferences/errors.js +11 -0
- package/dist/preferences/loader.cjs +119 -6
- package/dist/preferences/loader.d.ts +21 -1
- package/dist/preferences/loader.d.ts.map +1 -1
- package/dist/preferences/loader.js +102 -1
- package/dist/preferences/schemas.cjs +12 -0
- package/dist/preferences/schemas.d.ts +38 -12
- package/dist/preferences/schemas.d.ts.map +1 -1
- package/dist/preferences/schemas.js +10 -0
- package/dist/registry/registry.d.ts +4 -44
- package/dist/registry/registry.d.ts.map +1 -1
- package/dist/runtime/AgentPool.d.ts +2 -2
- package/dist/runtime/AgentPool.d.ts.map +1 -1
- package/dist/runtime/AgentRuntime.cjs +20 -15
- package/dist/runtime/AgentRuntime.d.ts +2 -2
- package/dist/runtime/AgentRuntime.d.ts.map +1 -1
- package/dist/runtime/AgentRuntime.js +20 -15
- package/dist/runtime/approval-delegation.d.ts +2 -2
- package/dist/runtime/approval-delegation.d.ts.map +1 -1
- package/dist/runtime/schemas.d.ts +1 -1
- package/dist/runtime/types.d.ts +2 -1
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/{tool-provider → tool-factories/agent-spawner}/error-codes.d.ts +1 -1
- package/dist/tool-factories/agent-spawner/error-codes.d.ts.map +1 -0
- package/dist/{tool-provider → tool-factories/agent-spawner}/errors.d.ts +1 -1
- package/dist/tool-factories/agent-spawner/errors.d.ts.map +1 -0
- package/dist/tool-factories/agent-spawner/factory.cjs +290 -0
- package/dist/tool-factories/agent-spawner/factory.d.ts +4 -0
- package/dist/tool-factories/agent-spawner/factory.d.ts.map +1 -0
- package/dist/tool-factories/agent-spawner/factory.js +279 -0
- package/dist/{tool-provider → tool-factories/agent-spawner}/index.cjs +9 -9
- package/dist/{tool-provider → tool-factories/agent-spawner}/index.d.ts +3 -3
- package/dist/tool-factories/agent-spawner/index.d.ts.map +1 -0
- package/dist/{tool-provider → tool-factories/agent-spawner}/index.js +4 -4
- package/dist/{tool-provider → tool-factories/agent-spawner}/llm-resolution.cjs +1 -1
- package/dist/{tool-provider → tool-factories/agent-spawner}/llm-resolution.d.ts +4 -4
- package/dist/tool-factories/agent-spawner/llm-resolution.d.ts.map +1 -0
- package/dist/{tool-provider → tool-factories/agent-spawner}/llm-resolution.js +1 -1
- package/dist/{tool-provider/runtime-service.cjs → tool-factories/agent-spawner/runtime.cjs} +112 -73
- package/dist/{tool-provider/runtime-service.d.ts → tool-factories/agent-spawner/runtime.d.ts} +8 -6
- package/dist/tool-factories/agent-spawner/runtime.d.ts.map +1 -0
- package/dist/{tool-provider/runtime-service.js → tool-factories/agent-spawner/runtime.js} +98 -69
- package/dist/{tool-provider → tool-factories/agent-spawner}/schemas.cjs +2 -2
- package/dist/{tool-provider → tool-factories/agent-spawner}/schemas.d.ts +4 -4
- package/dist/tool-factories/agent-spawner/schemas.d.ts.map +1 -0
- package/dist/{tool-provider → tool-factories/agent-spawner}/schemas.js +2 -2
- package/dist/{tool-provider → tool-factories/agent-spawner}/spawn-agent-tool.cjs +8 -7
- package/dist/tool-factories/agent-spawner/spawn-agent-tool.d.ts +11 -0
- package/dist/tool-factories/agent-spawner/spawn-agent-tool.d.ts.map +1 -0
- package/dist/{tool-provider → tool-factories/agent-spawner}/spawn-agent-tool.js +8 -7
- package/dist/tool-factories/agent-spawner/types.d.ts.map +1 -0
- package/dist/utils/api-key-resolver.cjs +1 -1
- package/dist/utils/api-key-resolver.js +1 -1
- package/dist/utils/feature-flags.cjs +3 -1
- package/dist/utils/feature-flags.d.ts +2 -2
- package/dist/utils/feature-flags.d.ts.map +1 -1
- package/dist/utils/feature-flags.js +3 -1
- package/dist/writer.d.ts +2 -1
- package/dist/writer.d.ts.map +1 -1
- package/package.json +6 -3
- package/dist/tool-provider/error-codes.d.ts.map +0 -1
- package/dist/tool-provider/errors.d.ts.map +0 -1
- package/dist/tool-provider/index.d.ts.map +0 -1
- package/dist/tool-provider/llm-resolution.d.ts.map +0 -1
- package/dist/tool-provider/runtime-service.d.ts.map +0 -1
- package/dist/tool-provider/schemas.d.ts.map +0 -1
- package/dist/tool-provider/spawn-agent-tool.d.ts +0 -10
- package/dist/tool-provider/spawn-agent-tool.d.ts.map +0 -1
- package/dist/tool-provider/tool-provider.cjs +0 -46
- package/dist/tool-provider/tool-provider.d.ts +0 -24
- package/dist/tool-provider/tool-provider.d.ts.map +0 -1
- package/dist/tool-provider/tool-provider.js +0 -22
- package/dist/tool-provider/types.d.ts.map +0 -1
- /package/dist/{tool-provider → tool-factories/agent-spawner}/error-codes.cjs +0 -0
- /package/dist/{tool-provider → tool-factories/agent-spawner}/error-codes.js +0 -0
- /package/dist/{tool-provider → tool-factories/agent-spawner}/errors.cjs +0 -0
- /package/dist/{tool-provider → tool-factories/agent-spawner}/errors.js +0 -0
- /package/dist/{tool-provider → tool-factories/agent-spawner}/types.cjs +0 -0
- /package/dist/{tool-provider → tool-factories/agent-spawner}/types.d.ts +0 -0
- /package/dist/{tool-provider → tool-factories/agent-spawner}/types.js +0 -0
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* this module determines which LLM configuration the sub-agent should use.
|
|
6
6
|
*
|
|
7
7
|
* Resolution priority:
|
|
8
|
-
* 1. If parent's provider can serve sub-agent's model (dexto/openrouter/same provider)
|
|
8
|
+
* 1. If parent's provider can serve sub-agent's model (dexto-nova/openrouter/same provider)
|
|
9
9
|
* → Use parent's provider + sub-agent's model (transformed if needed)
|
|
10
10
|
* 2. If incompatible providers
|
|
11
11
|
* → Fall back to parent's full LLM config (with warning)
|
|
@@ -40,12 +40,12 @@ export interface ResolveSubAgentLLMOptions {
|
|
|
40
40
|
* when possible, while leveraging the parent's provider/credentials.
|
|
41
41
|
*
|
|
42
42
|
* @example
|
|
43
|
-
* // Parent uses dexto, sub-agent wants anthropic/haiku
|
|
43
|
+
* // Parent uses dexto-nova, sub-agent wants anthropic/haiku
|
|
44
44
|
* resolveSubAgentLLM({
|
|
45
45
|
* subAgentLLM: { provider: 'anthropic', model: 'claude-haiku-4-5-20251001', apiKey: '$ANTHROPIC_API_KEY' },
|
|
46
|
-
* parentLLM: { provider: 'dexto', model: 'anthropic/claude-sonnet-4', apiKey: '$DEXTO_API_KEY' }
|
|
46
|
+
* parentLLM: { provider: 'dexto-nova', model: 'anthropic/claude-sonnet-4', apiKey: '$DEXTO_API_KEY' }
|
|
47
47
|
* })
|
|
48
|
-
* // Returns: { provider: 'dexto', model: 'anthropic/claude-haiku-4.5', apiKey: '$DEXTO_API_KEY' }
|
|
48
|
+
* // Returns: { provider: 'dexto-nova', model: 'anthropic/claude-haiku-4.5', apiKey: '$DEXTO_API_KEY' }
|
|
49
49
|
*/
|
|
50
50
|
export declare function resolveSubAgentLLM(options: ResolveSubAgentLLMOptions): SubAgentLLMResolution;
|
|
51
51
|
//# sourceMappingURL=llm-resolution.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm-resolution.d.ts","sourceRoot":"","sources":["../../../src/tool-factories/agent-spawner/llm-resolution.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAG7C;;GAEG;AACH,MAAM,WAAW,qBAAqB;IAClC,4CAA4C;IAC5C,GAAG,EAAE,SAAS,CAAC;IACf,wCAAwC;IACxC,UAAU,EACJ,mBAAmB,GACnB,eAAe,GACf,iBAAiB,CAAC;IACxB,+CAA+C;IAC/C,MAAM,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,yBAAyB;IACtC,gDAAgD;IAChD,WAAW,EAAE,SAAS,CAAC;IACvB,6EAA6E;IAC7E,SAAS,EAAE,SAAS,CAAC;IACrB,wCAAwC;IACxC,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,yBAAyB,GAAG,qBAAqB,CAmE5F"}
|
|
@@ -42,7 +42,7 @@ function resolveSubAgentLLM(options) {
|
|
|
42
42
|
return {
|
|
43
43
|
llm: parentLLM,
|
|
44
44
|
resolution: "parent-fallback",
|
|
45
|
-
reason: `${agentLabel} cannot use ${subAgentProvider}/${subAgentModel} with parent's ${parentProvider} provider. Falling back to parent's LLM config. Tip: Use 'dexto login' for Dexto Credits which supports all models.`
|
|
45
|
+
reason: `${agentLabel} cannot use ${subAgentProvider}/${subAgentModel} with parent's ${parentProvider} provider. Falling back to parent's LLM config. Tip: Use 'dexto login' for Dexto Nova Credits which supports all models.`
|
|
46
46
|
};
|
|
47
47
|
}
|
|
48
48
|
export {
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
2
3
|
var __defProp = Object.defineProperty;
|
|
3
4
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
5
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
5
7
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
8
|
var __export = (target, all) => {
|
|
7
9
|
for (var name in all)
|
|
@@ -15,24 +17,66 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
15
17
|
}
|
|
16
18
|
return to;
|
|
17
19
|
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
18
28
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
-
var
|
|
20
|
-
__export(
|
|
21
|
-
|
|
29
|
+
var runtime_exports = {};
|
|
30
|
+
__export(runtime_exports, {
|
|
31
|
+
AgentSpawnerRuntime: () => AgentSpawnerRuntime
|
|
22
32
|
});
|
|
23
|
-
module.exports = __toCommonJS(
|
|
33
|
+
module.exports = __toCommonJS(runtime_exports);
|
|
24
34
|
var import_core = require("@dexto/core");
|
|
25
|
-
var import_AgentRuntime = require("
|
|
26
|
-
var import_approval_delegation = require("
|
|
27
|
-
var import_loader = require("
|
|
28
|
-
var import_registry = require("
|
|
35
|
+
var import_AgentRuntime = require("../../runtime/AgentRuntime.js");
|
|
36
|
+
var import_approval_delegation = require("../../runtime/approval-delegation.js");
|
|
37
|
+
var import_loader = require("../../config/loader.js");
|
|
38
|
+
var import_registry = require("../../registry/registry.js");
|
|
39
|
+
var import_types = require("../../registry/types.js");
|
|
40
|
+
var import_path = require("../../utils/path.js");
|
|
41
|
+
var path = __toESM(require("path"), 1);
|
|
29
42
|
var import_llm_resolution = require("./llm-resolution.js");
|
|
30
|
-
class
|
|
43
|
+
class AgentSpawnerRuntime {
|
|
31
44
|
runtime;
|
|
32
45
|
parentId;
|
|
33
46
|
parentAgent;
|
|
34
47
|
config;
|
|
35
48
|
logger;
|
|
49
|
+
resolveBundledAgentConfig(agentId) {
|
|
50
|
+
const baseDir = "agents";
|
|
51
|
+
const normalizedPath = path.relative(baseDir, path.join(baseDir, agentId));
|
|
52
|
+
if (normalizedPath.startsWith("..") || path.isAbsolute(normalizedPath)) {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
const candidates = [
|
|
56
|
+
`agents/${agentId}/${agentId}.yml`,
|
|
57
|
+
`agents/${agentId}/${agentId}.yaml`,
|
|
58
|
+
`agents/${agentId}.yml`,
|
|
59
|
+
`agents/${agentId}.yaml`
|
|
60
|
+
];
|
|
61
|
+
for (const candidate of candidates) {
|
|
62
|
+
try {
|
|
63
|
+
return (0, import_path.resolveBundledScript)(candidate);
|
|
64
|
+
} catch {
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
createFallbackRegistryEntry(agentId) {
|
|
70
|
+
return {
|
|
71
|
+
id: agentId,
|
|
72
|
+
name: (0, import_types.deriveDisplayName)(agentId),
|
|
73
|
+
description: "Agent specified in config (registry entry not found)",
|
|
74
|
+
author: "unknown",
|
|
75
|
+
tags: [],
|
|
76
|
+
source: agentId,
|
|
77
|
+
type: "custom"
|
|
78
|
+
};
|
|
79
|
+
}
|
|
36
80
|
constructor(parentAgent, config, logger) {
|
|
37
81
|
this.parentAgent = parentAgent;
|
|
38
82
|
this.config = config;
|
|
@@ -46,7 +90,7 @@ class RuntimeService {
|
|
|
46
90
|
logger
|
|
47
91
|
});
|
|
48
92
|
this.logger.debug(
|
|
49
|
-
`
|
|
93
|
+
`AgentSpawnerRuntime initialized for parent '${this.parentId}' (maxAgents: ${config.maxConcurrentAgents})`
|
|
50
94
|
);
|
|
51
95
|
}
|
|
52
96
|
/**
|
|
@@ -120,23 +164,7 @@ class RuntimeService {
|
|
|
120
164
|
* @param options.sessionId - Optional session ID for progress events
|
|
121
165
|
*/
|
|
122
166
|
async fork(options) {
|
|
123
|
-
|
|
124
|
-
task: options.task,
|
|
125
|
-
instructions: options.instructions
|
|
126
|
-
};
|
|
127
|
-
if (options.agentId) {
|
|
128
|
-
spawnOptions.agentId = options.agentId;
|
|
129
|
-
}
|
|
130
|
-
if (options.autoApprove !== void 0) {
|
|
131
|
-
spawnOptions.autoApprove = options.autoApprove;
|
|
132
|
-
}
|
|
133
|
-
if (options.toolCallId) {
|
|
134
|
-
spawnOptions.toolCallId = options.toolCallId;
|
|
135
|
-
}
|
|
136
|
-
if (options.sessionId) {
|
|
137
|
-
spawnOptions.sessionId = options.sessionId;
|
|
138
|
-
}
|
|
139
|
-
return this.spawnAndExecute(spawnOptions);
|
|
167
|
+
return this.spawnAndExecute(options);
|
|
140
168
|
}
|
|
141
169
|
/**
|
|
142
170
|
* Set up progress event emission for a sub-agent.
|
|
@@ -158,10 +186,8 @@ class RuntimeService {
|
|
|
158
186
|
let toolCount = 0;
|
|
159
187
|
const tokenUsage = { input: 0, output: 0, total: 0 };
|
|
160
188
|
let currentTool = "";
|
|
161
|
-
const subAgentBus = subAgentHandle.agent.agentEventBus;
|
|
162
|
-
const parentBus = this.parentAgent.agentEventBus;
|
|
163
189
|
const emitProgress = (tool, args) => {
|
|
164
|
-
|
|
190
|
+
this.parentAgent.emit("service:event", {
|
|
165
191
|
service: "agent-spawner",
|
|
166
192
|
event: "progress",
|
|
167
193
|
toolCallId,
|
|
@@ -179,15 +205,10 @@ class RuntimeService {
|
|
|
179
205
|
const toolCallHandler = (event) => {
|
|
180
206
|
toolCount++;
|
|
181
207
|
let displayToolName = event.toolName;
|
|
182
|
-
if (displayToolName.startsWith("
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
displayToolName =
|
|
186
|
-
} else if (displayToolName.startsWith("mcp--")) {
|
|
187
|
-
const parts = displayToolName.split("--");
|
|
188
|
-
if (parts.length >= 3) {
|
|
189
|
-
displayToolName = parts.slice(2).join("--");
|
|
190
|
-
}
|
|
208
|
+
if (displayToolName.startsWith("mcp--")) {
|
|
209
|
+
const trimmed = displayToolName.substring("mcp--".length);
|
|
210
|
+
const parts = trimmed.split("--");
|
|
211
|
+
displayToolName = parts.length >= 2 ? parts.slice(1).join("--") : trimmed;
|
|
191
212
|
}
|
|
192
213
|
currentTool = displayToolName;
|
|
193
214
|
this.logger.debug(
|
|
@@ -206,11 +227,11 @@ class RuntimeService {
|
|
|
206
227
|
emitProgress(currentTool || "processing");
|
|
207
228
|
}
|
|
208
229
|
};
|
|
209
|
-
|
|
210
|
-
|
|
230
|
+
subAgentHandle.agent.on("llm:tool-call", toolCallHandler);
|
|
231
|
+
subAgentHandle.agent.on("llm:response", responseHandler);
|
|
211
232
|
return () => {
|
|
212
|
-
|
|
213
|
-
|
|
233
|
+
subAgentHandle.agent.off("llm:tool-call", toolCallHandler);
|
|
234
|
+
subAgentHandle.agent.off("llm:response", responseHandler);
|
|
214
235
|
};
|
|
215
236
|
}
|
|
216
237
|
/**
|
|
@@ -423,19 +444,33 @@ class RuntimeService {
|
|
|
423
444
|
*/
|
|
424
445
|
async buildSubAgentConfig(options, sessionId) {
|
|
425
446
|
const { agentId, inheritLlm, autoApprove } = options;
|
|
426
|
-
const
|
|
447
|
+
const parentSettings = this.parentAgent.config;
|
|
427
448
|
const currentParentLLM = this.parentAgent.getCurrentLLMConfig(sessionId);
|
|
428
449
|
this.logger.debug(
|
|
429
|
-
`[
|
|
450
|
+
`[AgentSpawnerRuntime] Building sub-agent config with LLM: ${currentParentLLM.provider}/${currentParentLLM.model}` + (sessionId ? ` (sessionId: ${sessionId})` : " (no sessionId)")
|
|
430
451
|
);
|
|
431
|
-
const
|
|
452
|
+
const permissionsMode = autoApprove ? "auto-approve" : "manual";
|
|
432
453
|
if (agentId) {
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
454
|
+
let configPath = null;
|
|
455
|
+
try {
|
|
456
|
+
const registry = (0, import_registry.getAgentRegistry)();
|
|
457
|
+
if (!registry.hasAgent(agentId)) {
|
|
458
|
+
this.logger.warn(
|
|
459
|
+
`Agent '${agentId}' not found in registry. Trying bundled config paths.`
|
|
460
|
+
);
|
|
461
|
+
} else {
|
|
462
|
+
configPath = await registry.resolveAgent(agentId);
|
|
463
|
+
}
|
|
464
|
+
} catch (error) {
|
|
465
|
+
this.logger.warn(
|
|
466
|
+
`Failed to load agent registry for '${agentId}'. Trying bundled config paths. (${error instanceof Error ? error.message : String(error)})`
|
|
467
|
+
);
|
|
468
|
+
}
|
|
469
|
+
if (!configPath) {
|
|
470
|
+
configPath = this.resolveBundledAgentConfig(agentId);
|
|
471
|
+
}
|
|
472
|
+
if (configPath) {
|
|
473
|
+
this.logger.debug(`Loading agent config from registry/bundled path: ${configPath}`);
|
|
439
474
|
const loadedConfig = await (0, import_loader.loadAgentConfig)(configPath, this.logger);
|
|
440
475
|
let llmConfig = loadedConfig.llm;
|
|
441
476
|
if (inheritLlm) {
|
|
@@ -455,9 +490,9 @@ class RuntimeService {
|
|
|
455
490
|
return {
|
|
456
491
|
...loadedConfig,
|
|
457
492
|
llm: llmConfig,
|
|
458
|
-
|
|
459
|
-
...loadedConfig.
|
|
460
|
-
mode:
|
|
493
|
+
permissions: {
|
|
494
|
+
...loadedConfig.permissions,
|
|
495
|
+
mode: permissionsMode
|
|
461
496
|
},
|
|
462
497
|
// Suppress sub-agent console logs entirely using silent transport
|
|
463
498
|
logger: {
|
|
@@ -466,24 +501,19 @@ class RuntimeService {
|
|
|
466
501
|
}
|
|
467
502
|
};
|
|
468
503
|
}
|
|
504
|
+
this.logger.warn(
|
|
505
|
+
`Agent '${agentId}' not found in registry or bundled paths. Using default config.`
|
|
506
|
+
);
|
|
469
507
|
}
|
|
470
508
|
const config = {
|
|
471
509
|
llm: { ...currentParentLLM },
|
|
472
510
|
// Default system prompt for sub-agents
|
|
473
511
|
systemPrompt: "You are a helpful sub-agent. Complete the task given to you efficiently and concisely.",
|
|
474
|
-
|
|
475
|
-
mode:
|
|
512
|
+
permissions: {
|
|
513
|
+
mode: permissionsMode
|
|
476
514
|
},
|
|
477
515
|
// Inherit MCP servers from parent so subagent has tool access
|
|
478
|
-
mcpServers:
|
|
479
|
-
// Inherit internal tools from parent, excluding tools that don't work in subagent context
|
|
480
|
-
// - ask_user: Subagents can't interact with the user directly
|
|
481
|
-
// - invoke_skill: Avoid nested skill invocations for simplicity
|
|
482
|
-
internalTools: parentConfig.internalTools ? parentConfig.internalTools.filter(
|
|
483
|
-
(tool) => tool !== "ask_user" && tool !== "invoke_skill"
|
|
484
|
-
) : [],
|
|
485
|
-
// Inherit custom tools from parent
|
|
486
|
-
customTools: parentConfig.customTools ? [...parentConfig.customTools] : [],
|
|
516
|
+
mcpServers: parentSettings.mcpServers ? { ...parentSettings.mcpServers } : {},
|
|
487
517
|
// Suppress sub-agent console logs entirely using silent transport
|
|
488
518
|
logger: {
|
|
489
519
|
level: "error",
|
|
@@ -497,15 +527,24 @@ class RuntimeService {
|
|
|
497
527
|
* Returns agent metadata from registry, filtered by allowedAgents if configured.
|
|
498
528
|
*/
|
|
499
529
|
getAvailableAgents() {
|
|
500
|
-
|
|
501
|
-
|
|
530
|
+
let allAgents;
|
|
531
|
+
try {
|
|
532
|
+
const registry = (0, import_registry.getAgentRegistry)();
|
|
533
|
+
allAgents = registry.getAvailableAgents();
|
|
534
|
+
} catch (error) {
|
|
535
|
+
this.logger.warn(
|
|
536
|
+
`Failed to load agent registry for spawn_agent description: ${error instanceof Error ? error.message : String(error)}`
|
|
537
|
+
);
|
|
538
|
+
if (this.config.allowedAgents && this.config.allowedAgents.length > 0) {
|
|
539
|
+
return this.config.allowedAgents.map((id) => this.createFallbackRegistryEntry(id));
|
|
540
|
+
}
|
|
541
|
+
return [];
|
|
542
|
+
}
|
|
502
543
|
if (this.config.allowedAgents && this.config.allowedAgents.length > 0) {
|
|
503
544
|
const result = [];
|
|
504
545
|
for (const id of this.config.allowedAgents) {
|
|
505
546
|
const agent = allAgents[id];
|
|
506
|
-
|
|
507
|
-
result.push(agent);
|
|
508
|
-
}
|
|
547
|
+
result.push(agent ?? this.createFallbackRegistryEntry(id));
|
|
509
548
|
}
|
|
510
549
|
return result;
|
|
511
550
|
}
|
|
@@ -515,11 +554,11 @@ class RuntimeService {
|
|
|
515
554
|
* Clean up all sub-agents (called when parent stops)
|
|
516
555
|
*/
|
|
517
556
|
async cleanup() {
|
|
518
|
-
this.logger.debug(`Cleaning up
|
|
557
|
+
this.logger.debug(`Cleaning up AgentSpawnerRuntime for parent '${this.parentId}'`);
|
|
519
558
|
await this.runtime.stopAll({ group: this.parentId });
|
|
520
559
|
}
|
|
521
560
|
}
|
|
522
561
|
// Annotate the CommonJS export names for ESM import in node:
|
|
523
562
|
0 && (module.exports = {
|
|
524
|
-
|
|
563
|
+
AgentSpawnerRuntime
|
|
525
564
|
});
|
package/dist/{tool-provider/runtime-service.d.ts → tool-factories/agent-spawner/runtime.d.ts}
RENAMED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* AgentSpawnerRuntime - Bridge between tools and AgentRuntime
|
|
3
3
|
*
|
|
4
4
|
* Manages the relationship between a parent agent and its sub-agents,
|
|
5
5
|
* providing methods that tools can call to spawn and execute tasks.
|
|
@@ -10,17 +10,19 @@
|
|
|
10
10
|
* - Enforces per-parent agent limits
|
|
11
11
|
* - Always cleans up agents after task completion (synchronous model)
|
|
12
12
|
*/
|
|
13
|
-
import type { DextoAgent,
|
|
14
|
-
import type { AgentRegistryEntry } from '
|
|
13
|
+
import type { DextoAgent, Logger, TaskForker } from '@dexto/core';
|
|
14
|
+
import type { AgentRegistryEntry } from '../../registry/types.js';
|
|
15
15
|
import type { AgentSpawnerConfig } from './schemas.js';
|
|
16
16
|
import type { SpawnAgentOutput } from './types.js';
|
|
17
|
-
export declare class
|
|
17
|
+
export declare class AgentSpawnerRuntime implements TaskForker {
|
|
18
18
|
private runtime;
|
|
19
19
|
private parentId;
|
|
20
20
|
private parentAgent;
|
|
21
21
|
private config;
|
|
22
22
|
private logger;
|
|
23
|
-
|
|
23
|
+
private resolveBundledAgentConfig;
|
|
24
|
+
private createFallbackRegistryEntry;
|
|
25
|
+
constructor(parentAgent: DextoAgent, config: AgentSpawnerConfig, logger: Logger);
|
|
24
26
|
/**
|
|
25
27
|
* Get count of sub-agents belonging to this parent
|
|
26
28
|
*/
|
|
@@ -110,4 +112,4 @@ export declare class RuntimeService implements TaskForker {
|
|
|
110
112
|
*/
|
|
111
113
|
cleanup(): Promise<void>;
|
|
112
114
|
}
|
|
113
|
-
//# sourceMappingURL=runtime
|
|
115
|
+
//# sourceMappingURL=runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../src/tool-factories/agent-spawner/runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAMlE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAIlE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAGnD,qBAAa,mBAAoB,YAAW,UAAU;IAClD,OAAO,CAAC,OAAO,CAAe;IAC9B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,MAAM,CAAS;IAEvB,OAAO,CAAC,yBAAyB;IAyBjC,OAAO,CAAC,2BAA2B;gBAYvB,WAAW,EAAE,UAAU,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM;IAuB/E;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAIxB;;OAEG;IACH,OAAO,CAAC,QAAQ;IAIhB;;;;;;;;;;;;;;OAcG;IACG,eAAe,CAAC,KAAK,EAAE;QACzB,IAAI,EAAE,MAAM,CAAC;QACb,YAAY,EAAE,MAAM,CAAC;QACrB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,WAAW,CAAC,EAAE,OAAO,CAAC;QACtB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,SAAS,CAAC,EAAE,MAAM,CAAC;KACtB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA8C7B;;;;;;;;;;OAUG;IACG,IAAI,CAAC,OAAO,EAAE;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,YAAY,EAAE,MAAM,CAAC;QACrB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,WAAW,CAAC,EAAE,OAAO,CAAC;QACtB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,SAAS,CAAC,EAAE,MAAM,CAAC;KACtB,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAIpE;;;;;OAKG;IACH,OAAO,CAAC,qBAAqB;IAwG7B;;OAEG;IACH,OAAO,CAAC,UAAU;IAsBlB;;OAEG;YACW,oBAAoB;IAyPlC;;;;;;;OAOG;YACW,mBAAmB;IAmHjC;;;OAGG;IACH,kBAAkB,IAAI,kBAAkB,EAAE;IA6B1C;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAIjC"}
|
|
@@ -1,15 +1,49 @@
|
|
|
1
1
|
import { DextoRuntimeError, ErrorType } from "@dexto/core";
|
|
2
|
-
import { AgentRuntime } from "
|
|
3
|
-
import { createDelegatingApprovalHandler } from "
|
|
4
|
-
import { loadAgentConfig } from "
|
|
5
|
-
import { getAgentRegistry } from "
|
|
2
|
+
import { AgentRuntime } from "../../runtime/AgentRuntime.js";
|
|
3
|
+
import { createDelegatingApprovalHandler } from "../../runtime/approval-delegation.js";
|
|
4
|
+
import { loadAgentConfig } from "../../config/loader.js";
|
|
5
|
+
import { getAgentRegistry } from "../../registry/registry.js";
|
|
6
|
+
import { deriveDisplayName } from "../../registry/types.js";
|
|
7
|
+
import { resolveBundledScript } from "../../utils/path.js";
|
|
8
|
+
import * as path from "path";
|
|
6
9
|
import { resolveSubAgentLLM } from "./llm-resolution.js";
|
|
7
|
-
class
|
|
10
|
+
class AgentSpawnerRuntime {
|
|
8
11
|
runtime;
|
|
9
12
|
parentId;
|
|
10
13
|
parentAgent;
|
|
11
14
|
config;
|
|
12
15
|
logger;
|
|
16
|
+
resolveBundledAgentConfig(agentId) {
|
|
17
|
+
const baseDir = "agents";
|
|
18
|
+
const normalizedPath = path.relative(baseDir, path.join(baseDir, agentId));
|
|
19
|
+
if (normalizedPath.startsWith("..") || path.isAbsolute(normalizedPath)) {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
const candidates = [
|
|
23
|
+
`agents/${agentId}/${agentId}.yml`,
|
|
24
|
+
`agents/${agentId}/${agentId}.yaml`,
|
|
25
|
+
`agents/${agentId}.yml`,
|
|
26
|
+
`agents/${agentId}.yaml`
|
|
27
|
+
];
|
|
28
|
+
for (const candidate of candidates) {
|
|
29
|
+
try {
|
|
30
|
+
return resolveBundledScript(candidate);
|
|
31
|
+
} catch {
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
createFallbackRegistryEntry(agentId) {
|
|
37
|
+
return {
|
|
38
|
+
id: agentId,
|
|
39
|
+
name: deriveDisplayName(agentId),
|
|
40
|
+
description: "Agent specified in config (registry entry not found)",
|
|
41
|
+
author: "unknown",
|
|
42
|
+
tags: [],
|
|
43
|
+
source: agentId,
|
|
44
|
+
type: "custom"
|
|
45
|
+
};
|
|
46
|
+
}
|
|
13
47
|
constructor(parentAgent, config, logger) {
|
|
14
48
|
this.parentAgent = parentAgent;
|
|
15
49
|
this.config = config;
|
|
@@ -23,7 +57,7 @@ class RuntimeService {
|
|
|
23
57
|
logger
|
|
24
58
|
});
|
|
25
59
|
this.logger.debug(
|
|
26
|
-
`
|
|
60
|
+
`AgentSpawnerRuntime initialized for parent '${this.parentId}' (maxAgents: ${config.maxConcurrentAgents})`
|
|
27
61
|
);
|
|
28
62
|
}
|
|
29
63
|
/**
|
|
@@ -97,23 +131,7 @@ class RuntimeService {
|
|
|
97
131
|
* @param options.sessionId - Optional session ID for progress events
|
|
98
132
|
*/
|
|
99
133
|
async fork(options) {
|
|
100
|
-
|
|
101
|
-
task: options.task,
|
|
102
|
-
instructions: options.instructions
|
|
103
|
-
};
|
|
104
|
-
if (options.agentId) {
|
|
105
|
-
spawnOptions.agentId = options.agentId;
|
|
106
|
-
}
|
|
107
|
-
if (options.autoApprove !== void 0) {
|
|
108
|
-
spawnOptions.autoApprove = options.autoApprove;
|
|
109
|
-
}
|
|
110
|
-
if (options.toolCallId) {
|
|
111
|
-
spawnOptions.toolCallId = options.toolCallId;
|
|
112
|
-
}
|
|
113
|
-
if (options.sessionId) {
|
|
114
|
-
spawnOptions.sessionId = options.sessionId;
|
|
115
|
-
}
|
|
116
|
-
return this.spawnAndExecute(spawnOptions);
|
|
134
|
+
return this.spawnAndExecute(options);
|
|
117
135
|
}
|
|
118
136
|
/**
|
|
119
137
|
* Set up progress event emission for a sub-agent.
|
|
@@ -135,10 +153,8 @@ class RuntimeService {
|
|
|
135
153
|
let toolCount = 0;
|
|
136
154
|
const tokenUsage = { input: 0, output: 0, total: 0 };
|
|
137
155
|
let currentTool = "";
|
|
138
|
-
const subAgentBus = subAgentHandle.agent.agentEventBus;
|
|
139
|
-
const parentBus = this.parentAgent.agentEventBus;
|
|
140
156
|
const emitProgress = (tool, args) => {
|
|
141
|
-
|
|
157
|
+
this.parentAgent.emit("service:event", {
|
|
142
158
|
service: "agent-spawner",
|
|
143
159
|
event: "progress",
|
|
144
160
|
toolCallId,
|
|
@@ -156,15 +172,10 @@ class RuntimeService {
|
|
|
156
172
|
const toolCallHandler = (event) => {
|
|
157
173
|
toolCount++;
|
|
158
174
|
let displayToolName = event.toolName;
|
|
159
|
-
if (displayToolName.startsWith("
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
displayToolName =
|
|
163
|
-
} else if (displayToolName.startsWith("mcp--")) {
|
|
164
|
-
const parts = displayToolName.split("--");
|
|
165
|
-
if (parts.length >= 3) {
|
|
166
|
-
displayToolName = parts.slice(2).join("--");
|
|
167
|
-
}
|
|
175
|
+
if (displayToolName.startsWith("mcp--")) {
|
|
176
|
+
const trimmed = displayToolName.substring("mcp--".length);
|
|
177
|
+
const parts = trimmed.split("--");
|
|
178
|
+
displayToolName = parts.length >= 2 ? parts.slice(1).join("--") : trimmed;
|
|
168
179
|
}
|
|
169
180
|
currentTool = displayToolName;
|
|
170
181
|
this.logger.debug(
|
|
@@ -183,11 +194,11 @@ class RuntimeService {
|
|
|
183
194
|
emitProgress(currentTool || "processing");
|
|
184
195
|
}
|
|
185
196
|
};
|
|
186
|
-
|
|
187
|
-
|
|
197
|
+
subAgentHandle.agent.on("llm:tool-call", toolCallHandler);
|
|
198
|
+
subAgentHandle.agent.on("llm:response", responseHandler);
|
|
188
199
|
return () => {
|
|
189
|
-
|
|
190
|
-
|
|
200
|
+
subAgentHandle.agent.off("llm:tool-call", toolCallHandler);
|
|
201
|
+
subAgentHandle.agent.off("llm:response", responseHandler);
|
|
191
202
|
};
|
|
192
203
|
}
|
|
193
204
|
/**
|
|
@@ -400,19 +411,33 @@ class RuntimeService {
|
|
|
400
411
|
*/
|
|
401
412
|
async buildSubAgentConfig(options, sessionId) {
|
|
402
413
|
const { agentId, inheritLlm, autoApprove } = options;
|
|
403
|
-
const
|
|
414
|
+
const parentSettings = this.parentAgent.config;
|
|
404
415
|
const currentParentLLM = this.parentAgent.getCurrentLLMConfig(sessionId);
|
|
405
416
|
this.logger.debug(
|
|
406
|
-
`[
|
|
417
|
+
`[AgentSpawnerRuntime] Building sub-agent config with LLM: ${currentParentLLM.provider}/${currentParentLLM.model}` + (sessionId ? ` (sessionId: ${sessionId})` : " (no sessionId)")
|
|
407
418
|
);
|
|
408
|
-
const
|
|
419
|
+
const permissionsMode = autoApprove ? "auto-approve" : "manual";
|
|
409
420
|
if (agentId) {
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
421
|
+
let configPath = null;
|
|
422
|
+
try {
|
|
423
|
+
const registry = getAgentRegistry();
|
|
424
|
+
if (!registry.hasAgent(agentId)) {
|
|
425
|
+
this.logger.warn(
|
|
426
|
+
`Agent '${agentId}' not found in registry. Trying bundled config paths.`
|
|
427
|
+
);
|
|
428
|
+
} else {
|
|
429
|
+
configPath = await registry.resolveAgent(agentId);
|
|
430
|
+
}
|
|
431
|
+
} catch (error) {
|
|
432
|
+
this.logger.warn(
|
|
433
|
+
`Failed to load agent registry for '${agentId}'. Trying bundled config paths. (${error instanceof Error ? error.message : String(error)})`
|
|
434
|
+
);
|
|
435
|
+
}
|
|
436
|
+
if (!configPath) {
|
|
437
|
+
configPath = this.resolveBundledAgentConfig(agentId);
|
|
438
|
+
}
|
|
439
|
+
if (configPath) {
|
|
440
|
+
this.logger.debug(`Loading agent config from registry/bundled path: ${configPath}`);
|
|
416
441
|
const loadedConfig = await loadAgentConfig(configPath, this.logger);
|
|
417
442
|
let llmConfig = loadedConfig.llm;
|
|
418
443
|
if (inheritLlm) {
|
|
@@ -432,9 +457,9 @@ class RuntimeService {
|
|
|
432
457
|
return {
|
|
433
458
|
...loadedConfig,
|
|
434
459
|
llm: llmConfig,
|
|
435
|
-
|
|
436
|
-
...loadedConfig.
|
|
437
|
-
mode:
|
|
460
|
+
permissions: {
|
|
461
|
+
...loadedConfig.permissions,
|
|
462
|
+
mode: permissionsMode
|
|
438
463
|
},
|
|
439
464
|
// Suppress sub-agent console logs entirely using silent transport
|
|
440
465
|
logger: {
|
|
@@ -443,24 +468,19 @@ class RuntimeService {
|
|
|
443
468
|
}
|
|
444
469
|
};
|
|
445
470
|
}
|
|
471
|
+
this.logger.warn(
|
|
472
|
+
`Agent '${agentId}' not found in registry or bundled paths. Using default config.`
|
|
473
|
+
);
|
|
446
474
|
}
|
|
447
475
|
const config = {
|
|
448
476
|
llm: { ...currentParentLLM },
|
|
449
477
|
// Default system prompt for sub-agents
|
|
450
478
|
systemPrompt: "You are a helpful sub-agent. Complete the task given to you efficiently and concisely.",
|
|
451
|
-
|
|
452
|
-
mode:
|
|
479
|
+
permissions: {
|
|
480
|
+
mode: permissionsMode
|
|
453
481
|
},
|
|
454
482
|
// Inherit MCP servers from parent so subagent has tool access
|
|
455
|
-
mcpServers:
|
|
456
|
-
// Inherit internal tools from parent, excluding tools that don't work in subagent context
|
|
457
|
-
// - ask_user: Subagents can't interact with the user directly
|
|
458
|
-
// - invoke_skill: Avoid nested skill invocations for simplicity
|
|
459
|
-
internalTools: parentConfig.internalTools ? parentConfig.internalTools.filter(
|
|
460
|
-
(tool) => tool !== "ask_user" && tool !== "invoke_skill"
|
|
461
|
-
) : [],
|
|
462
|
-
// Inherit custom tools from parent
|
|
463
|
-
customTools: parentConfig.customTools ? [...parentConfig.customTools] : [],
|
|
483
|
+
mcpServers: parentSettings.mcpServers ? { ...parentSettings.mcpServers } : {},
|
|
464
484
|
// Suppress sub-agent console logs entirely using silent transport
|
|
465
485
|
logger: {
|
|
466
486
|
level: "error",
|
|
@@ -474,15 +494,24 @@ class RuntimeService {
|
|
|
474
494
|
* Returns agent metadata from registry, filtered by allowedAgents if configured.
|
|
475
495
|
*/
|
|
476
496
|
getAvailableAgents() {
|
|
477
|
-
|
|
478
|
-
|
|
497
|
+
let allAgents;
|
|
498
|
+
try {
|
|
499
|
+
const registry = getAgentRegistry();
|
|
500
|
+
allAgents = registry.getAvailableAgents();
|
|
501
|
+
} catch (error) {
|
|
502
|
+
this.logger.warn(
|
|
503
|
+
`Failed to load agent registry for spawn_agent description: ${error instanceof Error ? error.message : String(error)}`
|
|
504
|
+
);
|
|
505
|
+
if (this.config.allowedAgents && this.config.allowedAgents.length > 0) {
|
|
506
|
+
return this.config.allowedAgents.map((id) => this.createFallbackRegistryEntry(id));
|
|
507
|
+
}
|
|
508
|
+
return [];
|
|
509
|
+
}
|
|
479
510
|
if (this.config.allowedAgents && this.config.allowedAgents.length > 0) {
|
|
480
511
|
const result = [];
|
|
481
512
|
for (const id of this.config.allowedAgents) {
|
|
482
513
|
const agent = allAgents[id];
|
|
483
|
-
|
|
484
|
-
result.push(agent);
|
|
485
|
-
}
|
|
514
|
+
result.push(agent ?? this.createFallbackRegistryEntry(id));
|
|
486
515
|
}
|
|
487
516
|
return result;
|
|
488
517
|
}
|
|
@@ -492,10 +521,10 @@ class RuntimeService {
|
|
|
492
521
|
* Clean up all sub-agents (called when parent stops)
|
|
493
522
|
*/
|
|
494
523
|
async cleanup() {
|
|
495
|
-
this.logger.debug(`Cleaning up
|
|
524
|
+
this.logger.debug(`Cleaning up AgentSpawnerRuntime for parent '${this.parentId}'`);
|
|
496
525
|
await this.runtime.stopAll({ group: this.parentId });
|
|
497
526
|
}
|
|
498
527
|
}
|
|
499
528
|
export {
|
|
500
|
-
|
|
529
|
+
AgentSpawnerRuntime
|
|
501
530
|
};
|
|
@@ -24,7 +24,7 @@ __export(schemas_exports, {
|
|
|
24
24
|
module.exports = __toCommonJS(schemas_exports);
|
|
25
25
|
var import_zod = require("zod");
|
|
26
26
|
const AgentSpawnerConfigSchema = import_zod.z.object({
|
|
27
|
-
/** Type discriminator for the
|
|
27
|
+
/** Type discriminator for the factory */
|
|
28
28
|
type: import_zod.z.literal("agent-spawner"),
|
|
29
29
|
/** Maximum concurrent sub-agents this parent can spawn (default: 5) */
|
|
30
30
|
maxConcurrentAgents: import_zod.z.number().int().positive().default(5).describe("Maximum concurrent sub-agents"),
|
|
@@ -57,7 +57,7 @@ const AgentSpawnerConfigSchema = import_zod.z.object({
|
|
|
57
57
|
* ```
|
|
58
58
|
*/
|
|
59
59
|
autoApproveAgents: import_zod.z.array(import_zod.z.string().min(1)).optional().describe("Agent IDs that should have tools auto-approved (read-only agents)")
|
|
60
|
-
}).strict().describe("Configuration for the agent spawner
|
|
60
|
+
}).strict().describe("Configuration for the agent spawner tools factory");
|
|
61
61
|
const SpawnAgentInputSchema = import_zod.z.object({
|
|
62
62
|
/** Short task description (shown in UI/logs) */
|
|
63
63
|
task: import_zod.z.string().min(1).describe("Short task description for UI/logs"),
|