@winspan/claude-forge 8.34.0 → 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 (113) hide show
  1. package/README.md +10 -30
  2. package/dist/capability/index.d.ts +6 -5
  3. package/dist/capability/index.d.ts.map +1 -1
  4. package/dist/capability/index.js +6 -5
  5. package/dist/capability/index.js.map +1 -1
  6. package/dist/capability/types.d.ts +5 -74
  7. package/dist/capability/types.d.ts.map +1 -1
  8. package/dist/capability/types.js +4 -1
  9. package/dist/capability/types.js.map +1 -1
  10. package/dist/core/storage/rows.d.ts +0 -36
  11. package/dist/core/storage/rows.d.ts.map +1 -1
  12. package/dist/core/storage/schema.sql +1 -45
  13. package/dist/core/storage/sqlite.d.ts +2 -79
  14. package/dist/core/storage/sqlite.d.ts.map +1 -1
  15. package/dist/core/storage/sqlite.js +3 -362
  16. package/dist/core/storage/sqlite.js.map +1 -1
  17. package/dist/core/utils/token-tracker.d.ts +0 -1
  18. package/dist/core/utils/token-tracker.d.ts.map +1 -1
  19. package/dist/core/utils/token-tracker.js +0 -1
  20. package/dist/core/utils/token-tracker.js.map +1 -1
  21. package/dist/daemon/handlers/post-tool-use.d.ts +1 -9
  22. package/dist/daemon/handlers/post-tool-use.d.ts.map +1 -1
  23. package/dist/daemon/handlers/post-tool-use.js +2 -99
  24. package/dist/daemon/handlers/post-tool-use.js.map +1 -1
  25. package/dist/daemon/handlers/stop.d.ts +1 -15
  26. package/dist/daemon/handlers/stop.d.ts.map +1 -1
  27. package/dist/daemon/handlers/stop.js +1 -95
  28. package/dist/daemon/handlers/stop.js.map +1 -1
  29. package/dist/daemon/handlers/user-prompt.d.ts +1 -5
  30. package/dist/daemon/handlers/user-prompt.d.ts.map +1 -1
  31. package/dist/daemon/handlers/user-prompt.js +4 -96
  32. package/dist/daemon/handlers/user-prompt.js.map +1 -1
  33. package/dist/daemon/index.d.ts.map +1 -1
  34. package/dist/daemon/index.js +3 -54
  35. package/dist/daemon/index.js.map +1 -1
  36. package/dist/skills/official-skills.d.ts.map +1 -1
  37. package/dist/skills/official-skills.js +218 -20
  38. package/dist/skills/official-skills.js.map +1 -1
  39. package/dist/web/routes/status.d.ts.map +1 -1
  40. package/dist/web/routes/status.js +8 -10
  41. package/dist/web/routes/status.js.map +1 -1
  42. package/dist/web/routes/token-usage.d.ts +1 -1
  43. package/dist/web/routes/token-usage.d.ts.map +1 -1
  44. package/dist/web/routes/token-usage.js +1 -16
  45. package/dist/web/routes/token-usage.js.map +1 -1
  46. package/dist/web/routes/types.d.ts +0 -6
  47. package/dist/web/routes/types.d.ts.map +1 -1
  48. package/dist/web/routes/types.js.map +1 -1
  49. package/dist/web/server.d.ts +0 -6
  50. package/dist/web/server.d.ts.map +1 -1
  51. package/dist/web/server.js +0 -5
  52. package/dist/web/server.js.map +1 -1
  53. package/package.json +2 -2
  54. package/dist/capability/execution-manager.d.ts +0 -96
  55. package/dist/capability/execution-manager.d.ts.map +0 -1
  56. package/dist/capability/execution-manager.js +0 -260
  57. package/dist/capability/execution-manager.js.map +0 -1
  58. package/dist/capability/executor/background-executor.d.ts +0 -58
  59. package/dist/capability/executor/background-executor.d.ts.map +0 -1
  60. package/dist/capability/executor/background-executor.js +0 -322
  61. package/dist/capability/executor/background-executor.js.map +0 -1
  62. package/dist/capability/executor/foreground-executor.d.ts +0 -26
  63. package/dist/capability/executor/foreground-executor.d.ts.map +0 -1
  64. package/dist/capability/executor/foreground-executor.js +0 -82
  65. package/dist/capability/executor/foreground-executor.js.map +0 -1
  66. package/dist/capability/executor/orchestrator.d.ts +0 -38
  67. package/dist/capability/executor/orchestrator.d.ts.map +0 -1
  68. package/dist/capability/executor/orchestrator.js +0 -158
  69. package/dist/capability/executor/orchestrator.js.map +0 -1
  70. package/dist/capability/executor/stream-parser.d.ts +0 -73
  71. package/dist/capability/executor/stream-parser.d.ts.map +0 -1
  72. package/dist/capability/executor/stream-parser.js +0 -56
  73. package/dist/capability/executor/stream-parser.js.map +0 -1
  74. package/dist/capability/executor/types.d.ts +0 -44
  75. package/dist/capability/executor/types.d.ts.map +0 -1
  76. package/dist/capability/executor/types.js +0 -9
  77. package/dist/capability/executor/types.js.map +0 -1
  78. package/dist/capability/executor/worker-auth-probe.d.ts +0 -30
  79. package/dist/capability/executor/worker-auth-probe.d.ts.map +0 -1
  80. package/dist/capability/executor/worker-auth-probe.js +0 -108
  81. package/dist/capability/executor/worker-auth-probe.js.map +0 -1
  82. package/dist/capability/methodologies/bmad.yaml +0 -81
  83. package/dist/capability/methodologies/code-quality-audit.yaml +0 -26
  84. package/dist/capability/methodologies/harness-engineering.yaml +0 -75
  85. package/dist/capability/methodologies/test-coverage-scan.yaml +0 -26
  86. package/dist/capability/methodology-planner.d.ts +0 -49
  87. package/dist/capability/methodology-planner.d.ts.map +0 -1
  88. package/dist/capability/methodology-planner.js +0 -306
  89. package/dist/capability/methodology-planner.js.map +0 -1
  90. package/dist/capability/methodology-registry.d.ts +0 -32
  91. package/dist/capability/methodology-registry.d.ts.map +0 -1
  92. package/dist/capability/methodology-registry.js +0 -113
  93. package/dist/capability/methodology-registry.js.map +0 -1
  94. package/dist/daemon/handlers/methodology-formatter.d.ts +0 -16
  95. package/dist/daemon/handlers/methodology-formatter.d.ts.map +0 -1
  96. package/dist/daemon/handlers/methodology-formatter.js +0 -119
  97. package/dist/daemon/handlers/methodology-formatter.js.map +0 -1
  98. package/dist/daemon/idle-detector.d.ts +0 -35
  99. package/dist/daemon/idle-detector.d.ts.map +0 -1
  100. package/dist/daemon/idle-detector.js +0 -56
  101. package/dist/daemon/idle-detector.js.map +0 -1
  102. package/dist/daemon/idle-trigger.d.ts +0 -53
  103. package/dist/daemon/idle-trigger.d.ts.map +0 -1
  104. package/dist/daemon/idle-trigger.js +0 -153
  105. package/dist/daemon/idle-trigger.js.map +0 -1
  106. package/dist/daemon/methodology-pending-queue.d.ts +0 -33
  107. package/dist/daemon/methodology-pending-queue.d.ts.map +0 -1
  108. package/dist/daemon/methodology-pending-queue.js +0 -120
  109. package/dist/daemon/methodology-pending-queue.js.map +0 -1
  110. package/dist/web/routes/methodology.d.ts +0 -12
  111. package/dist/web/routes/methodology.d.ts.map +0 -1
  112. package/dist/web/routes/methodology.js +0 -228
  113. package/dist/web/routes/methodology.js.map +0 -1
@@ -1,322 +0,0 @@
1
- /**
2
- * BackgroundExecutor —— spawn `claude -p` 子进程独立执行一个 phase。
3
- *
4
- * 与 ForegroundExecutor 的差异:
5
- * - 真正调用 CLI 并等待结束,所以 `executePhase` 返回的是最终 status
6
- * ('completed' | 'failed'), 不是 'injected'
7
- * - 不会改 pending queue —— 后台执行路径跟 Claude 主会话完全隔离
8
- * - 进度通过 subscribe() 的 ExecutorEvent 对外暴露(SSE 可订阅)
9
- */
10
- import { spawn } from 'node:child_process';
11
- import { mkdirSync, existsSync, createWriteStream, writeFileSync } from 'node:fs';
12
- import { homedir } from 'node:os';
13
- import path from 'node:path';
14
- import { formatMethodologyPhaseDirectiveForWorker } from '../../daemon/handlers/methodology-formatter.js';
15
- import { parseStreamLine, extractResultText, extractToolUses, isTerminal, } from './stream-parser.js';
16
- import { logger } from '../../core/utils/logger.js';
17
- const DEFAULT_LOG_DIR = path.join(homedir(), '.claude-forge', 'logs');
18
- const DEFAULT_WORKER_SETTINGS_PATH = path.join(homedir(), '.claude-forge', 'worker-settings.json');
19
- /**
20
- * 确保 worker settings 文件存在。已存在则复用(不覆写),不存在则以 `{"hooks": {}}` 创建。
21
- */
22
- function ensureWorkerSettingsFile(target) {
23
- if (existsSync(target))
24
- return;
25
- mkdirSync(path.dirname(target), { recursive: true });
26
- writeFileSync(target, JSON.stringify({ hooks: {} }, null, 2), 'utf-8');
27
- }
28
- export class BackgroundExecutor {
29
- storage;
30
- registry;
31
- mode = 'background';
32
- listeners = new Set();
33
- running = new Map();
34
- cancelRequested = new Set();
35
- opts;
36
- constructor(storage, registry, options = {}) {
37
- this.storage = storage;
38
- this.registry = registry;
39
- const settingsPath = options.settingsPath ?? DEFAULT_WORKER_SETTINGS_PATH;
40
- ensureWorkerSettingsFile(settingsPath);
41
- this.opts = {
42
- claudeBin: options.claudeBin ?? 'claude',
43
- cwd: options.cwd ?? process.cwd(),
44
- projectRoot: options.projectRoot,
45
- maxBudgetUsdPerPhase: options.maxBudgetUsdPerPhase ?? 2,
46
- permissionMode: options.permissionMode ?? 'bypassPermissions',
47
- disallowedTools: options.disallowedTools ?? 'WebFetch,WebSearch',
48
- phaseTimeoutMs: options.phaseTimeoutMs ?? 30 * 60 * 1000,
49
- logDir: options.logDir ?? DEFAULT_LOG_DIR,
50
- settingsPath,
51
- };
52
- }
53
- async executePhase(execution, phase, phaseIndex) {
54
- const methodology = this.registry.get(execution.methodology_id);
55
- if (!methodology) {
56
- return {
57
- status: 'failed',
58
- phase_index: phaseIndex,
59
- phase_id: phase.id,
60
- error: `methodology ${execution.methodology_id} not found`,
61
- };
62
- }
63
- const plan = JSON.parse(execution.plan_json);
64
- const directive = formatMethodologyPhaseDirectiveForWorker(methodology, plan, phase, phaseIndex, execution.id);
65
- // Find or create the phase_executions row for this phase
66
- const existing = this.storage.getPhaseExecutions(execution.id).find(p => p.phase_index === phaseIndex);
67
- const phaseExecId = existing?.id ?? this.storage.createPhaseExecution({
68
- methodology_execution_id: execution.id,
69
- phase_id: phase.id,
70
- phase_index: phaseIndex,
71
- agent_name: phase.agent,
72
- prompt: phase.prompt,
73
- });
74
- if (!existsSync(this.opts.logDir))
75
- mkdirSync(this.opts.logDir, { recursive: true });
76
- const logPath = path.join(this.opts.logDir, `execution-${execution.id}-phase-${phaseIndex}.jsonl`);
77
- this.storage.updatePhaseExecution(phaseExecId, { stream_log_path: logPath });
78
- this.emit({
79
- type: 'phase-start',
80
- execution_id: execution.id,
81
- phase_index: phaseIndex,
82
- phase_id: phase.id,
83
- timestamp: Date.now(),
84
- payload: { mode: 'background', agent: phase.agent, logPath },
85
- });
86
- const startedAt = Date.now();
87
- const args = this.buildArgs();
88
- logger.info(`[BackgroundExecutor] spawn claude -p for execution=${execution.id} phase=${phaseIndex} (${phase.id})`);
89
- let stdoutBuf = '';
90
- let finalText = null;
91
- let capturedSessionId = null;
92
- let capturedErrorMessage = null;
93
- let exitReason = 'completed';
94
- const child = spawn(this.opts.claudeBin, args, {
95
- cwd: this.opts.cwd,
96
- env: { ...process.env, CLAUDE_FORGE_WORKER: '1' },
97
- stdio: ['pipe', 'pipe', 'pipe'],
98
- });
99
- this.running.set(execution.id, child);
100
- this.storage.updateMethodologyExecution(execution.id, {
101
- worker_pid: child.pid ?? null,
102
- last_progress_at: Date.now(),
103
- });
104
- const logStream = createWriteStream(logPath, { flags: 'a' });
105
- const handleStreamEvent = (event) => {
106
- // Capture session id from init event
107
- if (event.type === 'system' && 'session_id' in event && typeof event.session_id === 'string') {
108
- capturedSessionId = event.session_id;
109
- this.storage.updateMethodologyExecution(execution.id, {
110
- worker_session_id: event.session_id,
111
- last_progress_at: Date.now(),
112
- });
113
- }
114
- // Tool uses — emit as phase-log for observability
115
- const tools = extractToolUses(event);
116
- for (const t of tools) {
117
- this.emit({
118
- type: 'phase-log',
119
- execution_id: execution.id,
120
- phase_index: phaseIndex,
121
- phase_id: phase.id,
122
- timestamp: Date.now(),
123
- payload: { kind: 'tool_use', tool: t.name, input: t.input },
124
- });
125
- }
126
- // Result event — terminal
127
- if (event.type === 'result') {
128
- const txt = extractResultText(event);
129
- if (txt)
130
- finalText = txt;
131
- if ('is_error' in event && event.is_error) {
132
- exitReason = 'failed';
133
- capturedErrorMessage = typeof event.result === 'string' ? event.result : 'claude -p reported error';
134
- }
135
- }
136
- };
137
- const waitForExit = new Promise((resolve) => {
138
- let timer = setTimeout(() => {
139
- logger.warn(`[BackgroundExecutor] phase ${phaseIndex} timed out`);
140
- exitReason = 'timeout';
141
- capturedErrorMessage = `phase exceeded ${this.opts.phaseTimeoutMs}ms wall-clock timeout`;
142
- child.kill('SIGTERM');
143
- }, this.opts.phaseTimeoutMs);
144
- child.stdout.on('data', (chunk) => {
145
- const text = chunk.toString('utf-8');
146
- stdoutBuf += text;
147
- logStream.write(text);
148
- let newlineIdx;
149
- while ((newlineIdx = stdoutBuf.indexOf('\n')) >= 0) {
150
- const line = stdoutBuf.slice(0, newlineIdx);
151
- stdoutBuf = stdoutBuf.slice(newlineIdx + 1);
152
- const parsed = parseStreamLine(line);
153
- if (parsed.event) {
154
- handleStreamEvent(parsed.event);
155
- if (isTerminal(parsed.event)) {
156
- // result event — child should exit on its own shortly
157
- }
158
- }
159
- }
160
- });
161
- child.stderr.on('data', (chunk) => {
162
- const text = chunk.toString('utf-8');
163
- logStream.write(`[stderr] ${text}`);
164
- logger.debug(`[BackgroundExecutor][stderr] ${text.slice(0, 200)}`);
165
- });
166
- child.on('error', (err) => {
167
- logger.warn(`[BackgroundExecutor] spawn error: ${err.message}`);
168
- exitReason = 'failed';
169
- capturedErrorMessage = `spawn failed: ${err.message}`;
170
- if (timer) {
171
- clearTimeout(timer);
172
- timer = null;
173
- }
174
- resolve();
175
- });
176
- child.on('exit', (code, signal) => {
177
- if (timer) {
178
- clearTimeout(timer);
179
- timer = null;
180
- }
181
- logger.info(`[BackgroundExecutor] phase ${phaseIndex} child exit code=${code} signal=${signal}`);
182
- if (exitReason === 'timeout') {
183
- // already set
184
- }
185
- else if (this.cancelRequested.has(execution.id) ||
186
- signal === 'SIGKILL' ||
187
- signal === 'SIGTERM' ||
188
- // macOS 下 SIGTERM 杀掉的 child,Node 会报 code=143 (128+SIGTERM) / signal=null,
189
- // SIGKILL 对应 code=137。无论 signal 字段形状如何,都认定为 cancelled。
190
- code === 143 ||
191
- code === 137) {
192
- // manual cancel takes priority over natural completion semantics
193
- if (exitReason === 'completed')
194
- exitReason = 'cancelled';
195
- }
196
- else if (code !== 0 && exitReason === 'completed') {
197
- exitReason = 'failed';
198
- capturedErrorMessage = capturedErrorMessage ?? `claude -p exited with code ${code}`;
199
- }
200
- resolve();
201
- });
202
- });
203
- child.stdin.end(directive);
204
- await waitForExit;
205
- this.running.delete(execution.id);
206
- this.cancelRequested.delete(execution.id);
207
- logStream.end();
208
- const durationMs = Date.now() - startedAt;
209
- // exitReason 的三路映射:
210
- // completed -> 'completed'
211
- // cancelled -> 'cancelled'(需要 schema 支持,见 runMigrations)
212
- // failed/timeout -> 'failed'
213
- const phaseStatus = exitReason === 'completed'
214
- ? 'completed'
215
- : exitReason === 'cancelled'
216
- ? 'cancelled'
217
- : 'failed';
218
- this.storage.updatePhaseExecution(phaseExecId, {
219
- status: phaseStatus,
220
- completed_at: Date.now(),
221
- output_text: finalText ?? null,
222
- error_message: capturedErrorMessage,
223
- });
224
- this.emit({
225
- type: 'phase-finish',
226
- execution_id: execution.id,
227
- phase_index: phaseIndex,
228
- phase_id: phase.id,
229
- timestamp: Date.now(),
230
- payload: { status: phaseStatus, duration_ms: durationMs, session_id: capturedSessionId },
231
- });
232
- if (exitReason === 'completed') {
233
- return {
234
- status: 'completed',
235
- phase_index: phaseIndex,
236
- phase_id: phase.id,
237
- output_text: finalText ?? undefined,
238
- duration_ms: durationMs,
239
- };
240
- }
241
- if (exitReason === 'cancelled') {
242
- return {
243
- status: 'cancelled',
244
- phase_index: phaseIndex,
245
- phase_id: phase.id,
246
- error: capturedErrorMessage ?? 'cancelled',
247
- duration_ms: durationMs,
248
- };
249
- }
250
- return {
251
- status: 'failed',
252
- phase_index: phaseIndex,
253
- phase_id: phase.id,
254
- error: capturedErrorMessage ?? 'unknown failure',
255
- duration_ms: durationMs,
256
- };
257
- }
258
- async cancel(execution_id) {
259
- this.cancelRequested.add(execution_id);
260
- const child = this.running.get(execution_id);
261
- if (child) {
262
- logger.info(`[BackgroundExecutor] kill worker pid=${child.pid} for execution=${execution_id}`);
263
- child.kill('SIGTERM');
264
- setTimeout(() => {
265
- if (!child.killed)
266
- child.kill('SIGKILL');
267
- }, 5000);
268
- }
269
- this.storage.updateMethodologyExecution(execution_id, {
270
- status: 'cancelled',
271
- completed_at: Date.now(),
272
- worker_pid: null,
273
- });
274
- this.emit({
275
- type: 'done',
276
- execution_id,
277
- timestamp: Date.now(),
278
- payload: { reason: 'cancelled' },
279
- });
280
- }
281
- subscribe(listener) {
282
- this.listeners.add(listener);
283
- return () => { this.listeners.delete(listener); };
284
- }
285
- emit(event) {
286
- for (const l of this.listeners) {
287
- try {
288
- l(event);
289
- }
290
- catch (err) {
291
- logger.debug(`[BackgroundExecutor] listener failed: ${err}`);
292
- }
293
- }
294
- }
295
- /**
296
- * @internal test-only: 构建 spawn 参数。生产代码请走 `executePhase`。
297
- */
298
- buildArgs() {
299
- const args = [
300
- '-p',
301
- '--output-format', 'stream-json',
302
- '--verbose', // required for stream-json with -p
303
- '--include-hook-events',
304
- '--permission-mode', this.opts.permissionMode,
305
- '--max-budget-usd', String(this.opts.maxBudgetUsdPerPhase),
306
- '--no-session-persistence',
307
- '--settings', this.opts.settingsPath, // worker 用空 hooks settings,避免再触发 daemon hook
308
- ];
309
- if (this.opts.disallowedTools) {
310
- args.push('--disallowed-tools', this.opts.disallowedTools);
311
- }
312
- if (this.opts.projectRoot) {
313
- args.push('--add-dir', this.opts.projectRoot);
314
- }
315
- return args;
316
- }
317
- /** @internal test-only */
318
- getSettingsPath() {
319
- return this.opts.settingsPath;
320
- }
321
- }
322
- //# sourceMappingURL=background-executor.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"background-executor.js","sourceRoot":"","sources":["../../../src/capability/executor/background-executor.ts"],"names":[],"mappings":"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"}
@@ -1,26 +0,0 @@
1
- /**
2
- * ForegroundExecutor —— 把 Phase A 的 pending-queue 逻辑收敛成 PhaseExecutor 实现。
3
- *
4
- * 重要约束:daemon 不能主动 push 到 Claude 主对话,所以 `executePhase` 只是
5
- * 把本阶段的 directive 放入 pending queue。真正的"Claude 执行"发生在下一次
6
- * UserPromptSubmit 被消费时,以及由 PostToolUse 推进阶段。
7
- *
8
- * 这让 Orchestrator 的逻辑在两种模式下形状一致:executePhase → wait → next。
9
- * 前台的 "wait" 实际上立即返回 'injected',由外部 hook 路径驱动后续。
10
- */
11
- import type { MethodologyExecution, PlannedPhase } from '../types.js';
12
- import type { SQLiteStorage } from '../../core/storage/sqlite.js';
13
- import type { MethodologyRegistry } from '../methodology-registry.js';
14
- import type { ExecutorEventListener, PhaseExecutionResult, PhaseExecutor } from './types.js';
15
- export declare class ForegroundExecutor implements PhaseExecutor {
16
- private storage;
17
- private registry;
18
- readonly mode: "foreground";
19
- private listeners;
20
- constructor(storage: SQLiteStorage, registry: MethodologyRegistry);
21
- executePhase(execution: MethodologyExecution, phase: PlannedPhase, phaseIndex: number): Promise<PhaseExecutionResult>;
22
- cancel(execution_id: number): Promise<void>;
23
- subscribe(listener: ExecutorEventListener): () => void;
24
- private emit;
25
- }
26
- //# sourceMappingURL=foreground-executor.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"foreground-executor.d.ts","sourceRoot":"","sources":["../../../src/capability/executor/foreground-executor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAiB,oBAAoB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACrF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,KAAK,EAEV,qBAAqB,EACrB,oBAAoB,EACpB,aAAa,EACd,MAAM,YAAY,CAAC;AAKpB,qBAAa,kBAAmB,YAAW,aAAa;IAKpD,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,QAAQ;IALlB,QAAQ,CAAC,IAAI,EAAG,YAAY,CAAU;IACtC,OAAO,CAAC,SAAS,CAAoC;gBAG3C,OAAO,EAAE,aAAa,EACtB,QAAQ,EAAE,mBAAmB;IAGjC,YAAY,CAChB,SAAS,EAAE,oBAAoB,EAC/B,KAAK,EAAE,YAAY,EACnB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,oBAAoB,CAAC;IA4C1B,MAAM,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAcjD,SAAS,CAAC,QAAQ,EAAE,qBAAqB,GAAG,MAAM,IAAI;IAKtD,OAAO,CAAC,IAAI;CAKb"}
@@ -1,82 +0,0 @@
1
- /**
2
- * ForegroundExecutor —— 把 Phase A 的 pending-queue 逻辑收敛成 PhaseExecutor 实现。
3
- *
4
- * 重要约束:daemon 不能主动 push 到 Claude 主对话,所以 `executePhase` 只是
5
- * 把本阶段的 directive 放入 pending queue。真正的"Claude 执行"发生在下一次
6
- * UserPromptSubmit 被消费时,以及由 PostToolUse 推进阶段。
7
- *
8
- * 这让 Orchestrator 的逻辑在两种模式下形状一致:executePhase → wait → next。
9
- * 前台的 "wait" 实际上立即返回 'injected',由外部 hook 路径驱动后续。
10
- */
11
- import { formatMethodologyPhaseDirective } from '../../daemon/handlers/methodology-formatter.js';
12
- import { getMethodologyPendingQueue } from '../../daemon/methodology-pending-queue.js';
13
- import { logger } from '../../core/utils/logger.js';
14
- export class ForegroundExecutor {
15
- storage;
16
- registry;
17
- mode = 'foreground';
18
- listeners = new Set();
19
- constructor(storage, registry) {
20
- this.storage = storage;
21
- this.registry = registry;
22
- }
23
- async executePhase(execution, phase, phaseIndex) {
24
- const methodology = this.registry.get(execution.methodology_id);
25
- if (!methodology) {
26
- return {
27
- status: 'failed',
28
- phase_index: phaseIndex,
29
- phase_id: phase.id,
30
- error: `methodology ${execution.methodology_id} not found`,
31
- };
32
- }
33
- const plan = JSON.parse(execution.plan_json);
34
- const directive = formatMethodologyPhaseDirective(methodology, plan, phase, phaseIndex, execution.id);
35
- getMethodologyPendingQueue().enqueue({
36
- session_id: execution.session_id,
37
- execution_id: execution.id,
38
- phase_index: phaseIndex,
39
- directive,
40
- enqueued_at: Date.now(),
41
- reason: 'cold-restart',
42
- });
43
- this.emit({
44
- type: 'phase-start',
45
- execution_id: execution.id,
46
- phase_index: phaseIndex,
47
- phase_id: phase.id,
48
- timestamp: Date.now(),
49
- payload: { mode: 'foreground', agent: phase.agent },
50
- });
51
- logger.info(`[ForegroundExecutor] Injected directive for execution=${execution.id} phase=${phaseIndex}`);
52
- return { status: 'injected', phase_index: phaseIndex, phase_id: phase.id };
53
- }
54
- async cancel(execution_id) {
55
- getMethodologyPendingQueue().purgeByExecutionId(execution_id);
56
- this.storage.updateMethodologyExecution(execution_id, {
57
- status: 'cancelled',
58
- completed_at: Date.now(),
59
- });
60
- this.emit({
61
- type: 'done',
62
- execution_id,
63
- timestamp: Date.now(),
64
- payload: { reason: 'cancelled' },
65
- });
66
- }
67
- subscribe(listener) {
68
- this.listeners.add(listener);
69
- return () => { this.listeners.delete(listener); };
70
- }
71
- emit(event) {
72
- for (const l of this.listeners) {
73
- try {
74
- l(event);
75
- }
76
- catch (err) {
77
- logger.debug(`[ForegroundExecutor] listener failed: ${err}`);
78
- }
79
- }
80
- }
81
- }
82
- //# sourceMappingURL=foreground-executor.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"foreground-executor.js","sourceRoot":"","sources":["../../../src/capability/executor/foreground-executor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAWH,OAAO,EAAE,+BAA+B,EAAE,MAAM,gDAAgD,CAAC;AACjG,OAAO,EAAE,0BAA0B,EAAE,MAAM,2CAA2C,CAAC;AACvF,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAEpD,MAAM,OAAO,kBAAkB;IAKnB;IACA;IALD,IAAI,GAAG,YAAqB,CAAC;IAC9B,SAAS,GAAG,IAAI,GAAG,EAAyB,CAAC;IAErD,YACU,OAAsB,EACtB,QAA6B;QAD7B,YAAO,GAAP,OAAO,CAAe;QACtB,aAAQ,GAAR,QAAQ,CAAqB;IACpC,CAAC;IAEJ,KAAK,CAAC,YAAY,CAChB,SAA+B,EAC/B,KAAmB,EACnB,UAAkB;QAElB,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QAChE,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO;gBACL,MAAM,EAAE,QAAQ;gBAChB,WAAW,EAAE,UAAU;gBACvB,QAAQ,EAAE,KAAK,CAAC,EAAE;gBAClB,KAAK,EAAE,eAAe,SAAS,CAAC,cAAc,YAAY;aAC3D,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAkB,CAAC;QAC9D,MAAM,SAAS,GAAG,+BAA+B,CAC/C,WAAW,EACX,IAAI,EACJ,KAAK,EACL,UAAU,EACV,SAAS,CAAC,EAAE,CACb,CAAC;QAEF,0BAA0B,EAAE,CAAC,OAAO,CAAC;YACnC,UAAU,EAAE,SAAS,CAAC,UAAU;YAChC,YAAY,EAAE,SAAS,CAAC,EAAE;YAC1B,WAAW,EAAE,UAAU;YACvB,SAAS;YACT,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE;YACvB,MAAM,EAAE,cAAc;SACvB,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,CAAC;YACR,IAAI,EAAE,aAAa;YACnB,YAAY,EAAE,SAAS,CAAC,EAAE;YAC1B,WAAW,EAAE,UAAU;YACvB,QAAQ,EAAE,KAAK,CAAC,EAAE;YAClB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,OAAO,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE;SACpD,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,CACT,yDAAyD,SAAS,CAAC,EAAE,UAAU,UAAU,EAAE,CAC5F,CAAC;QACF,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC;IAC7E,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,YAAoB;QAC/B,0BAA0B,EAAE,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC;QAC9D,IAAI,CAAC,OAAO,CAAC,0BAA0B,CAAC,YAAY,EAAE;YACpD,MAAM,EAAE,WAAW;YACnB,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE;SACzB,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,CAAC;YACR,IAAI,EAAE,MAAM;YACZ,YAAY;YACZ,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,OAAO,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE;SACjC,CAAC,CAAC;IACL,CAAC;IAED,SAAS,CAAC,QAA+B;QACvC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC7B,OAAO,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC;IAEO,IAAI,CAAC,KAAoB;QAC/B,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAC/B,IAAI,CAAC;gBAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YAAC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBAAC,MAAM,CAAC,KAAK,CAAC,yCAAyC,GAAG,EAAE,CAAC,CAAC;YAAC,CAAC;QACjG,CAAC;IACH,CAAC;CACF"}
@@ -1,38 +0,0 @@
1
- /**
2
- * Orchestrator — 驱动一个 execution 的所有 phase 串行执行。
3
- *
4
- * 职责:
5
- * 1. 从 storage 读取 execution 和 plan
6
- * 2. 对每个 phase 调用 executor.executePhase()
7
- * 3. 根据结果更新 methodology_executions 状态
8
- * 4. 其中任一 phase 失败 → 尝试 replan(如果启用)
9
- * 5. 如果 replan 失败或取消 → 整个 execution 标 failed/cancelled 并停止
10
- *
11
- * 前台模式下,executePhase 只是入队 directive(返回 'injected')。此时
12
- * orchestrator 不推进下一 phase —— 推进由 PostToolUse handler 基于实际
13
- * 执行结果来做(已有机制)。所以前台模式下 orchestrator 只驱动 phase 0,
14
- * 其余阶段由 daemon 既有路径推进。
15
- *
16
- * 后台模式下,executePhase 阻塞直到 phase 真正完成,orchestrator 再推进。
17
- */
18
- import type { SQLiteStorage } from '../../core/storage/sqlite.js';
19
- import type { PhaseExecutor } from './types.js';
20
- import type { MethodologyPlanner } from '../methodology-planner.js';
21
- export declare class Orchestrator {
22
- private storage;
23
- private executor;
24
- private planner?;
25
- private readonly enableReplan;
26
- private readonly maxRetry;
27
- constructor(storage: SQLiteStorage, executor: PhaseExecutor, planner?: MethodologyPlanner | undefined, options?: {
28
- enableReplan?: boolean;
29
- maxRetry?: number;
30
- });
31
- run(execution_id: number): Promise<void>;
32
- /**
33
- * 尝试重新规划(失败反馈环)
34
- * @returns true 如果 replan 成功并更新了 plan,false 否则
35
- */
36
- private attemptReplan;
37
- }
38
- //# sourceMappingURL=orchestrator.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../../src/capability/executor/orchestrator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAGpE,qBAAa,YAAY;IAKrB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,OAAO,CAAC;IANlB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAU;IACvC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;gBAGxB,OAAO,EAAE,aAAa,EACtB,QAAQ,EAAE,aAAa,EACvB,OAAO,CAAC,EAAE,kBAAkB,YAAA,EACpC,OAAO,CAAC,EAAE;QACR,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB;IAMG,GAAG,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiF9C;;;OAGG;YACW,aAAa;CAkE5B"}
@@ -1,158 +0,0 @@
1
- /**
2
- * Orchestrator — 驱动一个 execution 的所有 phase 串行执行。
3
- *
4
- * 职责:
5
- * 1. 从 storage 读取 execution 和 plan
6
- * 2. 对每个 phase 调用 executor.executePhase()
7
- * 3. 根据结果更新 methodology_executions 状态
8
- * 4. 其中任一 phase 失败 → 尝试 replan(如果启用)
9
- * 5. 如果 replan 失败或取消 → 整个 execution 标 failed/cancelled 并停止
10
- *
11
- * 前台模式下,executePhase 只是入队 directive(返回 'injected')。此时
12
- * orchestrator 不推进下一 phase —— 推进由 PostToolUse handler 基于实际
13
- * 执行结果来做(已有机制)。所以前台模式下 orchestrator 只驱动 phase 0,
14
- * 其余阶段由 daemon 既有路径推进。
15
- *
16
- * 后台模式下,executePhase 阻塞直到 phase 真正完成,orchestrator 再推进。
17
- */
18
- import { logger } from '../../core/utils/logger.js';
19
- export class Orchestrator {
20
- storage;
21
- executor;
22
- planner;
23
- enableReplan;
24
- maxRetry;
25
- constructor(storage, executor, planner, options) {
26
- this.storage = storage;
27
- this.executor = executor;
28
- this.planner = planner;
29
- this.enableReplan = options?.enableReplan ?? (process.env.ENABLE_METHODOLOGY_REPLAN !== 'false');
30
- this.maxRetry = options?.maxRetry ?? parseInt(process.env.MAX_METHODOLOGY_RETRY || '2', 10);
31
- }
32
- async run(execution_id) {
33
- const execution = this.storage.getMethodologyExecution(execution_id);
34
- if (!execution)
35
- throw new Error(`execution ${execution_id} not found`);
36
- if (execution.status !== 'running') {
37
- logger.info(`[Orchestrator] execution ${execution_id} status=${execution.status}, nothing to do`);
38
- return;
39
- }
40
- const plan = JSON.parse(execution.plan_json);
41
- const startFrom = execution.current_phase_index ?? 0;
42
- for (let i = startFrom; i < plan.phases.length; i++) {
43
- const phase = plan.phases[i];
44
- logger.info(`[Orchestrator] execution=${execution_id} phase=${i + 1}/${plan.phases.length} (${phase.id} → ${phase.agent})`);
45
- const fresh = this.storage.getMethodologyExecution(execution_id);
46
- if (fresh.status !== 'running') {
47
- logger.info(`[Orchestrator] execution=${execution_id} status changed to ${fresh.status}, stopping`);
48
- return;
49
- }
50
- this.storage.updateMethodologyExecution(execution_id, {
51
- current_phase_index: i,
52
- last_progress_at: Date.now(),
53
- });
54
- const result = await this.executor.executePhase(fresh, phase, i);
55
- if (this.executor.mode === 'foreground') {
56
- // Foreground 模式:只入队第一阶段,后续由 PostToolUse 推进。
57
- logger.info(`[Orchestrator] foreground injected phase ${i}, handing off to hook pipeline`);
58
- return;
59
- }
60
- // Background 模式:result 指示 phase 的真实状态
61
- if (result.status === 'failed') {
62
- // 尝试失败反馈环
63
- const replanSucceeded = await this.attemptReplan(execution_id, i, result.error || 'unknown error', plan);
64
- if (replanSucceeded) {
65
- // Replan 成功,继续执行(从下一个 phase 开始,因为 plan 已更新)
66
- logger.info(`[Orchestrator] replan succeeded, continuing execution from phase ${i + 1}`);
67
- // 重新加载更新后的 plan
68
- const updatedExecution = this.storage.getMethodologyExecution(execution_id);
69
- const updatedPlan = JSON.parse(updatedExecution.plan_json);
70
- // 递归调用 run 以继续执行更新后的计划
71
- return this.run(execution_id);
72
- }
73
- // Replan 失败或未启用,标记 execution 为 failed
74
- this.storage.updateMethodologyExecution(execution_id, {
75
- status: 'failed',
76
- completed_at: Date.now(),
77
- worker_pid: null,
78
- });
79
- logger.warn(`[Orchestrator] execution=${execution_id} failed at phase ${i}: ${result.error}`);
80
- return;
81
- }
82
- if (result.status === 'cancelled') {
83
- this.storage.updateMethodologyExecution(execution_id, {
84
- status: 'cancelled',
85
- completed_at: Date.now(),
86
- worker_pid: null,
87
- });
88
- logger.info(`[Orchestrator] execution=${execution_id} cancelled at phase ${i}`);
89
- return;
90
- }
91
- }
92
- // 所有 phase 完成
93
- this.storage.updateMethodologyExecution(execution_id, {
94
- status: 'completed',
95
- completed_at: Date.now(),
96
- worker_pid: null,
97
- });
98
- logger.info(`[Orchestrator] execution=${execution_id} completed all ${plan.phases.length} phases`);
99
- }
100
- /**
101
- * 尝试重新规划(失败反馈环)
102
- * @returns true 如果 replan 成功并更新了 plan,false 否则
103
- */
104
- async attemptReplan(execution_id, failedPhaseIndex, failureReason, currentPlan) {
105
- // 检查是否启用 replan
106
- if (!this.enableReplan) {
107
- logger.info('[Orchestrator] replan disabled by configuration');
108
- return false;
109
- }
110
- // 检查是否有 planner
111
- if (!this.planner) {
112
- logger.info('[Orchestrator] no planner available for replan');
113
- return false;
114
- }
115
- // 检查 retry_count 是否达到上限
116
- const execution = this.storage.getMethodologyExecution(execution_id);
117
- const retryCount = execution.retry_count ?? 0;
118
- if (retryCount >= this.maxRetry) {
119
- logger.info(`[Orchestrator] retry_count=${retryCount} reached max=${this.maxRetry}, not replanning`);
120
- return false;
121
- }
122
- logger.info(`[Orchestrator] attempting replan for execution=${execution_id}, phase=${failedPhaseIndex}, retry=${retryCount + 1}/${this.maxRetry}`);
123
- // 获取原始计划
124
- const originalPlan = execution.original_plan_json
125
- ? JSON.parse(execution.original_plan_json)
126
- : currentPlan;
127
- // 获取已完成的 phases
128
- const completedPhases = currentPlan.phases.slice(0, failedPhaseIndex);
129
- try {
130
- // 调用 planner.replan()
131
- const newPlan = await this.planner.replan({
132
- executionId: execution_id,
133
- failedPhaseIndex,
134
- failureReason,
135
- originalPlan,
136
- completedPhases,
137
- });
138
- if (!newPlan) {
139
- logger.info('[Orchestrator] planner determined recovery not possible');
140
- return false;
141
- }
142
- // 更新 execution 的 plan 和 retry_count
143
- this.storage.updateMethodologyExecution(execution_id, {
144
- plan_json: JSON.stringify(newPlan),
145
- retry_count: retryCount + 1,
146
- current_phase_index: failedPhaseIndex, // 从失败的 phase 重新开始
147
- last_progress_at: Date.now(),
148
- });
149
- logger.info(`[Orchestrator] replan successful, updated plan with ${newPlan.phases.length} phases`);
150
- return true;
151
- }
152
- catch (err) {
153
- logger.warn(`[Orchestrator] replan failed with error: ${err}`);
154
- return false;
155
- }
156
- }
157
- }
158
- //# sourceMappingURL=orchestrator.js.map