@dexto/agent-management 1.5.8 → 1.6.1
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 +8 -14
- package/dist/config/config-enrichment.d.ts +7 -1
- package/dist/config/config-enrichment.d.ts.map +1 -1
- package/dist/config/config-enrichment.js +8 -14
- 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 +32 -2
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +31 -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/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/loader.cjs +21 -6
- package/dist/preferences/loader.d.ts +4 -0
- package/dist/preferences/loader.d.ts.map +1 -1
- package/dist/preferences/loader.js +21 -6
- package/dist/preferences/schemas.cjs +5 -1
- package/dist/preferences/schemas.d.ts +32 -0
- package/dist/preferences/schemas.d.ts.map +1 -1
- package/dist/preferences/schemas.js +5 -1
- package/dist/registry/registry.d.ts +4 -44
- package/dist/registry/registry.d.ts.map +1 -1
- package/dist/registry/types.cjs +4 -0
- package/dist/registry/types.d.ts +8 -0
- package/dist/registry/types.d.ts.map +1 -1
- package/dist/registry/types.js +4 -0
- package/dist/runtime/AgentPool.d.ts +2 -2
- package/dist/runtime/AgentPool.d.ts.map +1 -1
- package/dist/runtime/AgentRuntime.cjs +32 -19
- package/dist/runtime/AgentRuntime.d.ts +2 -2
- package/dist/runtime/AgentRuntime.d.ts.map +1 -1
- package/dist/runtime/AgentRuntime.js +32 -19
- package/dist/runtime/approval-delegation.cjs +6 -3
- package/dist/runtime/approval-delegation.d.ts +3 -2
- package/dist/runtime/approval-delegation.d.ts.map +1 -1
- package/dist/runtime/approval-delegation.js +6 -3
- package/dist/runtime/schemas.cjs +1 -1
- package/dist/runtime/schemas.d.ts +1 -1
- package/dist/runtime/schemas.js +1 -1
- package/dist/runtime/types.d.ts +3 -2
- 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 +327 -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 +316 -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-factories/agent-spawner/llm-resolution.d.ts.map +1 -0
- package/dist/{tool-provider/runtime-service.cjs → tool-factories/agent-spawner/runtime.cjs} +149 -83
- package/dist/{tool-provider/runtime-service.d.ts → tool-factories/agent-spawner/runtime.d.ts} +11 -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} +145 -79
- package/dist/{tool-provider → tool-factories/agent-spawner}/schemas.cjs +4 -4
- package/dist/{tool-provider → tool-factories/agent-spawner}/schemas.d.ts +5 -5
- package/dist/tool-factories/agent-spawner/schemas.d.ts.map +1 -0
- package/dist/{tool-provider → tool-factories/agent-spawner}/schemas.js +4 -4
- package/dist/{tool-provider → tool-factories/agent-spawner}/spawn-agent-tool.cjs +17 -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 +17 -7
- package/dist/tool-factories/agent-spawner/types.d.ts.map +1 -0
- package/dist/utils/path.cjs +10 -1
- package/dist/utils/path.d.ts +5 -2
- package/dist/utils/path.d.ts.map +1 -1
- package/dist/utils/path.js +10 -1
- package/dist/writer.d.ts +2 -1
- package/dist/writer.d.ts.map +1 -1
- package/package.json +6 -4
- 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 -197
- package/dist/tool-provider/tool-provider.d.ts +0 -30
- package/dist/tool-provider/tool-provider.d.ts.map +0 -1
- package/dist/tool-provider/tool-provider.js +0 -180
- 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}/llm-resolution.cjs +0 -0
- /package/dist/{tool-provider → tool-factories/agent-spawner}/llm-resolution.d.ts +0 -0
- /package/dist/{tool-provider → tool-factories/agent-spawner}/llm-resolution.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
|
@@ -16,20 +16,20 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
16
16
|
return to;
|
|
17
17
|
};
|
|
18
18
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
-
var
|
|
20
|
-
__export(
|
|
19
|
+
var agent_spawner_exports = {};
|
|
20
|
+
__export(agent_spawner_exports, {
|
|
21
21
|
AgentSpawnerConfigSchema: () => import_schemas.AgentSpawnerConfigSchema,
|
|
22
22
|
AgentSpawnerError: () => import_errors.AgentSpawnerError,
|
|
23
23
|
AgentSpawnerErrorCode: () => import_error_codes.AgentSpawnerErrorCode,
|
|
24
|
-
|
|
24
|
+
AgentSpawnerRuntime: () => import_runtime.AgentSpawnerRuntime,
|
|
25
25
|
SpawnAgentInputSchema: () => import_schemas2.SpawnAgentInputSchema,
|
|
26
|
-
|
|
26
|
+
agentSpawnerToolsFactory: () => import_factory.agentSpawnerToolsFactory,
|
|
27
27
|
createSpawnAgentTool: () => import_spawn_agent_tool.createSpawnAgentTool
|
|
28
28
|
});
|
|
29
|
-
module.exports = __toCommonJS(
|
|
30
|
-
var
|
|
29
|
+
module.exports = __toCommonJS(agent_spawner_exports);
|
|
30
|
+
var import_factory = require("./factory.js");
|
|
31
31
|
var import_schemas = require("./schemas.js");
|
|
32
|
-
var
|
|
32
|
+
var import_runtime = require("./runtime.js");
|
|
33
33
|
var import_spawn_agent_tool = require("./spawn-agent-tool.js");
|
|
34
34
|
var import_schemas2 = require("./schemas.js");
|
|
35
35
|
var import_errors = require("./errors.js");
|
|
@@ -39,8 +39,8 @@ var import_error_codes = require("./error-codes.js");
|
|
|
39
39
|
AgentSpawnerConfigSchema,
|
|
40
40
|
AgentSpawnerError,
|
|
41
41
|
AgentSpawnerErrorCode,
|
|
42
|
-
|
|
42
|
+
AgentSpawnerRuntime,
|
|
43
43
|
SpawnAgentInputSchema,
|
|
44
|
-
|
|
44
|
+
agentSpawnerToolsFactory,
|
|
45
45
|
createSpawnAgentTool
|
|
46
46
|
});
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Agent Spawner
|
|
2
|
+
* Agent Spawner Tools Factory
|
|
3
3
|
*
|
|
4
4
|
* Enables agents to spawn sub-agents for task delegation.
|
|
5
5
|
*/
|
|
6
|
-
export {
|
|
6
|
+
export { agentSpawnerToolsFactory } from './factory.js';
|
|
7
7
|
export { AgentSpawnerConfigSchema } from './schemas.js';
|
|
8
8
|
export type { AgentSpawnerConfig } from './schemas.js';
|
|
9
|
-
export {
|
|
9
|
+
export { AgentSpawnerRuntime } from './runtime.js';
|
|
10
10
|
export { createSpawnAgentTool } from './spawn-agent-tool.js';
|
|
11
11
|
export { SpawnAgentInputSchema } from './schemas.js';
|
|
12
12
|
export type { SpawnAgentInput } from './schemas.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tool-factories/agent-spawner/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AAGxD,OAAO,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AACxD,YAAY,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAGvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAGnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAG7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACrD,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAGpD,YAAY,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAGnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { agentSpawnerToolsFactory } from "./factory.js";
|
|
2
2
|
import { AgentSpawnerConfigSchema } from "./schemas.js";
|
|
3
|
-
import {
|
|
3
|
+
import { AgentSpawnerRuntime } from "./runtime.js";
|
|
4
4
|
import { createSpawnAgentTool } from "./spawn-agent-tool.js";
|
|
5
5
|
import { SpawnAgentInputSchema } from "./schemas.js";
|
|
6
6
|
import { AgentSpawnerError } from "./errors.js";
|
|
@@ -9,8 +9,8 @@ export {
|
|
|
9
9
|
AgentSpawnerConfigSchema,
|
|
10
10
|
AgentSpawnerError,
|
|
11
11
|
AgentSpawnerErrorCode,
|
|
12
|
-
|
|
12
|
+
AgentSpawnerRuntime,
|
|
13
13
|
SpawnAgentInputSchema,
|
|
14
|
-
|
|
14
|
+
agentSpawnerToolsFactory,
|
|
15
15
|
createSpawnAgentTool
|
|
16
16
|
};
|
|
@@ -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"}
|
|
@@ -26,21 +26,22 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
26
26
|
mod
|
|
27
27
|
));
|
|
28
28
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
-
var
|
|
30
|
-
__export(
|
|
31
|
-
|
|
29
|
+
var runtime_exports = {};
|
|
30
|
+
__export(runtime_exports, {
|
|
31
|
+
AgentSpawnerRuntime: () => AgentSpawnerRuntime
|
|
32
32
|
});
|
|
33
|
-
module.exports = __toCommonJS(
|
|
33
|
+
module.exports = __toCommonJS(runtime_exports);
|
|
34
|
+
var import_crypto = require("crypto");
|
|
34
35
|
var import_core = require("@dexto/core");
|
|
35
|
-
var import_AgentRuntime = require("
|
|
36
|
-
var import_approval_delegation = require("
|
|
37
|
-
var import_loader = require("
|
|
38
|
-
var import_registry = require("
|
|
39
|
-
var import_types = require("
|
|
40
|
-
var import_path = require("
|
|
36
|
+
var import_AgentRuntime = require("../../runtime/AgentRuntime.js");
|
|
37
|
+
var import_approval_delegation = require("../../runtime/approval-delegation.js");
|
|
38
|
+
var import_loader = require("../../config/loader.js");
|
|
39
|
+
var import_registry = require("../../registry/registry.js");
|
|
40
|
+
var import_types = require("../../registry/types.js");
|
|
41
|
+
var import_path = require("../../utils/path.js");
|
|
41
42
|
var path = __toESM(require("path"), 1);
|
|
42
43
|
var import_llm_resolution = require("./llm-resolution.js");
|
|
43
|
-
class
|
|
44
|
+
class AgentSpawnerRuntime {
|
|
44
45
|
runtime;
|
|
45
46
|
parentId;
|
|
46
47
|
parentAgent;
|
|
@@ -90,7 +91,7 @@ class RuntimeService {
|
|
|
90
91
|
logger
|
|
91
92
|
});
|
|
92
93
|
this.logger.debug(
|
|
93
|
-
`
|
|
94
|
+
`AgentSpawnerRuntime initialized for parent '${this.parentId}' (maxAgents: ${config.maxConcurrentAgents})`
|
|
94
95
|
);
|
|
95
96
|
}
|
|
96
97
|
/**
|
|
@@ -164,23 +165,7 @@ class RuntimeService {
|
|
|
164
165
|
* @param options.sessionId - Optional session ID for progress events
|
|
165
166
|
*/
|
|
166
167
|
async fork(options) {
|
|
167
|
-
|
|
168
|
-
task: options.task,
|
|
169
|
-
instructions: options.instructions
|
|
170
|
-
};
|
|
171
|
-
if (options.agentId) {
|
|
172
|
-
spawnOptions.agentId = options.agentId;
|
|
173
|
-
}
|
|
174
|
-
if (options.autoApprove !== void 0) {
|
|
175
|
-
spawnOptions.autoApprove = options.autoApprove;
|
|
176
|
-
}
|
|
177
|
-
if (options.toolCallId) {
|
|
178
|
-
spawnOptions.toolCallId = options.toolCallId;
|
|
179
|
-
}
|
|
180
|
-
if (options.sessionId) {
|
|
181
|
-
spawnOptions.sessionId = options.sessionId;
|
|
182
|
-
}
|
|
183
|
-
return this.spawnAndExecute(spawnOptions);
|
|
168
|
+
return this.spawnAndExecute(options);
|
|
184
169
|
}
|
|
185
170
|
/**
|
|
186
171
|
* Set up progress event emission for a sub-agent.
|
|
@@ -202,10 +187,12 @@ class RuntimeService {
|
|
|
202
187
|
let toolCount = 0;
|
|
203
188
|
const tokenUsage = { input: 0, output: 0, total: 0 };
|
|
204
189
|
let currentTool = "";
|
|
205
|
-
const subAgentBus = subAgentHandle.agent.agentEventBus;
|
|
206
|
-
const parentBus = this.parentAgent.agentEventBus;
|
|
207
190
|
const emitProgress = (tool, args) => {
|
|
208
|
-
|
|
191
|
+
const subAgentLogFilePath = this.getSubAgentLogFilePath({
|
|
192
|
+
runtimeAgentId: subAgentHandle.agentId,
|
|
193
|
+
sessionId
|
|
194
|
+
});
|
|
195
|
+
this.parentAgent.emit("service:event", {
|
|
209
196
|
service: "agent-spawner",
|
|
210
197
|
event: "progress",
|
|
211
198
|
toolCallId,
|
|
@@ -213,6 +200,8 @@ class RuntimeService {
|
|
|
213
200
|
data: {
|
|
214
201
|
task: input.task,
|
|
215
202
|
agentId: input.agentId ?? "default",
|
|
203
|
+
runtimeAgentId: subAgentHandle.agentId,
|
|
204
|
+
...subAgentLogFilePath ? { subAgentLogFilePath } : {},
|
|
216
205
|
toolsCalled: toolCount,
|
|
217
206
|
currentTool: tool,
|
|
218
207
|
currentArgs: args,
|
|
@@ -223,15 +212,10 @@ class RuntimeService {
|
|
|
223
212
|
const toolCallHandler = (event) => {
|
|
224
213
|
toolCount++;
|
|
225
214
|
let displayToolName = event.toolName;
|
|
226
|
-
if (displayToolName.startsWith("
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
displayToolName =
|
|
230
|
-
} else if (displayToolName.startsWith("mcp--")) {
|
|
231
|
-
const parts = displayToolName.split("--");
|
|
232
|
-
if (parts.length >= 3) {
|
|
233
|
-
displayToolName = parts.slice(2).join("--");
|
|
234
|
-
}
|
|
215
|
+
if (displayToolName.startsWith("mcp--")) {
|
|
216
|
+
const trimmed = displayToolName.substring("mcp--".length);
|
|
217
|
+
const parts = trimmed.split("--");
|
|
218
|
+
displayToolName = parts.length >= 2 ? parts.slice(1).join("--") : trimmed;
|
|
235
219
|
}
|
|
236
220
|
currentTool = displayToolName;
|
|
237
221
|
this.logger.debug(
|
|
@@ -250,13 +234,51 @@ class RuntimeService {
|
|
|
250
234
|
emitProgress(currentTool || "processing");
|
|
251
235
|
}
|
|
252
236
|
};
|
|
253
|
-
|
|
254
|
-
|
|
237
|
+
subAgentHandle.agent.on("llm:tool-call", toolCallHandler);
|
|
238
|
+
subAgentHandle.agent.on("llm:response", responseHandler);
|
|
255
239
|
return () => {
|
|
256
|
-
|
|
257
|
-
|
|
240
|
+
subAgentHandle.agent.off("llm:tool-call", toolCallHandler);
|
|
241
|
+
subAgentHandle.agent.off("llm:response", responseHandler);
|
|
258
242
|
};
|
|
259
243
|
}
|
|
244
|
+
/**
|
|
245
|
+
* Ensure spawned agent inherits the parent's workspace context.
|
|
246
|
+
*/
|
|
247
|
+
async applyParentWorkspace(agent) {
|
|
248
|
+
let parentWorkspace;
|
|
249
|
+
try {
|
|
250
|
+
parentWorkspace = await this.parentAgent.getWorkspace();
|
|
251
|
+
} catch (error) {
|
|
252
|
+
this.logger.warn(
|
|
253
|
+
`Failed to read parent workspace for sub-agent: ${error instanceof Error ? error.message : String(error)}`
|
|
254
|
+
);
|
|
255
|
+
return;
|
|
256
|
+
}
|
|
257
|
+
if (!parentWorkspace?.path) {
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
try {
|
|
261
|
+
await agent.setWorkspace({
|
|
262
|
+
path: parentWorkspace.path,
|
|
263
|
+
...parentWorkspace.name ? { name: parentWorkspace.name } : {}
|
|
264
|
+
});
|
|
265
|
+
} catch (error) {
|
|
266
|
+
this.logger.warn(
|
|
267
|
+
`Failed to apply parent workspace to sub-agent: ${error instanceof Error ? error.message : String(error)}`
|
|
268
|
+
);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
getSubAgentLogFilePath(options) {
|
|
272
|
+
const { runtimeAgentId, sessionId } = options;
|
|
273
|
+
if (!sessionId) {
|
|
274
|
+
return null;
|
|
275
|
+
}
|
|
276
|
+
const safeSessionId = sessionId.replace(/[^a-zA-Z0-9._-]/g, "_");
|
|
277
|
+
return (0, import_path.getDextoPath)(
|
|
278
|
+
"logs",
|
|
279
|
+
path.join(this.parentId, `${safeSessionId}.subagent.${runtimeAgentId}.log`)
|
|
280
|
+
);
|
|
281
|
+
}
|
|
260
282
|
/**
|
|
261
283
|
* Check if an error is LLM-related (API errors, credit issues, model not found, etc.)
|
|
262
284
|
*/
|
|
@@ -278,7 +300,10 @@ class RuntimeService {
|
|
|
278
300
|
let llmMode = "subagent";
|
|
279
301
|
let cleanupProgressTracking;
|
|
280
302
|
try {
|
|
281
|
-
const buildOptions = {
|
|
303
|
+
const buildOptions = {
|
|
304
|
+
// Pre-generate the runtime agentId so we can deterministically route logs.
|
|
305
|
+
runtimeAgentId: `agent-${(0, import_crypto.randomUUID)().slice(0, 8)}`
|
|
306
|
+
};
|
|
282
307
|
if (input.agentId !== void 0) {
|
|
283
308
|
buildOptions.agentId = input.agentId;
|
|
284
309
|
}
|
|
@@ -289,6 +314,7 @@ class RuntimeService {
|
|
|
289
314
|
let handle;
|
|
290
315
|
try {
|
|
291
316
|
handle = await this.runtime.spawnAgent({
|
|
317
|
+
agentId: buildOptions.runtimeAgentId,
|
|
292
318
|
agentConfig: subAgentConfig,
|
|
293
319
|
ephemeral: true,
|
|
294
320
|
group: this.parentId,
|
|
@@ -303,6 +329,7 @@ class RuntimeService {
|
|
|
303
329
|
const delegatingHandler = (0, import_approval_delegation.createDelegatingApprovalHandler)(
|
|
304
330
|
this.parentAgent.services.approvalManager,
|
|
305
331
|
agent.config.agentId ?? "unknown",
|
|
332
|
+
sessionId,
|
|
306
333
|
this.logger
|
|
307
334
|
);
|
|
308
335
|
agent.setApprovalHandler(delegatingHandler);
|
|
@@ -310,6 +337,7 @@ class RuntimeService {
|
|
|
310
337
|
}
|
|
311
338
|
});
|
|
312
339
|
spawnedAgentId = handle.agentId;
|
|
340
|
+
await this.applyParentWorkspace(handle.agent);
|
|
313
341
|
} catch (spawnError) {
|
|
314
342
|
const isLlmError = this.isLLMError(spawnError);
|
|
315
343
|
if (isLlmError && input.agentId && llmMode === "subagent") {
|
|
@@ -321,6 +349,7 @@ class RuntimeService {
|
|
|
321
349
|
buildOptions.inheritLlm = true;
|
|
322
350
|
subAgentConfig = await this.buildSubAgentConfig(buildOptions, sessionId);
|
|
323
351
|
handle = await this.runtime.spawnAgent({
|
|
352
|
+
agentId: buildOptions.runtimeAgentId,
|
|
324
353
|
agentConfig: subAgentConfig,
|
|
325
354
|
ephemeral: true,
|
|
326
355
|
group: this.parentId,
|
|
@@ -337,6 +366,7 @@ class RuntimeService {
|
|
|
337
366
|
const delegatingHandler = (0, import_approval_delegation.createDelegatingApprovalHandler)(
|
|
338
367
|
this.parentAgent.services.approvalManager,
|
|
339
368
|
agent.config.agentId ?? "unknown",
|
|
369
|
+
sessionId,
|
|
340
370
|
this.logger
|
|
341
371
|
);
|
|
342
372
|
agent.setApprovalHandler(delegatingHandler);
|
|
@@ -344,6 +374,7 @@ class RuntimeService {
|
|
|
344
374
|
}
|
|
345
375
|
});
|
|
346
376
|
spawnedAgentId = handle.agentId;
|
|
377
|
+
await this.applyParentWorkspace(handle.agent);
|
|
347
378
|
} else {
|
|
348
379
|
throw spawnError;
|
|
349
380
|
}
|
|
@@ -351,6 +382,23 @@ class RuntimeService {
|
|
|
351
382
|
this.logger.info(
|
|
352
383
|
`Spawned sub-agent '${spawnedAgentId}' for task: ${input.task}${autoApprove ? " (auto-approve)" : ""}${llmMode === "parent" ? " (using parent LLM)" : ""}`
|
|
353
384
|
);
|
|
385
|
+
const subAgentLogFilePath = this.getSubAgentLogFilePath(
|
|
386
|
+
sessionId ? { runtimeAgentId: buildOptions.runtimeAgentId, sessionId } : { runtimeAgentId: buildOptions.runtimeAgentId }
|
|
387
|
+
);
|
|
388
|
+
if (subAgentLogFilePath) {
|
|
389
|
+
this.logger.info(`Sub-agent logs: ${subAgentLogFilePath}`);
|
|
390
|
+
}
|
|
391
|
+
if (sessionId) {
|
|
392
|
+
const parentSession = await this.parentAgent.getSession(sessionId);
|
|
393
|
+
if (parentSession) {
|
|
394
|
+
parentSession.logger.info("Sub-agent spawned", {
|
|
395
|
+
runtimeAgentId: spawnedAgentId,
|
|
396
|
+
registryAgentId: input.agentId ?? "default",
|
|
397
|
+
task: input.task,
|
|
398
|
+
...subAgentLogFilePath ? { subAgentLogFilePath } : {}
|
|
399
|
+
});
|
|
400
|
+
}
|
|
401
|
+
}
|
|
354
402
|
cleanupProgressTracking = this.setupProgressTracking(
|
|
355
403
|
handle,
|
|
356
404
|
input,
|
|
@@ -384,6 +432,7 @@ class RuntimeService {
|
|
|
384
432
|
buildOptions.inheritLlm = true;
|
|
385
433
|
subAgentConfig = await this.buildSubAgentConfig(buildOptions, sessionId);
|
|
386
434
|
handle = await this.runtime.spawnAgent({
|
|
435
|
+
agentId: buildOptions.runtimeAgentId,
|
|
387
436
|
agentConfig: subAgentConfig,
|
|
388
437
|
ephemeral: true,
|
|
389
438
|
group: this.parentId,
|
|
@@ -400,6 +449,7 @@ class RuntimeService {
|
|
|
400
449
|
const delegatingHandler = (0, import_approval_delegation.createDelegatingApprovalHandler)(
|
|
401
450
|
this.parentAgent.services.approvalManager,
|
|
402
451
|
agent.config.agentId ?? "unknown",
|
|
452
|
+
sessionId,
|
|
403
453
|
this.logger
|
|
404
454
|
);
|
|
405
455
|
agent.setApprovalHandler(delegatingHandler);
|
|
@@ -407,6 +457,7 @@ class RuntimeService {
|
|
|
407
457
|
}
|
|
408
458
|
});
|
|
409
459
|
spawnedAgentId = handle.agentId;
|
|
460
|
+
await this.applyParentWorkspace(handle.agent);
|
|
410
461
|
this.logger.info(
|
|
411
462
|
`Re-spawned sub-agent '${spawnedAgentId}' for task: ${input.task} (using parent LLM)`
|
|
412
463
|
);
|
|
@@ -466,13 +517,49 @@ class RuntimeService {
|
|
|
466
517
|
* @param sessionId - Optional session ID to get session-specific LLM config
|
|
467
518
|
*/
|
|
468
519
|
async buildSubAgentConfig(options, sessionId) {
|
|
469
|
-
const { agentId, inheritLlm, autoApprove } = options;
|
|
470
|
-
const
|
|
520
|
+
const { agentId, inheritLlm, autoApprove, runtimeAgentId } = options;
|
|
521
|
+
const parentSettings = this.parentAgent.config;
|
|
471
522
|
const currentParentLLM = this.parentAgent.getCurrentLLMConfig(sessionId);
|
|
472
523
|
this.logger.debug(
|
|
473
|
-
`[
|
|
524
|
+
`[AgentSpawnerRuntime] Building sub-agent config with LLM: ${currentParentLLM.provider}/${currentParentLLM.model}` + (sessionId ? ` (sessionId: ${sessionId})` : " (no sessionId)")
|
|
474
525
|
);
|
|
475
|
-
const
|
|
526
|
+
const permissionsMode = autoApprove ? "auto-approve" : "manual";
|
|
527
|
+
const parentToolPolicies = parentSettings.permissions?.toolPolicies;
|
|
528
|
+
const mergeToolPolicies = (subAgentPolicies) => {
|
|
529
|
+
const alwaysAllow = [
|
|
530
|
+
...parentToolPolicies?.alwaysAllow ?? [],
|
|
531
|
+
...subAgentPolicies?.alwaysAllow ?? []
|
|
532
|
+
];
|
|
533
|
+
const alwaysDeny = [
|
|
534
|
+
...parentToolPolicies?.alwaysDeny ?? [],
|
|
535
|
+
...subAgentPolicies?.alwaysDeny ?? []
|
|
536
|
+
];
|
|
537
|
+
return {
|
|
538
|
+
alwaysAllow: Array.from(new Set(alwaysAllow)),
|
|
539
|
+
alwaysDeny: Array.from(new Set(alwaysDeny))
|
|
540
|
+
};
|
|
541
|
+
};
|
|
542
|
+
const inheritedLoggerConfig = await (async () => {
|
|
543
|
+
if (!sessionId) {
|
|
544
|
+
return void 0;
|
|
545
|
+
}
|
|
546
|
+
const session = await this.parentAgent.getSession(sessionId);
|
|
547
|
+
if (!session) {
|
|
548
|
+
return void 0;
|
|
549
|
+
}
|
|
550
|
+
const parentSessionLogPath = session.logger.getLogFilePath();
|
|
551
|
+
if (!parentSessionLogPath) {
|
|
552
|
+
return void 0;
|
|
553
|
+
}
|
|
554
|
+
const subAgentLogFilePath = this.getSubAgentLogFilePath({ runtimeAgentId, sessionId });
|
|
555
|
+
if (!subAgentLogFilePath) {
|
|
556
|
+
return void 0;
|
|
557
|
+
}
|
|
558
|
+
return {
|
|
559
|
+
level: session.logger.getLevel(),
|
|
560
|
+
transports: [{ type: "file", path: subAgentLogFilePath }]
|
|
561
|
+
};
|
|
562
|
+
})();
|
|
476
563
|
if (agentId) {
|
|
477
564
|
let configPath = null;
|
|
478
565
|
try {
|
|
@@ -510,22 +597,15 @@ class RuntimeService {
|
|
|
510
597
|
this.logger.debug(`Sub-agent LLM resolution: ${resolution.reason}`);
|
|
511
598
|
llmConfig = resolution.llm;
|
|
512
599
|
}
|
|
513
|
-
const filteredCustomTools = loadedConfig.customTools ? loadedConfig.customTools.filter(
|
|
514
|
-
(tool) => typeof tool === "object" && tool !== null && "type" in tool && tool.type !== "agent-spawner"
|
|
515
|
-
) : void 0;
|
|
516
600
|
return {
|
|
517
601
|
...loadedConfig,
|
|
518
602
|
llm: llmConfig,
|
|
519
|
-
|
|
520
|
-
...loadedConfig.
|
|
521
|
-
mode:
|
|
603
|
+
permissions: {
|
|
604
|
+
...loadedConfig.permissions,
|
|
605
|
+
mode: permissionsMode,
|
|
606
|
+
toolPolicies: mergeToolPolicies(loadedConfig.permissions?.toolPolicies)
|
|
522
607
|
},
|
|
523
|
-
|
|
524
|
-
// Suppress sub-agent console logs entirely using silent transport
|
|
525
|
-
logger: {
|
|
526
|
-
level: "error",
|
|
527
|
-
transports: [{ type: "silent" }]
|
|
528
|
-
}
|
|
608
|
+
...inheritedLoggerConfig !== void 0 && { logger: inheritedLoggerConfig }
|
|
529
609
|
};
|
|
530
610
|
}
|
|
531
611
|
this.logger.warn(
|
|
@@ -536,27 +616,13 @@ class RuntimeService {
|
|
|
536
616
|
llm: { ...currentParentLLM },
|
|
537
617
|
// Default system prompt for sub-agents
|
|
538
618
|
systemPrompt: "You are a helpful sub-agent. Complete the task given to you efficiently and concisely.",
|
|
539
|
-
|
|
540
|
-
mode:
|
|
619
|
+
permissions: {
|
|
620
|
+
mode: permissionsMode,
|
|
621
|
+
toolPolicies: mergeToolPolicies(void 0)
|
|
541
622
|
},
|
|
542
623
|
// Inherit MCP servers from parent so subagent has tool access
|
|
543
|
-
mcpServers:
|
|
544
|
-
|
|
545
|
-
// - ask_user: Subagents can't interact with the user directly
|
|
546
|
-
// - invoke_skill: Avoid nested skill invocations for simplicity
|
|
547
|
-
internalTools: parentConfig.internalTools ? parentConfig.internalTools.filter(
|
|
548
|
-
(tool) => tool !== "ask_user" && tool !== "invoke_skill"
|
|
549
|
-
) : [],
|
|
550
|
-
// Inherit custom tools from parent, excluding agent-spawner to prevent nested spawning (depth=1 limit)
|
|
551
|
-
// - agent-spawner: Sub-agents should not spawn their own sub-agents
|
|
552
|
-
customTools: parentConfig.customTools ? parentConfig.customTools.filter(
|
|
553
|
-
(tool) => typeof tool === "object" && tool !== null && "type" in tool && tool.type !== "agent-spawner"
|
|
554
|
-
) : [],
|
|
555
|
-
// Suppress sub-agent console logs entirely using silent transport
|
|
556
|
-
logger: {
|
|
557
|
-
level: "error",
|
|
558
|
-
transports: [{ type: "silent" }]
|
|
559
|
-
}
|
|
624
|
+
mcpServers: parentSettings.mcpServers ? { ...parentSettings.mcpServers } : {},
|
|
625
|
+
...inheritedLoggerConfig !== void 0 && { logger: inheritedLoggerConfig }
|
|
560
626
|
};
|
|
561
627
|
return config;
|
|
562
628
|
}
|
|
@@ -592,11 +658,11 @@ class RuntimeService {
|
|
|
592
658
|
* Clean up all sub-agents (called when parent stops)
|
|
593
659
|
*/
|
|
594
660
|
async cleanup() {
|
|
595
|
-
this.logger.debug(`Cleaning up
|
|
661
|
+
this.logger.debug(`Cleaning up AgentSpawnerRuntime for parent '${this.parentId}'`);
|
|
596
662
|
await this.runtime.stopAll({ group: this.parentId });
|
|
597
663
|
}
|
|
598
664
|
}
|
|
599
665
|
// Annotate the CommonJS export names for ESM import in node:
|
|
600
666
|
0 && (module.exports = {
|
|
601
|
-
|
|
667
|
+
AgentSpawnerRuntime
|
|
602
668
|
});
|
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,11 +10,11 @@
|
|
|
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;
|
|
@@ -22,7 +22,7 @@ export declare class RuntimeService implements TaskForker {
|
|
|
22
22
|
private logger;
|
|
23
23
|
private resolveBundledAgentConfig;
|
|
24
24
|
private createFallbackRegistryEntry;
|
|
25
|
-
constructor(parentAgent: DextoAgent, config: AgentSpawnerConfig, logger:
|
|
25
|
+
constructor(parentAgent: DextoAgent, config: AgentSpawnerConfig, logger: Logger);
|
|
26
26
|
/**
|
|
27
27
|
* Get count of sub-agents belonging to this parent
|
|
28
28
|
*/
|
|
@@ -85,6 +85,11 @@ export declare class RuntimeService implements TaskForker {
|
|
|
85
85
|
* @returns Cleanup function to unsubscribe from events
|
|
86
86
|
*/
|
|
87
87
|
private setupProgressTracking;
|
|
88
|
+
/**
|
|
89
|
+
* Ensure spawned agent inherits the parent's workspace context.
|
|
90
|
+
*/
|
|
91
|
+
private applyParentWorkspace;
|
|
92
|
+
private getSubAgentLogFilePath;
|
|
88
93
|
/**
|
|
89
94
|
* Check if an error is LLM-related (API errors, credit issues, model not found, etc.)
|
|
90
95
|
*/
|
|
@@ -112,4 +117,4 @@ export declare class RuntimeService implements TaskForker {
|
|
|
112
117
|
*/
|
|
113
118
|
cleanup(): Promise<void>;
|
|
114
119
|
}
|
|
115
|
-
//# sourceMappingURL=runtime
|
|
120
|
+
//# 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;AAIH,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;IA+G7B;;OAEG;YACW,oBAAoB;IA2BlC,OAAO,CAAC,sBAAsB;IAuB9B;;OAEG;IACH,OAAO,CAAC,UAAU;IAsBlB;;OAEG;YACW,oBAAoB;IA4RlC;;;;;;;OAOG;YACW,mBAAmB;IAiKjC;;;OAGG;IACH,kBAAkB,IAAI,kBAAkB,EAAE;IA6B1C;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAIjC"}
|