@winspan/claude-forge 8.34.0 → 8.36.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 +10 -30
- package/dist/capability/index.d.ts +6 -5
- package/dist/capability/index.d.ts.map +1 -1
- package/dist/capability/index.js +6 -5
- package/dist/capability/index.js.map +1 -1
- package/dist/capability/types.d.ts +5 -74
- package/dist/capability/types.d.ts.map +1 -1
- package/dist/capability/types.js +4 -1
- package/dist/capability/types.js.map +1 -1
- package/dist/core/ai/provider.d.ts +23 -1
- package/dist/core/ai/provider.d.ts.map +1 -1
- package/dist/core/ai/provider.js +67 -1
- package/dist/core/ai/provider.js.map +1 -1
- package/dist/core/ai/types.d.ts +28 -0
- package/dist/core/ai/types.d.ts.map +1 -1
- package/dist/core/storage/rows.d.ts +0 -36
- package/dist/core/storage/rows.d.ts.map +1 -1
- package/dist/core/storage/schema.sql +1 -45
- package/dist/core/storage/sqlite.d.ts +2 -79
- package/dist/core/storage/sqlite.d.ts.map +1 -1
- package/dist/core/storage/sqlite.js +3 -362
- package/dist/core/storage/sqlite.js.map +1 -1
- package/dist/core/utils/token-tracker.d.ts +0 -1
- package/dist/core/utils/token-tracker.d.ts.map +1 -1
- package/dist/core/utils/token-tracker.js +0 -1
- package/dist/core/utils/token-tracker.js.map +1 -1
- package/dist/daemon/handlers/post-tool-use.d.ts +1 -9
- package/dist/daemon/handlers/post-tool-use.d.ts.map +1 -1
- package/dist/daemon/handlers/post-tool-use.js +2 -99
- package/dist/daemon/handlers/post-tool-use.js.map +1 -1
- package/dist/daemon/handlers/stop.d.ts +1 -15
- package/dist/daemon/handlers/stop.d.ts.map +1 -1
- package/dist/daemon/handlers/stop.js +1 -95
- package/dist/daemon/handlers/stop.js.map +1 -1
- package/dist/daemon/handlers/user-prompt.d.ts +1 -5
- package/dist/daemon/handlers/user-prompt.d.ts.map +1 -1
- package/dist/daemon/handlers/user-prompt.js +29 -99
- package/dist/daemon/handlers/user-prompt.js.map +1 -1
- package/dist/daemon/index.d.ts.map +1 -1
- package/dist/daemon/index.js +9 -56
- package/dist/daemon/index.js.map +1 -1
- package/dist/engine/agent-router.d.ts +37 -0
- package/dist/engine/agent-router.d.ts.map +1 -1
- package/dist/engine/agent-router.js +58 -0
- package/dist/engine/agent-router.js.map +1 -1
- package/dist/engine/conventions/routing.yaml +31 -2
- package/dist/intelligence/classifier.d.ts +63 -43
- package/dist/intelligence/classifier.d.ts.map +1 -1
- package/dist/intelligence/classifier.js +256 -191
- package/dist/intelligence/classifier.js.map +1 -1
- package/dist/intelligence/context-gatherer.d.ts +101 -0
- package/dist/intelligence/context-gatherer.d.ts.map +1 -0
- package/dist/intelligence/context-gatherer.js +417 -0
- package/dist/intelligence/context-gatherer.js.map +1 -0
- package/dist/intelligence/cot-classifier.d.ts +95 -0
- package/dist/intelligence/cot-classifier.d.ts.map +1 -0
- package/dist/intelligence/cot-classifier.js +391 -0
- package/dist/intelligence/cot-classifier.js.map +1 -0
- package/dist/intelligence/execution-doc-builder.d.ts +90 -0
- package/dist/intelligence/execution-doc-builder.d.ts.map +1 -1
- package/dist/intelligence/execution-doc-builder.js +459 -42
- package/dist/intelligence/execution-doc-builder.js.map +1 -1
- package/dist/intelligence/intent-types.d.ts +13 -0
- package/dist/intelligence/intent-types.d.ts.map +1 -0
- package/dist/intelligence/intent-types.js +19 -0
- package/dist/intelligence/intent-types.js.map +1 -0
- package/dist/intelligence/multimodal-parser.d.ts +105 -0
- package/dist/intelligence/multimodal-parser.d.ts.map +1 -0
- package/dist/intelligence/multimodal-parser.js +425 -0
- package/dist/intelligence/multimodal-parser.js.map +1 -0
- package/dist/skills/official-skills.d.ts.map +1 -1
- package/dist/skills/official-skills.js +218 -20
- package/dist/skills/official-skills.js.map +1 -1
- package/dist/web/routes/status.d.ts.map +1 -1
- package/dist/web/routes/status.js +8 -10
- package/dist/web/routes/status.js.map +1 -1
- package/dist/web/routes/token-usage.d.ts +1 -1
- package/dist/web/routes/token-usage.d.ts.map +1 -1
- package/dist/web/routes/token-usage.js +1 -16
- package/dist/web/routes/token-usage.js.map +1 -1
- package/dist/web/routes/types.d.ts +0 -6
- package/dist/web/routes/types.d.ts.map +1 -1
- package/dist/web/routes/types.js.map +1 -1
- package/dist/web/server.d.ts +0 -6
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +0 -5
- package/dist/web/server.js.map +1 -1
- package/dist/web/static/assets/{AIConfig-DiUFET_Q.js → AIConfig-D4VglzCl.js} +2 -2
- package/dist/web/static/assets/{AIConfig-DiUFET_Q.js.map → AIConfig-D4VglzCl.js.map} +1 -1
- package/dist/web/static/assets/{Agents-bNNGbQnL.js → Agents-ne5lXc7V.js} +2 -2
- package/dist/web/static/assets/{Agents-bNNGbQnL.js.map → Agents-ne5lXc7V.js.map} +1 -1
- package/dist/web/static/assets/Dashboard-D4j0Zmek.js +2 -0
- package/dist/web/static/assets/Dashboard-D4j0Zmek.js.map +1 -0
- package/dist/web/static/assets/{Drawer-DOUcx6m1.js → Drawer-Lo5ihVP-.js} +2 -2
- package/dist/web/static/assets/{Drawer-DOUcx6m1.js.map → Drawer-Lo5ihVP-.js.map} +1 -1
- package/dist/web/static/assets/{Events-DQHP6Uaq.js → Events-DBJ1B7OW.js} +2 -2
- package/dist/web/static/assets/{Events-DQHP6Uaq.js.map → Events-DBJ1B7OW.js.map} +1 -1
- package/dist/web/static/assets/{ExecutionTrace-Co8ARdg-.js → ExecutionTrace-Du9XADc1.js} +2 -2
- package/dist/web/static/assets/{ExecutionTrace-Co8ARdg-.js.map → ExecutionTrace-Du9XADc1.js.map} +1 -1
- package/dist/web/static/assets/{Routing-BW3eGD-8.js → Routing-BNQ09OlH.js} +2 -2
- package/dist/web/static/assets/{Routing-BW3eGD-8.js.map → Routing-BNQ09OlH.js.map} +1 -1
- package/dist/web/static/assets/{SessionDetail-Cbd7Jwox.js → SessionDetail-BPrPyMNa.js} +2 -2
- package/dist/web/static/assets/{SessionDetail-Cbd7Jwox.js.map → SessionDetail-BPrPyMNa.js.map} +1 -1
- package/dist/web/static/assets/{Sessions-ZQSCgXyy.js → Sessions-o3EXsXz9.js} +2 -2
- package/dist/web/static/assets/{Sessions-ZQSCgXyy.js.map → Sessions-o3EXsXz9.js.map} +1 -1
- package/dist/web/static/assets/{Skills-C5-5zOSH.js → Skills-Czt5mkyc.js} +2 -2
- package/dist/web/static/assets/{Skills-C5-5zOSH.js.map → Skills-Czt5mkyc.js.map} +1 -1
- package/dist/web/static/assets/{export-CbQTOt71.js → export-C0mlC4AT.js} +2 -2
- package/dist/web/static/assets/{export-CbQTOt71.js.map → export-C0mlC4AT.js.map} +1 -1
- package/dist/web/static/assets/index-B1J7nBu0.js +3 -0
- package/dist/web/static/assets/index-B1J7nBu0.js.map +1 -0
- package/dist/web/static/assets/index-BVqk4bSO.css +1 -0
- package/dist/web/static/assets/{lucide-BanPULT1.js → lucide-Bu44HVAM.js} +33 -73
- package/dist/web/static/assets/lucide-Bu44HVAM.js.map +1 -0
- package/dist/web/static/index.html +3 -3
- package/package.json +2 -2
- package/dist/capability/execution-manager.d.ts +0 -96
- package/dist/capability/execution-manager.d.ts.map +0 -1
- package/dist/capability/execution-manager.js +0 -260
- package/dist/capability/execution-manager.js.map +0 -1
- package/dist/capability/executor/background-executor.d.ts +0 -58
- package/dist/capability/executor/background-executor.d.ts.map +0 -1
- package/dist/capability/executor/background-executor.js +0 -322
- package/dist/capability/executor/background-executor.js.map +0 -1
- package/dist/capability/executor/foreground-executor.d.ts +0 -26
- package/dist/capability/executor/foreground-executor.d.ts.map +0 -1
- package/dist/capability/executor/foreground-executor.js +0 -82
- package/dist/capability/executor/foreground-executor.js.map +0 -1
- package/dist/capability/executor/orchestrator.d.ts +0 -38
- package/dist/capability/executor/orchestrator.d.ts.map +0 -1
- package/dist/capability/executor/orchestrator.js +0 -158
- package/dist/capability/executor/orchestrator.js.map +0 -1
- package/dist/capability/executor/stream-parser.d.ts +0 -73
- package/dist/capability/executor/stream-parser.d.ts.map +0 -1
- package/dist/capability/executor/stream-parser.js +0 -56
- package/dist/capability/executor/stream-parser.js.map +0 -1
- package/dist/capability/executor/types.d.ts +0 -44
- package/dist/capability/executor/types.d.ts.map +0 -1
- package/dist/capability/executor/types.js +0 -9
- package/dist/capability/executor/types.js.map +0 -1
- package/dist/capability/executor/worker-auth-probe.d.ts +0 -30
- package/dist/capability/executor/worker-auth-probe.d.ts.map +0 -1
- package/dist/capability/executor/worker-auth-probe.js +0 -108
- package/dist/capability/executor/worker-auth-probe.js.map +0 -1
- package/dist/capability/methodologies/bmad.yaml +0 -81
- package/dist/capability/methodologies/code-quality-audit.yaml +0 -26
- package/dist/capability/methodologies/harness-engineering.yaml +0 -75
- package/dist/capability/methodologies/test-coverage-scan.yaml +0 -26
- package/dist/capability/methodology-planner.d.ts +0 -49
- package/dist/capability/methodology-planner.d.ts.map +0 -1
- package/dist/capability/methodology-planner.js +0 -306
- package/dist/capability/methodology-planner.js.map +0 -1
- package/dist/capability/methodology-registry.d.ts +0 -32
- package/dist/capability/methodology-registry.d.ts.map +0 -1
- package/dist/capability/methodology-registry.js +0 -113
- package/dist/capability/methodology-registry.js.map +0 -1
- package/dist/daemon/handlers/methodology-formatter.d.ts +0 -16
- package/dist/daemon/handlers/methodology-formatter.d.ts.map +0 -1
- package/dist/daemon/handlers/methodology-formatter.js +0 -119
- package/dist/daemon/handlers/methodology-formatter.js.map +0 -1
- package/dist/daemon/idle-detector.d.ts +0 -35
- package/dist/daemon/idle-detector.d.ts.map +0 -1
- package/dist/daemon/idle-detector.js +0 -56
- package/dist/daemon/idle-detector.js.map +0 -1
- package/dist/daemon/idle-trigger.d.ts +0 -53
- package/dist/daemon/idle-trigger.d.ts.map +0 -1
- package/dist/daemon/idle-trigger.js +0 -153
- package/dist/daemon/idle-trigger.js.map +0 -1
- package/dist/daemon/methodology-pending-queue.d.ts +0 -33
- package/dist/daemon/methodology-pending-queue.d.ts.map +0 -1
- package/dist/daemon/methodology-pending-queue.js +0 -120
- package/dist/daemon/methodology-pending-queue.js.map +0 -1
- package/dist/web/routes/methodology.d.ts +0 -12
- package/dist/web/routes/methodology.d.ts.map +0 -1
- package/dist/web/routes/methodology.js +0 -228
- package/dist/web/routes/methodology.js.map +0 -1
- package/dist/web/static/assets/Dashboard-Ciyyw6ph.js +0 -2
- package/dist/web/static/assets/Dashboard-Ciyyw6ph.js.map +0 -1
- package/dist/web/static/assets/Methodologies-CXNrDXwG.js +0 -5
- package/dist/web/static/assets/Methodologies-CXNrDXwG.js.map +0 -1
- package/dist/web/static/assets/MethodologyDetail-rV3W1utf.js +0 -2
- package/dist/web/static/assets/MethodologyDetail-rV3W1utf.js.map +0 -1
- package/dist/web/static/assets/index-DJK5beK6.js +0 -3
- package/dist/web/static/assets/index-DJK5beK6.js.map +0 -1
- package/dist/web/static/assets/index-phpuytMI.css +0 -1
- package/dist/web/static/assets/lucide-BanPULT1.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"methodology-planner.js","sourceRoot":"","sources":["../../src/capability/methodology-planner.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Methodology Registry
|
|
3
|
-
*
|
|
4
|
-
* 加载和管理方法论定义
|
|
5
|
-
*/
|
|
6
|
-
import type { Methodology } from './types.js';
|
|
7
|
-
import type { IntentAnalysis } from '../intelligence/classifier.js';
|
|
8
|
-
export declare class MethodologyRegistry {
|
|
9
|
-
private methodologies;
|
|
10
|
-
constructor();
|
|
11
|
-
/**
|
|
12
|
-
* 加载所有方法论定义
|
|
13
|
-
*/
|
|
14
|
-
private loadAll;
|
|
15
|
-
/**
|
|
16
|
-
* 根据 intent 匹配方法论
|
|
17
|
-
*/
|
|
18
|
-
match(intent: IntentAnalysis): Methodology | null;
|
|
19
|
-
/**
|
|
20
|
-
* 检查方法论是否匹配 intent
|
|
21
|
-
*/
|
|
22
|
-
private isMatch;
|
|
23
|
-
/**
|
|
24
|
-
* 根据 ID 获取方法论
|
|
25
|
-
*/
|
|
26
|
-
get(id: string): Methodology | undefined;
|
|
27
|
-
/**
|
|
28
|
-
* 获取所有方法论
|
|
29
|
-
*/
|
|
30
|
-
getAll(): Methodology[];
|
|
31
|
-
}
|
|
32
|
-
//# sourceMappingURL=methodology-registry.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"methodology-registry.d.ts","sourceRoot":"","sources":["../../src/capability/methodology-registry.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAMpE,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,aAAa,CAAuC;;IAM5D;;OAEG;IACH,OAAO,CAAC,OAAO;IAwBf;;OAEG;IACH,KAAK,CAAC,MAAM,EAAE,cAAc,GAAG,WAAW,GAAG,IAAI;IASjD;;OAEG;IACH,OAAO,CAAC,OAAO;IAkDf;;OAEG;IACH,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAIxC;;OAEG;IACH,MAAM,IAAI,WAAW,EAAE;CAGxB"}
|
|
@@ -1,113 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Methodology Registry
|
|
3
|
-
*
|
|
4
|
-
* 加载和管理方法论定义
|
|
5
|
-
*/
|
|
6
|
-
import { readFileSync, readdirSync } from 'fs';
|
|
7
|
-
import { join, dirname } from 'path';
|
|
8
|
-
import { fileURLToPath } from 'url';
|
|
9
|
-
import { parse as parseYaml } from 'yaml';
|
|
10
|
-
import { logger } from '../core/utils/logger.js';
|
|
11
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
12
|
-
const __dirname = dirname(__filename);
|
|
13
|
-
export class MethodologyRegistry {
|
|
14
|
-
methodologies = new Map();
|
|
15
|
-
constructor() {
|
|
16
|
-
this.loadAll();
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* 加载所有方法论定义
|
|
20
|
-
*/
|
|
21
|
-
loadAll() {
|
|
22
|
-
const methodologiesDir = join(__dirname, 'methodologies');
|
|
23
|
-
try {
|
|
24
|
-
const files = readdirSync(methodologiesDir).filter(f => f.endsWith('.yaml'));
|
|
25
|
-
for (const file of files) {
|
|
26
|
-
try {
|
|
27
|
-
const content = readFileSync(join(methodologiesDir, file), 'utf-8');
|
|
28
|
-
const methodology = parseYaml(content);
|
|
29
|
-
this.methodologies.set(methodology.id, methodology);
|
|
30
|
-
logger.info(`[MethodologyRegistry] Loaded: ${methodology.id}`);
|
|
31
|
-
}
|
|
32
|
-
catch (err) {
|
|
33
|
-
logger.warn(`[MethodologyRegistry] Failed to load ${file}: ${err}`);
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
logger.info(`[MethodologyRegistry] Loaded ${this.methodologies.size} methodologies`);
|
|
37
|
-
}
|
|
38
|
-
catch (err) {
|
|
39
|
-
logger.warn(`[MethodologyRegistry] Failed to load methodologies: ${err}`);
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* 根据 intent 匹配方法论
|
|
44
|
-
*/
|
|
45
|
-
match(intent) {
|
|
46
|
-
for (const methodology of this.methodologies.values()) {
|
|
47
|
-
if (this.isMatch(methodology, intent)) {
|
|
48
|
-
return methodology;
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
return null;
|
|
52
|
-
}
|
|
53
|
-
/**
|
|
54
|
-
* 检查方法论是否匹配 intent
|
|
55
|
-
*/
|
|
56
|
-
isMatch(methodology, intent) {
|
|
57
|
-
const trigger = methodology.trigger;
|
|
58
|
-
// Idle-only 方法论守卫:若 taskType / complexity / keywords 三个维度都未声明
|
|
59
|
-
// (字段缺失或为空数组),说明该方法论不参与基于 intent 的匹配(例如 idle 专用)。
|
|
60
|
-
// 否则"空数组"会被当作"无约束",从而对任意 intent 都返回 true,产生误匹配。
|
|
61
|
-
const hasTaskType = Array.isArray(trigger.taskType) && trigger.taskType.length > 0;
|
|
62
|
-
const hasComplexity = Array.isArray(trigger.complexity) && trigger.complexity.length > 0;
|
|
63
|
-
const hasKeywords = Array.isArray(trigger.keywords) && trigger.keywords.length > 0;
|
|
64
|
-
if (!hasTaskType && !hasComplexity && !hasKeywords) {
|
|
65
|
-
logger.debug(`[MethodologyRegistry] ${methodology.id} skipped: no intent-based trigger declared (idle-only)`);
|
|
66
|
-
return false;
|
|
67
|
-
}
|
|
68
|
-
// 检查 taskType
|
|
69
|
-
if (trigger.taskType && trigger.taskType.length > 0) {
|
|
70
|
-
if (!trigger.taskType.includes(intent.taskType)) {
|
|
71
|
-
logger.debug(`[MethodologyRegistry] ${methodology.id} taskType mismatch: expected ${trigger.taskType.join('|')}, got ${intent.taskType}`);
|
|
72
|
-
return false;
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
// 检查 complexity
|
|
76
|
-
if (trigger.complexity && trigger.complexity.length > 0) {
|
|
77
|
-
if (!trigger.complexity.includes(intent.complexity)) {
|
|
78
|
-
logger.debug(`[MethodologyRegistry] ${methodology.id} complexity mismatch: expected ${trigger.complexity.join('|')}, got ${intent.complexity}`);
|
|
79
|
-
return false;
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
// 检查 keywords - 如果 YAML 定义了 keywords(数组非空),则要求 intent.requirement
|
|
83
|
-
// 或 intent.searchKeywords 至少命中一个 keyword(大小写不敏感、子串匹配)
|
|
84
|
-
if (trigger.keywords && trigger.keywords.length > 0) {
|
|
85
|
-
const haystack = [
|
|
86
|
-
intent.requirement ?? '',
|
|
87
|
-
...(intent.searchKeywords ?? []),
|
|
88
|
-
]
|
|
89
|
-
.join(' ')
|
|
90
|
-
.toLowerCase();
|
|
91
|
-
const hit = trigger.keywords.some(kw => haystack.includes(kw.toLowerCase()));
|
|
92
|
-
if (!hit) {
|
|
93
|
-
logger.debug(`[MethodologyRegistry] ${methodology.id} keywords not matched: requirement="${intent.requirement}", searchKeywords=${JSON.stringify(intent.searchKeywords)}, expected one of ${trigger.keywords.join('|')}`);
|
|
94
|
-
return false;
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
logger.debug(`[MethodologyRegistry] ${methodology.id} matched!`);
|
|
98
|
-
return true;
|
|
99
|
-
}
|
|
100
|
-
/**
|
|
101
|
-
* 根据 ID 获取方法论
|
|
102
|
-
*/
|
|
103
|
-
get(id) {
|
|
104
|
-
return this.methodologies.get(id);
|
|
105
|
-
}
|
|
106
|
-
/**
|
|
107
|
-
* 获取所有方法论
|
|
108
|
-
*/
|
|
109
|
-
getAll() {
|
|
110
|
-
return Array.from(this.methodologies.values());
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
//# sourceMappingURL=methodology-registry.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"methodology-registry.js","sourceRoot":"","sources":["../../src/capability/methodology-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Methodology Directive Formatter
|
|
3
|
-
*
|
|
4
|
-
* 格式化方法论执行指令(Ruflo 风格)
|
|
5
|
-
*/
|
|
6
|
-
import type { Methodology, ExecutionPlan, PlannedPhase } from '../../capability/types.js';
|
|
7
|
-
export declare function formatMethodologyPhaseDirective(methodology: Methodology, plan: ExecutionPlan, phase: PlannedPhase, phaseIndex: number, executionId: number): string;
|
|
8
|
-
/**
|
|
9
|
-
* 格式化给后台 worker 子进程的 phase directive。
|
|
10
|
-
*
|
|
11
|
-
* 和前台版本的区别:worker 本身**就是**那个 agent,不能再要求它调 Agent/Task 工具。
|
|
12
|
-
* 这里直接把 phase 的 prompt 当作任务本体,让 worker 以该 agent 的身份直接完成并回写结果。
|
|
13
|
-
*/
|
|
14
|
-
export declare function formatMethodologyPhaseDirectiveForWorker(methodology: Methodology, plan: ExecutionPlan, phase: PlannedPhase, phaseIndex: number, executionId: number): string;
|
|
15
|
-
export declare function formatMethodologyCompletionMessage(plan: ExecutionPlan): string;
|
|
16
|
-
//# sourceMappingURL=methodology-formatter.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"methodology-formatter.d.ts","sourceRoot":"","sources":["../../../src/daemon/handlers/methodology-formatter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAE1F,wBAAgB,+BAA+B,CAC7C,WAAW,EAAE,WAAW,EACxB,IAAI,EAAE,aAAa,EACnB,KAAK,EAAE,YAAY,EACnB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,GAClB,MAAM,CAkDR;AAED;;;;;GAKG;AACH,wBAAgB,wCAAwC,CACtD,WAAW,EAAE,WAAW,EACxB,IAAI,EAAE,aAAa,EACnB,KAAK,EAAE,YAAY,EACnB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,GAClB,MAAM,CAwCR;AAED,wBAAgB,kCAAkC,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,CAiB9E"}
|
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Methodology Directive Formatter
|
|
3
|
-
*
|
|
4
|
-
* 格式化方法论执行指令(Ruflo 风格)
|
|
5
|
-
*/
|
|
6
|
-
export function formatMethodologyPhaseDirective(methodology, plan, phase, phaseIndex, executionId) {
|
|
7
|
-
const totalPhases = plan.phases.length;
|
|
8
|
-
const phaseOverview = plan.phases
|
|
9
|
-
.map((p, i) => {
|
|
10
|
-
const marker = i === phaseIndex ? '← YOU ARE HERE' : (i < phaseIndex ? '✓' : '');
|
|
11
|
-
return ` ${i + 1}. ${p.id} (${p.agent}) ${marker}`;
|
|
12
|
-
})
|
|
13
|
-
.join('\n');
|
|
14
|
-
return `
|
|
15
|
-
╔═══════════════════════════════════════════════════════════════╗
|
|
16
|
-
║ METHODOLOGY: ${methodology.name.padEnd(48)} ║
|
|
17
|
-
║ EXECUTION PLAN: ${totalPhases} phases (AI-generated)${' '.repeat(28)} ║
|
|
18
|
-
╠═══════════════════════════════════════════════════════════════╣
|
|
19
|
-
║ CRITICAL: You MUST execute phases sequentially using Agent ║
|
|
20
|
-
║ DO NOT execute phases yourself - delegate to specialized agents ║
|
|
21
|
-
╚═══════════════════════════════════════════════════════════════╝
|
|
22
|
-
|
|
23
|
-
[METHODOLOGY_ACTIVE: ${methodology.id}]
|
|
24
|
-
[EXECUTION_ID: ${executionId}]
|
|
25
|
-
[CURRENT_PHASE: ${phaseIndex + 1}/${totalPhases}]
|
|
26
|
-
|
|
27
|
-
**PHASE ${phaseIndex + 1}: ${phase.id}**
|
|
28
|
-
Rationale: ${phase.rationale}
|
|
29
|
-
|
|
30
|
-
MANDATORY ACTION - MUST EXECUTE IMMEDIATELY:
|
|
31
|
-
Agent({
|
|
32
|
-
subagent_type: "${phase.agent}",
|
|
33
|
-
description: "Execute Phase ${phaseIndex + 1} of ${methodology.name}",
|
|
34
|
-
prompt: "${phase.prompt.replace(/"/g, '\\"')}"
|
|
35
|
-
})
|
|
36
|
-
|
|
37
|
-
EXECUTION PLAN OVERVIEW:
|
|
38
|
-
${phaseOverview}
|
|
39
|
-
|
|
40
|
-
Plan Rationale: ${plan.rationale}
|
|
41
|
-
|
|
42
|
-
AFTER Phase ${phaseIndex + 1} completes:
|
|
43
|
-
- System will verify artifacts
|
|
44
|
-
- System will inject Phase ${phaseIndex + 2} instruction (if exists)
|
|
45
|
-
|
|
46
|
-
FORBIDDEN:
|
|
47
|
-
- Do NOT execute Phase ${phaseIndex + 1} yourself
|
|
48
|
-
- Do NOT skip to Phase ${phaseIndex + 2}
|
|
49
|
-
- Do NOT call wrong agent (must be "${phase.agent}")
|
|
50
|
-
- Do NOT deviate from the execution plan
|
|
51
|
-
|
|
52
|
-
See CLAUDE.md "Behavioral Rules (Always Enforced)" for routing protocol.
|
|
53
|
-
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
54
|
-
`;
|
|
55
|
-
}
|
|
56
|
-
/**
|
|
57
|
-
* 格式化给后台 worker 子进程的 phase directive。
|
|
58
|
-
*
|
|
59
|
-
* 和前台版本的区别:worker 本身**就是**那个 agent,不能再要求它调 Agent/Task 工具。
|
|
60
|
-
* 这里直接把 phase 的 prompt 当作任务本体,让 worker 以该 agent 的身份直接完成并回写结果。
|
|
61
|
-
*/
|
|
62
|
-
export function formatMethodologyPhaseDirectiveForWorker(methodology, plan, phase, phaseIndex, executionId) {
|
|
63
|
-
const totalPhases = plan.phases.length;
|
|
64
|
-
const phaseOverview = plan.phases
|
|
65
|
-
.map((p, i) => {
|
|
66
|
-
const marker = i === phaseIndex ? '← current' : (i < phaseIndex ? '(done)' : '');
|
|
67
|
-
return ` ${i + 1}. ${p.id} (${p.agent}) ${marker}`.trimEnd();
|
|
68
|
-
})
|
|
69
|
-
.join('\n');
|
|
70
|
-
return `[METHODOLOGY_WORKER: ${methodology.id}] [EXECUTION_ID: ${executionId}] [PHASE: ${phaseIndex + 1}/${totalPhases}]
|
|
71
|
-
|
|
72
|
-
You ARE the \`${phase.agent}\` agent. You have been spawned as a background worker to execute phase ${phaseIndex + 1} of the "${methodology.name}" methodology.
|
|
73
|
-
|
|
74
|
-
Your job for this phase is to directly carry out the following task, in your capacity as the \`${phase.agent}\` agent. Respond directly, don't delegate, don't call an Agent/Task tool — you already are the agent.
|
|
75
|
-
|
|
76
|
-
──────────────────────────────────────────────────────────────
|
|
77
|
-
TASK (phase ${phaseIndex + 1}: ${phase.id})
|
|
78
|
-
──────────────────────────────────────────────────────────────
|
|
79
|
-
${phase.prompt}
|
|
80
|
-
|
|
81
|
-
──────────────────────────────────────────────────────────────
|
|
82
|
-
CONTEXT
|
|
83
|
-
──────────────────────────────────────────────────────────────
|
|
84
|
-
Methodology: ${methodology.name} (${methodology.id})
|
|
85
|
-
Phase rationale: ${phase.rationale}
|
|
86
|
-
Plan rationale: ${plan.rationale}
|
|
87
|
-
|
|
88
|
-
Plan overview:
|
|
89
|
-
${phaseOverview}
|
|
90
|
-
|
|
91
|
-
──────────────────────────────────────────────────────────────
|
|
92
|
-
RULES
|
|
93
|
-
──────────────────────────────────────────────────────────────
|
|
94
|
-
- You are the \`${phase.agent}\` agent. Act as that role.
|
|
95
|
-
- Do NOT invoke Agent/Task/subagent tools; those are not available and not needed.
|
|
96
|
-
- Do NOT try to execute other phases — only phase ${phaseIndex + 1}.
|
|
97
|
-
- When you're done, respond directly with your findings / output. The orchestrator will capture your final response and advance the plan.
|
|
98
|
-
|
|
99
|
-
Respond directly, don't delegate.
|
|
100
|
-
`;
|
|
101
|
-
}
|
|
102
|
-
export function formatMethodologyCompletionMessage(plan) {
|
|
103
|
-
const phaseList = plan.phases
|
|
104
|
-
.map((p, i) => ` ${i + 1}. ${p.id} (${p.agent}) ✓`)
|
|
105
|
-
.join('\n');
|
|
106
|
-
return `
|
|
107
|
-
╔═══════════════════════════════════════════════════════════════╗
|
|
108
|
-
║ METHODOLOGY EXECUTION COMPLETED ║
|
|
109
|
-
╚═══════════════════════════════════════════════════════════════╝
|
|
110
|
-
|
|
111
|
-
All ${plan.phases.length} phases finished successfully:
|
|
112
|
-
${phaseList}
|
|
113
|
-
|
|
114
|
-
Plan Rationale: ${plan.rationale}
|
|
115
|
-
|
|
116
|
-
You may now proceed with any follow-up tasks.
|
|
117
|
-
`;
|
|
118
|
-
}
|
|
119
|
-
//# sourceMappingURL=methodology-formatter.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"methodology-formatter.js","sourceRoot":"","sources":["../../../src/daemon/handlers/methodology-formatter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,UAAU,+BAA+B,CAC7C,WAAwB,EACxB,IAAmB,EACnB,KAAmB,EACnB,UAAkB,EAClB,WAAmB;IAEnB,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;IACvC,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM;SAC9B,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACZ,MAAM,MAAM,GAAG,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACjF,OAAO,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;IACtD,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,OAAO;;iBAEQ,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;oBACxB,WAAW,yBAAyB,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;;;;;;uBAM/C,WAAW,CAAC,EAAE;iBACpB,WAAW;kBACV,UAAU,GAAG,CAAC,IAAI,WAAW;;UAErC,UAAU,GAAG,CAAC,KAAK,KAAK,CAAC,EAAE;aACxB,KAAK,CAAC,SAAS;;;;sBAIN,KAAK,CAAC,KAAK;kCACC,UAAU,GAAG,CAAC,OAAO,WAAW,CAAC,IAAI;eACxD,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;;;;EAI9C,aAAa;;kBAEG,IAAI,CAAC,SAAS;;cAElB,UAAU,GAAG,CAAC;;+BAEG,UAAU,GAAG,CAAC;;;2BAGlB,UAAU,GAAG,CAAC;2BACd,UAAU,GAAG,CAAC;wCACD,KAAK,CAAC,KAAK;;;;;CAKlD,CAAC;AACF,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,wCAAwC,CACtD,WAAwB,EACxB,IAAmB,EACnB,KAAmB,EACnB,UAAkB,EAClB,WAAmB;IAEnB,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;IACvC,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM;SAC9B,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACZ,MAAM,MAAM,GAAG,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACjF,OAAO,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC,OAAO,EAAE,CAAC;IAChE,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,OAAO,wBAAwB,WAAW,CAAC,EAAE,oBAAoB,WAAW,aAAa,UAAU,GAAG,CAAC,IAAI,WAAW;;gBAExG,KAAK,CAAC,KAAK,2EAA2E,UAAU,GAAG,CAAC,YAAY,WAAW,CAAC,IAAI;;iGAE/C,KAAK,CAAC,KAAK;;;cAG9F,UAAU,GAAG,CAAC,KAAK,KAAK,CAAC,EAAE;;EAEvC,KAAK,CAAC,MAAM;;;;;eAKC,WAAW,CAAC,IAAI,KAAK,WAAW,CAAC,EAAE;mBAC/B,KAAK,CAAC,SAAS;kBAChB,IAAI,CAAC,SAAS;;;EAG9B,aAAa;;;;;kBAKG,KAAK,CAAC,KAAK;;oDAEuB,UAAU,GAAG,CAAC;;;;CAIjE,CAAC;AACF,CAAC;AAED,MAAM,UAAU,kCAAkC,CAAC,IAAmB;IACpE,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM;SAC1B,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,KAAK,KAAK,CAAC;SACnD,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,OAAO;;;;;MAKH,IAAI,CAAC,MAAM,CAAC,MAAM;EACtB,SAAS;;kBAEO,IAAI,CAAC,SAAS;;;CAG/B,CAAC;AACF,CAAC"}
|
|
@@ -1,35 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|
|
@@ -1,56 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|
|
@@ -1,53 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|
|
@@ -1,153 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"idle-trigger.js","sourceRoot":"","sources":["../../src/daemon/idle-trigger.ts"],"names":[],"mappings":"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"}
|