@winspan/claude-forge 8.33.5 → 8.35.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 (184) hide show
  1. package/README.md +10 -30
  2. package/dist/agents/definition.d.ts +3 -0
  3. package/dist/agents/definition.d.ts.map +1 -1
  4. package/dist/agents/definition.js +3 -0
  5. package/dist/agents/definition.js.map +1 -1
  6. package/dist/agents/official-agents.d.ts.map +1 -1
  7. package/dist/agents/official-agents.js +6 -3
  8. package/dist/agents/official-agents.js.map +1 -1
  9. package/dist/agents/registry.d.ts +17 -1
  10. package/dist/agents/registry.d.ts.map +1 -1
  11. package/dist/agents/registry.js +106 -7
  12. package/dist/agents/registry.js.map +1 -1
  13. package/dist/capability/index.d.ts +6 -5
  14. package/dist/capability/index.d.ts.map +1 -1
  15. package/dist/capability/index.js +6 -5
  16. package/dist/capability/index.js.map +1 -1
  17. package/dist/capability/types.d.ts +5 -74
  18. package/dist/capability/types.d.ts.map +1 -1
  19. package/dist/capability/types.js +4 -1
  20. package/dist/capability/types.js.map +1 -1
  21. package/dist/cli/commands/executions.d.ts +3 -0
  22. package/dist/cli/commands/executions.d.ts.map +1 -0
  23. package/dist/cli/commands/executions.js +109 -0
  24. package/dist/cli/commands/executions.js.map +1 -0
  25. package/dist/cli/commands/skills.d.ts.map +1 -1
  26. package/dist/cli/commands/skills.js +83 -20
  27. package/dist/cli/commands/skills.js.map +1 -1
  28. package/dist/cli/index.js +2 -0
  29. package/dist/cli/index.js.map +1 -1
  30. package/dist/core/storage/rows.d.ts +14 -36
  31. package/dist/core/storage/rows.d.ts.map +1 -1
  32. package/dist/core/storage/schema.sql +27 -45
  33. package/dist/core/storage/sqlite.d.ts +11 -79
  34. package/dist/core/storage/sqlite.d.ts.map +1 -1
  35. package/dist/core/storage/sqlite.js +35 -362
  36. package/dist/core/storage/sqlite.js.map +1 -1
  37. package/dist/core/utils/token-tracker.d.ts +0 -1
  38. package/dist/core/utils/token-tracker.d.ts.map +1 -1
  39. package/dist/core/utils/token-tracker.js +0 -1
  40. package/dist/core/utils/token-tracker.js.map +1 -1
  41. package/dist/daemon/handlers/post-tool-use.d.ts +1 -9
  42. package/dist/daemon/handlers/post-tool-use.d.ts.map +1 -1
  43. package/dist/daemon/handlers/post-tool-use.js +2 -99
  44. package/dist/daemon/handlers/post-tool-use.js.map +1 -1
  45. package/dist/daemon/handlers/stop.d.ts +5 -15
  46. package/dist/daemon/handlers/stop.d.ts.map +1 -1
  47. package/dist/daemon/handlers/stop.js +25 -93
  48. package/dist/daemon/handlers/stop.js.map +1 -1
  49. package/dist/daemon/handlers/user-prompt.d.ts +3 -5
  50. package/dist/daemon/handlers/user-prompt.d.ts.map +1 -1
  51. package/dist/daemon/handlers/user-prompt.js +39 -98
  52. package/dist/daemon/handlers/user-prompt.js.map +1 -1
  53. package/dist/daemon/index.d.ts.map +1 -1
  54. package/dist/daemon/index.js +11 -56
  55. package/dist/daemon/index.js.map +1 -1
  56. package/dist/daemon/routing-observer.d.ts.map +1 -1
  57. package/dist/daemon/routing-observer.js +24 -1
  58. package/dist/daemon/routing-observer.js.map +1 -1
  59. package/dist/intelligence/execution-doc-builder.d.ts +61 -0
  60. package/dist/intelligence/execution-doc-builder.d.ts.map +1 -0
  61. package/dist/intelligence/execution-doc-builder.js +601 -0
  62. package/dist/intelligence/execution-doc-builder.js.map +1 -0
  63. package/dist/skills/invocation-guard.d.ts +45 -0
  64. package/dist/skills/invocation-guard.d.ts.map +1 -0
  65. package/dist/skills/invocation-guard.js +82 -0
  66. package/dist/skills/invocation-guard.js.map +1 -0
  67. package/dist/skills/official-skills.d.ts.map +1 -1
  68. package/dist/skills/official-skills.js +218 -20
  69. package/dist/skills/official-skills.js.map +1 -1
  70. package/dist/skills/registry.d.ts +22 -0
  71. package/dist/skills/registry.d.ts.map +1 -1
  72. package/dist/skills/registry.js +30 -2
  73. package/dist/skills/registry.js.map +1 -1
  74. package/dist/skills/tools/skill-invoke.d.ts +36 -0
  75. package/dist/skills/tools/skill-invoke.d.ts.map +1 -0
  76. package/dist/skills/tools/skill-invoke.js +82 -0
  77. package/dist/skills/tools/skill-invoke.js.map +1 -0
  78. package/dist/skills/tools/skill-list.d.ts +26 -0
  79. package/dist/skills/tools/skill-list.d.ts.map +1 -0
  80. package/dist/skills/tools/skill-list.js +35 -0
  81. package/dist/skills/tools/skill-list.js.map +1 -0
  82. package/dist/web/routes/execution-trace.d.ts.map +1 -1
  83. package/dist/web/routes/execution-trace.js +16 -0
  84. package/dist/web/routes/execution-trace.js.map +1 -1
  85. package/dist/web/routes/skill-stats.d.ts +12 -0
  86. package/dist/web/routes/skill-stats.d.ts.map +1 -0
  87. package/dist/web/routes/skill-stats.js +72 -0
  88. package/dist/web/routes/skill-stats.js.map +1 -0
  89. package/dist/web/routes/status.d.ts.map +1 -1
  90. package/dist/web/routes/status.js +8 -10
  91. package/dist/web/routes/status.js.map +1 -1
  92. package/dist/web/routes/token-usage.d.ts +1 -1
  93. package/dist/web/routes/token-usage.d.ts.map +1 -1
  94. package/dist/web/routes/token-usage.js +1 -16
  95. package/dist/web/routes/token-usage.js.map +1 -1
  96. package/dist/web/routes/types.d.ts +0 -6
  97. package/dist/web/routes/types.d.ts.map +1 -1
  98. package/dist/web/routes/types.js.map +1 -1
  99. package/dist/web/server.d.ts +0 -6
  100. package/dist/web/server.d.ts.map +1 -1
  101. package/dist/web/server.js +0 -5
  102. package/dist/web/server.js.map +1 -1
  103. package/dist/web/static/assets/{AIConfig-BbwRuWzm.js → AIConfig-DiUFET_Q.js} +2 -2
  104. package/dist/web/static/assets/{AIConfig-BbwRuWzm.js.map → AIConfig-DiUFET_Q.js.map} +1 -1
  105. package/dist/web/static/assets/{Agents-FyKzsN-g.js → Agents-bNNGbQnL.js} +2 -2
  106. package/dist/web/static/assets/{Agents-FyKzsN-g.js.map → Agents-bNNGbQnL.js.map} +1 -1
  107. package/dist/web/static/assets/{Events-C2OCOKAD.js → Events-DQHP6Uaq.js} +2 -2
  108. package/dist/web/static/assets/{Events-C2OCOKAD.js.map → Events-DQHP6Uaq.js.map} +1 -1
  109. package/dist/web/static/assets/ExecutionTrace-Co8ARdg-.js +3 -0
  110. package/dist/web/static/assets/ExecutionTrace-Co8ARdg-.js.map +1 -0
  111. package/dist/web/static/assets/{Methodologies-DwYLXc8o.js → Methodologies-CXNrDXwG.js} +2 -2
  112. package/dist/web/static/assets/{Methodologies-DwYLXc8o.js.map → Methodologies-CXNrDXwG.js.map} +1 -1
  113. package/dist/web/static/assets/{Sessions-CFpFk-5I.js → Sessions-ZQSCgXyy.js} +2 -2
  114. package/dist/web/static/assets/{Sessions-CFpFk-5I.js.map → Sessions-ZQSCgXyy.js.map} +1 -1
  115. package/dist/web/static/assets/{Skills-BkbegTV1.js → Skills-C5-5zOSH.js} +2 -2
  116. package/dist/web/static/assets/{Skills-BkbegTV1.js.map → Skills-C5-5zOSH.js.map} +1 -1
  117. package/dist/web/static/assets/{index-CIRlno4E.js → index-DJK5beK6.js} +3 -3
  118. package/dist/web/static/assets/{index-CIRlno4E.js.map → index-DJK5beK6.js.map} +1 -1
  119. package/dist/web/static/assets/index-phpuytMI.css +1 -0
  120. package/dist/web/static/index.html +2 -2
  121. package/package.json +2 -2
  122. package/dist/capability/execution-manager.d.ts +0 -96
  123. package/dist/capability/execution-manager.d.ts.map +0 -1
  124. package/dist/capability/execution-manager.js +0 -260
  125. package/dist/capability/execution-manager.js.map +0 -1
  126. package/dist/capability/executor/background-executor.d.ts +0 -58
  127. package/dist/capability/executor/background-executor.d.ts.map +0 -1
  128. package/dist/capability/executor/background-executor.js +0 -322
  129. package/dist/capability/executor/background-executor.js.map +0 -1
  130. package/dist/capability/executor/foreground-executor.d.ts +0 -26
  131. package/dist/capability/executor/foreground-executor.d.ts.map +0 -1
  132. package/dist/capability/executor/foreground-executor.js +0 -82
  133. package/dist/capability/executor/foreground-executor.js.map +0 -1
  134. package/dist/capability/executor/orchestrator.d.ts +0 -38
  135. package/dist/capability/executor/orchestrator.d.ts.map +0 -1
  136. package/dist/capability/executor/orchestrator.js +0 -158
  137. package/dist/capability/executor/orchestrator.js.map +0 -1
  138. package/dist/capability/executor/stream-parser.d.ts +0 -73
  139. package/dist/capability/executor/stream-parser.d.ts.map +0 -1
  140. package/dist/capability/executor/stream-parser.js +0 -56
  141. package/dist/capability/executor/stream-parser.js.map +0 -1
  142. package/dist/capability/executor/types.d.ts +0 -44
  143. package/dist/capability/executor/types.d.ts.map +0 -1
  144. package/dist/capability/executor/types.js +0 -9
  145. package/dist/capability/executor/types.js.map +0 -1
  146. package/dist/capability/executor/worker-auth-probe.d.ts +0 -30
  147. package/dist/capability/executor/worker-auth-probe.d.ts.map +0 -1
  148. package/dist/capability/executor/worker-auth-probe.js +0 -108
  149. package/dist/capability/executor/worker-auth-probe.js.map +0 -1
  150. package/dist/capability/methodologies/bmad.yaml +0 -81
  151. package/dist/capability/methodologies/code-quality-audit.yaml +0 -26
  152. package/dist/capability/methodologies/harness-engineering.yaml +0 -75
  153. package/dist/capability/methodologies/test-coverage-scan.yaml +0 -26
  154. package/dist/capability/methodology-planner.d.ts +0 -49
  155. package/dist/capability/methodology-planner.d.ts.map +0 -1
  156. package/dist/capability/methodology-planner.js +0 -306
  157. package/dist/capability/methodology-planner.js.map +0 -1
  158. package/dist/capability/methodology-registry.d.ts +0 -32
  159. package/dist/capability/methodology-registry.d.ts.map +0 -1
  160. package/dist/capability/methodology-registry.js +0 -113
  161. package/dist/capability/methodology-registry.js.map +0 -1
  162. package/dist/daemon/handlers/methodology-formatter.d.ts +0 -16
  163. package/dist/daemon/handlers/methodology-formatter.d.ts.map +0 -1
  164. package/dist/daemon/handlers/methodology-formatter.js +0 -119
  165. package/dist/daemon/handlers/methodology-formatter.js.map +0 -1
  166. package/dist/daemon/idle-detector.d.ts +0 -35
  167. package/dist/daemon/idle-detector.d.ts.map +0 -1
  168. package/dist/daemon/idle-detector.js +0 -56
  169. package/dist/daemon/idle-detector.js.map +0 -1
  170. package/dist/daemon/idle-trigger.d.ts +0 -53
  171. package/dist/daemon/idle-trigger.d.ts.map +0 -1
  172. package/dist/daemon/idle-trigger.js +0 -153
  173. package/dist/daemon/idle-trigger.js.map +0 -1
  174. package/dist/daemon/methodology-pending-queue.d.ts +0 -33
  175. package/dist/daemon/methodology-pending-queue.d.ts.map +0 -1
  176. package/dist/daemon/methodology-pending-queue.js +0 -120
  177. package/dist/daemon/methodology-pending-queue.js.map +0 -1
  178. package/dist/web/routes/methodology.d.ts +0 -12
  179. package/dist/web/routes/methodology.d.ts.map +0 -1
  180. package/dist/web/routes/methodology.js +0 -228
  181. package/dist/web/routes/methodology.js.map +0 -1
  182. package/dist/web/static/assets/ExecutionTrace-BsWSpu2v.js +0 -3
  183. package/dist/web/static/assets/ExecutionTrace-BsWSpu2v.js.map +0 -1
  184. package/dist/web/static/assets/index-N1EByy_h.css +0 -1
@@ -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":"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"}
@@ -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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"}
@@ -1,33 +0,0 @@
1
- /**
2
- * Methodology Pending Inject Queue
3
- *
4
- * 前台模式下,Claude 主对话有时会忽略 UserPromptSubmit 注入的阶段指令
5
- * (3 小时进度 0% 就是这种情况)。Stop hook 检测到这种情况时,把"下
6
- * 一次要注入的指令"写入队列;UserPromptSubmit 在下一轮响应前消费一次。
7
- *
8
- * 进程内 Map + 磁盘 JSON 双层:daemon 重启时从磁盘恢复。
9
- */
10
- export interface PendingDirective {
11
- session_id: string;
12
- execution_id: number;
13
- phase_index: number;
14
- directive: string;
15
- enqueued_at: number;
16
- reason: 'stop-fallback' | 'cold-restart' | 'idle-timeout';
17
- }
18
- export declare class MethodologyPendingQueue {
19
- private memory;
20
- private queueDir;
21
- constructor(queueDir?: string);
22
- private loadFromDisk;
23
- private filePath;
24
- enqueue(entry: PendingDirective): void;
25
- consume(session_id: string): PendingDirective | null;
26
- peek(session_id: string): PendingDirective | null;
27
- size(): number;
28
- purgeByExecutionId(execution_id: number): void;
29
- }
30
- export declare function getMethodologyPendingQueue(): MethodologyPendingQueue;
31
- export declare function _resetMethodologyPendingQueueForTest(): void;
32
- export declare function getPendingQueueDir(): string;
33
- //# sourceMappingURL=methodology-pending-queue.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"methodology-pending-queue.d.ts","sourceRoot":"","sources":["../../src/daemon/methodology-pending-queue.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAaH,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,eAAe,GAAG,cAAc,GAAG,cAAc,CAAC;CAC3D;AAED,qBAAa,uBAAuB;IAClC,OAAO,CAAC,MAAM,CAAuC;IACrD,OAAO,CAAC,QAAQ,CAAS;gBAEb,QAAQ,CAAC,EAAE,MAAM;IAK7B,OAAO,CAAC,YAAY;IAwBpB,OAAO,CAAC,QAAQ;IAKhB,OAAO,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI;IActC,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI;IAiBpD,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI;IAIjD,IAAI,IAAI,MAAM;IAKd,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;CAW/C;AAID,wBAAgB,0BAA0B,IAAI,uBAAuB,CAGpE;AAGD,wBAAgB,oCAAoC,IAAI,IAAI,CAE3D;AAGD,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C"}
@@ -1,120 +0,0 @@
1
- /**
2
- * Methodology Pending Inject Queue
3
- *
4
- * 前台模式下,Claude 主对话有时会忽略 UserPromptSubmit 注入的阶段指令
5
- * (3 小时进度 0% 就是这种情况)。Stop hook 检测到这种情况时,把"下
6
- * 一次要注入的指令"写入队列;UserPromptSubmit 在下一轮响应前消费一次。
7
- *
8
- * 进程内 Map + 磁盘 JSON 双层:daemon 重启时从磁盘恢复。
9
- */
10
- import { existsSync, mkdirSync, readdirSync, readFileSync, unlinkSync, writeFileSync } from 'fs';
11
- import path from 'path';
12
- import { homedir } from 'os';
13
- import { logger } from '../core/utils/logger.js';
14
- const DEFAULT_QUEUE_DIR = path.join(homedir(), '.claude-forge', 'pending-inject');
15
- function resolveQueueDir() {
16
- return process.env.CLAUDE_FORGE_PENDING_DIR || DEFAULT_QUEUE_DIR;
17
- }
18
- export class MethodologyPendingQueue {
19
- memory = new Map();
20
- queueDir;
21
- constructor(queueDir) {
22
- this.queueDir = queueDir ?? resolveQueueDir();
23
- this.loadFromDisk();
24
- }
25
- loadFromDisk() {
26
- try {
27
- if (!existsSync(this.queueDir)) {
28
- mkdirSync(this.queueDir, { recursive: true });
29
- return;
30
- }
31
- const files = readdirSync(this.queueDir).filter(f => f.endsWith('.json'));
32
- for (const file of files) {
33
- try {
34
- const raw = readFileSync(path.join(this.queueDir, file), 'utf-8');
35
- const entry = JSON.parse(raw);
36
- this.memory.set(entry.session_id, entry);
37
- }
38
- catch (err) {
39
- logger.debug(`[MethodologyPendingQueue] skip corrupt ${file}: ${err}`);
40
- }
41
- }
42
- if (this.memory.size > 0) {
43
- logger.info(`[MethodologyPendingQueue] restored ${this.memory.size} pending directives`);
44
- }
45
- }
46
- catch (err) {
47
- logger.warn(`[MethodologyPendingQueue] loadFromDisk failed: ${err}`);
48
- }
49
- }
50
- filePath(session_id) {
51
- const safe = session_id.replace(/[^a-zA-Z0-9_-]/g, '_');
52
- return path.join(this.queueDir, `${safe}.json`);
53
- }
54
- enqueue(entry) {
55
- this.memory.set(entry.session_id, entry);
56
- try {
57
- if (!existsSync(this.queueDir))
58
- mkdirSync(this.queueDir, { recursive: true });
59
- writeFileSync(this.filePath(entry.session_id), JSON.stringify(entry, null, 2), 'utf-8');
60
- logger.info(`[MethodologyPendingQueue] enqueued ${entry.reason} for session=${entry.session_id.slice(0, 8)} phase=${entry.phase_index}`);
61
- }
62
- catch (err) {
63
- logger.warn(`[MethodologyPendingQueue] persist failed: ${err}`);
64
- }
65
- }
66
- // 取出并移除。返回 null 如果没有待注入。
67
- consume(session_id) {
68
- const entry = this.memory.get(session_id);
69
- if (!entry)
70
- return null;
71
- this.memory.delete(session_id);
72
- try {
73
- const fp = this.filePath(session_id);
74
- if (existsSync(fp))
75
- unlinkSync(fp);
76
- }
77
- catch (err) {
78
- logger.debug(`[MethodologyPendingQueue] cleanup failed: ${err}`);
79
- }
80
- logger.info(`[MethodologyPendingQueue] consumed ${entry.reason} for session=${session_id.slice(0, 8)} phase=${entry.phase_index}`);
81
- return entry;
82
- }
83
- // 对外只用于调试/可观测,不建议修改返回值
84
- peek(session_id) {
85
- return this.memory.get(session_id) ?? null;
86
- }
87
- size() {
88
- return this.memory.size;
89
- }
90
- // 强制清理指定 execution 的所有 pending(execution 被 cancel / 完成时调用)
91
- purgeByExecutionId(execution_id) {
92
- for (const [sid, entry] of this.memory.entries()) {
93
- if (entry.execution_id === execution_id) {
94
- this.memory.delete(sid);
95
- try {
96
- const fp = this.filePath(sid);
97
- if (existsSync(fp))
98
- unlinkSync(fp);
99
- }
100
- catch { /* ignore */ }
101
- }
102
- }
103
- }
104
- }
105
- // Daemon 单例
106
- let _instance = null;
107
- export function getMethodologyPendingQueue() {
108
- if (!_instance)
109
- _instance = new MethodologyPendingQueue();
110
- return _instance;
111
- }
112
- // 测试用 reset
113
- export function _resetMethodologyPendingQueueForTest() {
114
- _instance = null;
115
- }
116
- // 暴露给外部(用于避免测试时写真实 HOME)
117
- export function getPendingQueueDir() {
118
- return resolveQueueDir();
119
- }
120
- //# sourceMappingURL=methodology-pending-queue.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"methodology-pending-queue.js","sourceRoot":"","sources":["../../src/daemon/methodology-pending-queue.ts"],"names":[],"mappings":"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"}
@@ -1,12 +0,0 @@
1
- import type { Application } from 'express';
2
- import type { RouteContext } from './types.js';
3
- /**
4
- * /api/methodology-executions/* and /api/methodologies.
5
- *
6
- * Also owns the SSE stream for live execution updates. Note: the SSE route
7
- * `/api/methodology-executions/events` must be registered before the
8
- * parameterized `/:id` route on Express 4 (Express matches in definition
9
- * order and `:id` would otherwise swallow the literal `events` segment).
10
- */
11
- export declare function registerMethodologyRoutes(app: Application, ctx: RouteContext): void;
12
- //# sourceMappingURL=methodology.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"methodology.d.ts","sourceRoot":"","sources":["../../../src/web/routes/methodology.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAQ3C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAI/C;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,YAAY,GAAG,IAAI,CAkOnF"}