@winspan/claude-forge 8.28.2 → 8.33.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 (248) hide show
  1. package/README.md +68 -215
  2. package/dist/capability/execution-manager.d.ts +96 -0
  3. package/dist/capability/execution-manager.d.ts.map +1 -0
  4. package/dist/capability/execution-manager.js +260 -0
  5. package/dist/capability/execution-manager.js.map +1 -0
  6. package/dist/capability/executor/background-executor.d.ts +58 -0
  7. package/dist/capability/executor/background-executor.d.ts.map +1 -0
  8. package/dist/capability/executor/background-executor.js +322 -0
  9. package/dist/capability/executor/background-executor.js.map +1 -0
  10. package/dist/capability/executor/foreground-executor.d.ts +26 -0
  11. package/dist/capability/executor/foreground-executor.d.ts.map +1 -0
  12. package/dist/capability/executor/foreground-executor.js +82 -0
  13. package/dist/capability/executor/foreground-executor.js.map +1 -0
  14. package/dist/capability/executor/orchestrator.d.ts +38 -0
  15. package/dist/capability/executor/orchestrator.d.ts.map +1 -0
  16. package/dist/capability/executor/orchestrator.js +158 -0
  17. package/dist/capability/executor/orchestrator.js.map +1 -0
  18. package/dist/capability/executor/stream-parser.d.ts +73 -0
  19. package/dist/capability/executor/stream-parser.d.ts.map +1 -0
  20. package/dist/capability/executor/stream-parser.js +56 -0
  21. package/dist/capability/executor/stream-parser.js.map +1 -0
  22. package/dist/capability/executor/types.d.ts +44 -0
  23. package/dist/capability/executor/types.d.ts.map +1 -0
  24. package/dist/capability/executor/types.js +9 -0
  25. package/dist/capability/executor/types.js.map +1 -0
  26. package/dist/capability/executor/worker-auth-probe.d.ts +30 -0
  27. package/dist/capability/executor/worker-auth-probe.d.ts.map +1 -0
  28. package/dist/capability/executor/worker-auth-probe.js +108 -0
  29. package/dist/capability/executor/worker-auth-probe.js.map +1 -0
  30. package/dist/capability/methodologies/bmad.yaml +17 -5
  31. package/dist/capability/methodologies/code-quality-audit.yaml +26 -0
  32. package/dist/capability/methodologies/harness-engineering.yaml +12 -6
  33. package/dist/capability/methodologies/test-coverage-scan.yaml +26 -0
  34. package/dist/capability/methodology-planner.d.ts +17 -1
  35. package/dist/capability/methodology-planner.d.ts.map +1 -1
  36. package/dist/capability/methodology-planner.js +125 -0
  37. package/dist/capability/methodology-planner.js.map +1 -1
  38. package/dist/capability/methodology-registry.d.ts.map +1 -1
  39. package/dist/capability/methodology-registry.js +21 -5
  40. package/dist/capability/methodology-registry.js.map +1 -1
  41. package/dist/capability/types.d.ts +12 -1
  42. package/dist/capability/types.d.ts.map +1 -1
  43. package/dist/core/ai/provider.d.ts +17 -9
  44. package/dist/core/ai/provider.d.ts.map +1 -1
  45. package/dist/core/ai/provider.js +130 -23
  46. package/dist/core/ai/provider.js.map +1 -1
  47. package/dist/core/ai/types.d.ts +26 -5
  48. package/dist/core/ai/types.d.ts.map +1 -1
  49. package/dist/core/storage/rows.d.ts +153 -0
  50. package/dist/core/storage/rows.d.ts.map +1 -0
  51. package/dist/core/storage/rows.js +14 -0
  52. package/dist/core/storage/rows.js.map +1 -0
  53. package/dist/core/storage/schema.sql +26 -2
  54. package/dist/core/storage/sqlite.d.ts +112 -6
  55. package/dist/core/storage/sqlite.d.ts.map +1 -1
  56. package/dist/core/storage/sqlite.js +480 -22
  57. package/dist/core/storage/sqlite.js.map +1 -1
  58. package/dist/core/utils/token-tracker.d.ts +40 -0
  59. package/dist/core/utils/token-tracker.d.ts.map +1 -0
  60. package/dist/core/utils/token-tracker.js +70 -0
  61. package/dist/core/utils/token-tracker.js.map +1 -0
  62. package/dist/daemon/handlers/methodology-formatter.d.ts +7 -0
  63. package/dist/daemon/handlers/methodology-formatter.d.ts.map +1 -1
  64. package/dist/daemon/handlers/methodology-formatter.js +46 -0
  65. package/dist/daemon/handlers/methodology-formatter.js.map +1 -1
  66. package/dist/daemon/handlers/post-tool-use.d.ts +1 -0
  67. package/dist/daemon/handlers/post-tool-use.d.ts.map +1 -1
  68. package/dist/daemon/handlers/post-tool-use.js +7 -0
  69. package/dist/daemon/handlers/post-tool-use.js.map +1 -1
  70. package/dist/daemon/handlers/stop.d.ts +17 -1
  71. package/dist/daemon/handlers/stop.d.ts.map +1 -1
  72. package/dist/daemon/handlers/stop.js +97 -1
  73. package/dist/daemon/handlers/stop.js.map +1 -1
  74. package/dist/daemon/handlers/user-prompt.d.ts.map +1 -1
  75. package/dist/daemon/handlers/user-prompt.js +97 -5
  76. package/dist/daemon/handlers/user-prompt.js.map +1 -1
  77. package/dist/daemon/idle-detector.d.ts +35 -0
  78. package/dist/daemon/idle-detector.d.ts.map +1 -0
  79. package/dist/daemon/idle-detector.js +56 -0
  80. package/dist/daemon/idle-detector.js.map +1 -0
  81. package/dist/daemon/idle-trigger.d.ts +53 -0
  82. package/dist/daemon/idle-trigger.d.ts.map +1 -0
  83. package/dist/daemon/idle-trigger.js +153 -0
  84. package/dist/daemon/idle-trigger.js.map +1 -0
  85. package/dist/daemon/index.d.ts.map +1 -1
  86. package/dist/daemon/index.js +49 -2
  87. package/dist/daemon/index.js.map +1 -1
  88. package/dist/daemon/methodology-pending-queue.d.ts +33 -0
  89. package/dist/daemon/methodology-pending-queue.d.ts.map +1 -0
  90. package/dist/daemon/methodology-pending-queue.js +120 -0
  91. package/dist/daemon/methodology-pending-queue.js.map +1 -0
  92. package/dist/daemon/routing-observer.d.ts +2 -1
  93. package/dist/daemon/routing-observer.d.ts.map +1 -1
  94. package/dist/daemon/routing-observer.js +117 -39
  95. package/dist/daemon/routing-observer.js.map +1 -1
  96. package/dist/engine/agent-router.d.ts +6 -0
  97. package/dist/engine/agent-router.d.ts.map +1 -1
  98. package/dist/engine/agent-router.js +13 -1
  99. package/dist/engine/agent-router.js.map +1 -1
  100. package/dist/engine/conventions/routing.yaml +15 -0
  101. package/dist/engine/dsl/compiler.d.ts.map +1 -1
  102. package/dist/engine/dsl/compiler.js +85 -3
  103. package/dist/engine/dsl/compiler.js.map +1 -1
  104. package/dist/engine/recommender.d.ts.map +1 -1
  105. package/dist/engine/recommender.js +10 -1
  106. package/dist/engine/recommender.js.map +1 -1
  107. package/dist/intelligence/classifier.d.ts +6 -0
  108. package/dist/intelligence/classifier.d.ts.map +1 -1
  109. package/dist/intelligence/classifier.js +57 -0
  110. package/dist/intelligence/classifier.js.map +1 -1
  111. package/dist/skills/registry.d.ts +6 -0
  112. package/dist/skills/registry.d.ts.map +1 -1
  113. package/dist/skills/registry.js +49 -14
  114. package/dist/skills/registry.js.map +1 -1
  115. package/dist/skills/semantic-matcher.d.ts +1 -0
  116. package/dist/skills/semantic-matcher.d.ts.map +1 -1
  117. package/dist/skills/semantic-matcher.js +6 -1
  118. package/dist/skills/semantic-matcher.js.map +1 -1
  119. package/dist/web/auth-middleware.d.ts +22 -0
  120. package/dist/web/auth-middleware.d.ts.map +1 -0
  121. package/dist/web/auth-middleware.js +51 -0
  122. package/dist/web/auth-middleware.js.map +1 -0
  123. package/dist/web/routes/agents.d.ts +7 -0
  124. package/dist/web/routes/agents.d.ts.map +1 -0
  125. package/dist/web/routes/agents.js +192 -0
  126. package/dist/web/routes/agents.js.map +1 -0
  127. package/dist/web/routes/ai.d.ts +10 -0
  128. package/dist/web/routes/ai.d.ts.map +1 -0
  129. package/dist/web/routes/ai.js +197 -0
  130. package/dist/web/routes/ai.js.map +1 -0
  131. package/dist/web/routes/auth.d.ts +12 -0
  132. package/dist/web/routes/auth.d.ts.map +1 -0
  133. package/dist/web/routes/auth.js +20 -0
  134. package/dist/web/routes/auth.js.map +1 -0
  135. package/dist/web/routes/events.d.ts +11 -0
  136. package/dist/web/routes/events.d.ts.map +1 -0
  137. package/dist/web/routes/events.js +43 -0
  138. package/dist/web/routes/events.js.map +1 -0
  139. package/dist/web/routes/execution-trace.d.ts +13 -0
  140. package/dist/web/routes/execution-trace.d.ts.map +1 -0
  141. package/dist/web/routes/execution-trace.js +308 -0
  142. package/dist/web/routes/execution-trace.js.map +1 -0
  143. package/dist/web/routes/experiments.d.ts +15 -0
  144. package/dist/web/routes/experiments.d.ts.map +1 -0
  145. package/dist/web/routes/experiments.js +187 -0
  146. package/dist/web/routes/experiments.js.map +1 -0
  147. package/dist/web/routes/methodology.d.ts +12 -0
  148. package/dist/web/routes/methodology.d.ts.map +1 -0
  149. package/dist/web/routes/methodology.js +228 -0
  150. package/dist/web/routes/methodology.js.map +1 -0
  151. package/dist/web/routes/patch.d.ts +7 -0
  152. package/dist/web/routes/patch.d.ts.map +1 -0
  153. package/dist/web/routes/patch.js +106 -0
  154. package/dist/web/routes/patch.js.map +1 -0
  155. package/dist/web/routes/routing.d.ts +17 -0
  156. package/dist/web/routes/routing.d.ts.map +1 -0
  157. package/dist/web/routes/routing.js +582 -0
  158. package/dist/web/routes/routing.js.map +1 -0
  159. package/dist/web/routes/rules.d.ts +7 -0
  160. package/dist/web/routes/rules.d.ts.map +1 -0
  161. package/dist/web/routes/rules.js +105 -0
  162. package/dist/web/routes/rules.js.map +1 -0
  163. package/dist/web/routes/sessions.d.ts +10 -0
  164. package/dist/web/routes/sessions.d.ts.map +1 -0
  165. package/dist/web/routes/sessions.js +234 -0
  166. package/dist/web/routes/sessions.js.map +1 -0
  167. package/dist/web/routes/skills.d.ts +10 -0
  168. package/dist/web/routes/skills.d.ts.map +1 -0
  169. package/dist/web/routes/skills.js +272 -0
  170. package/dist/web/routes/skills.js.map +1 -0
  171. package/dist/web/routes/static.d.ts +19 -0
  172. package/dist/web/routes/static.d.ts.map +1 -0
  173. package/dist/web/routes/static.js +61 -0
  174. package/dist/web/routes/static.js.map +1 -0
  175. package/dist/web/routes/status.d.ts +7 -0
  176. package/dist/web/routes/status.d.ts.map +1 -0
  177. package/dist/web/routes/status.js +28 -0
  178. package/dist/web/routes/status.js.map +1 -0
  179. package/dist/web/routes/token-usage.d.ts +7 -0
  180. package/dist/web/routes/token-usage.d.ts.map +1 -0
  181. package/dist/web/routes/token-usage.js +33 -0
  182. package/dist/web/routes/token-usage.js.map +1 -0
  183. package/dist/web/routes/types.d.ts +40 -0
  184. package/dist/web/routes/types.d.ts.map +1 -0
  185. package/dist/web/routes/types.js +52 -0
  186. package/dist/web/routes/types.js.map +1 -0
  187. package/dist/web/server.d.ts +13 -4
  188. package/dist/web/server.d.ts.map +1 -1
  189. package/dist/web/server.js +60 -2210
  190. package/dist/web/server.js.map +1 -1
  191. package/dist/web/ssrf-guard.d.ts +35 -0
  192. package/dist/web/ssrf-guard.d.ts.map +1 -0
  193. package/dist/web/ssrf-guard.js +93 -0
  194. package/dist/web/ssrf-guard.js.map +1 -0
  195. package/dist/web/static/assets/AIConfig-D-vrYoJ3.js +2 -0
  196. package/dist/web/static/assets/AIConfig-D-vrYoJ3.js.map +1 -0
  197. package/dist/web/static/assets/Agents-DAGWYsJj.js +2 -0
  198. package/dist/web/static/assets/Agents-DAGWYsJj.js.map +1 -0
  199. package/dist/web/static/assets/CodeBlock--H53gk46.js +2 -0
  200. package/dist/web/static/assets/CodeBlock--H53gk46.js.map +1 -0
  201. package/dist/web/static/assets/Dashboard-qUCxXFSI.js +2 -0
  202. package/dist/web/static/assets/Dashboard-qUCxXFSI.js.map +1 -0
  203. package/dist/web/static/assets/Drawer-DeKukfwJ.js +2 -0
  204. package/dist/web/static/assets/Drawer-DeKukfwJ.js.map +1 -0
  205. package/dist/web/static/assets/Events-BoQ8Fo5k.js +2 -0
  206. package/dist/web/static/assets/Events-BoQ8Fo5k.js.map +1 -0
  207. package/dist/web/static/assets/ExecutionTrace-sFZ_vHNf.js +2 -0
  208. package/dist/web/static/assets/ExecutionTrace-sFZ_vHNf.js.map +1 -0
  209. package/dist/web/static/assets/MarkdownRenderer-CCIz1MOz.js +2 -0
  210. package/dist/web/static/assets/MarkdownRenderer-CCIz1MOz.js.map +1 -0
  211. package/dist/web/static/assets/Methodologies-C0-Keokj.js +5 -0
  212. package/dist/web/static/assets/Methodologies-C0-Keokj.js.map +1 -0
  213. package/dist/web/static/assets/MethodologyDetail-Do1taSKM.js +2 -0
  214. package/dist/web/static/assets/MethodologyDetail-Do1taSKM.js.map +1 -0
  215. package/dist/web/static/assets/Routing-CFmM7JuB.js +2 -0
  216. package/dist/web/static/assets/Routing-CFmM7JuB.js.map +1 -0
  217. package/dist/web/static/assets/SessionDetail-DzTue2xK.js +2 -0
  218. package/dist/web/static/assets/SessionDetail-DzTue2xK.js.map +1 -0
  219. package/dist/web/static/assets/Sessions-Bjf-Mvwb.js +2 -0
  220. package/dist/web/static/assets/Sessions-Bjf-Mvwb.js.map +1 -0
  221. package/dist/web/static/assets/Skills-CrLshkrJ.js +2 -0
  222. package/dist/web/static/assets/Skills-CrLshkrJ.js.map +1 -0
  223. package/dist/web/static/assets/charts-CLrM0_uM.js +37 -0
  224. package/dist/web/static/assets/charts-CLrM0_uM.js.map +1 -0
  225. package/dist/web/static/assets/date-fns-CZ_bHujz.js +2 -0
  226. package/dist/web/static/assets/date-fns-CZ_bHujz.js.map +1 -0
  227. package/dist/web/static/assets/export-CEzDNM66.js +4 -0
  228. package/dist/web/static/assets/export-CEzDNM66.js.map +1 -0
  229. package/dist/web/static/assets/index-D23sAOAt.js +3 -0
  230. package/dist/web/static/assets/index-D23sAOAt.js.map +1 -0
  231. package/dist/web/static/assets/index-Drpf7sLl.css +1 -0
  232. package/dist/web/static/assets/lucide-DjB4fWNj.js +227 -0
  233. package/dist/web/static/assets/lucide-DjB4fWNj.js.map +1 -0
  234. package/dist/web/static/assets/query-C99w429o.js +2 -0
  235. package/dist/web/static/assets/query-C99w429o.js.map +1 -0
  236. package/dist/web/static/assets/react-router-I-HqunH7.js +20 -0
  237. package/dist/web/static/assets/react-router-I-HqunH7.js.map +1 -0
  238. package/dist/web/static/assets/react-vendor-CSp-GLFF.js +49 -0
  239. package/dist/web/static/assets/react-vendor-CSp-GLFF.js.map +1 -0
  240. package/dist/web/static/assets/syntax-highlighter-44FakypI.js +9 -0
  241. package/dist/web/static/assets/syntax-highlighter-44FakypI.js.map +1 -0
  242. package/dist/web/static/assets/vendor-CMMjVdZs.js +64 -0
  243. package/dist/web/static/assets/vendor-CMMjVdZs.js.map +1 -0
  244. package/dist/web/static/index.html +8 -2
  245. package/package.json +3 -2
  246. package/dist/web/static/assets/index-CtylfoaN.css +0 -1
  247. package/dist/web/static/assets/index-DnaQt27h.js +0 -388
  248. package/dist/web/static/assets/index-DnaQt27h.js.map +0 -1
@@ -13,6 +13,7 @@
13
13
  import { logger } from '../../core/utils/logger.js';
14
14
  import { routingState } from '../routing-state.js';
15
15
  import { formatMethodologyPhaseDirective } from './methodology-formatter.js';
16
+ import { getMethodologyPendingQueue } from '../methodology-pending-queue.js';
16
17
  export const INJECTION_VERSION = 'v1-declarative-2026-05-08';
17
18
  export class UserPromptHandler {
18
19
  classifier;
@@ -71,16 +72,50 @@ export class UserPromptHandler {
71
72
  logger.info(`[UserPrompt] Intent: complexity=${analysis.complexity} taskType=${analysis.taskType} ` +
72
73
  `source=${source}${analysis.classificationMs ? ` (${analysis.classificationMs}ms)` : ''}`);
73
74
  // 1.5 Methodology matching and dynamic plan generation (NEW)
75
+ // Meta prompt("继续"/"开启多个 agent"/列表前缀等)直接跳过方法论,
76
+ // 避免指令性 prompt 触发 plan 生成,造成死循环。
74
77
  let methodologyExecutionId = null;
75
78
  let methodologyHandled = false;
76
- if (this.methodologyRegistry && this.methodologyPlanner && this.storage) {
79
+ if (this.methodologyRegistry && this.methodologyPlanner && this.storage && !analysis.isMetaPrompt) {
77
80
  try {
81
+ // Phase A 兜底:优先消费 pending 队列(Stop hook 兜底注入 / 冷启动)
82
+ const pending = getMethodologyPendingQueue().consume(event.session_id);
83
+ if (pending) {
84
+ systemParts.push(pending.directive);
85
+ methodologyHandled = true;
86
+ methodologyExecutionId = pending.execution_id;
87
+ logger.info(`[Methodology] Re-injected pending directive (reason=${pending.reason}, execution=${pending.execution_id}, phase=${pending.phase_index})`);
88
+ }
78
89
  logger.info(`[Methodology] Checking match for taskType=${analysis.taskType} complexity=${analysis.complexity}`);
79
90
  // Check if there's an active methodology execution for this session
80
91
  const activeExecution = this.storage.getActiveMethodologyExecution(event.session_id);
81
92
  if (activeExecution) {
82
93
  logger.info(`[Methodology] Active execution found: ${activeExecution.id}`);
83
- // Methodology already running, don't create new one
94
+ // 若本轮尚未注入过(没有命中 pending 分支),且当前 phase 还没
95
+ // 推进(status != 'completed'),就重新注入当前 phase 指令。
96
+ // 避免 Claude 忽略上一次注入导致停在 0% 的情况。
97
+ if (!methodologyHandled) {
98
+ try {
99
+ const plan = JSON.parse(activeExecution.plan_json);
100
+ const idx = activeExecution.current_phase_index ?? 0;
101
+ const currentPhase = plan.phases[idx];
102
+ const phaseExecs = this.storage.getPhaseExecutions(activeExecution.id);
103
+ const currentExec = phaseExecs.find(p => p.phase_index === idx);
104
+ const phaseAlreadyDone = currentExec?.status === 'completed';
105
+ if (currentPhase && !phaseAlreadyDone) {
106
+ const methodology = this.methodologyRegistry.get(activeExecution.methodology_id);
107
+ if (methodology) {
108
+ systemParts.push(formatMethodologyPhaseDirective(methodology, plan, currentPhase, idx, activeExecution.id));
109
+ methodologyHandled = true;
110
+ methodologyExecutionId = activeExecution.id;
111
+ logger.info(`[Methodology] Cold re-injection: execution=${activeExecution.id} phase=${idx + 1}/${plan.phases.length} (${currentPhase.id} → ${currentPhase.agent})`);
112
+ }
113
+ }
114
+ }
115
+ catch (err) {
116
+ logger.warn(`[Methodology] Cold re-injection skipped: ${err}`);
117
+ }
118
+ }
84
119
  }
85
120
  else {
86
121
  // Match methodology based on intent
@@ -122,12 +157,15 @@ export class UserPromptHandler {
122
157
  logger.warn(`[Methodology] Matching/planning failed: ${err}`);
123
158
  }
124
159
  }
125
- // 2. Route (skip if methodology handled this prompt)
160
+ // 2. Route (skip if methodology handled this prompt or prompt is meta)
161
+ // Meta prompt("继续"/"开启多个 agent"/列表前缀等)不应触发 agent 路由,
162
+ // 否则会把控制性指令误路由到 refactor-specialist 等 agent,造成违抗数据。
126
163
  let decision = null;
127
164
  let routedAgentName = null;
128
165
  let routedAgentDef = null;
166
+ let routedAgents = null; // For route_to_agent_group
129
167
  let routedType = 'none';
130
- if (this.router && !methodologyHandled) {
168
+ if (this.router && !methodologyHandled && !analysis.isMetaPrompt) {
131
169
  decision = this.router.decide({ taskType: analysis.taskType, complexity: analysis.complexity }, event.session_id);
132
170
  if (decision.action.type === 'route_to_agent') {
133
171
  const agentName = decision.action.name;
@@ -143,6 +181,22 @@ export class UserPromptHandler {
143
181
  logger.warn(`[UserPrompt] Router decided agent '${agentName}' but no definition found — falling back to skill`);
144
182
  }
145
183
  }
184
+ else if (decision.action.type === 'route_to_agent_group') {
185
+ const agents = decision.action.agents;
186
+ const validAgents = agents
187
+ .map(a => ({ ...a, def: this.agents?.get(a.name) }))
188
+ .filter(a => a.def !== undefined);
189
+ if (validAgents.length > 0) {
190
+ routedType = 'agent';
191
+ routedAgentName = validAgents.map(a => a.name).join(',');
192
+ routedAgents = validAgents.map(a => a.name); // Store agent list for observer
193
+ systemParts.push(formatAgentGroupDirective(validAgents));
194
+ logger.info(`[UserPrompt] Routed to agent group: ${validAgents.map(a => a.name).join(', ')}`);
195
+ }
196
+ else {
197
+ logger.warn(`[UserPrompt] Router decided agent group but no valid agents found — falling back`);
198
+ }
199
+ }
146
200
  }
147
201
  // 3. (Phase 5) Skill fallback removed: UserPromptSubmit 不再自动推荐 skill。
148
202
  // 没有匹到 agent 的 prompt 直接走 Claude 默认流程;slash command /<skill-name>
@@ -175,7 +229,7 @@ export class UserPromptHandler {
175
229
  experiment_group: decision?.groupId ?? null,
176
230
  });
177
231
  if (routedType === 'agent' && this.observer) {
178
- this.observer.beginPending(event.session_id, eventId, routeRequestId, routedAgentName);
232
+ this.observer.beginPending(event.session_id, eventId, routeRequestId, routedAgentName, routedAgents);
179
233
  }
180
234
  // Record routing state for PreToolUse enforcement
181
235
  if (routedType === 'agent' && routedAgentName && routedAgentDef) {
@@ -240,4 +294,42 @@ function formatAgentDirective(agentName, agentDescription) {
240
294
  '━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━',
241
295
  ].join('\n');
242
296
  }
297
+ /**
298
+ * Format concurrent agent group directive (route_to_agent_group).
299
+ * Instructs Claude to launch multiple agents in parallel using Agent tool.
300
+ */
301
+ function formatAgentGroupDirective(agents) {
302
+ const agentList = agents.map((a, i) => `${i + 1}. **${a.name}** — ${a.focus}\n Role: ${a.def.description}`).join('\n\n');
303
+ const agentConfigs = agents.map(a => `Agent({\n subagent_type: "${a.name}",\n description: "${a.focus}",\n prompt: "<user's complete original prompt>"\n})`).join('\n\n');
304
+ return [
305
+ '╔═══════════════════════════════════════════════════════════════╗',
306
+ `║ ROUTING DECISION: CONCURRENT AGENT GROUP (${agents.length} agents)${' '.repeat(Math.max(0, 17 - agents.length.toString().length))} ║`,
307
+ '╠═══════════════════════════════════════════════════════════════╣',
308
+ '║ ACTION REQUIRED: Launch multiple agents in parallel ║',
309
+ '║ ENFORCEMENT: Active (see CLAUDE.md Behavioral Rules) ║',
310
+ '╚═══════════════════════════════════════════════════════════════╝',
311
+ '',
312
+ `[ROUTE_TO: agent-group] [ROUTING_ENFORCED] [AGENT_REQUIRED]`,
313
+ '',
314
+ '**MANDATORY WORKFLOW**:',
315
+ '1. Investigate (optional) → Use Read/Grep/WebSearch to understand',
316
+ '2. Execute (required) → Launch ALL agents below in a SINGLE response',
317
+ '3. Parallel execution → Use multiple Agent tool calls in one message',
318
+ '4. Never bypass → Direct Edit/Write/Bash calls violate routing rules',
319
+ '',
320
+ '**AGENTS TO LAUNCH**:',
321
+ agentList,
322
+ '',
323
+ '**AGENT CONFIGURATIONS** (call all in parallel):',
324
+ '```typescript',
325
+ agentConfigs,
326
+ '```',
327
+ '',
328
+ '⚠️ **CRITICAL**: Make ALL Agent tool calls in the SAME response to enable',
329
+ 'parallel execution. Do NOT wait for one agent to finish before starting another.',
330
+ '',
331
+ '⚠️ **REMINDER**: See CLAUDE.md "Behavioral Rules (Always Enforced)" section',
332
+ '━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━',
333
+ ].join('\n');
334
+ }
243
335
  //# sourceMappingURL=user-prompt.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"user-prompt.js","sourceRoot":"","sources":["../../../src/daemon/handlers/user-prompt.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"user-prompt.js","sourceRoot":"","sources":["../../../src/daemon/handlers/user-prompt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * IdleDetector — 检测 session 空闲状态
3
+ *
4
+ * 职责:
5
+ * 1. 跟踪每个 session 的最后活动时间
6
+ * 2. 提供查询接口,返回超过阈值的空闲 session 列表
7
+ *
8
+ * 活动定义:UserPromptSubmit / PostToolUse / Stop 等 hook 事件
9
+ */
10
+ export interface IdleDetectorOptions {
11
+ /**
12
+ * 空闲阈值(毫秒)。超过此时长无活动即视为 idle。
13
+ * 默认 5 分钟。
14
+ */
15
+ idleThresholdMs?: number;
16
+ }
17
+ export declare class IdleDetector {
18
+ private lastActivityTime;
19
+ private readonly idleThresholdMs;
20
+ constructor(options?: IdleDetectorOptions);
21
+ /**
22
+ * 记录 session 活动
23
+ */
24
+ recordActivity(session_id: string): void;
25
+ /**
26
+ * 获取空闲的 session 列表
27
+ */
28
+ getIdleSessions(): string[];
29
+ /**
30
+ * 清理过期的 session 记录(可选,避免内存泄漏)
31
+ * @param maxAgeMs 超过此时长的记录会被清理,默认 24 小时
32
+ */
33
+ cleanup(maxAgeMs?: number): number;
34
+ }
35
+ //# sourceMappingURL=idle-detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idle-detector.d.ts","sourceRoot":"","sources":["../../src/daemon/idle-detector.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,MAAM,WAAW,mBAAmB;IAClC;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,gBAAgB,CAA6B;IACrD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;gBAE7B,OAAO,GAAE,mBAAwB;IAK7C;;OAEG;IACH,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAIxC;;OAEG;IACH,eAAe,IAAI,MAAM,EAAE;IAa3B;;;OAGG;IACH,OAAO,CAAC,QAAQ,GAAE,MAA4B,GAAG,MAAM;CAiBxD"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * IdleDetector — 检测 session 空闲状态
3
+ *
4
+ * 职责:
5
+ * 1. 跟踪每个 session 的最后活动时间
6
+ * 2. 提供查询接口,返回超过阈值的空闲 session 列表
7
+ *
8
+ * 活动定义:UserPromptSubmit / PostToolUse / Stop 等 hook 事件
9
+ */
10
+ import { logger } from '../core/utils/logger.js';
11
+ export class IdleDetector {
12
+ lastActivityTime = new Map();
13
+ idleThresholdMs;
14
+ constructor(options = {}) {
15
+ this.idleThresholdMs = options.idleThresholdMs ?? 5 * 60 * 1000;
16
+ logger.debug(`[IdleDetector] initialized with threshold=${this.idleThresholdMs}ms`);
17
+ }
18
+ /**
19
+ * 记录 session 活动
20
+ */
21
+ recordActivity(session_id) {
22
+ this.lastActivityTime.set(session_id, Date.now());
23
+ }
24
+ /**
25
+ * 获取空闲的 session 列表
26
+ */
27
+ getIdleSessions() {
28
+ const now = Date.now();
29
+ const idle = [];
30
+ for (const [session_id, lastTime] of this.lastActivityTime) {
31
+ if (now - lastTime > this.idleThresholdMs) {
32
+ idle.push(session_id);
33
+ }
34
+ }
35
+ return idle;
36
+ }
37
+ /**
38
+ * 清理过期的 session 记录(可选,避免内存泄漏)
39
+ * @param maxAgeMs 超过此时长的记录会被清理,默认 24 小时
40
+ */
41
+ cleanup(maxAgeMs = 24 * 60 * 60 * 1000) {
42
+ const now = Date.now();
43
+ let cleaned = 0;
44
+ for (const [session_id, lastTime] of this.lastActivityTime) {
45
+ if (now - lastTime > maxAgeMs) {
46
+ this.lastActivityTime.delete(session_id);
47
+ cleaned++;
48
+ }
49
+ }
50
+ if (cleaned > 0) {
51
+ logger.debug(`[IdleDetector] cleaned ${cleaned} expired session(s)`);
52
+ }
53
+ return cleaned;
54
+ }
55
+ }
56
+ //# sourceMappingURL=idle-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idle-detector.js","sourceRoot":"","sources":["../../src/daemon/idle-detector.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAUjD,MAAM,OAAO,YAAY;IACf,gBAAgB,GAAG,IAAI,GAAG,EAAkB,CAAC;IACpC,eAAe,CAAS;IAEzC,YAAY,UAA+B,EAAE;QAC3C,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC,eAAe,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;QAChE,MAAM,CAAC,KAAK,CAAC,6CAA6C,IAAI,CAAC,eAAe,IAAI,CAAC,CAAC;IACtF,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,UAAkB;QAC/B,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IACpD,CAAC;IAED;;OAEG;IACH,eAAe;QACb,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,IAAI,GAAa,EAAE,CAAC;QAE1B,KAAK,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC3D,IAAI,GAAG,GAAG,QAAQ,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;gBAC1C,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;OAGG;IACH,OAAO,CAAC,WAAmB,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;QAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,OAAO,GAAG,CAAC,CAAC;QAEhB,KAAK,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC3D,IAAI,GAAG,GAAG,QAAQ,GAAG,QAAQ,EAAE,CAAC;gBAC9B,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;gBACzC,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC;QAED,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;YAChB,MAAM,CAAC,KAAK,CAAC,0BAA0B,OAAO,qBAAqB,CAAC,CAAC;QACvE,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;CACF"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * IdleTrigger — 在 session 空闲时自动触发低优方法论
3
+ *
4
+ * 职责:
5
+ * 1. 检测空闲 session(通过 IdleDetector)
6
+ * 2. 读取 idle 方法论配置
7
+ * 3. 检查触发条件(无 running methodology、未超频触发)
8
+ * 4. 创建 background execution
9
+ *
10
+ * 借鉴 ruflo 的 12 个后台 worker 设计,在主会话空闲时自动跑低优任务。
11
+ */
12
+ import type { SQLiteStorage } from '../core/storage/sqlite.js';
13
+ import type { MethodologyRegistry } from '../capability/methodology-registry.js';
14
+ import type { ExecutionManager } from '../capability/execution-manager.js';
15
+ import type { IdleDetector } from './idle-detector.js';
16
+ export interface IdleMethodologyConfig {
17
+ id: string;
18
+ trigger_interval: number;
19
+ priority: 'low' | 'medium' | 'high';
20
+ }
21
+ export interface IdleTriggerOptions {
22
+ /**
23
+ * 是否启用 idle 触发器
24
+ */
25
+ enabled?: boolean;
26
+ }
27
+ export declare class IdleTrigger {
28
+ private storage;
29
+ private registry;
30
+ private executionManager;
31
+ private idleDetector;
32
+ private lastTriggerTime;
33
+ private readonly enabled;
34
+ constructor(storage: SQLiteStorage, registry: MethodologyRegistry, executionManager: ExecutionManager, idleDetector: IdleDetector, options?: IdleTriggerOptions);
35
+ /**
36
+ * 从方法论 YAML 中提取 idle 配置
37
+ */
38
+ private getIdleMethodologies;
39
+ /**
40
+ * 触发空闲方法论
41
+ * 在 daemon reconcile loop 里定期调用
42
+ */
43
+ trigger(): Promise<void>;
44
+ /**
45
+ * 为单个 session 触发 idle 方法论
46
+ */
47
+ private triggerForSession;
48
+ /**
49
+ * 清理过期的触发记录
50
+ */
51
+ cleanup(maxAgeMs?: number): number;
52
+ }
53
+ //# sourceMappingURL=idle-trigger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idle-trigger.d.ts","sourceRoot":"","sources":["../../src/daemon/idle-trigger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uCAAuC,CAAC;AACjF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAC3E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGvD,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;CACrC;AAED,MAAM,WAAW,kBAAkB;IACjC;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,qBAAa,WAAW;IAKpB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,gBAAgB;IACxB,OAAO,CAAC,YAAY;IAPtB,OAAO,CAAC,eAAe,CAA6B;IACpD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;gBAGxB,OAAO,EAAE,aAAa,EACtB,QAAQ,EAAE,mBAAmB,EAC7B,gBAAgB,EAAE,gBAAgB,EAClC,YAAY,EAAE,YAAY,EAClC,OAAO,GAAE,kBAAuB;IAMlC;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAiB5B;;;OAGG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAkB9B;;OAEG;YACW,iBAAiB;IAkF/B;;OAEG;IACH,OAAO,CAAC,QAAQ,GAAE,MAA4B,GAAG,MAAM;CAiBxD"}
@@ -0,0 +1,153 @@
1
+ /**
2
+ * IdleTrigger — 在 session 空闲时自动触发低优方法论
3
+ *
4
+ * 职责:
5
+ * 1. 检测空闲 session(通过 IdleDetector)
6
+ * 2. 读取 idle 方法论配置
7
+ * 3. 检查触发条件(无 running methodology、未超频触发)
8
+ * 4. 创建 background execution
9
+ *
10
+ * 借鉴 ruflo 的 12 个后台 worker 设计,在主会话空闲时自动跑低优任务。
11
+ */
12
+ import { logger } from '../core/utils/logger.js';
13
+ export class IdleTrigger {
14
+ storage;
15
+ registry;
16
+ executionManager;
17
+ idleDetector;
18
+ lastTriggerTime = new Map(); // `${session_id}:${methodology_id}` → timestamp
19
+ enabled;
20
+ constructor(storage, registry, executionManager, idleDetector, options = {}) {
21
+ this.storage = storage;
22
+ this.registry = registry;
23
+ this.executionManager = executionManager;
24
+ this.idleDetector = idleDetector;
25
+ this.enabled = options.enabled ?? (process.env.ENABLE_IDLE_TRIGGER !== 'false');
26
+ logger.info(`[IdleTrigger] ${this.enabled ? 'enabled' : 'disabled'}`);
27
+ }
28
+ /**
29
+ * 从方法论 YAML 中提取 idle 配置
30
+ */
31
+ getIdleMethodologies() {
32
+ const configs = [];
33
+ for (const methodology of this.registry.getAll()) {
34
+ const idleTrigger = methodology.idle_trigger;
35
+ if (!idleTrigger?.enabled)
36
+ continue;
37
+ configs.push({
38
+ id: methodology.id,
39
+ trigger_interval: idleTrigger.interval ?? 3600000, // 默认 1 小时
40
+ priority: idleTrigger.priority ?? 'low',
41
+ });
42
+ }
43
+ return configs;
44
+ }
45
+ /**
46
+ * 触发空闲方法论
47
+ * 在 daemon reconcile loop 里定期调用
48
+ */
49
+ async trigger() {
50
+ if (!this.enabled)
51
+ return;
52
+ const idleSessions = this.idleDetector.getIdleSessions();
53
+ if (idleSessions.length === 0)
54
+ return;
55
+ const idleMethodologies = this.getIdleMethodologies();
56
+ if (idleMethodologies.length === 0)
57
+ return;
58
+ for (const session_id of idleSessions) {
59
+ try {
60
+ await this.triggerForSession(session_id, idleMethodologies);
61
+ }
62
+ catch (err) {
63
+ logger.warn(`[IdleTrigger] failed for session ${session_id}: ${err}`);
64
+ }
65
+ }
66
+ }
67
+ /**
68
+ * 为单个 session 触发 idle 方法论
69
+ */
70
+ async triggerForSession(session_id, idleMethodologies) {
71
+ // 检查是否已有 running methodology
72
+ const activeExecution = this.storage.getActiveMethodologyExecution(session_id);
73
+ if (activeExecution) {
74
+ logger.debug(`[IdleTrigger] session ${session_id} has active execution, skip`);
75
+ return;
76
+ }
77
+ // 按优先级排序(high > medium > low)
78
+ const sorted = [...idleMethodologies].sort((a, b) => {
79
+ const priority = { high: 3, medium: 2, low: 1 };
80
+ return priority[b.priority] - priority[a.priority];
81
+ });
82
+ for (const config of sorted) {
83
+ // 检查上次触发时间
84
+ const key = `${session_id}:${config.id}`;
85
+ const lastTrigger = this.lastTriggerTime.get(key) ?? 0;
86
+ const now = Date.now();
87
+ if (now - lastTrigger < config.trigger_interval) {
88
+ logger.debug(`[IdleTrigger] ${config.id} for session ${session_id} triggered too recently, skip`);
89
+ continue;
90
+ }
91
+ // 触发 background execution
92
+ try {
93
+ const methodology = this.registry.get(config.id);
94
+ if (!methodology) {
95
+ logger.warn(`[IdleTrigger] methodology ${config.id} not found`);
96
+ continue;
97
+ }
98
+ // 获取 project_path(从最近的 event 推断)
99
+ const recentEvents = this.storage.queryEvents({ session_id, limit: 1 });
100
+ if (recentEvents.length === 0) {
101
+ logger.debug(`[IdleTrigger] no events for session ${session_id}, skip`);
102
+ continue;
103
+ }
104
+ const project_path = recentEvents[0].project_path;
105
+ // 创建简单的执行计划(idle 方法论通常是单阶段扫描任务)
106
+ const plan = {
107
+ methodology_id: config.id,
108
+ phases: [
109
+ {
110
+ id: 'scan',
111
+ agent: 'researcher',
112
+ prompt: `[Idle trigger] Run ${methodology.name}`,
113
+ rationale: 'Automated background scan during idle time',
114
+ },
115
+ ],
116
+ rationale: `Idle trigger: ${methodology.description}`,
117
+ };
118
+ const executionId = this.executionManager.start({
119
+ session_id,
120
+ methodology_id: config.id,
121
+ plan,
122
+ mode: 'background',
123
+ trigger_type: 'idle',
124
+ });
125
+ this.lastTriggerTime.set(key, now);
126
+ logger.info(`[IdleTrigger] triggered ${config.id} for session ${session_id} (execution=${executionId})`);
127
+ // 一次只触发一个,避免资源争抢
128
+ break;
129
+ }
130
+ catch (err) {
131
+ logger.warn(`[IdleTrigger] failed to start ${config.id}: ${err}`);
132
+ }
133
+ }
134
+ }
135
+ /**
136
+ * 清理过期的触发记录
137
+ */
138
+ cleanup(maxAgeMs = 24 * 60 * 60 * 1000) {
139
+ const now = Date.now();
140
+ let cleaned = 0;
141
+ for (const [key, lastTime] of this.lastTriggerTime) {
142
+ if (now - lastTime > maxAgeMs) {
143
+ this.lastTriggerTime.delete(key);
144
+ cleaned++;
145
+ }
146
+ }
147
+ if (cleaned > 0) {
148
+ logger.debug(`[IdleTrigger] cleaned ${cleaned} expired trigger record(s)`);
149
+ }
150
+ return cleaned;
151
+ }
152
+ }
153
+ //# sourceMappingURL=idle-trigger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idle-trigger.js","sourceRoot":"","sources":["../../src/daemon/idle-trigger.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/daemon/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AA0CH,wBAAsB,WAAW,CAAC,UAAU,GAAE,OAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CA6P5E"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/daemon/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AA4CH,wBAAsB,WAAW,CAAC,UAAU,GAAE,OAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAgT5E"}
@@ -38,6 +38,8 @@ import { PostToolUseHandler } from './handlers/post-tool-use.js';
38
38
  import { StopHandler } from './handlers/stop.js';
39
39
  import { MethodologyRegistry } from '../capability/methodology-registry.js';
40
40
  import { MethodologyPlanner } from '../capability/methodology-planner.js';
41
+ import { IdleDetector } from './idle-detector.js';
42
+ import { IdleTrigger } from './idle-trigger.js';
41
43
  export async function startDaemon(foreground = false) {
42
44
  // ── 1. Config & Logging ────────────────────────────────────────────────────
43
45
  const config = new ConfigManager().get();
@@ -82,7 +84,7 @@ export async function startDaemon(foreground = false) {
82
84
  // UserPromptSubmit no longer auto-recommends skills (removed in v8.15.4);
83
85
  // skills remain available via slash command `/<skill-name>`.
84
86
  const skillApiKey = config.skill_matching?.api_key || apiKey;
85
- void new SkillRegistry(skillApiKey);
87
+ const skillRegistry = new SkillRegistry(skillApiKey);
86
88
  if (skillApiKey) {
87
89
  logger.info('[Skills] Registry loaded with semantic matching support');
88
90
  }
@@ -112,6 +114,43 @@ export async function startDaemon(foreground = false) {
112
114
  const methodologyRegistry = new MethodologyRegistry();
113
115
  const methodologyPlanner = new MethodologyPlanner(ai);
114
116
  logger.info(`[Methodology] Loaded ${methodologyRegistry.getAll().length} methodologies`);
117
+ // Execution manager: drives foreground + background orchestrators, reconciles orphans
118
+ const { ExecutionManager } = await import('../capability/execution-manager.js');
119
+ const executionManager = new ExecutionManager(storage, methodologyRegistry, {
120
+ background: {
121
+ cwd: process.cwd(),
122
+ projectRoot: process.cwd(),
123
+ },
124
+ });
125
+ try {
126
+ executionManager.reconcileOrphansOnStartup();
127
+ }
128
+ catch (err) {
129
+ logger.warn(`[ExecutionManager] reconcile failed: ${err}`);
130
+ }
131
+ try {
132
+ const cancelled = executionManager.cancelStaleForegroundExecutions();
133
+ if (cancelled.length > 0) {
134
+ logger.info(`[ExecutionManager] startup sweep cancelled ${cancelled.length} stale foreground execution(s): [${cancelled.join(', ')}]`);
135
+ }
136
+ }
137
+ catch (err) {
138
+ logger.warn(`[ExecutionManager] foreground sweep failed: ${err}`);
139
+ }
140
+ // Initialize idle detector and trigger
141
+ const idleDetector = new IdleDetector({
142
+ idleThresholdMs: parseInt(process.env.IDLE_THRESHOLD_MS ?? '300000', 10), // 默认 5 分钟
143
+ });
144
+ const idleTrigger = new IdleTrigger(storage, methodologyRegistry, executionManager, idleDetector, {
145
+ enabled: process.env.ENABLE_IDLE_TRIGGER !== 'false',
146
+ });
147
+ // Start reconcile loop with idle trigger callback
148
+ executionManager.startReconcileLoop(60_000, async () => {
149
+ await idleTrigger.trigger();
150
+ // Periodic cleanup
151
+ idleDetector.cleanup();
152
+ idleTrigger.cleanup();
153
+ });
115
154
  // Enable hot-reload for routing.yaml (Phase 3) and experiments.yaml (Phase 5)
116
155
  defaultRouter.enableHotReload();
117
156
  experimentRouter.enableHotReload();
@@ -128,13 +167,15 @@ export async function startDaemon(foreground = false) {
128
167
  UserPromptSubmit: new UserPromptHandler(classifier, resume, conventionExtractor, experimentRouter, agents, storage, routingObserver, methodologyRegistry, methodologyPlanner),
129
168
  PreToolUse: new PreToolUseHandler(ruleEngine, contextBuilder),
130
169
  PostToolUse: new PostToolUseHandler(qualityGate ?? null, storage, routingObserver, methodologyRegistry),
131
- Stop: new StopHandler(distiller ?? null, exporter, resume, routingObserver, taskSegmenter),
170
+ Stop: new StopHandler(distiller ?? null, exporter, resume, routingObserver, taskSegmenter, storage, methodologyRegistry),
132
171
  };
133
172
  // ── 7. Event handler ───────────────────────────────────────────────────────
134
173
  const handleEvent = async (event) => {
135
174
  try {
136
175
  storage.writeEvent(event);
137
176
  logger.debug(`[Event] ${event.hook_type} | tool=${event.tool_name ?? 'N/A'}`);
177
+ // Record activity for idle detection
178
+ idleDetector.recordActivity(event.session_id);
138
179
  // Task segmentation: UserPromptSubmit starts/continues tasks, other events link to current task
139
180
  const prompt = event.user_prompt || event.tool_input?.user_prompt;
140
181
  if (event.hook_type === 'UserPromptSubmit' && prompt) {
@@ -230,6 +271,10 @@ export async function startDaemon(foreground = false) {
230
271
  ruleEngine,
231
272
  router: defaultRouter,
232
273
  agents,
274
+ executionManager,
275
+ methodologyRegistry,
276
+ methodologyPlanner,
277
+ skillRegistry,
233
278
  });
234
279
  await webServer.start();
235
280
  }
@@ -242,6 +287,8 @@ export async function startDaemon(foreground = false) {
242
287
  logger.info('Shutting down...');
243
288
  if (ai)
244
289
  logger.info(`[AI Stats] ${ai.formatStats()}`);
290
+ executionManager.stopReconcileLoop();
291
+ autoDisableScheduler.stop();
245
292
  if (webServer)
246
293
  await webServer.stop();
247
294
  await server.close();