rfc-003: remove timeout from RoleSpec, it's an adapter concern

RoleSpec now has exactly 3 fields: adapter, prompt, meta.
Timeout belongs to adapter config — different timeouts = different adapter instances.

Refs #245
小橘 🍊(NEKO Team)
This commit is contained in:
2026-04-29 08:34:00 +00:00
parent 4be465918c
commit 7de75b5df7
+9 -12
View File
@@ -82,7 +82,7 @@ const workflow: WorkflowSpec<MyMeta> = {
roles: { roles: {
architect: { adapter: cursorAdapter, prompt: architectPrompt, meta: architectSchema }, architect: { adapter: cursorAdapter, prompt: architectPrompt, meta: architectSchema },
coder: { adapter: createCursorAdapter({ model: "claude-sonnet-4", timeout: 600 }), prompt: coderPrompt, meta: coderSchema }, coder: { adapter: createCursorAdapter({ model: "claude-sonnet-4", timeout: 600 }), prompt: coderPrompt, meta: coderSchema },
reviewer: { adapter: hermesAdapter, prompt: reviewPrompt, meta: reviewSchema, timeout: "60s" }, reviewer: { adapter: hermesAdapter, prompt: reviewPrompt, meta: reviewSchema },
deployer: { adapter: hermesAdapter, prompt: deployPrompt, meta: deploySchema }, deployer: { adapter: hermesAdapter, prompt: deployPrompt, meta: deploySchema },
}, },
moderator, moderator,
@@ -162,7 +162,6 @@ type RoleSpec<M> = {
adapter: AgentFn; adapter: AgentFn;
prompt: PromptInput; prompt: PromptInput;
meta: Schema<M>; meta: Schema<M>;
timeout: string | null;
}; };
``` ```
@@ -170,22 +169,20 @@ Static prompts cover simple cases. Dynamic prompts (functions) are needed when t
### Timeout Resolution ### Timeout Resolution
Two-layer: adapter default + role override. Timeout is an **adapter concern**, not a role concern. Roles define *what to do* (prompt + schema); adapters define *how to do it* (tool, model, timeout).
1. Adapter instance carries its default timeout (set at creation or from default export) When different roles need different timeouts, create separate adapter instances:
2. Role definition can override for specific scenarios
```ts ```ts
import { cursorAdapter, createCursorAdapter } from "@uncaged/nerve-adapter-cursor"; import { cursorAdapter, createCursorAdapter } from "@uncaged/nerve-adapter-cursor";
// cursorAdapter has built-in default (300s) const fastCursor = createCursorAdapter({ model: "auto", timeout: 60 });
// Or create with custom timeout: const slowCursor = createCursorAdapter({ model: "auto", timeout: 600 });
const longRunAdapter = createCursorAdapter({ model: "auto", timeout: 600 });
// Role override — review is faster roles: {
reviewer: { adapter: cursorAdapter, ..., timeout: "60s" } reviewer: { adapter: fastCursor, prompt: reviewPrompt, meta: reviewSchema },
// coder uses adapter default (300s) coder: { adapter: slowCursor, prompt: coderPrompt, meta: coderSchema },
coder: { adapter: cursorAdapter, ... } }
``` ```
### No Runtime Fallback ### No Runtime Fallback