@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,58 +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 type { MethodologyExecution, PlannedPhase } from '../types.js';
11
- import type { SQLiteStorage } from '../../core/storage/sqlite.js';
12
- import type { MethodologyRegistry } from '../methodology-registry.js';
13
- import type { ExecutorEventListener, PhaseExecutionResult, PhaseExecutor } from './types.js';
14
- export interface BackgroundExecutorOptions {
15
- /** claude CLI 可执行文件路径(默认走 PATH) */
16
- claudeBin?: string;
17
- /** 子进程 cwd;默认为当前项目目录 */
18
- cwd?: string;
19
- /** 项目根目录,作为 --add-dir 的参数;默认走 cwd */
20
- projectRoot?: string;
21
- /** 每个 phase 的最大预算美元(默认 2) */
22
- maxBudgetUsdPerPhase?: number;
23
- /** 权限模式(默认 bypassPermissions) */
24
- permissionMode?: 'acceptEdits' | 'bypassPermissions' | 'default' | 'dontAsk' | 'plan';
25
- /** 默认禁用的工具(逗号分隔) */
26
- disallowedTools?: string;
27
- /** phase 级 wall-clock 超时(ms),默认 30 分钟 */
28
- phaseTimeoutMs?: number;
29
- /** stream-json 日志根目录 */
30
- logDir?: string;
31
- /**
32
- * worker 专用 settings.json 路径。若未提供,会懒生成到
33
- * `$HOME/.claude-forge/worker-settings.json`,内容为 `{"hooks": {}}`。
34
- * 目的:让 worker 子进程跳过 daemon hooks,避免递归触发。
35
- */
36
- settingsPath?: string;
37
- }
38
- export declare class BackgroundExecutor implements PhaseExecutor {
39
- private storage;
40
- private registry;
41
- readonly mode: "background";
42
- private listeners;
43
- private running;
44
- private cancelRequested;
45
- private readonly opts;
46
- constructor(storage: SQLiteStorage, registry: MethodologyRegistry, options?: BackgroundExecutorOptions);
47
- executePhase(execution: MethodologyExecution, phase: PlannedPhase, phaseIndex: number): Promise<PhaseExecutionResult>;
48
- cancel(execution_id: number): Promise<void>;
49
- subscribe(listener: ExecutorEventListener): () => void;
50
- private emit;
51
- /**
52
- * @internal test-only: 构建 spawn 参数。生产代码请走 `executePhase`。
53
- */
54
- buildArgs(): string[];
55
- /** @internal test-only */
56
- getSettingsPath(): string;
57
- }
58
- //# sourceMappingURL=background-executor.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"background-executor.d.ts","sourceRoot":"","sources":["../../../src/capability/executor/background-executor.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,OAAO,KAAK,EAAE,oBAAoB,EAAE,YAAY,EAAiB,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;AAWpB,MAAM,WAAW,yBAAyB;IACxC,mCAAmC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wBAAwB;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,qCAAqC;IACrC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,6BAA6B;IAC7B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,iCAAiC;IACjC,cAAc,CAAC,EAAE,aAAa,GAAG,mBAAmB,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;IACtF,oBAAoB;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,yCAAyC;IACzC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,wBAAwB;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAcD,qBAAa,kBAAmB,YAAW,aAAa;IAQpD,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,QAAQ;IARlB,QAAQ,CAAC,IAAI,EAAG,YAAY,CAAU;IACtC,OAAO,CAAC,SAAS,CAAoC;IACrD,OAAO,CAAC,OAAO,CAAqD;IACpE,OAAO,CAAC,eAAe,CAAqB;IAC5C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAsF;gBAGjG,OAAO,EAAE,aAAa,EACtB,QAAQ,EAAE,mBAAmB,EACrC,OAAO,GAAE,yBAA8B;IAiBnC,YAAY,CAChB,SAAS,EAAE,oBAAoB,EAC/B,KAAK,EAAE,YAAY,EACnB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,oBAAoB,CAAC;IAoO1B,MAAM,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBjD,SAAS,CAAC,QAAQ,EAAE,qBAAqB,GAAG,MAAM,IAAI;IAKtD,OAAO,CAAC,IAAI;IAMZ;;OAEG;IACH,SAAS,IAAI,MAAM,EAAE;IAoBrB,0BAA0B;IAC1B,eAAe,IAAI,MAAM;CAG1B"}
@@ -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":"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"}
@@ -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"}