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:
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user