@dreb/coding-agent 2.57.0 → 2.58.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 (45) hide show
  1. package/README.md +4 -2
  2. package/dist/core/agent-session.d.ts +10 -0
  3. package/dist/core/agent-session.d.ts.map +1 -1
  4. package/dist/core/agent-session.js +28 -3
  5. package/dist/core/agent-session.js.map +1 -1
  6. package/dist/core/sdk.d.ts.map +1 -1
  7. package/dist/core/sdk.js +1 -0
  8. package/dist/core/sdk.js.map +1 -1
  9. package/dist/core/settings-manager.d.ts +5 -0
  10. package/dist/core/settings-manager.d.ts.map +1 -1
  11. package/dist/core/settings-manager.js +26 -0
  12. package/dist/core/settings-manager.js.map +1 -1
  13. package/dist/core/system-prompt.d.ts +2 -0
  14. package/dist/core/system-prompt.d.ts.map +1 -1
  15. package/dist/core/system-prompt.js +6 -1
  16. package/dist/core/system-prompt.js.map +1 -1
  17. package/dist/core/tools/index.d.ts +1 -1
  18. package/dist/core/tools/index.d.ts.map +1 -1
  19. package/dist/core/tools/index.js +1 -1
  20. package/dist/core/tools/index.js.map +1 -1
  21. package/dist/core/tools/subagent.d.ts +29 -0
  22. package/dist/core/tools/subagent.d.ts.map +1 -1
  23. package/dist/core/tools/subagent.js +48 -25
  24. package/dist/core/tools/subagent.js.map +1 -1
  25. package/dist/modes/interactive/components/settings-selector.d.ts +3 -0
  26. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  27. package/dist/modes/interactive/components/settings-selector.js +11 -0
  28. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  29. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  30. package/dist/modes/interactive/interactive-mode.js +15 -0
  31. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  32. package/dist/modes/rpc/rpc-mode.d.ts +2 -2
  33. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  34. package/dist/modes/rpc/rpc-mode.js +12 -0
  35. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  36. package/dist/modes/rpc/rpc-types.d.ts +3 -0
  37. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  38. package/dist/modes/rpc/rpc-types.js.map +1 -1
  39. package/docs/custom-provider.md +17 -2
  40. package/docs/dashboard.md +1 -1
  41. package/docs/models.md +1 -1
  42. package/docs/rpc.md +11 -1
  43. package/docs/sdk.md +1 -1
  44. package/docs/settings.md +5 -1
  45. package/package.json +1 -1
@@ -37,11 +37,11 @@ import { expandPromptTemplate } from "./prompt-templates.js";
37
37
  import { scrubSecrets } from "./secret-scrubber.js";
38
38
  import { isSensitivePath } from "./sensitive-paths.js";
39
39
  import { CURRENT_SESSION_VERSION, getLatestCompactionEntry } from "./session-manager.js";
40
- import { DEFAULT_BG_PARENT_TURN_LIMIT } from "./settings-manager.js";
40
+ import { DEFAULT_BG_PARENT_TURN_LIMIT, DEFAULT_MAX_CONCURRENT_SUBAGENTS, } from "./settings-manager.js";
41
41
  import { createSyntheticSourceInfo } from "./source-info.js";
42
42
  import { buildSystemPrompt } from "./system-prompt.js";
43
43
  import { resolveThinkingDisplay } from "./thinking.js";
44
- import { createAllToolDefinitions, discoverAgentTypes, getRunningBackgroundAgents, } from "./tools/index.js";
44
+ import { createAllToolDefinitions, createSubagentConcurrencyGate, discoverAgentTypes, getRunningBackgroundAgents, } from "./tools/index.js";
45
45
  import { expandSkillContent } from "./tools/skill.js";
46
46
  import { createToolDefinitionFromAgentTool, wrapToolDefinition } from "./tools/tool-definition-wrapper.js";
47
47
  // ============================================================================
@@ -152,6 +152,14 @@ export class AgentSession {
152
152
  // Base system prompt (without extension appends) - used to apply fresh appends each turn
153
153
  _baseSystemPrompt = "";
154
154
  _uiType;
155
+ _maxConcurrentSubagents;
156
+ _subagentsDisabledBySetting;
157
+ /**
158
+ * Session-owned concurrency gate. Created once and reused across `_buildRuntime` rebuilds so
159
+ * the running-child count stays accurate through `/reload` while children launched before the
160
+ * reload are still in flight.
161
+ */
162
+ _subagentConcurrencyGate;
155
163
  performanceTracker;
156
164
  _ownsPerformanceTracker;
157
165
  // Git repo state captured once at session start
@@ -184,6 +192,15 @@ export class AgentSession {
184
192
  this._initialActiveToolNames = config.initialActiveToolNames;
185
193
  this._baseToolsOverride = config.baseToolsOverride;
186
194
  this._uiType = config.uiType;
195
+ const configuredMaxConcurrentSubagents = config.maxConcurrentSubagents ?? this.settingsManager.getMaxConcurrentSubagents();
196
+ if (!Number.isSafeInteger(configuredMaxConcurrentSubagents) || configuredMaxConcurrentSubagents < 0) {
197
+ throw new Error("maxConcurrentSubagents must be a non-negative whole number");
198
+ }
199
+ const isChildAgentSession = this.sessionManager.getHeader()?.agentType !== undefined;
200
+ this._subagentsDisabledBySetting = !isChildAgentSession && configuredMaxConcurrentSubagents === 0;
201
+ this._maxConcurrentSubagents =
202
+ configuredMaxConcurrentSubagents > 0 ? configuredMaxConcurrentSubagents : DEFAULT_MAX_CONCURRENT_SUBAGENTS;
203
+ this._subagentConcurrencyGate = createSubagentConcurrencyGate(this._maxConcurrentSubagents);
187
204
  // Capture git repo state once at session start (before building runtime/system prompt)
188
205
  this._gitRepoState = getGitRepoState(this._cwd) ?? undefined;
189
206
  this._dispatchArbiter = new DispatchArbiter({
@@ -1105,6 +1122,8 @@ export class AgentSession {
1105
1122
  const tools = [];
1106
1123
  const validToolNames = [];
1107
1124
  for (const name of toolNames) {
1125
+ if (this._subagentsDisabledBySetting && name === "subagent")
1126
+ continue;
1108
1127
  const tool = this._toolRegistry.get(name);
1109
1128
  if (tool) {
1110
1129
  tools.push(tool);
@@ -1231,6 +1250,7 @@ export class AgentSession {
1231
1250
  uiType: this._uiType,
1232
1251
  gitRepoState: this._gitRepoState,
1233
1252
  currentModel: this.model ? { provider: this.model.provider, id: this.model.id } : undefined,
1253
+ subagentsDisabled: this._subagentsDisabledBySetting,
1234
1254
  });
1235
1255
  }
1236
1256
  // =========================================================================
@@ -2562,7 +2582,10 @@ export class AgentSession {
2562
2582
  }
2563
2583
  }
2564
2584
  }
2565
- this.setActiveToolsByName([...new Set(nextActiveToolNames)]);
2585
+ const uniqueActiveToolNames = [...new Set(nextActiveToolNames)];
2586
+ this.setActiveToolsByName(this._subagentsDisabledBySetting
2587
+ ? uniqueActiveToolNames.filter((name) => name !== "subagent")
2588
+ : uniqueActiveToolNames);
2566
2589
  }
2567
2590
  _buildRuntime(options) {
2568
2591
  const autoResizeImages = this.settingsManager.getImageAutoResize();
@@ -2617,6 +2640,8 @@ export class AgentSession {
2617
2640
  modelRegistry: this._modelRegistry,
2618
2641
  getAgentModelsForAgent: (name) => this.settingsManager?.getAgentModelsForAgent(name),
2619
2642
  defaultThinkingLevel: () => this.settingsManager.getDefaultThinkingLevel() ?? DEFAULT_THINKING_LEVEL,
2643
+ maxConcurrentSubagents: this._maxConcurrentSubagents,
2644
+ concurrencyGate: this._subagentConcurrencyGate,
2620
2645
  arbitrate: (request, signal) => this._dispatchArbiter.arbitrate(request, signal),
2621
2646
  onArbitration: (event) => {
2622
2647
  this.sessionManager.appendCustomEntry("subagent_arbitration", event);