@winspan/claude-forge 8.13.0 → 8.15.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.
- package/dist/agents/definition.d.ts +53 -0
- package/dist/agents/definition.d.ts.map +1 -0
- package/dist/agents/definition.js +24 -0
- package/dist/agents/definition.js.map +1 -0
- package/dist/agents/distributor.d.ts +23 -0
- package/dist/agents/distributor.d.ts.map +1 -0
- package/dist/agents/distributor.js +85 -0
- package/dist/agents/distributor.js.map +1 -0
- package/dist/agents/index.d.ts +5 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +5 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/official-agents.d.ts +14 -0
- package/dist/agents/official-agents.d.ts.map +1 -0
- package/dist/agents/official-agents.js +522 -0
- package/dist/agents/official-agents.js.map +1 -0
- package/dist/agents/registry.d.ts +27 -0
- package/dist/agents/registry.d.ts.map +1 -0
- package/dist/agents/registry.js +105 -0
- package/dist/agents/registry.js.map +1 -0
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +17 -0
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/core/storage/schema.sql +60 -0
- package/dist/core/storage/sqlite.d.ts +73 -0
- package/dist/core/storage/sqlite.d.ts.map +1 -1
- package/dist/core/storage/sqlite.js +159 -0
- package/dist/core/storage/sqlite.js.map +1 -1
- package/dist/daemon/auto-disable-scheduler.d.ts +53 -0
- package/dist/daemon/auto-disable-scheduler.d.ts.map +1 -0
- package/dist/daemon/auto-disable-scheduler.js +114 -0
- package/dist/daemon/auto-disable-scheduler.js.map +1 -0
- package/dist/daemon/handlers/post-tool-use.d.ts +3 -1
- package/dist/daemon/handlers/post-tool-use.d.ts.map +1 -1
- package/dist/daemon/handlers/post-tool-use.js +14 -2
- package/dist/daemon/handlers/post-tool-use.js.map +1 -1
- package/dist/daemon/handlers/stop.d.ts +3 -1
- package/dist/daemon/handlers/stop.d.ts.map +1 -1
- package/dist/daemon/handlers/stop.js +14 -1
- package/dist/daemon/handlers/stop.js.map +1 -1
- package/dist/daemon/handlers/user-prompt.d.ts +18 -5
- package/dist/daemon/handlers/user-prompt.d.ts.map +1 -1
- package/dist/daemon/handlers/user-prompt.js +104 -21
- package/dist/daemon/handlers/user-prompt.js.map +1 -1
- package/dist/daemon/index.d.ts.map +1 -1
- package/dist/daemon/index.js +42 -12
- package/dist/daemon/index.js.map +1 -1
- package/dist/daemon/routing-observer.d.ts +39 -0
- package/dist/daemon/routing-observer.d.ts.map +1 -0
- package/dist/daemon/routing-observer.js +156 -0
- package/dist/daemon/routing-observer.js.map +1 -0
- package/dist/engine/agent-router.d.ts +99 -0
- package/dist/engine/agent-router.d.ts.map +1 -0
- package/dist/engine/agent-router.js +206 -0
- package/dist/engine/agent-router.js.map +1 -0
- package/dist/engine/conventions/routing.yaml +74 -0
- package/dist/engine/evidence-store.d.ts.map +1 -1
- package/dist/engine/evidence-store.js +3 -0
- package/dist/engine/evidence-store.js.map +1 -1
- package/dist/engine/experiment-router.d.ts +102 -0
- package/dist/engine/experiment-router.d.ts.map +1 -0
- package/dist/engine/experiment-router.js +289 -0
- package/dist/engine/experiment-router.js.map +1 -0
- package/dist/engine/recommender.d.ts +52 -0
- package/dist/engine/recommender.d.ts.map +1 -0
- package/dist/engine/recommender.js +150 -0
- package/dist/engine/recommender.js.map +1 -0
- package/dist/intelligence/classifier.d.ts +18 -4
- package/dist/intelligence/classifier.d.ts.map +1 -1
- package/dist/intelligence/classifier.js +90 -20
- package/dist/intelligence/classifier.js.map +1 -1
- package/dist/skills/registry.d.ts.map +1 -1
- package/dist/skills/registry.js +5 -2
- package/dist/skills/registry.js.map +1 -1
- package/dist/web/server.d.ts +4 -0
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +482 -11
- package/dist/web/server.js.map +1 -1
- package/dist/web/static/index.html +764 -1
- package/package.json +1 -1
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RoutingObserver — tracks in-flight routing decisions and judges whether
|
|
3
|
+
* the main Claude obeyed the injected agent recommendation.
|
|
4
|
+
*
|
|
5
|
+
* Lifecycle per session:
|
|
6
|
+
* 1. UserPromptSubmit handler: after routing decides an agent, call
|
|
7
|
+
* `beginPending(session_id, eventId, routedAgent)`.
|
|
8
|
+
* 2. PostToolUse handler: call `observeTool(session_id, tool_name, tool_input)`
|
|
9
|
+
* to classify the tool (read-only → ignore, decision-type → judge).
|
|
10
|
+
* 3. Stop handler: call `finalizePending(session_id, lastAssistantText?)` to
|
|
11
|
+
* flush any still-pending event as obeyed=NULL and optionally extract
|
|
12
|
+
* refusal_reason from Claude's last message.
|
|
13
|
+
*
|
|
14
|
+
* The 30s safety timer ensures stale pending entries are cleaned up even if
|
|
15
|
+
* no Stop arrives (e.g. daemon restart window).
|
|
16
|
+
*/
|
|
17
|
+
import { logger } from '../core/utils/logger.js';
|
|
18
|
+
const OBEYED_TIMEOUT_MS = 30_000;
|
|
19
|
+
const READ_ONLY_TOOLS = new Set([
|
|
20
|
+
'Read', 'Grep', 'Glob', 'LS', 'NotebookRead', 'WebFetch', 'WebSearch',
|
|
21
|
+
]);
|
|
22
|
+
export class RoutingObserver {
|
|
23
|
+
storage;
|
|
24
|
+
pending = new Map();
|
|
25
|
+
constructor(storage) {
|
|
26
|
+
this.storage = storage;
|
|
27
|
+
}
|
|
28
|
+
beginPending(sessionId, eventId, routedAgent) {
|
|
29
|
+
// Replace any existing pending (new prompt supersedes previous unfinished observation)
|
|
30
|
+
const prev = this.pending.get(sessionId);
|
|
31
|
+
if (prev)
|
|
32
|
+
clearTimeout(prev.timer);
|
|
33
|
+
const timer = setTimeout(() => {
|
|
34
|
+
this.timeoutPending(sessionId);
|
|
35
|
+
}, OBEYED_TIMEOUT_MS);
|
|
36
|
+
timer.unref?.();
|
|
37
|
+
this.pending.set(sessionId, {
|
|
38
|
+
eventId,
|
|
39
|
+
routedAgent,
|
|
40
|
+
t0: Date.now(),
|
|
41
|
+
timer,
|
|
42
|
+
obeyedWritten: false,
|
|
43
|
+
downstreamChain: [],
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
observeTool(sessionId, toolName, toolInput) {
|
|
47
|
+
const entry = this.pending.get(sessionId);
|
|
48
|
+
if (!entry)
|
|
49
|
+
return;
|
|
50
|
+
// Read-only tool — allow Claude's pre-investigation, don't judge yet
|
|
51
|
+
if (READ_ONLY_TOOLS.has(toolName))
|
|
52
|
+
return;
|
|
53
|
+
// Decision-type tool — judge or track downstream
|
|
54
|
+
if (!entry.obeyedWritten) {
|
|
55
|
+
const isTask = toolName === 'Task';
|
|
56
|
+
const subagentType = typeof toolInput.subagent_type === 'string' ? toolInput.subagent_type : null;
|
|
57
|
+
const matched = isTask && subagentType !== null && subagentType === entry.routedAgent;
|
|
58
|
+
const obeyed = matched ? 1 : 0;
|
|
59
|
+
try {
|
|
60
|
+
this.storage.updateRoutingEvent(entry.eventId, {
|
|
61
|
+
obeyed,
|
|
62
|
+
first_tool_name: toolName,
|
|
63
|
+
first_tool_ts: Date.now(),
|
|
64
|
+
});
|
|
65
|
+
entry.obeyedWritten = true;
|
|
66
|
+
if (matched)
|
|
67
|
+
entry.downstreamChain.push(subagentType);
|
|
68
|
+
}
|
|
69
|
+
catch (err) {
|
|
70
|
+
logger.warn(`[RoutingObserver] updateRoutingEvent failed: ${err}`);
|
|
71
|
+
}
|
|
72
|
+
// If it wasn't a Task call, we have our verdict — stop tracking
|
|
73
|
+
if (!isTask) {
|
|
74
|
+
this.dropPending(sessionId);
|
|
75
|
+
}
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
// Already judged — track downstream Task chain
|
|
79
|
+
if (toolName === 'Task' && typeof toolInput.subagent_type === 'string') {
|
|
80
|
+
entry.downstreamChain.push(toolInput.subagent_type);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Flush the pending event for a session (obeyed = NULL if still unset,
|
|
85
|
+
* persist downstream chain, optionally extract refusal_reason).
|
|
86
|
+
*/
|
|
87
|
+
finalizePending(sessionId, lastAssistantText) {
|
|
88
|
+
const entry = this.pending.get(sessionId);
|
|
89
|
+
if (!entry)
|
|
90
|
+
return;
|
|
91
|
+
const patch = {};
|
|
92
|
+
if (!entry.obeyedWritten)
|
|
93
|
+
patch.obeyed = null;
|
|
94
|
+
if (entry.downstreamChain.length > 0) {
|
|
95
|
+
patch.downstream_task_chain = JSON.stringify(entry.downstreamChain);
|
|
96
|
+
}
|
|
97
|
+
if (lastAssistantText && (!entry.obeyedWritten || entry.routedAgent)) {
|
|
98
|
+
const reason = extractRefusalReason(lastAssistantText);
|
|
99
|
+
if (reason)
|
|
100
|
+
patch.refusal_reason = reason;
|
|
101
|
+
}
|
|
102
|
+
if (Object.keys(patch).length > 0) {
|
|
103
|
+
try {
|
|
104
|
+
this.storage.updateRoutingEvent(entry.eventId, patch);
|
|
105
|
+
}
|
|
106
|
+
catch (err) {
|
|
107
|
+
logger.warn(`[RoutingObserver] finalize failed: ${err}`);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
this.dropPending(sessionId);
|
|
111
|
+
}
|
|
112
|
+
timeoutPending(sessionId) {
|
|
113
|
+
const entry = this.pending.get(sessionId);
|
|
114
|
+
if (!entry)
|
|
115
|
+
return;
|
|
116
|
+
if (!entry.obeyedWritten) {
|
|
117
|
+
try {
|
|
118
|
+
this.storage.updateRoutingEvent(entry.eventId, { obeyed: null });
|
|
119
|
+
}
|
|
120
|
+
catch (err) {
|
|
121
|
+
logger.warn(`[RoutingObserver] timeout update failed: ${err}`);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
this.dropPending(sessionId);
|
|
125
|
+
}
|
|
126
|
+
dropPending(sessionId) {
|
|
127
|
+
const entry = this.pending.get(sessionId);
|
|
128
|
+
if (!entry)
|
|
129
|
+
return;
|
|
130
|
+
clearTimeout(entry.timer);
|
|
131
|
+
this.pending.delete(sessionId);
|
|
132
|
+
}
|
|
133
|
+
/** Used by tests/introspection. */
|
|
134
|
+
getPending(sessionId) {
|
|
135
|
+
const e = this.pending.get(sessionId);
|
|
136
|
+
return e ? { eventId: e.eventId, routedAgent: e.routedAgent } : null;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
/** Extract refusal explanation from Claude's last message. */
|
|
140
|
+
export function extractRefusalReason(text) {
|
|
141
|
+
if (!text)
|
|
142
|
+
return null;
|
|
143
|
+
const patterns = [
|
|
144
|
+
/不适用此路径[^。\n]*[。\n]?/,
|
|
145
|
+
/不需要(?:使用|调用|借助)[^。\n]*agent[^。\n]*/i,
|
|
146
|
+
/I(?:'m| am) not going to use the \w+ agent[^.\n]*/i,
|
|
147
|
+
/Skipping the \w+ agent[^.\n]*/i,
|
|
148
|
+
];
|
|
149
|
+
for (const p of patterns) {
|
|
150
|
+
const m = text.match(p);
|
|
151
|
+
if (m)
|
|
152
|
+
return m[0].trim().slice(0, 300);
|
|
153
|
+
}
|
|
154
|
+
return null;
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=routing-observer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routing-observer.js","sourceRoot":"","sources":["../../src/daemon/routing-observer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AgentRouter — matches classifier output against a YAML routing table and
|
|
3
|
+
* decides whether to route to an agent, a skill, or let the default flow
|
|
4
|
+
* continue.
|
|
5
|
+
*
|
|
6
|
+
* Deliberately independent from RuleEngine:
|
|
7
|
+
* - RuleEngine handles governance decisions (block/warn/confirm) on tool use
|
|
8
|
+
* - AgentRouter handles intent-to-agent/skill routing at UserPromptSubmit
|
|
9
|
+
*
|
|
10
|
+
* Both share the Convention-YAML ethos but have different context shapes and
|
|
11
|
+
* action semantics, so coupling them through RuleEngine would leak types.
|
|
12
|
+
*
|
|
13
|
+
* Routing YAML format (engine/conventions/routing.yaml):
|
|
14
|
+
*
|
|
15
|
+
* schemaVersion: "1.0"
|
|
16
|
+
* rules:
|
|
17
|
+
* - when: { taskType: build_system }
|
|
18
|
+
* action: { type: route_to_agent, name: full-system-builder }
|
|
19
|
+
* - when: { taskType: add_feature, complexity: [moderate, complex] }
|
|
20
|
+
* action: { type: route_to_agent, name: feature-developer }
|
|
21
|
+
* - when: { default: true }
|
|
22
|
+
* action: { type: route_to_skill, strategy: best_match }
|
|
23
|
+
*/
|
|
24
|
+
export type Complexity = 'simple' | 'moderate' | 'complex';
|
|
25
|
+
export type TaskType = 'build_system' | 'add_feature' | 'refactor' | 'migrate' | 'fix_bug' | 'analyze_requirement' | 'design_architecture' | 'design_api' | 'design_schema' | 'write_code' | 'write_test' | 'review' | 'audit_security' | 'optimize_perf' | 'write_spec' | 'review_doc' | 'create_pr' | 'explain' | 'other';
|
|
26
|
+
export interface RouteInput {
|
|
27
|
+
taskType: TaskType;
|
|
28
|
+
complexity: Complexity;
|
|
29
|
+
}
|
|
30
|
+
export type RouteAction = {
|
|
31
|
+
type: 'route_to_agent';
|
|
32
|
+
name: string;
|
|
33
|
+
} | {
|
|
34
|
+
type: 'route_to_skill';
|
|
35
|
+
strategy: 'best_match' | 'none';
|
|
36
|
+
} | {
|
|
37
|
+
type: 'none';
|
|
38
|
+
};
|
|
39
|
+
export interface RouteDecision {
|
|
40
|
+
action: RouteAction;
|
|
41
|
+
matchedRuleIndex: number | null;
|
|
42
|
+
source: 'yaml' | 'fallback';
|
|
43
|
+
}
|
|
44
|
+
interface WhenClause {
|
|
45
|
+
taskType?: TaskType | TaskType[];
|
|
46
|
+
complexity?: Complexity | Complexity[];
|
|
47
|
+
default?: boolean;
|
|
48
|
+
}
|
|
49
|
+
export interface RoutingRule {
|
|
50
|
+
when: WhenClause;
|
|
51
|
+
action: RouteAction;
|
|
52
|
+
}
|
|
53
|
+
export type IsRuleDisabled = (taskType: TaskType, agent: string) => boolean;
|
|
54
|
+
export declare class AgentRouter {
|
|
55
|
+
private rules;
|
|
56
|
+
private sourceLabel;
|
|
57
|
+
private userPath;
|
|
58
|
+
private defaultPath;
|
|
59
|
+
private watcher;
|
|
60
|
+
private isRuleDisabled;
|
|
61
|
+
/**
|
|
62
|
+
* Load routing rules from:
|
|
63
|
+
* 1. Inline rules (if provided) — skips disk load, used by ExperimentRouter
|
|
64
|
+
* 2. User override: ~/.claude-forge/routing.yaml
|
|
65
|
+
* 3. Default: engine/conventions/routing.yaml (shipped)
|
|
66
|
+
* 4. Fallback: FALLBACK_RULES (always route to skill)
|
|
67
|
+
*
|
|
68
|
+
* If `isRuleDisabled` is provided, decide() will skip any rule whose
|
|
69
|
+
* (taskType, agent) pair is currently flagged disabled.
|
|
70
|
+
*/
|
|
71
|
+
constructor(opts?: {
|
|
72
|
+
defaultPath?: string;
|
|
73
|
+
userPath?: string;
|
|
74
|
+
rules?: RoutingRule[];
|
|
75
|
+
isRuleDisabled?: IsRuleDisabled;
|
|
76
|
+
});
|
|
77
|
+
/** Allow late binding (used by ExperimentRouter per-group routers). */
|
|
78
|
+
setIsRuleDisabled(fn: IsRuleDisabled | null): void;
|
|
79
|
+
/**
|
|
80
|
+
* (Re)load routing rules from disk. Called by constructor and hot-reload watcher.
|
|
81
|
+
*/
|
|
82
|
+
private load;
|
|
83
|
+
/**
|
|
84
|
+
* Enable hot-reload: watch user override file for changes and auto-reload.
|
|
85
|
+
* Safe to call multiple times (idempotent).
|
|
86
|
+
*/
|
|
87
|
+
enableHotReload(): void;
|
|
88
|
+
/**
|
|
89
|
+
* Disable hot-reload watcher (cleanup on daemon shutdown).
|
|
90
|
+
*/
|
|
91
|
+
disableHotReload(): void;
|
|
92
|
+
private resolveShippedDefault;
|
|
93
|
+
private tryLoad;
|
|
94
|
+
decide(input: RouteInput): RouteDecision;
|
|
95
|
+
/** Exposed for Web UI "路由调优" panel. */
|
|
96
|
+
getRules(): RoutingRule[];
|
|
97
|
+
}
|
|
98
|
+
export {};
|
|
99
|
+
//# sourceMappingURL=agent-router.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-router.d.ts","sourceRoot":"","sources":["../../src/engine/agent-router.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAWH,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC;AAE3D,MAAM,MAAM,QAAQ,GAChB,cAAc,GACd,aAAa,GACb,UAAU,GACV,SAAS,GACT,SAAS,GACT,qBAAqB,GACrB,qBAAqB,GACrB,YAAY,GACZ,eAAe,GACf,YAAY,GACZ,YAAY,GACZ,QAAQ,GACR,gBAAgB,GAChB,eAAe,GACf,YAAY,GACZ,YAAY,GACZ,WAAW,GACX,SAAS,GACT,OAAO,CAAC;AAEZ,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,QAAQ,CAAC;IACnB,UAAU,EAAE,UAAU,CAAC;CACxB;AAED,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACxC;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,QAAQ,EAAE,YAAY,GAAG,MAAM,CAAA;CAAE,GAC3D;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAErB,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,WAAW,CAAC;IACpB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,MAAM,EAAE,MAAM,GAAG,UAAU,CAAC;CAC7B;AAED,UAAU,UAAU;IAClB,QAAQ,CAAC,EAAE,QAAQ,GAAG,QAAQ,EAAE,CAAC;IACjC,UAAU,CAAC,EAAE,UAAU,GAAG,UAAU,EAAE,CAAC;IACvC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,UAAU,CAAC;IACjB,MAAM,EAAE,WAAW,CAAC;CACrB;AAeD,MAAM,MAAM,cAAc,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;AAE5E,qBAAa,WAAW;IACtB,OAAO,CAAC,KAAK,CAAiC;IAC9C,OAAO,CAAC,WAAW,CAAmC;IACtD,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,cAAc,CAA+B;IAErD;;;;;;;;;OASG;gBACS,IAAI,GAAE;QAChB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,KAAK,CAAC,EAAE,WAAW,EAAE,CAAC;QACtB,cAAc,CAAC,EAAE,cAAc,CAAC;KAC5B;IAYN,uEAAuE;IACvE,iBAAiB,CAAC,EAAE,EAAE,cAAc,GAAG,IAAI,GAAG,IAAI;IAIlD;;OAEG;IACH,OAAO,CAAC,IAAI;IAgBZ;;;OAGG;IACH,eAAe,IAAI,IAAI;IAyBvB;;OAEG;IACH,gBAAgB,IAAI,IAAI;IAQxB,OAAO,CAAC,qBAAqB;IAW7B,OAAO,CAAC,OAAO;IAgBf,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,aAAa;IAoBxC,uCAAuC;IACvC,QAAQ,IAAI,WAAW,EAAE;CAG1B"}
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AgentRouter — matches classifier output against a YAML routing table and
|
|
3
|
+
* decides whether to route to an agent, a skill, or let the default flow
|
|
4
|
+
* continue.
|
|
5
|
+
*
|
|
6
|
+
* Deliberately independent from RuleEngine:
|
|
7
|
+
* - RuleEngine handles governance decisions (block/warn/confirm) on tool use
|
|
8
|
+
* - AgentRouter handles intent-to-agent/skill routing at UserPromptSubmit
|
|
9
|
+
*
|
|
10
|
+
* Both share the Convention-YAML ethos but have different context shapes and
|
|
11
|
+
* action semantics, so coupling them through RuleEngine would leak types.
|
|
12
|
+
*
|
|
13
|
+
* Routing YAML format (engine/conventions/routing.yaml):
|
|
14
|
+
*
|
|
15
|
+
* schemaVersion: "1.0"
|
|
16
|
+
* rules:
|
|
17
|
+
* - when: { taskType: build_system }
|
|
18
|
+
* action: { type: route_to_agent, name: full-system-builder }
|
|
19
|
+
* - when: { taskType: add_feature, complexity: [moderate, complex] }
|
|
20
|
+
* action: { type: route_to_agent, name: feature-developer }
|
|
21
|
+
* - when: { default: true }
|
|
22
|
+
* action: { type: route_to_skill, strategy: best_match }
|
|
23
|
+
*/
|
|
24
|
+
import fs from 'node:fs';
|
|
25
|
+
import path from 'node:path';
|
|
26
|
+
import { homedir } from 'node:os';
|
|
27
|
+
import { fileURLToPath } from 'node:url';
|
|
28
|
+
import yaml from 'js-yaml';
|
|
29
|
+
import { logger } from '../core/utils/logger.js';
|
|
30
|
+
// -- Defaults (hardcoded fallback for when YAML is missing/broken) --
|
|
31
|
+
const FALLBACK_RULES = [
|
|
32
|
+
{ when: { default: true }, action: { type: 'route_to_skill', strategy: 'best_match' } },
|
|
33
|
+
];
|
|
34
|
+
export class AgentRouter {
|
|
35
|
+
rules = FALLBACK_RULES;
|
|
36
|
+
sourceLabel = 'fallback';
|
|
37
|
+
userPath;
|
|
38
|
+
defaultPath;
|
|
39
|
+
watcher = null;
|
|
40
|
+
isRuleDisabled = null;
|
|
41
|
+
/**
|
|
42
|
+
* Load routing rules from:
|
|
43
|
+
* 1. Inline rules (if provided) — skips disk load, used by ExperimentRouter
|
|
44
|
+
* 2. User override: ~/.claude-forge/routing.yaml
|
|
45
|
+
* 3. Default: engine/conventions/routing.yaml (shipped)
|
|
46
|
+
* 4. Fallback: FALLBACK_RULES (always route to skill)
|
|
47
|
+
*
|
|
48
|
+
* If `isRuleDisabled` is provided, decide() will skip any rule whose
|
|
49
|
+
* (taskType, agent) pair is currently flagged disabled.
|
|
50
|
+
*/
|
|
51
|
+
constructor(opts = {}) {
|
|
52
|
+
this.userPath = opts.userPath ?? path.join(homedir(), '.claude-forge', 'routing.yaml');
|
|
53
|
+
this.defaultPath = opts.defaultPath ?? this.resolveShippedDefault();
|
|
54
|
+
this.isRuleDisabled = opts.isRuleDisabled ?? null;
|
|
55
|
+
if (opts.rules && opts.rules.length > 0) {
|
|
56
|
+
this.rules = opts.rules.filter(isValidRule);
|
|
57
|
+
this.sourceLabel = 'yaml';
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
this.load();
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/** Allow late binding (used by ExperimentRouter per-group routers). */
|
|
64
|
+
setIsRuleDisabled(fn) {
|
|
65
|
+
this.isRuleDisabled = fn;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* (Re)load routing rules from disk. Called by constructor and hot-reload watcher.
|
|
69
|
+
*/
|
|
70
|
+
load() {
|
|
71
|
+
const loaded = this.tryLoad(this.userPath, 'user override') ??
|
|
72
|
+
this.tryLoad(this.defaultPath, 'shipped default');
|
|
73
|
+
if (loaded && loaded.length > 0) {
|
|
74
|
+
this.rules = loaded;
|
|
75
|
+
this.sourceLabel = 'yaml';
|
|
76
|
+
logger.info(`[AgentRouter] Loaded ${loaded.length} routing rule(s)`);
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
this.rules = FALLBACK_RULES;
|
|
80
|
+
this.sourceLabel = 'fallback';
|
|
81
|
+
logger.warn('[AgentRouter] No routing YAML found, using fallback');
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Enable hot-reload: watch user override file for changes and auto-reload.
|
|
86
|
+
* Safe to call multiple times (idempotent).
|
|
87
|
+
*/
|
|
88
|
+
enableHotReload() {
|
|
89
|
+
if (this.watcher)
|
|
90
|
+
return; // already watching
|
|
91
|
+
const watchPath = this.userPath;
|
|
92
|
+
const watchDir = path.dirname(watchPath);
|
|
93
|
+
// Watch the directory (not the file) to catch create/delete/rename
|
|
94
|
+
if (!fs.existsSync(watchDir)) {
|
|
95
|
+
logger.debug(`[AgentRouter] Hot-reload skipped: ${watchDir} does not exist`);
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
try {
|
|
99
|
+
this.watcher = fs.watch(watchDir, (eventType, filename) => {
|
|
100
|
+
if (filename === path.basename(watchPath)) {
|
|
101
|
+
logger.info(`[AgentRouter] Detected change in ${watchPath}, reloading...`);
|
|
102
|
+
this.load();
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
logger.info(`[AgentRouter] Hot-reload enabled for ${watchPath}`);
|
|
106
|
+
}
|
|
107
|
+
catch (err) {
|
|
108
|
+
logger.warn(`[AgentRouter] Failed to enable hot-reload: ${err}`);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Disable hot-reload watcher (cleanup on daemon shutdown).
|
|
113
|
+
*/
|
|
114
|
+
disableHotReload() {
|
|
115
|
+
if (this.watcher) {
|
|
116
|
+
this.watcher.close();
|
|
117
|
+
this.watcher = null;
|
|
118
|
+
logger.info('[AgentRouter] Hot-reload disabled');
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
resolveShippedDefault() {
|
|
122
|
+
// When running from dist/, __filename resolves into dist/engine/.
|
|
123
|
+
// The conventions dir is sibling to this file in both dev and build layouts.
|
|
124
|
+
try {
|
|
125
|
+
const here = fileURLToPath(import.meta.url);
|
|
126
|
+
return path.join(path.dirname(here), 'conventions', 'routing.yaml');
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
return path.resolve(process.cwd(), 'src/engine/conventions/routing.yaml');
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
tryLoad(filePath, label) {
|
|
133
|
+
if (!fs.existsSync(filePath))
|
|
134
|
+
return null;
|
|
135
|
+
try {
|
|
136
|
+
const raw = fs.readFileSync(filePath, 'utf-8');
|
|
137
|
+
const parsed = yaml.load(raw);
|
|
138
|
+
if (!parsed || !Array.isArray(parsed.rules) || parsed.rules.length === 0) {
|
|
139
|
+
logger.warn(`[AgentRouter] ${label} has no rules: ${filePath}`);
|
|
140
|
+
return null;
|
|
141
|
+
}
|
|
142
|
+
return parsed.rules.filter(isValidRule);
|
|
143
|
+
}
|
|
144
|
+
catch (err) {
|
|
145
|
+
logger.warn(`[AgentRouter] Failed to parse ${label} (${filePath}): ${err}`);
|
|
146
|
+
return null;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
decide(input) {
|
|
150
|
+
for (let i = 0; i < this.rules.length; i++) {
|
|
151
|
+
const rule = this.rules[i];
|
|
152
|
+
if (!matchWhen(rule.when, input))
|
|
153
|
+
continue;
|
|
154
|
+
if (this.isRuleDisabled && rule.action.type === 'route_to_agent') {
|
|
155
|
+
if (this.isRuleDisabled(input.taskType, rule.action.name))
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
return {
|
|
159
|
+
action: rule.action,
|
|
160
|
+
matchedRuleIndex: i,
|
|
161
|
+
source: this.sourceLabel,
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
return {
|
|
165
|
+
action: { type: 'none' },
|
|
166
|
+
matchedRuleIndex: null,
|
|
167
|
+
source: this.sourceLabel,
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
/** Exposed for Web UI "路由调优" panel. */
|
|
171
|
+
getRules() {
|
|
172
|
+
return this.rules.slice();
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
// -- Helpers --
|
|
176
|
+
function matchWhen(when, input) {
|
|
177
|
+
if (when.default === true)
|
|
178
|
+
return true;
|
|
179
|
+
if (when.taskType !== undefined) {
|
|
180
|
+
const expected = Array.isArray(when.taskType) ? when.taskType : [when.taskType];
|
|
181
|
+
if (!expected.includes(input.taskType))
|
|
182
|
+
return false;
|
|
183
|
+
}
|
|
184
|
+
if (when.complexity !== undefined) {
|
|
185
|
+
const expected = Array.isArray(when.complexity)
|
|
186
|
+
? when.complexity
|
|
187
|
+
: [when.complexity];
|
|
188
|
+
if (!expected.includes(input.complexity))
|
|
189
|
+
return false;
|
|
190
|
+
}
|
|
191
|
+
return true;
|
|
192
|
+
}
|
|
193
|
+
function isValidRule(r) {
|
|
194
|
+
if (!r || typeof r !== 'object')
|
|
195
|
+
return false;
|
|
196
|
+
const rule = r;
|
|
197
|
+
if (!rule.when || typeof rule.when !== 'object')
|
|
198
|
+
return false;
|
|
199
|
+
if (!rule.action || typeof rule.action !== 'object')
|
|
200
|
+
return false;
|
|
201
|
+
const type = rule.action.type;
|
|
202
|
+
return (type === 'route_to_agent' ||
|
|
203
|
+
type === 'route_to_skill' ||
|
|
204
|
+
type === 'none');
|
|
205
|
+
}
|
|
206
|
+
//# sourceMappingURL=agent-router.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-router.js","sourceRoot":"","sources":["../../src/engine/agent-router.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# Claude Forge — Default Agent Routing Rules
|
|
2
|
+
# Schema version 1.0
|
|
3
|
+
#
|
|
4
|
+
# Evaluated top-down, first match wins. User override at
|
|
5
|
+
# ~/.claude-forge/routing.yaml can replace this entire rule set.
|
|
6
|
+
#
|
|
7
|
+
# Phase 1 ships planner + coder only; remaining agents wire in during Phase 2.
|
|
8
|
+
|
|
9
|
+
schemaVersion: "1.0"
|
|
10
|
+
rules:
|
|
11
|
+
# -- Phase 1 core agents ---------------------------------------------------
|
|
12
|
+
|
|
13
|
+
- when:
|
|
14
|
+
taskType: analyze_requirement
|
|
15
|
+
action: { type: route_to_agent, name: planner }
|
|
16
|
+
- when:
|
|
17
|
+
taskType: design_architecture
|
|
18
|
+
action: { type: route_to_agent, name: planner }
|
|
19
|
+
- when:
|
|
20
|
+
taskType: design_api
|
|
21
|
+
action: { type: route_to_agent, name: planner }
|
|
22
|
+
- when:
|
|
23
|
+
taskType: design_schema
|
|
24
|
+
action: { type: route_to_agent, name: planner }
|
|
25
|
+
|
|
26
|
+
- when:
|
|
27
|
+
taskType: write_code
|
|
28
|
+
action: { type: route_to_agent, name: coder }
|
|
29
|
+
- when:
|
|
30
|
+
taskType: optimize_perf
|
|
31
|
+
action: { type: route_to_agent, name: coder }
|
|
32
|
+
|
|
33
|
+
# -- Phase 2 agents (now enabled) ------------------------------------------
|
|
34
|
+
|
|
35
|
+
- when:
|
|
36
|
+
taskType: build_system
|
|
37
|
+
action: { type: route_to_agent, name: full-system-builder }
|
|
38
|
+
- when:
|
|
39
|
+
taskType: add_feature
|
|
40
|
+
complexity: [moderate, complex]
|
|
41
|
+
action: { type: route_to_agent, name: feature-developer }
|
|
42
|
+
- when:
|
|
43
|
+
taskType: refactor
|
|
44
|
+
complexity: complex
|
|
45
|
+
action: { type: route_to_agent, name: refactor-specialist }
|
|
46
|
+
- when:
|
|
47
|
+
taskType: migrate
|
|
48
|
+
action: { type: route_to_agent, name: migration-planner }
|
|
49
|
+
- when:
|
|
50
|
+
taskType: write_test
|
|
51
|
+
action: { type: route_to_agent, name: tester }
|
|
52
|
+
- when:
|
|
53
|
+
taskType: review
|
|
54
|
+
action: { type: route_to_agent, name: reviewer }
|
|
55
|
+
- when:
|
|
56
|
+
taskType: audit_security
|
|
57
|
+
action: { type: route_to_agent, name: reviewer }
|
|
58
|
+
- when:
|
|
59
|
+
taskType: research
|
|
60
|
+
action: { type: route_to_agent, name: researcher }
|
|
61
|
+
- when:
|
|
62
|
+
taskType: write_spec
|
|
63
|
+
action: { type: route_to_agent, name: spec-writer }
|
|
64
|
+
- when:
|
|
65
|
+
taskType: review_doc
|
|
66
|
+
action: { type: route_to_agent, name: doc-reviewer }
|
|
67
|
+
- when:
|
|
68
|
+
taskType: create_pr
|
|
69
|
+
action: { type: route_to_agent, name: pr-creator }
|
|
70
|
+
|
|
71
|
+
# -- Fallback --------------------------------------------------------------
|
|
72
|
+
|
|
73
|
+
- when: { default: true }
|
|
74
|
+
action: { type: route_to_skill, strategy: best_match }
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evidence-store.d.ts","sourceRoot":"","sources":["../../src/engine/evidence-store.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEpE,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,KAAK,EAAE,SAAS,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,2EAA2E;AAC3E,MAAM,WAAW,mBAAmB;IAClC,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAClE,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,kBAAkB,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrH,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACpE;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAuC;IACrD,OAAO,CAAC,SAAS,CAA4C;IAC7D,OAAO,CAAC,KAAK,CAAwC;IACrD,OAAO,CAAC,WAAW,CAAC,CAAsB;gBAE9B,WAAW,CAAC,EAAE,mBAAmB;IAI7C,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,IAAI;IAkBtD,cAAc,CACZ,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,kBAAkB,EAC5B,KAAK,EAAE,SAAS,EAChB,UAAU,CAAC,EAAE,MAAM,GAClB,IAAI;
|
|
1
|
+
{"version":3,"file":"evidence-store.d.ts","sourceRoot":"","sources":["../../src/engine/evidence-store.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEpE,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,KAAK,EAAE,SAAS,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,2EAA2E;AAC3E,MAAM,WAAW,mBAAmB;IAClC,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAClE,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,kBAAkB,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrH,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACpE;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAuC;IACrD,OAAO,CAAC,SAAS,CAA4C;IAC7D,OAAO,CAAC,KAAK,CAAwC;IACrD,OAAO,CAAC,WAAW,CAAC,CAAsB;gBAE9B,WAAW,CAAC,EAAE,mBAAmB;IAI7C,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,IAAI;IAkBtD,cAAc,CACZ,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,kBAAkB,EAC5B,KAAK,EAAE,SAAS,EAChB,UAAU,CAAC,EAAE,MAAM,GAClB,IAAI;IA+BP,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,EAAE;IAIzC,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,EAAE;IAKxD,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,EAAE;IAIjD,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY;IAIzC,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAMrC,OAAO,CAAC,WAAW;IAmBnB,OAAO,CAAC,gBAAgB;CAazB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evidence-store.js","sourceRoot":"","sources":["../../src/engine/evidence-store.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"evidence-store.js","sourceRoot":"","sources":["../../src/engine/evidence-store.ts"],"names":[],"mappings":"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"}
|