@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.
Files changed (139) hide show
  1. package/dist/AgentFactory.cjs +5 -9
  2. package/dist/AgentFactory.d.ts +6 -5
  3. package/dist/AgentFactory.d.ts.map +1 -1
  4. package/dist/AgentFactory.js +5 -9
  5. package/dist/AgentManager.cjs +2 -2
  6. package/dist/AgentManager.d.ts +1 -1
  7. package/dist/AgentManager.d.ts.map +1 -1
  8. package/dist/AgentManager.js +4 -4
  9. package/dist/agent-creation.cjs +95 -0
  10. package/dist/agent-creation.d.ts +15 -0
  11. package/dist/agent-creation.d.ts.map +1 -0
  12. package/dist/agent-creation.js +78 -0
  13. package/dist/config/config-enrichment.cjs +8 -14
  14. package/dist/config/config-enrichment.d.ts +7 -1
  15. package/dist/config/config-enrichment.d.ts.map +1 -1
  16. package/dist/config/config-enrichment.js +8 -14
  17. package/dist/config/config-manager.cjs +4 -4
  18. package/dist/config/config-manager.d.ts +1 -1
  19. package/dist/config/config-manager.d.ts.map +1 -1
  20. package/dist/config/config-manager.js +3 -1
  21. package/dist/config/loader.d.ts +3 -3
  22. package/dist/config/loader.d.ts.map +1 -1
  23. package/dist/images/image-store.cjs +256 -0
  24. package/dist/images/image-store.d.ts +70 -0
  25. package/dist/images/image-store.d.ts.map +1 -0
  26. package/dist/images/image-store.js +210 -0
  27. package/dist/index.cjs +32 -2
  28. package/dist/index.d.ts +3 -1
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +31 -1
  31. package/dist/plugins/discover-plugins.cjs +15 -31
  32. package/dist/plugins/discover-plugins.d.ts.map +1 -1
  33. package/dist/plugins/discover-plugins.js +15 -31
  34. package/dist/plugins/index.cjs +0 -2
  35. package/dist/plugins/index.d.ts +5 -6
  36. package/dist/plugins/index.d.ts.map +1 -1
  37. package/dist/plugins/index.js +0 -2
  38. package/dist/plugins/list-plugins.cjs +3 -1
  39. package/dist/plugins/list-plugins.d.ts.map +1 -1
  40. package/dist/plugins/list-plugins.js +3 -1
  41. package/dist/plugins/load-plugin.cjs +0 -13
  42. package/dist/plugins/load-plugin.d.ts +3 -5
  43. package/dist/plugins/load-plugin.d.ts.map +1 -1
  44. package/dist/plugins/load-plugin.js +0 -13
  45. package/dist/plugins/schemas.cjs +1 -11
  46. package/dist/plugins/schemas.d.ts +14 -69
  47. package/dist/plugins/schemas.d.ts.map +1 -1
  48. package/dist/plugins/schemas.js +1 -10
  49. package/dist/plugins/types.d.ts +2 -20
  50. package/dist/plugins/types.d.ts.map +1 -1
  51. package/dist/plugins/validate-plugin.cjs +7 -37
  52. package/dist/plugins/validate-plugin.d.ts +6 -24
  53. package/dist/plugins/validate-plugin.d.ts.map +1 -1
  54. package/dist/plugins/validate-plugin.js +8 -38
  55. package/dist/preferences/loader.cjs +21 -6
  56. package/dist/preferences/loader.d.ts +4 -0
  57. package/dist/preferences/loader.d.ts.map +1 -1
  58. package/dist/preferences/loader.js +21 -6
  59. package/dist/preferences/schemas.cjs +5 -1
  60. package/dist/preferences/schemas.d.ts +32 -0
  61. package/dist/preferences/schemas.d.ts.map +1 -1
  62. package/dist/preferences/schemas.js +5 -1
  63. package/dist/registry/registry.d.ts +4 -44
  64. package/dist/registry/registry.d.ts.map +1 -1
  65. package/dist/registry/types.cjs +4 -0
  66. package/dist/registry/types.d.ts +8 -0
  67. package/dist/registry/types.d.ts.map +1 -1
  68. package/dist/registry/types.js +4 -0
  69. package/dist/runtime/AgentPool.d.ts +2 -2
  70. package/dist/runtime/AgentPool.d.ts.map +1 -1
  71. package/dist/runtime/AgentRuntime.cjs +32 -19
  72. package/dist/runtime/AgentRuntime.d.ts +2 -2
  73. package/dist/runtime/AgentRuntime.d.ts.map +1 -1
  74. package/dist/runtime/AgentRuntime.js +32 -19
  75. package/dist/runtime/approval-delegation.cjs +6 -3
  76. package/dist/runtime/approval-delegation.d.ts +3 -2
  77. package/dist/runtime/approval-delegation.d.ts.map +1 -1
  78. package/dist/runtime/approval-delegation.js +6 -3
  79. package/dist/runtime/schemas.cjs +1 -1
  80. package/dist/runtime/schemas.d.ts +1 -1
  81. package/dist/runtime/schemas.js +1 -1
  82. package/dist/runtime/types.d.ts +3 -2
  83. package/dist/runtime/types.d.ts.map +1 -1
  84. package/dist/{tool-provider → tool-factories/agent-spawner}/error-codes.d.ts +1 -1
  85. package/dist/tool-factories/agent-spawner/error-codes.d.ts.map +1 -0
  86. package/dist/{tool-provider → tool-factories/agent-spawner}/errors.d.ts +1 -1
  87. package/dist/tool-factories/agent-spawner/errors.d.ts.map +1 -0
  88. package/dist/tool-factories/agent-spawner/factory.cjs +327 -0
  89. package/dist/tool-factories/agent-spawner/factory.d.ts +4 -0
  90. package/dist/tool-factories/agent-spawner/factory.d.ts.map +1 -0
  91. package/dist/tool-factories/agent-spawner/factory.js +316 -0
  92. package/dist/{tool-provider → tool-factories/agent-spawner}/index.cjs +9 -9
  93. package/dist/{tool-provider → tool-factories/agent-spawner}/index.d.ts +3 -3
  94. package/dist/tool-factories/agent-spawner/index.d.ts.map +1 -0
  95. package/dist/{tool-provider → tool-factories/agent-spawner}/index.js +4 -4
  96. package/dist/tool-factories/agent-spawner/llm-resolution.d.ts.map +1 -0
  97. package/dist/{tool-provider/runtime-service.cjs → tool-factories/agent-spawner/runtime.cjs} +149 -83
  98. package/dist/{tool-provider/runtime-service.d.ts → tool-factories/agent-spawner/runtime.d.ts} +11 -6
  99. package/dist/tool-factories/agent-spawner/runtime.d.ts.map +1 -0
  100. package/dist/{tool-provider/runtime-service.js → tool-factories/agent-spawner/runtime.js} +145 -79
  101. package/dist/{tool-provider → tool-factories/agent-spawner}/schemas.cjs +4 -4
  102. package/dist/{tool-provider → tool-factories/agent-spawner}/schemas.d.ts +5 -5
  103. package/dist/tool-factories/agent-spawner/schemas.d.ts.map +1 -0
  104. package/dist/{tool-provider → tool-factories/agent-spawner}/schemas.js +4 -4
  105. package/dist/{tool-provider → tool-factories/agent-spawner}/spawn-agent-tool.cjs +17 -7
  106. package/dist/tool-factories/agent-spawner/spawn-agent-tool.d.ts +11 -0
  107. package/dist/tool-factories/agent-spawner/spawn-agent-tool.d.ts.map +1 -0
  108. package/dist/{tool-provider → tool-factories/agent-spawner}/spawn-agent-tool.js +17 -7
  109. package/dist/tool-factories/agent-spawner/types.d.ts.map +1 -0
  110. package/dist/utils/path.cjs +10 -1
  111. package/dist/utils/path.d.ts +5 -2
  112. package/dist/utils/path.d.ts.map +1 -1
  113. package/dist/utils/path.js +10 -1
  114. package/dist/writer.d.ts +2 -1
  115. package/dist/writer.d.ts.map +1 -1
  116. package/package.json +6 -4
  117. package/dist/tool-provider/error-codes.d.ts.map +0 -1
  118. package/dist/tool-provider/errors.d.ts.map +0 -1
  119. package/dist/tool-provider/index.d.ts.map +0 -1
  120. package/dist/tool-provider/llm-resolution.d.ts.map +0 -1
  121. package/dist/tool-provider/runtime-service.d.ts.map +0 -1
  122. package/dist/tool-provider/schemas.d.ts.map +0 -1
  123. package/dist/tool-provider/spawn-agent-tool.d.ts +0 -10
  124. package/dist/tool-provider/spawn-agent-tool.d.ts.map +0 -1
  125. package/dist/tool-provider/tool-provider.cjs +0 -197
  126. package/dist/tool-provider/tool-provider.d.ts +0 -30
  127. package/dist/tool-provider/tool-provider.d.ts.map +0 -1
  128. package/dist/tool-provider/tool-provider.js +0 -180
  129. package/dist/tool-provider/types.d.ts.map +0 -1
  130. /package/dist/{tool-provider → tool-factories/agent-spawner}/error-codes.cjs +0 -0
  131. /package/dist/{tool-provider → tool-factories/agent-spawner}/error-codes.js +0 -0
  132. /package/dist/{tool-provider → tool-factories/agent-spawner}/errors.cjs +0 -0
  133. /package/dist/{tool-provider → tool-factories/agent-spawner}/errors.js +0 -0
  134. /package/dist/{tool-provider → tool-factories/agent-spawner}/llm-resolution.cjs +0 -0
  135. /package/dist/{tool-provider → tool-factories/agent-spawner}/llm-resolution.d.ts +0 -0
  136. /package/dist/{tool-provider → tool-factories/agent-spawner}/llm-resolution.js +0 -0
  137. /package/dist/{tool-provider → tool-factories/agent-spawner}/types.cjs +0 -0
  138. /package/dist/{tool-provider → tool-factories/agent-spawner}/types.d.ts +0 -0
  139. /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 tool_provider_exports = {};
20
- __export(tool_provider_exports, {
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
- RuntimeService: () => import_runtime_service.RuntimeService,
24
+ AgentSpawnerRuntime: () => import_runtime.AgentSpawnerRuntime,
25
25
  SpawnAgentInputSchema: () => import_schemas2.SpawnAgentInputSchema,
26
- agentSpawnerToolsProvider: () => import_tool_provider.agentSpawnerToolsProvider,
26
+ agentSpawnerToolsFactory: () => import_factory.agentSpawnerToolsFactory,
27
27
  createSpawnAgentTool: () => import_spawn_agent_tool.createSpawnAgentTool
28
28
  });
29
- module.exports = __toCommonJS(tool_provider_exports);
30
- var import_tool_provider = require("./tool-provider.js");
29
+ module.exports = __toCommonJS(agent_spawner_exports);
30
+ var import_factory = require("./factory.js");
31
31
  var import_schemas = require("./schemas.js");
32
- var import_runtime_service = require("./runtime-service.js");
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
- RuntimeService,
42
+ AgentSpawnerRuntime,
43
43
  SpawnAgentInputSchema,
44
- agentSpawnerToolsProvider,
44
+ agentSpawnerToolsFactory,
45
45
  createSpawnAgentTool
46
46
  });
@@ -1,12 +1,12 @@
1
1
  /**
2
- * Agent Spawner Tool Provider
2
+ * Agent Spawner Tools Factory
3
3
  *
4
4
  * Enables agents to spawn sub-agents for task delegation.
5
5
  */
6
- export { agentSpawnerToolsProvider } from './tool-provider.js';
6
+ export { agentSpawnerToolsFactory } from './factory.js';
7
7
  export { AgentSpawnerConfigSchema } from './schemas.js';
8
8
  export type { AgentSpawnerConfig } from './schemas.js';
9
- export { RuntimeService } from './runtime-service.js';
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 { agentSpawnerToolsProvider } from "./tool-provider.js";
1
+ import { agentSpawnerToolsFactory } from "./factory.js";
2
2
  import { AgentSpawnerConfigSchema } from "./schemas.js";
3
- import { RuntimeService } from "./runtime-service.js";
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
- RuntimeService,
12
+ AgentSpawnerRuntime,
13
13
  SpawnAgentInputSchema,
14
- agentSpawnerToolsProvider,
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 runtime_service_exports = {};
30
- __export(runtime_service_exports, {
31
- RuntimeService: () => RuntimeService
29
+ var runtime_exports = {};
30
+ __export(runtime_exports, {
31
+ AgentSpawnerRuntime: () => AgentSpawnerRuntime
32
32
  });
33
- module.exports = __toCommonJS(runtime_service_exports);
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("../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");
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 RuntimeService {
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
- `RuntimeService initialized for parent '${this.parentId}' (maxAgents: ${config.maxConcurrentAgents})`
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
- const spawnOptions = {
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
- parentBus.emit("service:event", {
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("internal--")) {
227
- displayToolName = displayToolName.replace("internal--", "");
228
- } else if (displayToolName.startsWith("custom--")) {
229
- displayToolName = displayToolName.replace("custom--", "");
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
- subAgentBus.on("llm:tool-call", toolCallHandler);
254
- subAgentBus.on("llm:response", responseHandler);
237
+ subAgentHandle.agent.on("llm:tool-call", toolCallHandler);
238
+ subAgentHandle.agent.on("llm:response", responseHandler);
255
239
  return () => {
256
- subAgentBus.off("llm:tool-call", toolCallHandler);
257
- subAgentBus.off("llm:response", responseHandler);
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 parentConfig = this.parentAgent.config;
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
- `[RuntimeService] Building sub-agent config with LLM: ${currentParentLLM.provider}/${currentParentLLM.model}` + (sessionId ? ` (sessionId: ${sessionId})` : " (no sessionId)")
524
+ `[AgentSpawnerRuntime] Building sub-agent config with LLM: ${currentParentLLM.provider}/${currentParentLLM.model}` + (sessionId ? ` (sessionId: ${sessionId})` : " (no sessionId)")
474
525
  );
475
- const toolConfirmationMode = autoApprove ? "auto-approve" : "manual";
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
- toolConfirmation: {
520
- ...loadedConfig.toolConfirmation,
521
- mode: toolConfirmationMode
603
+ permissions: {
604
+ ...loadedConfig.permissions,
605
+ mode: permissionsMode,
606
+ toolPolicies: mergeToolPolicies(loadedConfig.permissions?.toolPolicies)
522
607
  },
523
- customTools: filteredCustomTools,
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
- toolConfirmation: {
540
- mode: toolConfirmationMode
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: parentConfig.mcpServers ? { ...parentConfig.mcpServers } : {},
544
- // Inherit internal tools from parent, excluding tools that don't work in subagent context
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 RuntimeService for parent '${this.parentId}'`);
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
- RuntimeService
667
+ AgentSpawnerRuntime
602
668
  });
@@ -1,5 +1,5 @@
1
1
  /**
2
- * RuntimeService - Bridge between tools and AgentRuntime
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, IDextoLogger, TaskForker } from '@dexto/core';
14
- import type { AgentRegistryEntry } from '../registry/types.js';
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 RuntimeService implements TaskForker {
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: IDextoLogger);
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-service.d.ts.map
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"}