diff --git a/src/config/config.ts b/src/config/config.ts index ab31d041d..56735a3ad 100644 --- a/src/config/config.ts +++ b/src/config/config.ts @@ -325,6 +325,8 @@ export type ClawdisConfig = { typingIntervalSeconds?: number; /** Periodic background heartbeat runs (minutes). 0 disables. */ heartbeatMinutes?: number; + /** Max concurrent agent runs across all conversations. Default: 1 (sequential). */ + maxConcurrent?: number; /** Bash tool defaults. */ bash?: { /** Default time (ms) before a bash command auto-backgrounds. */ @@ -582,6 +584,7 @@ const ClawdisSchema = z.object({ mediaMaxMb: z.number().positive().optional(), typingIntervalSeconds: z.number().int().positive().optional(), heartbeatMinutes: z.number().nonnegative().optional(), + maxConcurrent: z.number().int().positive().optional(), bash: z .object({ backgroundMs: z.number().int().positive().optional(), diff --git a/src/gateway/server.ts b/src/gateway/server.ts index de97ad17c..ab2767ffd 100644 --- a/src/gateway/server.ts +++ b/src/gateway/server.ts @@ -1736,6 +1736,7 @@ export async function startGatewayServer( { controller: AbortController; sessionId: string; sessionKey: string } >(); setCommandLaneConcurrency("cron", cfgAtStart.cron?.maxConcurrentRuns ?? 1); + setCommandLaneConcurrency("main", cfgAtStart.agent?.maxConcurrent ?? 1); const cronStorePath = resolveCronStorePath(cfgAtStart.cron?.store); const cronLogger = getChildLogger({