@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.
- package/README.md +68 -215
- package/dist/capability/execution-manager.d.ts +96 -0
- package/dist/capability/execution-manager.d.ts.map +1 -0
- package/dist/capability/execution-manager.js +260 -0
- package/dist/capability/execution-manager.js.map +1 -0
- package/dist/capability/executor/background-executor.d.ts +58 -0
- package/dist/capability/executor/background-executor.d.ts.map +1 -0
- package/dist/capability/executor/background-executor.js +322 -0
- package/dist/capability/executor/background-executor.js.map +1 -0
- package/dist/capability/executor/foreground-executor.d.ts +26 -0
- package/dist/capability/executor/foreground-executor.d.ts.map +1 -0
- package/dist/capability/executor/foreground-executor.js +82 -0
- package/dist/capability/executor/foreground-executor.js.map +1 -0
- package/dist/capability/executor/orchestrator.d.ts +38 -0
- package/dist/capability/executor/orchestrator.d.ts.map +1 -0
- package/dist/capability/executor/orchestrator.js +158 -0
- package/dist/capability/executor/orchestrator.js.map +1 -0
- package/dist/capability/executor/stream-parser.d.ts +73 -0
- package/dist/capability/executor/stream-parser.d.ts.map +1 -0
- package/dist/capability/executor/stream-parser.js +56 -0
- package/dist/capability/executor/stream-parser.js.map +1 -0
- package/dist/capability/executor/types.d.ts +44 -0
- package/dist/capability/executor/types.d.ts.map +1 -0
- package/dist/capability/executor/types.js +9 -0
- package/dist/capability/executor/types.js.map +1 -0
- package/dist/capability/executor/worker-auth-probe.d.ts +30 -0
- package/dist/capability/executor/worker-auth-probe.d.ts.map +1 -0
- package/dist/capability/executor/worker-auth-probe.js +108 -0
- package/dist/capability/executor/worker-auth-probe.js.map +1 -0
- package/dist/capability/methodologies/bmad.yaml +17 -5
- package/dist/capability/methodologies/code-quality-audit.yaml +26 -0
- package/dist/capability/methodologies/harness-engineering.yaml +12 -6
- package/dist/capability/methodologies/test-coverage-scan.yaml +26 -0
- package/dist/capability/methodology-planner.d.ts +17 -1
- package/dist/capability/methodology-planner.d.ts.map +1 -1
- package/dist/capability/methodology-planner.js +125 -0
- package/dist/capability/methodology-planner.js.map +1 -1
- package/dist/capability/methodology-registry.d.ts.map +1 -1
- package/dist/capability/methodology-registry.js +21 -5
- package/dist/capability/methodology-registry.js.map +1 -1
- package/dist/capability/types.d.ts +12 -1
- package/dist/capability/types.d.ts.map +1 -1
- package/dist/core/ai/provider.d.ts +17 -9
- package/dist/core/ai/provider.d.ts.map +1 -1
- package/dist/core/ai/provider.js +130 -23
- package/dist/core/ai/provider.js.map +1 -1
- package/dist/core/ai/types.d.ts +26 -5
- package/dist/core/ai/types.d.ts.map +1 -1
- package/dist/core/storage/rows.d.ts +153 -0
- package/dist/core/storage/rows.d.ts.map +1 -0
- package/dist/core/storage/rows.js +14 -0
- package/dist/core/storage/rows.js.map +1 -0
- package/dist/core/storage/schema.sql +26 -2
- package/dist/core/storage/sqlite.d.ts +112 -6
- package/dist/core/storage/sqlite.d.ts.map +1 -1
- package/dist/core/storage/sqlite.js +480 -22
- package/dist/core/storage/sqlite.js.map +1 -1
- package/dist/core/utils/token-tracker.d.ts +40 -0
- package/dist/core/utils/token-tracker.d.ts.map +1 -0
- package/dist/core/utils/token-tracker.js +70 -0
- package/dist/core/utils/token-tracker.js.map +1 -0
- package/dist/daemon/handlers/methodology-formatter.d.ts +7 -0
- package/dist/daemon/handlers/methodology-formatter.d.ts.map +1 -1
- package/dist/daemon/handlers/methodology-formatter.js +46 -0
- package/dist/daemon/handlers/methodology-formatter.js.map +1 -1
- package/dist/daemon/handlers/post-tool-use.d.ts +1 -0
- package/dist/daemon/handlers/post-tool-use.d.ts.map +1 -1
- package/dist/daemon/handlers/post-tool-use.js +7 -0
- package/dist/daemon/handlers/post-tool-use.js.map +1 -1
- package/dist/daemon/handlers/stop.d.ts +17 -1
- package/dist/daemon/handlers/stop.d.ts.map +1 -1
- package/dist/daemon/handlers/stop.js +97 -1
- package/dist/daemon/handlers/stop.js.map +1 -1
- package/dist/daemon/handlers/user-prompt.d.ts.map +1 -1
- package/dist/daemon/handlers/user-prompt.js +97 -5
- package/dist/daemon/handlers/user-prompt.js.map +1 -1
- package/dist/daemon/idle-detector.d.ts +35 -0
- package/dist/daemon/idle-detector.d.ts.map +1 -0
- package/dist/daemon/idle-detector.js +56 -0
- package/dist/daemon/idle-detector.js.map +1 -0
- package/dist/daemon/idle-trigger.d.ts +53 -0
- package/dist/daemon/idle-trigger.d.ts.map +1 -0
- package/dist/daemon/idle-trigger.js +153 -0
- package/dist/daemon/idle-trigger.js.map +1 -0
- package/dist/daemon/index.d.ts.map +1 -1
- package/dist/daemon/index.js +49 -2
- package/dist/daemon/index.js.map +1 -1
- package/dist/daemon/methodology-pending-queue.d.ts +33 -0
- package/dist/daemon/methodology-pending-queue.d.ts.map +1 -0
- package/dist/daemon/methodology-pending-queue.js +120 -0
- package/dist/daemon/methodology-pending-queue.js.map +1 -0
- package/dist/daemon/routing-observer.d.ts +2 -1
- package/dist/daemon/routing-observer.d.ts.map +1 -1
- package/dist/daemon/routing-observer.js +117 -39
- package/dist/daemon/routing-observer.js.map +1 -1
- package/dist/engine/agent-router.d.ts +6 -0
- package/dist/engine/agent-router.d.ts.map +1 -1
- package/dist/engine/agent-router.js +13 -1
- package/dist/engine/agent-router.js.map +1 -1
- package/dist/engine/conventions/routing.yaml +15 -0
- package/dist/engine/dsl/compiler.d.ts.map +1 -1
- package/dist/engine/dsl/compiler.js +85 -3
- package/dist/engine/dsl/compiler.js.map +1 -1
- package/dist/engine/recommender.d.ts.map +1 -1
- package/dist/engine/recommender.js +10 -1
- package/dist/engine/recommender.js.map +1 -1
- package/dist/intelligence/classifier.d.ts +6 -0
- package/dist/intelligence/classifier.d.ts.map +1 -1
- package/dist/intelligence/classifier.js +57 -0
- package/dist/intelligence/classifier.js.map +1 -1
- package/dist/skills/registry.d.ts +6 -0
- package/dist/skills/registry.d.ts.map +1 -1
- package/dist/skills/registry.js +49 -14
- package/dist/skills/registry.js.map +1 -1
- package/dist/skills/semantic-matcher.d.ts +1 -0
- package/dist/skills/semantic-matcher.d.ts.map +1 -1
- package/dist/skills/semantic-matcher.js +6 -1
- package/dist/skills/semantic-matcher.js.map +1 -1
- package/dist/web/auth-middleware.d.ts +22 -0
- package/dist/web/auth-middleware.d.ts.map +1 -0
- package/dist/web/auth-middleware.js +51 -0
- package/dist/web/auth-middleware.js.map +1 -0
- package/dist/web/routes/agents.d.ts +7 -0
- package/dist/web/routes/agents.d.ts.map +1 -0
- package/dist/web/routes/agents.js +192 -0
- package/dist/web/routes/agents.js.map +1 -0
- package/dist/web/routes/ai.d.ts +10 -0
- package/dist/web/routes/ai.d.ts.map +1 -0
- package/dist/web/routes/ai.js +197 -0
- package/dist/web/routes/ai.js.map +1 -0
- package/dist/web/routes/auth.d.ts +12 -0
- package/dist/web/routes/auth.d.ts.map +1 -0
- package/dist/web/routes/auth.js +20 -0
- package/dist/web/routes/auth.js.map +1 -0
- package/dist/web/routes/events.d.ts +11 -0
- package/dist/web/routes/events.d.ts.map +1 -0
- package/dist/web/routes/events.js +43 -0
- package/dist/web/routes/events.js.map +1 -0
- package/dist/web/routes/execution-trace.d.ts +13 -0
- package/dist/web/routes/execution-trace.d.ts.map +1 -0
- package/dist/web/routes/execution-trace.js +308 -0
- package/dist/web/routes/execution-trace.js.map +1 -0
- package/dist/web/routes/experiments.d.ts +15 -0
- package/dist/web/routes/experiments.d.ts.map +1 -0
- package/dist/web/routes/experiments.js +187 -0
- package/dist/web/routes/experiments.js.map +1 -0
- package/dist/web/routes/methodology.d.ts +12 -0
- package/dist/web/routes/methodology.d.ts.map +1 -0
- package/dist/web/routes/methodology.js +228 -0
- package/dist/web/routes/methodology.js.map +1 -0
- package/dist/web/routes/patch.d.ts +7 -0
- package/dist/web/routes/patch.d.ts.map +1 -0
- package/dist/web/routes/patch.js +106 -0
- package/dist/web/routes/patch.js.map +1 -0
- package/dist/web/routes/routing.d.ts +17 -0
- package/dist/web/routes/routing.d.ts.map +1 -0
- package/dist/web/routes/routing.js +582 -0
- package/dist/web/routes/routing.js.map +1 -0
- package/dist/web/routes/rules.d.ts +7 -0
- package/dist/web/routes/rules.d.ts.map +1 -0
- package/dist/web/routes/rules.js +105 -0
- package/dist/web/routes/rules.js.map +1 -0
- package/dist/web/routes/sessions.d.ts +10 -0
- package/dist/web/routes/sessions.d.ts.map +1 -0
- package/dist/web/routes/sessions.js +234 -0
- package/dist/web/routes/sessions.js.map +1 -0
- package/dist/web/routes/skills.d.ts +10 -0
- package/dist/web/routes/skills.d.ts.map +1 -0
- package/dist/web/routes/skills.js +272 -0
- package/dist/web/routes/skills.js.map +1 -0
- package/dist/web/routes/static.d.ts +19 -0
- package/dist/web/routes/static.d.ts.map +1 -0
- package/dist/web/routes/static.js +61 -0
- package/dist/web/routes/static.js.map +1 -0
- package/dist/web/routes/status.d.ts +7 -0
- package/dist/web/routes/status.d.ts.map +1 -0
- package/dist/web/routes/status.js +28 -0
- package/dist/web/routes/status.js.map +1 -0
- package/dist/web/routes/token-usage.d.ts +7 -0
- package/dist/web/routes/token-usage.d.ts.map +1 -0
- package/dist/web/routes/token-usage.js +33 -0
- package/dist/web/routes/token-usage.js.map +1 -0
- package/dist/web/routes/types.d.ts +40 -0
- package/dist/web/routes/types.d.ts.map +1 -0
- package/dist/web/routes/types.js +52 -0
- package/dist/web/routes/types.js.map +1 -0
- package/dist/web/server.d.ts +13 -4
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +60 -2210
- package/dist/web/server.js.map +1 -1
- package/dist/web/ssrf-guard.d.ts +35 -0
- package/dist/web/ssrf-guard.d.ts.map +1 -0
- package/dist/web/ssrf-guard.js +93 -0
- package/dist/web/ssrf-guard.js.map +1 -0
- package/dist/web/static/assets/AIConfig-D-vrYoJ3.js +2 -0
- package/dist/web/static/assets/AIConfig-D-vrYoJ3.js.map +1 -0
- package/dist/web/static/assets/Agents-DAGWYsJj.js +2 -0
- package/dist/web/static/assets/Agents-DAGWYsJj.js.map +1 -0
- package/dist/web/static/assets/CodeBlock--H53gk46.js +2 -0
- package/dist/web/static/assets/CodeBlock--H53gk46.js.map +1 -0
- package/dist/web/static/assets/Dashboard-qUCxXFSI.js +2 -0
- package/dist/web/static/assets/Dashboard-qUCxXFSI.js.map +1 -0
- package/dist/web/static/assets/Drawer-DeKukfwJ.js +2 -0
- package/dist/web/static/assets/Drawer-DeKukfwJ.js.map +1 -0
- package/dist/web/static/assets/Events-BoQ8Fo5k.js +2 -0
- package/dist/web/static/assets/Events-BoQ8Fo5k.js.map +1 -0
- package/dist/web/static/assets/ExecutionTrace-sFZ_vHNf.js +2 -0
- package/dist/web/static/assets/ExecutionTrace-sFZ_vHNf.js.map +1 -0
- package/dist/web/static/assets/MarkdownRenderer-CCIz1MOz.js +2 -0
- package/dist/web/static/assets/MarkdownRenderer-CCIz1MOz.js.map +1 -0
- package/dist/web/static/assets/Methodologies-C0-Keokj.js +5 -0
- package/dist/web/static/assets/Methodologies-C0-Keokj.js.map +1 -0
- package/dist/web/static/assets/MethodologyDetail-Do1taSKM.js +2 -0
- package/dist/web/static/assets/MethodologyDetail-Do1taSKM.js.map +1 -0
- package/dist/web/static/assets/Routing-CFmM7JuB.js +2 -0
- package/dist/web/static/assets/Routing-CFmM7JuB.js.map +1 -0
- package/dist/web/static/assets/SessionDetail-DzTue2xK.js +2 -0
- package/dist/web/static/assets/SessionDetail-DzTue2xK.js.map +1 -0
- package/dist/web/static/assets/Sessions-Bjf-Mvwb.js +2 -0
- package/dist/web/static/assets/Sessions-Bjf-Mvwb.js.map +1 -0
- package/dist/web/static/assets/Skills-CrLshkrJ.js +2 -0
- package/dist/web/static/assets/Skills-CrLshkrJ.js.map +1 -0
- package/dist/web/static/assets/charts-CLrM0_uM.js +37 -0
- package/dist/web/static/assets/charts-CLrM0_uM.js.map +1 -0
- package/dist/web/static/assets/date-fns-CZ_bHujz.js +2 -0
- package/dist/web/static/assets/date-fns-CZ_bHujz.js.map +1 -0
- package/dist/web/static/assets/export-CEzDNM66.js +4 -0
- package/dist/web/static/assets/export-CEzDNM66.js.map +1 -0
- package/dist/web/static/assets/index-D23sAOAt.js +3 -0
- package/dist/web/static/assets/index-D23sAOAt.js.map +1 -0
- package/dist/web/static/assets/index-Drpf7sLl.css +1 -0
- package/dist/web/static/assets/lucide-DjB4fWNj.js +227 -0
- package/dist/web/static/assets/lucide-DjB4fWNj.js.map +1 -0
- package/dist/web/static/assets/query-C99w429o.js +2 -0
- package/dist/web/static/assets/query-C99w429o.js.map +1 -0
- package/dist/web/static/assets/react-router-I-HqunH7.js +20 -0
- package/dist/web/static/assets/react-router-I-HqunH7.js.map +1 -0
- package/dist/web/static/assets/react-vendor-CSp-GLFF.js +49 -0
- package/dist/web/static/assets/react-vendor-CSp-GLFF.js.map +1 -0
- package/dist/web/static/assets/syntax-highlighter-44FakypI.js +9 -0
- package/dist/web/static/assets/syntax-highlighter-44FakypI.js.map +1 -0
- package/dist/web/static/assets/vendor-CMMjVdZs.js +64 -0
- package/dist/web/static/assets/vendor-CMMjVdZs.js.map +1 -0
- package/dist/web/static/index.html +8 -2
- package/package.json +3 -2
- package/dist/web/static/assets/index-CtylfoaN.css +0 -1
- package/dist/web/static/assets/index-DnaQt27h.js +0 -388
- 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
|
-
//
|
|
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;
|
|
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"}
|
package/dist/daemon/index.js
CHANGED
|
@@ -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
|
-
|
|
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();
|