deepseek-ai/deepseek-harness · error · Error
tool-jobs: waitTimeoutMs (${waitDefault}) exceeds maxWaitTim
Error message
tool-jobs: waitTimeoutMs (${waitDefault}) exceeds maxWaitTimeoutMs (${waitCap}) What it means
Error "tool-jobs: waitTimeoutMs (${waitDefault}) exceeds maxWaitTimeoutMs (${waitCap})" thrown in deepseek-ai/deepseek-harness.
Source
Thrown at packages/jobs/tool-jobs/src/index.ts:216
}
/** Pending presentation shared by the three generic job controls. */
function presentTaskCall(title: string, kind: 'read' | 'execute', rawInput?: string): GenericCallView {
return { card: 'generic', title, kind, ...rawInput !== undefined ? { rawInput } : {} }
}
export function apply(ctx: Context, config: Config): void {
const waitDefault = config.waitTimeoutMs ?? 30_000
const waitCap = config.maxWaitTimeoutMs ?? 600_000
const delivery = config.completionDelivery ?? 'wakeup'
const wakeBudget = config.maxConsecutiveWakes ?? 3
// Turns this plugin opened on each owner since that owner last consumed
// human input. Keyed by the exact Agent, so a same-session replacement
// starts with a full budget.
const spentWakes = new WeakMap<Agent, number>()
if (waitDefault > waitCap) {
throw new Error(`tool-jobs: waitTimeoutMs (${waitDefault}) exceeds maxWaitTimeoutMs (${waitCap})`)
}
// A budget is a count of turns. `Infinity` would leave the runaway chain this
// field exists to bound unbounded, and a fraction never names a turn at all.
if (!Number.isSafeInteger(wakeBudget)) {
throw new Error(`tool-jobs: maxConsecutiveWakes (${wakeBudget}) must be a whole number of turns`)
}
// Nothing spends the budget under quiet delivery, so nothing needs to refill it.
if (delivery === 'wakeup') {
ctx.on('agent/inbox/claimed', ({ agent, message }) => {
// Claiming is the point the human's input actually enters a step; a notice
// this plugin itself queued must not refill the budget it just spent.
if (message.source.kind === 'user') spentWakes.delete(agent)
})
}
const outputLimits = new WeakMap<ToolExecution, number>()
ctx.on('tools/pre-execute', (exec, next) => {
const maxBytes = visibleOutputLimit(ctx, exec)View on GitHub (pinned to b150a551b8)
Solutions
- Lower waitTimeoutMs to at most maxWaitTimeoutMs, or raise maxWaitTimeoutMs in the tool-jobs config.
When it happens
Trigger: Thrown at packages/jobs/tool-jobs/src/index.ts:216 when the library encounters an invalid state.
Common situations: See trigger scenarios.
Understand the failure class
- Timeouts: ETIMEDOUT, deadlines, and hung requests — what actually expires when a request times out.
AI-assisted analysis of deepseek-ai/deepseek-harness@b150a551b8 (2026-08-24).
Data as JSON: /api/errors/91ffd07da6e00df6.
Report an issue: GitHub.