@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.
Files changed (145) 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 +2 -12
  14. package/dist/config/config-enrichment.d.ts +1 -1
  15. package/dist/config/config-enrichment.d.ts.map +1 -1
  16. package/dist/config/config-enrichment.js +2 -12
  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 +43 -2
  28. package/dist/index.d.ts +5 -2
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +43 -1
  31. package/dist/models/custom-models.cjs +1 -1
  32. package/dist/models/custom-models.d.ts +7 -7
  33. package/dist/models/custom-models.d.ts.map +1 -1
  34. package/dist/models/custom-models.js +1 -1
  35. package/dist/plugins/discover-plugins.cjs +15 -31
  36. package/dist/plugins/discover-plugins.d.ts.map +1 -1
  37. package/dist/plugins/discover-plugins.js +15 -31
  38. package/dist/plugins/discover-skills.cjs +4 -0
  39. package/dist/plugins/discover-skills.d.ts +6 -3
  40. package/dist/plugins/discover-skills.d.ts.map +1 -1
  41. package/dist/plugins/discover-skills.js +4 -0
  42. package/dist/plugins/index.cjs +0 -2
  43. package/dist/plugins/index.d.ts +5 -6
  44. package/dist/plugins/index.d.ts.map +1 -1
  45. package/dist/plugins/index.js +0 -2
  46. package/dist/plugins/list-plugins.cjs +3 -1
  47. package/dist/plugins/list-plugins.d.ts.map +1 -1
  48. package/dist/plugins/list-plugins.js +3 -1
  49. package/dist/plugins/load-plugin.cjs +0 -13
  50. package/dist/plugins/load-plugin.d.ts +3 -5
  51. package/dist/plugins/load-plugin.d.ts.map +1 -1
  52. package/dist/plugins/load-plugin.js +0 -13
  53. package/dist/plugins/schemas.cjs +1 -11
  54. package/dist/plugins/schemas.d.ts +14 -69
  55. package/dist/plugins/schemas.d.ts.map +1 -1
  56. package/dist/plugins/schemas.js +1 -10
  57. package/dist/plugins/types.d.ts +2 -20
  58. package/dist/plugins/types.d.ts.map +1 -1
  59. package/dist/plugins/validate-plugin.cjs +7 -37
  60. package/dist/plugins/validate-plugin.d.ts +6 -24
  61. package/dist/plugins/validate-plugin.d.ts.map +1 -1
  62. package/dist/plugins/validate-plugin.js +8 -38
  63. package/dist/preferences/errors.cjs +11 -0
  64. package/dist/preferences/errors.d.ts +1 -0
  65. package/dist/preferences/errors.d.ts.map +1 -1
  66. package/dist/preferences/errors.js +11 -0
  67. package/dist/preferences/loader.cjs +119 -6
  68. package/dist/preferences/loader.d.ts +21 -1
  69. package/dist/preferences/loader.d.ts.map +1 -1
  70. package/dist/preferences/loader.js +102 -1
  71. package/dist/preferences/schemas.cjs +12 -0
  72. package/dist/preferences/schemas.d.ts +38 -12
  73. package/dist/preferences/schemas.d.ts.map +1 -1
  74. package/dist/preferences/schemas.js +10 -0
  75. package/dist/registry/registry.d.ts +4 -44
  76. package/dist/registry/registry.d.ts.map +1 -1
  77. package/dist/runtime/AgentPool.d.ts +2 -2
  78. package/dist/runtime/AgentPool.d.ts.map +1 -1
  79. package/dist/runtime/AgentRuntime.cjs +20 -15
  80. package/dist/runtime/AgentRuntime.d.ts +2 -2
  81. package/dist/runtime/AgentRuntime.d.ts.map +1 -1
  82. package/dist/runtime/AgentRuntime.js +20 -15
  83. package/dist/runtime/approval-delegation.d.ts +2 -2
  84. package/dist/runtime/approval-delegation.d.ts.map +1 -1
  85. package/dist/runtime/schemas.d.ts +1 -1
  86. package/dist/runtime/types.d.ts +2 -1
  87. package/dist/runtime/types.d.ts.map +1 -1
  88. package/dist/{tool-provider → tool-factories/agent-spawner}/error-codes.d.ts +1 -1
  89. package/dist/tool-factories/agent-spawner/error-codes.d.ts.map +1 -0
  90. package/dist/{tool-provider → tool-factories/agent-spawner}/errors.d.ts +1 -1
  91. package/dist/tool-factories/agent-spawner/errors.d.ts.map +1 -0
  92. package/dist/tool-factories/agent-spawner/factory.cjs +290 -0
  93. package/dist/tool-factories/agent-spawner/factory.d.ts +4 -0
  94. package/dist/tool-factories/agent-spawner/factory.d.ts.map +1 -0
  95. package/dist/tool-factories/agent-spawner/factory.js +279 -0
  96. package/dist/{tool-provider → tool-factories/agent-spawner}/index.cjs +9 -9
  97. package/dist/{tool-provider → tool-factories/agent-spawner}/index.d.ts +3 -3
  98. package/dist/tool-factories/agent-spawner/index.d.ts.map +1 -0
  99. package/dist/{tool-provider → tool-factories/agent-spawner}/index.js +4 -4
  100. package/dist/{tool-provider → tool-factories/agent-spawner}/llm-resolution.cjs +1 -1
  101. package/dist/{tool-provider → tool-factories/agent-spawner}/llm-resolution.d.ts +4 -4
  102. package/dist/tool-factories/agent-spawner/llm-resolution.d.ts.map +1 -0
  103. package/dist/{tool-provider → tool-factories/agent-spawner}/llm-resolution.js +1 -1
  104. package/dist/{tool-provider/runtime-service.cjs → tool-factories/agent-spawner/runtime.cjs} +112 -73
  105. package/dist/{tool-provider/runtime-service.d.ts → tool-factories/agent-spawner/runtime.d.ts} +8 -6
  106. package/dist/tool-factories/agent-spawner/runtime.d.ts.map +1 -0
  107. package/dist/{tool-provider/runtime-service.js → tool-factories/agent-spawner/runtime.js} +98 -69
  108. package/dist/{tool-provider → tool-factories/agent-spawner}/schemas.cjs +2 -2
  109. package/dist/{tool-provider → tool-factories/agent-spawner}/schemas.d.ts +4 -4
  110. package/dist/tool-factories/agent-spawner/schemas.d.ts.map +1 -0
  111. package/dist/{tool-provider → tool-factories/agent-spawner}/schemas.js +2 -2
  112. package/dist/{tool-provider → tool-factories/agent-spawner}/spawn-agent-tool.cjs +8 -7
  113. package/dist/tool-factories/agent-spawner/spawn-agent-tool.d.ts +11 -0
  114. package/dist/tool-factories/agent-spawner/spawn-agent-tool.d.ts.map +1 -0
  115. package/dist/{tool-provider → tool-factories/agent-spawner}/spawn-agent-tool.js +8 -7
  116. package/dist/tool-factories/agent-spawner/types.d.ts.map +1 -0
  117. package/dist/utils/api-key-resolver.cjs +1 -1
  118. package/dist/utils/api-key-resolver.js +1 -1
  119. package/dist/utils/feature-flags.cjs +3 -1
  120. package/dist/utils/feature-flags.d.ts +2 -2
  121. package/dist/utils/feature-flags.d.ts.map +1 -1
  122. package/dist/utils/feature-flags.js +3 -1
  123. package/dist/writer.d.ts +2 -1
  124. package/dist/writer.d.ts.map +1 -1
  125. package/package.json +6 -3
  126. package/dist/tool-provider/error-codes.d.ts.map +0 -1
  127. package/dist/tool-provider/errors.d.ts.map +0 -1
  128. package/dist/tool-provider/index.d.ts.map +0 -1
  129. package/dist/tool-provider/llm-resolution.d.ts.map +0 -1
  130. package/dist/tool-provider/runtime-service.d.ts.map +0 -1
  131. package/dist/tool-provider/schemas.d.ts.map +0 -1
  132. package/dist/tool-provider/spawn-agent-tool.d.ts +0 -10
  133. package/dist/tool-provider/spawn-agent-tool.d.ts.map +0 -1
  134. package/dist/tool-provider/tool-provider.cjs +0 -46
  135. package/dist/tool-provider/tool-provider.d.ts +0 -24
  136. package/dist/tool-provider/tool-provider.d.ts.map +0 -1
  137. package/dist/tool-provider/tool-provider.js +0 -22
  138. package/dist/tool-provider/types.d.ts.map +0 -1
  139. /package/dist/{tool-provider → tool-factories/agent-spawner}/error-codes.cjs +0 -0
  140. /package/dist/{tool-provider → tool-factories/agent-spawner}/error-codes.js +0 -0
  141. /package/dist/{tool-provider → tool-factories/agent-spawner}/errors.cjs +0 -0
  142. /package/dist/{tool-provider → tool-factories/agent-spawner}/errors.js +0 -0
  143. /package/dist/{tool-provider → tool-factories/agent-spawner}/types.cjs +0 -0
  144. /package/dist/{tool-provider → tool-factories/agent-spawner}/types.d.ts +0 -0
  145. /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 runtime_service_exports = {};
20
- __export(runtime_service_exports, {
21
- RuntimeService: () => RuntimeService
29
+ var runtime_exports = {};
30
+ __export(runtime_exports, {
31
+ AgentSpawnerRuntime: () => AgentSpawnerRuntime
22
32
  });
23
- module.exports = __toCommonJS(runtime_service_exports);
33
+ module.exports = __toCommonJS(runtime_exports);
24
34
  var import_core = require("@dexto/core");
25
- var import_AgentRuntime = require("../runtime/AgentRuntime.js");
26
- var import_approval_delegation = require("../runtime/approval-delegation.js");
27
- var import_loader = require("../config/loader.js");
28
- var import_registry = require("../registry/registry.js");
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 RuntimeService {
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
- `RuntimeService initialized for parent '${this.parentId}' (maxAgents: ${config.maxConcurrentAgents})`
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
- const spawnOptions = {
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
- parentBus.emit("service:event", {
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("internal--")) {
183
- displayToolName = displayToolName.replace("internal--", "");
184
- } else if (displayToolName.startsWith("custom--")) {
185
- displayToolName = displayToolName.replace("custom--", "");
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
- subAgentBus.on("llm:tool-call", toolCallHandler);
210
- subAgentBus.on("llm:response", responseHandler);
230
+ subAgentHandle.agent.on("llm:tool-call", toolCallHandler);
231
+ subAgentHandle.agent.on("llm:response", responseHandler);
211
232
  return () => {
212
- subAgentBus.off("llm:tool-call", toolCallHandler);
213
- subAgentBus.off("llm:response", responseHandler);
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 parentConfig = this.parentAgent.config;
447
+ const parentSettings = this.parentAgent.config;
427
448
  const currentParentLLM = this.parentAgent.getCurrentLLMConfig(sessionId);
428
449
  this.logger.debug(
429
- `[RuntimeService] Building sub-agent config with LLM: ${currentParentLLM.provider}/${currentParentLLM.model}` + (sessionId ? ` (sessionId: ${sessionId})` : " (no sessionId)")
450
+ `[AgentSpawnerRuntime] Building sub-agent config with LLM: ${currentParentLLM.provider}/${currentParentLLM.model}` + (sessionId ? ` (sessionId: ${sessionId})` : " (no sessionId)")
430
451
  );
431
- const toolConfirmationMode = autoApprove ? "auto-approve" : "manual";
452
+ const permissionsMode = autoApprove ? "auto-approve" : "manual";
432
453
  if (agentId) {
433
- const registry = (0, import_registry.getAgentRegistry)();
434
- if (!registry.hasAgent(agentId)) {
435
- this.logger.warn(`Agent '${agentId}' not found in registry. Using default config.`);
436
- } else {
437
- const configPath = await registry.resolveAgent(agentId);
438
- this.logger.debug(`Loading agent config from registry: ${configPath}`);
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
- toolConfirmation: {
459
- ...loadedConfig.toolConfirmation,
460
- mode: toolConfirmationMode
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
- toolConfirmation: {
475
- mode: toolConfirmationMode
512
+ permissions: {
513
+ mode: permissionsMode
476
514
  },
477
515
  // Inherit MCP servers from parent so subagent has tool access
478
- mcpServers: parentConfig.mcpServers ? { ...parentConfig.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
- const registry = (0, import_registry.getAgentRegistry)();
501
- const allAgents = registry.getAvailableAgents();
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
- if (agent) {
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 RuntimeService for parent '${this.parentId}'`);
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
- RuntimeService
563
+ AgentSpawnerRuntime
525
564
  });
@@ -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,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, 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;
21
21
  private config;
22
22
  private logger;
23
- constructor(parentAgent: DextoAgent, config: AgentSpawnerConfig, logger: IDextoLogger);
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-service.d.ts.map
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 "../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";
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 RuntimeService {
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
- `RuntimeService initialized for parent '${this.parentId}' (maxAgents: ${config.maxConcurrentAgents})`
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
- const spawnOptions = {
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
- parentBus.emit("service:event", {
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("internal--")) {
160
- displayToolName = displayToolName.replace("internal--", "");
161
- } else if (displayToolName.startsWith("custom--")) {
162
- displayToolName = displayToolName.replace("custom--", "");
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
- subAgentBus.on("llm:tool-call", toolCallHandler);
187
- subAgentBus.on("llm:response", responseHandler);
197
+ subAgentHandle.agent.on("llm:tool-call", toolCallHandler);
198
+ subAgentHandle.agent.on("llm:response", responseHandler);
188
199
  return () => {
189
- subAgentBus.off("llm:tool-call", toolCallHandler);
190
- subAgentBus.off("llm:response", responseHandler);
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 parentConfig = this.parentAgent.config;
414
+ const parentSettings = this.parentAgent.config;
404
415
  const currentParentLLM = this.parentAgent.getCurrentLLMConfig(sessionId);
405
416
  this.logger.debug(
406
- `[RuntimeService] Building sub-agent config with LLM: ${currentParentLLM.provider}/${currentParentLLM.model}` + (sessionId ? ` (sessionId: ${sessionId})` : " (no sessionId)")
417
+ `[AgentSpawnerRuntime] Building sub-agent config with LLM: ${currentParentLLM.provider}/${currentParentLLM.model}` + (sessionId ? ` (sessionId: ${sessionId})` : " (no sessionId)")
407
418
  );
408
- const toolConfirmationMode = autoApprove ? "auto-approve" : "manual";
419
+ const permissionsMode = autoApprove ? "auto-approve" : "manual";
409
420
  if (agentId) {
410
- const registry = getAgentRegistry();
411
- if (!registry.hasAgent(agentId)) {
412
- this.logger.warn(`Agent '${agentId}' not found in registry. Using default config.`);
413
- } else {
414
- const configPath = await registry.resolveAgent(agentId);
415
- this.logger.debug(`Loading agent config from registry: ${configPath}`);
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
- toolConfirmation: {
436
- ...loadedConfig.toolConfirmation,
437
- mode: toolConfirmationMode
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
- toolConfirmation: {
452
- mode: toolConfirmationMode
479
+ permissions: {
480
+ mode: permissionsMode
453
481
  },
454
482
  // Inherit MCP servers from parent so subagent has tool access
455
- mcpServers: parentConfig.mcpServers ? { ...parentConfig.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
- const registry = getAgentRegistry();
478
- const allAgents = registry.getAvailableAgents();
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
- if (agent) {
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 RuntimeService for parent '${this.parentId}'`);
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
- RuntimeService
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 provider */
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 tool provider");
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"),