@haoyiyin/workflow 0.2.11 → 0.3.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.
Files changed (164) hide show
  1. package/dist/src/agents/contracts/implementer.d.ts +29 -0
  2. package/dist/src/agents/contracts/implementer.d.ts.map +1 -0
  3. package/dist/src/agents/contracts/implementer.js +94 -0
  4. package/dist/src/agents/contracts/implementer.js.map +1 -0
  5. package/dist/src/agents/contracts/index.d.ts +11 -0
  6. package/dist/src/agents/contracts/index.d.ts.map +1 -0
  7. package/dist/src/agents/contracts/index.js +11 -0
  8. package/dist/src/agents/contracts/index.js.map +1 -0
  9. package/dist/src/agents/contracts/planner.d.ts +25 -0
  10. package/dist/src/agents/contracts/planner.d.ts.map +1 -0
  11. package/dist/src/agents/contracts/planner.js +107 -0
  12. package/dist/src/agents/contracts/planner.js.map +1 -0
  13. package/dist/src/agents/contracts/router.d.ts +24 -0
  14. package/dist/src/agents/contracts/router.d.ts.map +1 -0
  15. package/dist/src/agents/contracts/router.js +137 -0
  16. package/dist/src/agents/contracts/router.js.map +1 -0
  17. package/dist/src/agents/contracts/verifier.d.ts +27 -0
  18. package/dist/src/agents/contracts/verifier.d.ts.map +1 -0
  19. package/dist/src/agents/contracts/verifier.js +115 -0
  20. package/dist/src/agents/contracts/verifier.js.map +1 -0
  21. package/dist/src/agents/dispatcher.d.ts +94 -51
  22. package/dist/src/agents/dispatcher.d.ts.map +1 -1
  23. package/dist/src/agents/dispatcher.js +207 -164
  24. package/dist/src/agents/dispatcher.js.map +1 -1
  25. package/dist/src/persistence/index.d.ts +4 -2
  26. package/dist/src/persistence/index.d.ts.map +1 -1
  27. package/dist/src/persistence/index.js +4 -1
  28. package/dist/src/persistence/index.js.map +1 -1
  29. package/dist/src/persistence/plan-md.d.ts +3 -2
  30. package/dist/src/persistence/plan-md.d.ts.map +1 -1
  31. package/dist/src/persistence/plan-md.js +47 -15
  32. package/dist/src/persistence/plan-md.js.map +1 -1
  33. package/dist/src/persistence/state-md.d.ts +2 -0
  34. package/dist/src/persistence/state-md.d.ts.map +1 -1
  35. package/dist/src/persistence/state-md.js +40 -22
  36. package/dist/src/persistence/state-md.js.map +1 -1
  37. package/dist/src/persistence/types.d.ts +35 -39
  38. package/dist/src/persistence/types.d.ts.map +1 -1
  39. package/dist/src/router/namespace/core/intent-router.d.ts +24 -0
  40. package/dist/src/router/namespace/core/intent-router.d.ts.map +1 -0
  41. package/dist/src/router/namespace/core/intent-router.js +190 -0
  42. package/dist/src/router/namespace/core/intent-router.js.map +1 -0
  43. package/dist/src/router/namespace/core/lifecycle-router.d.ts +28 -0
  44. package/dist/src/router/namespace/core/lifecycle-router.d.ts.map +1 -0
  45. package/dist/src/router/namespace/core/lifecycle-router.js +132 -0
  46. package/dist/src/router/namespace/core/lifecycle-router.js.map +1 -0
  47. package/dist/src/router/namespace/core/state-router.d.ts +32 -0
  48. package/dist/src/router/namespace/core/state-router.d.ts.map +1 -0
  49. package/dist/src/router/namespace/core/state-router.js +157 -0
  50. package/dist/src/router/namespace/core/state-router.js.map +1 -0
  51. package/dist/src/router/namespace/domain/code-router.d.ts +26 -0
  52. package/dist/src/router/namespace/domain/code-router.d.ts.map +1 -0
  53. package/dist/src/router/namespace/domain/code-router.js +171 -0
  54. package/dist/src/router/namespace/domain/code-router.js.map +1 -0
  55. package/dist/src/router/namespace/domain/debug-router.d.ts +25 -0
  56. package/dist/src/router/namespace/domain/debug-router.d.ts.map +1 -0
  57. package/dist/src/router/namespace/domain/debug-router.js +139 -0
  58. package/dist/src/router/namespace/domain/debug-router.js.map +1 -0
  59. package/dist/src/router/namespace/domain/plan-router.d.ts +29 -0
  60. package/dist/src/router/namespace/domain/plan-router.d.ts.map +1 -0
  61. package/dist/src/router/namespace/domain/plan-router.js +160 -0
  62. package/dist/src/router/namespace/domain/plan-router.js.map +1 -0
  63. package/dist/src/router/namespace/domain/review-router.d.ts +24 -0
  64. package/dist/src/router/namespace/domain/review-router.d.ts.map +1 -0
  65. package/dist/src/router/namespace/domain/review-router.js +116 -0
  66. package/dist/src/router/namespace/domain/review-router.js.map +1 -0
  67. package/dist/src/router/namespace/index.d.ts +19 -0
  68. package/dist/src/router/namespace/index.d.ts.map +1 -0
  69. package/dist/src/router/namespace/index.js +22 -0
  70. package/dist/src/router/namespace/index.js.map +1 -0
  71. package/dist/src/router/namespace/registry.d.ts +67 -0
  72. package/dist/src/router/namespace/registry.d.ts.map +1 -0
  73. package/dist/src/router/namespace/registry.js +197 -0
  74. package/dist/src/router/namespace/registry.js.map +1 -0
  75. package/dist/src/router/namespace/types.d.ts +124 -0
  76. package/dist/src/router/namespace/types.d.ts.map +1 -0
  77. package/dist/src/router/namespace/types.js +20 -0
  78. package/dist/src/router/namespace/types.js.map +1 -0
  79. package/dist/src/router/namespace/utility/fallback-router.d.ts +28 -0
  80. package/dist/src/router/namespace/utility/fallback-router.d.ts.map +1 -0
  81. package/dist/src/router/namespace/utility/fallback-router.js +88 -0
  82. package/dist/src/router/namespace/utility/fallback-router.js.map +1 -0
  83. package/dist/src/router/namespace/utility/quick-task-router.d.ts +28 -0
  84. package/dist/src/router/namespace/utility/quick-task-router.d.ts.map +1 -0
  85. package/dist/src/router/namespace/utility/quick-task-router.js +99 -0
  86. package/dist/src/router/namespace/utility/quick-task-router.js.map +1 -0
  87. package/dist/src/router/namespace/utility/research-router.d.ts +24 -0
  88. package/dist/src/router/namespace/utility/research-router.d.ts.map +1 -0
  89. package/dist/src/router/namespace/utility/research-router.js +84 -0
  90. package/dist/src/router/namespace/utility/research-router.js.map +1 -0
  91. package/dist/src/skills/agents-md/index.js +2 -2
  92. package/dist/src/skills/agents-md/index.js.map +1 -1
  93. package/dist/src/skills/execute-plan/index.d.ts +45 -65
  94. package/dist/src/skills/execute-plan/index.d.ts.map +1 -1
  95. package/dist/src/skills/execute-plan/index.js +325 -551
  96. package/dist/src/skills/execute-plan/index.js.map +1 -1
  97. package/dist/src/skills/index.d.ts +1 -0
  98. package/dist/src/skills/index.d.ts.map +1 -1
  99. package/dist/src/skills/index.js +1 -0
  100. package/dist/src/skills/index.js.map +1 -1
  101. package/dist/src/skills/quick-task/index.d.ts +4 -4
  102. package/dist/src/skills/quick-task/index.js +1 -1
  103. package/dist/src/skills/quick-task/index.js.map +1 -1
  104. package/dist/src/skills/review-diff/index.d.ts +6 -6
  105. package/dist/src/skills/review-diff/index.js +1 -1
  106. package/dist/src/skills/review-diff/index.js.map +1 -1
  107. package/dist/src/skills/router/index.d.ts +101 -0
  108. package/dist/src/skills/router/index.d.ts.map +1 -0
  109. package/dist/src/skills/router/index.js +450 -0
  110. package/dist/src/skills/router/index.js.map +1 -0
  111. package/dist/src/skills/router/types.d.ts +79 -0
  112. package/dist/src/skills/router/types.d.ts.map +1 -0
  113. package/dist/src/skills/router/types.js +8 -0
  114. package/dist/src/skills/router/types.js.map +1 -0
  115. package/dist/src/skills/systematic-debugging/index.js +1 -1
  116. package/dist/src/skills/systematic-debugging/index.js.map +1 -1
  117. package/dist/src/skills/tdd/index.d.ts +14 -14
  118. package/dist/src/skills/tdd/index.js +1 -1
  119. package/dist/src/skills/tdd/index.js.map +1 -1
  120. package/dist/src/skills/to-plan/index-enhanced.d.ts +4 -4
  121. package/dist/src/skills/to-plan/index-enhanced.d.ts.map +1 -1
  122. package/dist/src/skills/to-plan/index-enhanced.js +3 -5
  123. package/dist/src/skills/to-plan/index-enhanced.js.map +1 -1
  124. package/dist/src/skills/to-plan/index.d.ts +24 -91
  125. package/dist/src/skills/to-plan/index.d.ts.map +1 -1
  126. package/dist/src/skills/to-plan/index.js +214 -409
  127. package/dist/src/skills/to-plan/index.js.map +1 -1
  128. package/package.json +3 -5
  129. package/src/agents/contracts/implementer.ts +122 -0
  130. package/src/agents/contracts/index.ts +27 -0
  131. package/src/agents/contracts/planner.ts +129 -0
  132. package/src/agents/contracts/router.ts +168 -0
  133. package/src/agents/contracts/verifier.ts +137 -0
  134. package/src/agents/dispatcher.ts +387 -362
  135. package/src/persistence/index.ts +10 -4
  136. package/src/persistence/plan-md.ts +52 -18
  137. package/src/persistence/state-md.ts +45 -23
  138. package/src/persistence/types.ts +37 -40
  139. package/src/router/namespace/README.md +127 -0
  140. package/src/router/namespace/core/intent-router.ts +221 -0
  141. package/src/router/namespace/core/lifecycle-router.ts +156 -0
  142. package/src/router/namespace/core/state-router.ts +192 -0
  143. package/src/router/namespace/domain/code-router.ts +202 -0
  144. package/src/router/namespace/domain/debug-router.ts +167 -0
  145. package/src/router/namespace/domain/plan-router.ts +196 -0
  146. package/src/router/namespace/domain/review-router.ts +142 -0
  147. package/src/router/namespace/index.ts +84 -0
  148. package/src/router/namespace/registry.ts +242 -0
  149. package/src/router/namespace/types.ts +182 -0
  150. package/src/router/namespace/utility/fallback-router.ts +107 -0
  151. package/src/router/namespace/utility/quick-task-router.ts +121 -0
  152. package/src/router/namespace/utility/research-router.ts +105 -0
  153. package/src/skills/agents-md/index.ts +2 -2
  154. package/src/skills/execute-plan/index.ts +419 -673
  155. package/src/skills/index.ts +1 -0
  156. package/src/skills/quick-task/index.ts +1 -1
  157. package/src/skills/review-diff/index.ts +1 -1
  158. package/src/skills/router/SKILL.md +181 -0
  159. package/src/skills/router/index.ts +577 -0
  160. package/src/skills/router/types.ts +90 -0
  161. package/src/skills/systematic-debugging/index.ts +1 -1
  162. package/src/skills/tdd/index.ts +1 -1
  163. package/src/skills/to-plan/index-enhanced.ts +3 -5
  164. package/src/skills/to-plan/index.ts +231 -502
@@ -0,0 +1,202 @@
1
+ /**
2
+ * Code Router - Domain Layer
3
+ *
4
+ * 处理代码相关的复杂路由决策
5
+ * 包括:代码编写、重构、测试、审查
6
+ */
7
+
8
+ import type {
9
+ NamespaceRouter,
10
+ RoutingContext,
11
+ RouteDecision,
12
+ NamespaceHealth,
13
+ AlternativeRoute,
14
+ } from '../types.js'
15
+
16
+ export class CodeRouter implements NamespaceRouter {
17
+ readonly name = 'code'
18
+ readonly layer = 'domain' as const
19
+ readonly priority = 65
20
+ readonly patterns = [
21
+ /code|代码/i,
22
+ /implement|实现/i,
23
+ /refactor|重构/i,
24
+ /write|写/i,
25
+ /function|函数|method|方法/i,
26
+ /class|类/i,
27
+ /component|组件/i,
28
+ ]
29
+
30
+ private routeCount = 0
31
+ private successCount = 0
32
+ private totalLatency = 0
33
+
34
+ async canRoute(context: RoutingContext): Promise<boolean> {
35
+ const text = context.request.text.toLowerCase()
36
+ return /code|代码|implement|实现|refactor|重构|write|写|function|函数|class|类|component|组件/.test(text)
37
+ }
38
+
39
+ async route(context: RoutingContext): Promise<RouteDecision> {
40
+ const startTime = Date.now()
41
+ const { state, request } = context
42
+
43
+ const decision = this.makeCodeDecision(state, request.text)
44
+
45
+ this.routeCount++
46
+ this.totalLatency += Date.now() - startTime
47
+ this.successCount++
48
+
49
+ return {
50
+ ...decision,
51
+ namespace: this.name,
52
+ metadata: {
53
+ layer: this.layer,
54
+ processingTime: Date.now() - startTime,
55
+ hops: 1,
56
+ },
57
+ }
58
+ }
59
+
60
+ private makeCodeDecision(
61
+ state: RoutingContext['state'],
62
+ requestText: string
63
+ ): Omit<RouteDecision, 'namespace' | 'metadata'> {
64
+ // 场景1: 编写测试
65
+ if (/test|测试|tdd|spec/i.test(requestText)) {
66
+ return {
67
+ skill: 'tdd',
68
+ confidence: 0.85,
69
+ reasoning: 'Code domain: test-related request',
70
+ alternatives: [
71
+ { skill: 'quick-task', confidence: 0.3, reasoning: 'Quick test fix' },
72
+ ],
73
+ }
74
+ }
75
+
76
+ // 场景2: 重构代码
77
+ if (/refactor|重构|restructure|重组/i.test(requestText)) {
78
+ return {
79
+ skill: 'to-plan',
80
+ confidence: 0.8,
81
+ reasoning: 'Refactoring requires careful planning',
82
+ alternatives: [
83
+ { skill: 'review-diff', confidence: 0.4, reasoning: 'Review after refactor' },
84
+ ],
85
+ }
86
+ }
87
+
88
+ // 场景3: 修复代码错误
89
+ if (/fix.*code|修复.*代码|bug|fix.*error/i.test(requestText)) {
90
+ if (state.phase === 'executing') {
91
+ return {
92
+ skill: 'systematic-debugging',
93
+ confidence: 0.85,
94
+ reasoning: 'Code bug fix during execution',
95
+ alternatives: [
96
+ { skill: 'quick-task', confidence: 0.5, reasoning: 'Simple fix' },
97
+ ],
98
+ }
99
+ }
100
+ return {
101
+ skill: 'systematic-debugging',
102
+ confidence: 0.75,
103
+ reasoning: 'Code domain: debugging required',
104
+ alternatives: [
105
+ { skill: 'quick-task', confidence: 0.4, reasoning: 'Quick fix attempt' },
106
+ ],
107
+ }
108
+ }
109
+
110
+ // 场景4: 新功能实现
111
+ if (/implement|实现|add.*feature|添加.*功能/i.test(requestText)) {
112
+ if (state.phase === 'executing') {
113
+ return {
114
+ skill: 'execute-plan',
115
+ confidence: 0.8,
116
+ reasoning: 'Code implementation during execution phase',
117
+ alternatives: [
118
+ { skill: 'tdd', confidence: 0.5, reasoning: 'Test-driven approach' },
119
+ ],
120
+ }
121
+ }
122
+
123
+ // 复杂实现需要计划
124
+ if (this.isComplexImplementation(requestText)) {
125
+ return {
126
+ skill: 'to-plan',
127
+ confidence: 0.75,
128
+ reasoning: 'Complex code implementation requires planning',
129
+ alternatives: [
130
+ { skill: 'tdd', confidence: 0.4, reasoning: 'TDD approach' },
131
+ ],
132
+ }
133
+ }
134
+
135
+ // 简单实现
136
+ return {
137
+ skill: 'quick-task',
138
+ confidence: 0.7,
139
+ reasoning: 'Simple code implementation',
140
+ alternatives: [
141
+ { skill: 'tdd', confidence: 0.5, reasoning: 'With tests' },
142
+ ],
143
+ }
144
+ }
145
+
146
+ // 场景5: 代码审查
147
+ if (/review.*code|审查.*代码|check.*code/i.test(requestText)) {
148
+ return {
149
+ skill: 'review-diff',
150
+ confidence: 0.85,
151
+ reasoning: 'Code review requested',
152
+ alternatives: [
153
+ { skill: 'quick-task', confidence: 0.2, reasoning: 'Self-review' },
154
+ ],
155
+ }
156
+ }
157
+
158
+ // 默认
159
+ return {
160
+ skill: 'quick-task',
161
+ confidence: 0.4,
162
+ reasoning: 'Code domain: default to quick-task',
163
+ alternatives: [
164
+ { skill: 'tdd', confidence: 0.3, reasoning: 'With tests' },
165
+ ],
166
+ }
167
+ }
168
+
169
+ private isComplexImplementation(request: string): boolean {
170
+ const complexityMarkers = [
171
+ /multiple|多个/i,
172
+ /steps?|步骤/i,
173
+ /integration|集成/i,
174
+ /api|interface/i,
175
+ /database|数据库/i,
176
+ /state|状态/i,
177
+ ]
178
+
179
+ return complexityMarkers.filter((p) => p.test(request)).length >= 2
180
+ }
181
+
182
+ getSupportedSkills(): string[] {
183
+ return ['tdd', 'to-plan', 'execute-plan', 'systematic-debugging', 'quick-task', 'review-diff']
184
+ }
185
+
186
+ getHealth(): NamespaceHealth {
187
+ return {
188
+ name: this.name,
189
+ status: this.successRate() > 0.75 ? 'healthy' : 'degraded',
190
+ totalRoutes: this.routeCount,
191
+ successRate: this.successRate(),
192
+ avgLatency: this.routeCount > 0 ? this.totalLatency / this.routeCount : 0,
193
+ }
194
+ }
195
+
196
+ private successRate(): number {
197
+ return this.routeCount > 0 ? this.successCount / this.routeCount : 1.0
198
+ }
199
+ }
200
+
201
+ export const codeRouter = new CodeRouter()
202
+ export default codeRouter
@@ -0,0 +1,167 @@
1
+ /**
2
+ * Debug Router - Domain Layer
3
+ *
4
+ * 处理调试相关的复杂路由决策
5
+ */
6
+
7
+ import type {
8
+ NamespaceRouter,
9
+ RoutingContext,
10
+ RouteDecision,
11
+ NamespaceHealth,
12
+ AlternativeRoute,
13
+ } from '../types.js'
14
+
15
+ export class DebugRouter implements NamespaceRouter {
16
+ readonly name = 'debug'
17
+ readonly layer = 'domain' as const
18
+ readonly priority = 70
19
+ readonly patterns = [
20
+ /debug|调试/i,
21
+ /bug|错误|故障/i,
22
+ /error|异常/i,
23
+ /crash|崩溃/i,
24
+ /broken|损坏/i,
25
+ /not working|不工作/i,
26
+ /fail|失败/i,
27
+ /issue|问题/i,
28
+ ]
29
+
30
+ private routeCount = 0
31
+ private successCount = 0
32
+ private totalLatency = 0
33
+
34
+ async canRoute(context: RoutingContext): Promise<boolean> {
35
+ const text = context.request.text.toLowerCase()
36
+ return /debug|调试|bug|错误|error|异常|crash|崩溃|fail|失败|issue|问题|not working|不工作/.test(text)
37
+ }
38
+
39
+ async route(context: RoutingContext): Promise<RouteDecision> {
40
+ const startTime = Date.now()
41
+ const { state, request } = context
42
+
43
+ const decision = this.makeDebugDecision(state, request.text)
44
+
45
+ this.routeCount++
46
+ this.totalLatency += Date.now() - startTime
47
+ this.successCount++
48
+
49
+ return {
50
+ ...decision,
51
+ namespace: this.name,
52
+ metadata: {
53
+ layer: this.layer,
54
+ processingTime: Date.now() - startTime,
55
+ hops: 1,
56
+ },
57
+ }
58
+ }
59
+
60
+ private makeDebugDecision(
61
+ state: RoutingContext['state'],
62
+ requestText: string
63
+ ): Omit<RouteDecision, 'namespace' | 'metadata'> {
64
+ const urgency = this.calculateUrgency(requestText)
65
+
66
+ // 场景1: 系统性调试
67
+ if (/systematic|系统|root cause|根本原因|investigate|调查/i.test(requestText)) {
68
+ return {
69
+ skill: 'systematic-debugging',
70
+ confidence: 0.9,
71
+ reasoning: `Systematic debugging approach requested (urgency: ${urgency})`,
72
+ alternatives: [
73
+ { skill: 'quick-task', confidence: 0.2, reasoning: 'Quick fix bypass' },
74
+ ],
75
+ }
76
+ }
77
+
78
+ // 场景2: 严重错误/崩溃
79
+ if (/crash|崩溃|critical|严重|production|生产/i.test(requestText)) {
80
+ return {
81
+ skill: 'systematic-debugging',
82
+ confidence: 0.95,
83
+ reasoning: `Critical issue detected: ${urgency} urgency`,
84
+ alternatives: [
85
+ { skill: 'quick-task', confidence: 0.3, reasoning: 'Emergency fix' },
86
+ ],
87
+ }
88
+ }
89
+
90
+ // 场景3: 测试失败
91
+ if (/test.*fail|测试.*失败|failing test/i.test(requestText)) {
92
+ return {
93
+ skill: 'tdd',
94
+ confidence: 0.8,
95
+ reasoning: 'Test failure: TDD skill can help',
96
+ alternatives: [
97
+ { skill: 'systematic-debugging', confidence: 0.6, reasoning: 'Deep investigation' },
98
+ ],
99
+ }
100
+ }
101
+
102
+ // 场景4: 执行阶段的问题
103
+ if (state.phase === 'executing') {
104
+ return {
105
+ skill: 'systematic-debugging',
106
+ confidence: 0.85,
107
+ reasoning: `Debug during execution phase: ${state.phase}`,
108
+ alternatives: [
109
+ { skill: 'quick-task', confidence: 0.4, reasoning: 'Quick workaround' },
110
+ ],
111
+ }
112
+ }
113
+
114
+ // 场景5: 验证阶段的问题
115
+ if (state.phase === 'verifying') {
116
+ return {
117
+ skill: 'systematic-debugging',
118
+ confidence: 0.85,
119
+ reasoning: 'Debug during verification phase',
120
+ alternatives: [
121
+ { skill: 'review-diff', confidence: 0.4, reasoning: 'Review first' },
122
+ ],
123
+ }
124
+ }
125
+
126
+ // 场景6: 一般性调试
127
+ return {
128
+ skill: 'systematic-debugging',
129
+ confidence: 0.75,
130
+ reasoning: `General debugging request (urgency: ${urgency})`,
131
+ alternatives: [
132
+ { skill: 'quick-task', confidence: 0.5, reasoning: 'Quick fix attempt' },
133
+ { skill: 'review-diff', confidence: 0.3, reasoning: 'Check recent changes' },
134
+ ],
135
+ }
136
+ }
137
+
138
+ private calculateUrgency(request: string): 'high' | 'medium' | 'low' {
139
+ const highUrgency = [/critical|严重|urgent|紧急|production|生产|crash|崩溃|outage|中断/i]
140
+ const mediumUrgency = [/bug|错误|error|异常|issue|问题|fail|失败/i]
141
+
142
+ if (highUrgency.some((p) => p.test(request))) return 'high'
143
+ if (mediumUrgency.some((p) => p.test(request))) return 'medium'
144
+ return 'low'
145
+ }
146
+
147
+ getSupportedSkills(): string[] {
148
+ return ['systematic-debugging', 'quick-task', 'tdd', 'review-diff']
149
+ }
150
+
151
+ getHealth(): NamespaceHealth {
152
+ return {
153
+ name: this.name,
154
+ status: this.successRate() > 0.8 ? 'healthy' : 'degraded',
155
+ totalRoutes: this.routeCount,
156
+ successRate: this.successRate(),
157
+ avgLatency: this.routeCount > 0 ? this.totalLatency / this.routeCount : 0,
158
+ }
159
+ }
160
+
161
+ private successRate(): number {
162
+ return this.routeCount > 0 ? this.successCount / this.routeCount : 1.0
163
+ }
164
+ }
165
+
166
+ export const debugRouter = new DebugRouter()
167
+ export default debugRouter
@@ -0,0 +1,196 @@
1
+ /**
2
+ * Plan Router - Domain Layer
3
+ *
4
+ * 处理计划相关的复杂路由决策
5
+ * 包括:创建计划、执行计划、验证计划
6
+ */
7
+
8
+ import type {
9
+ NamespaceRouter,
10
+ RoutingContext,
11
+ RouteDecision,
12
+ NamespaceHealth,
13
+ AlternativeRoute,
14
+ } from '../types.js'
15
+
16
+ export class PlanRouter implements NamespaceRouter {
17
+ readonly name = 'plan'
18
+ readonly layer = 'domain' as const
19
+ readonly priority = 70
20
+ readonly patterns = [
21
+ /plan|计划/i,
22
+ /wave|波次/i,
23
+ /task|任务/i,
24
+ /milestone|里程碑/i,
25
+ /phase|阶段/i,
26
+ ]
27
+
28
+ private routeCount = 0
29
+ private successCount = 0
30
+ private totalLatency = 0
31
+
32
+ async canRoute(context: RoutingContext): Promise<boolean> {
33
+ // 如果涉及到 plan 相关操作
34
+ const text = context.request.text.toLowerCase()
35
+ return (
36
+ /plan|计划|wave|任务|milestone|阶段/.test(text) ||
37
+ context.plan !== null
38
+ )
39
+ }
40
+
41
+ async route(context: RoutingContext): Promise<RouteDecision> {
42
+ const startTime = Date.now()
43
+ const { state, plan, request } = context
44
+
45
+ const decision = this.makePlanDecision(state, plan, request.text)
46
+
47
+ this.routeCount++
48
+ this.totalLatency += Date.now() - startTime
49
+ this.successCount++
50
+
51
+ return {
52
+ ...decision,
53
+ namespace: this.name,
54
+ metadata: {
55
+ layer: this.layer,
56
+ processingTime: Date.now() - startTime,
57
+ hops: 1,
58
+ },
59
+ }
60
+ }
61
+
62
+ private makePlanDecision(
63
+ state: RoutingContext['state'],
64
+ plan: RoutingContext['plan'],
65
+ requestText: string
66
+ ): Omit<RouteDecision, 'namespace' | 'metadata'> {
67
+ const alternatives: AlternativeRoute[] = []
68
+
69
+ // 场景1: 创建新计划
70
+ if (/create.*plan|new.*plan|开始.*计划|创建.*计划/i.test(requestText)) {
71
+ return {
72
+ skill: 'to-plan',
73
+ confidence: 0.9,
74
+ reasoning: 'User explicitly requested to create a new plan',
75
+ alternatives: [
76
+ { skill: 'research', confidence: 0.3, reasoning: 'If need background research' },
77
+ ],
78
+ }
79
+ }
80
+
81
+ // 场景2: 执行现有计划
82
+ if (plan && /execute.*plan|run.*plan|执行.*计划|运行.*计划/i.test(requestText)) {
83
+ return {
84
+ skill: 'execute-plan',
85
+ confidence: 0.9,
86
+ reasoning: `Execute existing plan with ${plan.tasks?.length || 0} tasks`,
87
+ alternatives: [
88
+ { skill: 'review-diff', confidence: 0.2, reasoning: 'Review before execute' },
89
+ ],
90
+ }
91
+ }
92
+
93
+ // 场景3: 验证计划完成情况
94
+ if (plan && state.phase === 'verifying') {
95
+ const completed = state.completedTasks?.length || 0
96
+ const total = plan.tasks?.length || 0
97
+
98
+ if (completed >= total) {
99
+ return {
100
+ skill: 'review-diff',
101
+ confidence: 0.85,
102
+ reasoning: `Plan complete (${completed}/${total}), verification needed`,
103
+ alternatives: [
104
+ { skill: 'systematic-debugging', confidence: 0.3, reasoning: 'If issues found' },
105
+ ],
106
+ }
107
+ }
108
+ }
109
+
110
+ // 场景4: 计划执行中途
111
+ if (plan && state.phase === 'executing') {
112
+ const completed = state.completedTasks?.length || 0
113
+ const total = plan.tasks?.length || 0
114
+
115
+ return {
116
+ skill: 'execute-plan',
117
+ confidence: 0.85,
118
+ reasoning: `Continue execution: ${completed}/${total} tasks done`,
119
+ alternatives: [
120
+ { skill: 'quick-task', confidence: 0.4, reasoning: 'Quick bypass' },
121
+ ],
122
+ }
123
+ }
124
+
125
+ // 场景5: 修改/更新计划
126
+ if (plan && /update.*plan|modify.*plan|revise|调整.*计划/i.test(requestText)) {
127
+ return {
128
+ skill: 'to-plan',
129
+ confidence: 0.8,
130
+ reasoning: 'Update existing plan based on user request',
131
+ alternatives: [
132
+ { skill: 'execute-plan', confidence: 0.3, reasoning: 'Continue with current plan' },
133
+ ],
134
+ }
135
+ }
136
+
137
+ // 场景6: 无计划但请求复杂
138
+ if (!plan && this.isPlanWorthy(requestText)) {
139
+ return {
140
+ skill: 'to-plan',
141
+ confidence: 0.75,
142
+ reasoning: 'No plan exists, request warrants planning',
143
+ alternatives: [
144
+ { skill: 'quick-task', confidence: 0.4, reasoning: 'Direct approach' },
145
+ { skill: 'research', confidence: 0.3, reasoning: 'Gather info first' },
146
+ ],
147
+ }
148
+ }
149
+
150
+ // 默认
151
+ return {
152
+ skill: 'quick-task',
153
+ confidence: 0.3,
154
+ reasoning: 'Plan domain: no specific plan action matched',
155
+ alternatives: [],
156
+ }
157
+ }
158
+
159
+ /**
160
+ * 判断是否值得创建计划
161
+ */
162
+ private isPlanWorthy(request: string): boolean {
163
+ const indicators = [
164
+ /implement|实现/i,
165
+ /feature|功能/i,
166
+ /refactor|重构/i,
167
+ /migration|迁移/i,
168
+ /upgrade|升级/i,
169
+ /and|和|then|然后.*(add|create|fix|update)/i,
170
+ ]
171
+
172
+ const matches = indicators.filter((p) => p.test(request)).length
173
+ return matches >= 2 || request.length > 120
174
+ }
175
+
176
+ getSupportedSkills(): string[] {
177
+ return ['to-plan', 'execute-plan', 'quick-task', 'review-diff', 'research']
178
+ }
179
+
180
+ getHealth(): NamespaceHealth {
181
+ return {
182
+ name: this.name,
183
+ status: this.successRate() > 0.8 ? 'healthy' : 'degraded',
184
+ totalRoutes: this.routeCount,
185
+ successRate: this.successRate(),
186
+ avgLatency: this.routeCount > 0 ? this.totalLatency / this.routeCount : 0,
187
+ }
188
+ }
189
+
190
+ private successRate(): number {
191
+ return this.routeCount > 0 ? this.successCount / this.routeCount : 1.0
192
+ }
193
+ }
194
+
195
+ export const planRouter = new PlanRouter()
196
+ export default planRouter
@@ -0,0 +1,142 @@
1
+ /**
2
+ * Review Router - Domain Layer
3
+ *
4
+ * 处理代码审查相关的复杂路由决策
5
+ */
6
+
7
+ import type {
8
+ NamespaceRouter,
9
+ RoutingContext,
10
+ RouteDecision,
11
+ NamespaceHealth,
12
+ AlternativeRoute,
13
+ } from '../types.js'
14
+
15
+ export class ReviewRouter implements NamespaceRouter {
16
+ readonly name = 'review'
17
+ readonly layer = 'domain' as const
18
+ readonly priority = 65
19
+ readonly patterns = [
20
+ /review|审查/i,
21
+ /audit|审核/i,
22
+ /check|检查/i,
23
+ /quality|质量/i,
24
+ /code review|代码审查/i,
25
+ /pr|pull request/i,
26
+ /merge|合并/i,
27
+ ]
28
+
29
+ private routeCount = 0
30
+ private successCount = 0
31
+ private totalLatency = 0
32
+
33
+ async canRoute(context: RoutingContext): Promise<boolean> {
34
+ const text = context.request.text.toLowerCase()
35
+ return /review|审查|audit|审核|check|检查|quality|质量|code review|代码审查|pr|pull request|merge|合并/.test(text)
36
+ }
37
+
38
+ async route(context: RoutingContext): Promise<RouteDecision> {
39
+ const startTime = Date.now()
40
+ const { state, request } = context
41
+
42
+ const decision = this.makeReviewDecision(state, request.text)
43
+
44
+ this.routeCount++
45
+ this.totalLatency += Date.now() - startTime
46
+ this.successCount++
47
+
48
+ return {
49
+ ...decision,
50
+ namespace: this.name,
51
+ metadata: {
52
+ layer: this.layer,
53
+ processingTime: Date.now() - startTime,
54
+ hops: 1,
55
+ },
56
+ }
57
+ }
58
+
59
+ private makeReviewDecision(
60
+ state: RoutingContext['state'],
61
+ requestText: string
62
+ ): Omit<RouteDecision, 'namespace' | 'metadata'> {
63
+ // 场景1: PR 审查
64
+ if (/pr|pull request|merge|合并|review.*change/i.test(requestText)) {
65
+ return {
66
+ skill: 'review-diff',
67
+ confidence: 0.9,
68
+ reasoning: 'PR/Merge review request',
69
+ alternatives: [
70
+ { skill: 'quick-task', confidence: 0.2, reasoning: 'Quick approval' },
71
+ ],
72
+ }
73
+ }
74
+
75
+ // 场景2: 代码质量检查
76
+ if (/quality|质量|audit|审核|check.*code/i.test(requestText)) {
77
+ return {
78
+ skill: 'review-diff',
79
+ confidence: 0.85,
80
+ reasoning: 'Code quality audit',
81
+ alternatives: [
82
+ { skill: 'systematic-debugging', confidence: 0.3, reasoning: 'If issues found' },
83
+ ],
84
+ }
85
+ }
86
+
87
+ // 场景3: 验证阶段
88
+ if (state.phase === 'verifying') {
89
+ return {
90
+ skill: 'review-diff',
91
+ confidence: 0.9,
92
+ reasoning: 'Verification phase: code review required',
93
+ alternatives: [
94
+ { skill: 'systematic-debugging', confidence: 0.4, reasoning: 'Fix issues' },
95
+ ],
96
+ }
97
+ }
98
+
99
+ // 场景4: 完成阶段
100
+ if (state.phase === 'completed') {
101
+ return {
102
+ skill: 'review-diff',
103
+ confidence: 0.8,
104
+ reasoning: 'Final review before completion',
105
+ alternatives: [
106
+ { skill: 'agents-md', confidence: 0.3, reasoning: 'Update docs' },
107
+ ],
108
+ }
109
+ }
110
+
111
+ // 场景5: 一般性审查
112
+ return {
113
+ skill: 'review-diff',
114
+ confidence: 0.75,
115
+ reasoning: 'General review request',
116
+ alternatives: [
117
+ { skill: 'quick-task', confidence: 0.3, reasoning: 'Quick scan' },
118
+ ],
119
+ }
120
+ }
121
+
122
+ getSupportedSkills(): string[] {
123
+ return ['review-diff', 'quick-task', 'systematic-debugging', 'agents-md']
124
+ }
125
+
126
+ getHealth(): NamespaceHealth {
127
+ return {
128
+ name: this.name,
129
+ status: this.successRate() > 0.8 ? 'healthy' : 'degraded',
130
+ totalRoutes: this.routeCount,
131
+ successRate: this.successRate(),
132
+ avgLatency: this.routeCount > 0 ? this.totalLatency / this.routeCount : 0,
133
+ }
134
+ }
135
+
136
+ private successRate(): number {
137
+ return this.routeCount > 0 ? this.successCount / this.routeCount : 1.0
138
+ }
139
+ }
140
+
141
+ export const reviewRouter = new ReviewRouter()
142
+ export default reviewRouter