@winspan/claude-forge 1.16.14 → 1.17.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 (80) hide show
  1. package/README.md +6 -6
  2. package/dist/daemon/index.d.ts.map +1 -1
  3. package/dist/daemon/index.js +8 -0
  4. package/dist/daemon/index.js.map +1 -1
  5. package/dist/pipeline/aggregator.d.ts +118 -0
  6. package/dist/pipeline/aggregator.d.ts.map +1 -0
  7. package/dist/pipeline/aggregator.js +252 -0
  8. package/dist/pipeline/aggregator.js.map +1 -0
  9. package/dist/pipeline/event-sourced-engine.d.ts +77 -0
  10. package/dist/pipeline/event-sourced-engine.d.ts.map +1 -0
  11. package/dist/pipeline/event-sourced-engine.js +266 -0
  12. package/dist/pipeline/event-sourced-engine.js.map +1 -0
  13. package/dist/pipeline/event-store.d.ts +58 -0
  14. package/dist/pipeline/event-store.d.ts.map +1 -0
  15. package/dist/pipeline/event-store.js +184 -0
  16. package/dist/pipeline/event-store.js.map +1 -0
  17. package/dist/pipeline/events.d.ts +166 -0
  18. package/dist/pipeline/events.d.ts.map +1 -0
  19. package/dist/pipeline/events.js +29 -0
  20. package/dist/pipeline/events.js.map +1 -0
  21. package/dist/pipeline/optimized-aggregator.d.ts +36 -0
  22. package/dist/pipeline/optimized-aggregator.d.ts.map +1 -0
  23. package/dist/pipeline/optimized-aggregator.js +93 -0
  24. package/dist/pipeline/optimized-aggregator.js.map +1 -0
  25. package/dist/pipeline/progress-tracker.d.ts +29 -0
  26. package/dist/pipeline/progress-tracker.d.ts.map +1 -0
  27. package/dist/pipeline/progress-tracker.js +99 -0
  28. package/dist/pipeline/progress-tracker.js.map +1 -0
  29. package/dist/pipeline/snapshot-store.d.ts +45 -0
  30. package/dist/pipeline/snapshot-store.d.ts.map +1 -0
  31. package/dist/pipeline/snapshot-store.js +89 -0
  32. package/dist/pipeline/snapshot-store.js.map +1 -0
  33. package/dist/pipeline/state-machine-types.d.ts +156 -0
  34. package/dist/pipeline/state-machine-types.d.ts.map +1 -0
  35. package/dist/pipeline/state-machine-types.js +7 -0
  36. package/dist/pipeline/state-machine-types.js.map +1 -0
  37. package/dist/pipeline/state-machine.d.ts +44 -0
  38. package/dist/pipeline/state-machine.d.ts.map +1 -0
  39. package/dist/pipeline/state-machine.js +203 -0
  40. package/dist/pipeline/state-machine.js.map +1 -0
  41. package/dist/pipeline/state-query.d.ts +71 -0
  42. package/dist/pipeline/state-query.d.ts.map +1 -0
  43. package/dist/pipeline/state-query.js +192 -0
  44. package/dist/pipeline/state-query.js.map +1 -0
  45. package/dist/pipeline/store.d.ts +12 -17
  46. package/dist/pipeline/store.d.ts.map +1 -1
  47. package/dist/pipeline/store.js +214 -110
  48. package/dist/pipeline/store.js.map +1 -1
  49. package/dist/pipeline/store.legacy.d.ts +48 -0
  50. package/dist/pipeline/store.legacy.d.ts.map +1 -0
  51. package/dist/pipeline/store.legacy.js +163 -0
  52. package/dist/pipeline/store.legacy.js.map +1 -0
  53. package/dist/pipeline/transitions.d.ts +28 -0
  54. package/dist/pipeline/transitions.d.ts.map +1 -0
  55. package/dist/pipeline/transitions.js +336 -0
  56. package/dist/pipeline/transitions.js.map +1 -0
  57. package/dist/scripts/auto-migrate.d.ts +9 -0
  58. package/dist/scripts/auto-migrate.d.ts.map +1 -0
  59. package/dist/scripts/auto-migrate.js +161 -0
  60. package/dist/scripts/auto-migrate.js.map +1 -0
  61. package/dist/scripts/migrate-to-event-sourcing.d.ts +16 -0
  62. package/dist/scripts/migrate-to-event-sourcing.d.ts.map +1 -0
  63. package/dist/scripts/migrate-to-event-sourcing.js +179 -0
  64. package/dist/scripts/migrate-to-event-sourcing.js.map +1 -0
  65. package/dist/storage/sqlite.d.ts +1 -0
  66. package/dist/storage/sqlite.d.ts.map +1 -1
  67. package/dist/storage/sqlite.js +3 -0
  68. package/dist/storage/sqlite.js.map +1 -1
  69. package/dist/web/routes/config.d.ts.map +1 -1
  70. package/dist/web/routes/config.js +48 -0
  71. package/dist/web/routes/config.js.map +1 -1
  72. package/dist/web/routes/events.d.ts.map +1 -1
  73. package/dist/web/routes/events.js +12 -0
  74. package/dist/web/routes/events.js.map +1 -1
  75. package/dist/web-static/assets/index-BFIWA0KC.css +2 -0
  76. package/dist/web-static/assets/index-BmOm81pb.js +65 -0
  77. package/dist/web-static/index.html +2 -2
  78. package/package.json +3 -1
  79. package/dist/web-static/assets/index-7DiTbk7a.css +0 -2
  80. package/dist/web-static/assets/index-nauLZfI_.js +0 -65
@@ -0,0 +1,156 @@
1
+ /**
2
+ * Pipeline 状态机 - 状态定义
3
+ *
4
+ * 定义所有合法的 Pipeline 状态和转换触发器
5
+ */
6
+ /**
7
+ * Pipeline 阶段
8
+ */
9
+ export type PipelinePhase = 'analyze' | 'design' | 'profile' | 'code' | 'test' | 'review' | 'done';
10
+ /**
11
+ * Pipeline 状态(阶段 + 状态)
12
+ */
13
+ export type PipelineStateMachineState = {
14
+ phase: 'analyze';
15
+ status: 'in_progress';
16
+ } | {
17
+ phase: 'analyze';
18
+ status: 'quality_checking';
19
+ } | {
20
+ phase: 'analyze';
21
+ status: 'quality_blocked';
22
+ fixAttempt: number;
23
+ } | {
24
+ phase: 'analyze';
25
+ status: 'quality_forced_pass';
26
+ } | {
27
+ phase: 'design';
28
+ status: 'in_progress';
29
+ } | {
30
+ phase: 'design';
31
+ status: 'quality_checking';
32
+ } | {
33
+ phase: 'design';
34
+ status: 'quality_blocked';
35
+ fixAttempt: number;
36
+ } | {
37
+ phase: 'design';
38
+ status: 'quality_forced_pass';
39
+ } | {
40
+ phase: 'profile';
41
+ status: 'in_progress';
42
+ } | {
43
+ phase: 'profile';
44
+ status: 'quality_checking';
45
+ } | {
46
+ phase: 'profile';
47
+ status: 'quality_blocked';
48
+ fixAttempt: number;
49
+ } | {
50
+ phase: 'profile';
51
+ status: 'quality_forced_pass';
52
+ } | {
53
+ phase: 'code';
54
+ status: 'in_progress';
55
+ } | {
56
+ phase: 'code';
57
+ status: 'quality_checking';
58
+ } | {
59
+ phase: 'code';
60
+ status: 'quality_blocked';
61
+ fixAttempt: number;
62
+ } | {
63
+ phase: 'code';
64
+ status: 'quality_forced_pass';
65
+ } | {
66
+ phase: 'test';
67
+ status: 'in_progress';
68
+ } | {
69
+ phase: 'test';
70
+ status: 'quality_checking';
71
+ } | {
72
+ phase: 'test';
73
+ status: 'quality_blocked';
74
+ fixAttempt: number;
75
+ } | {
76
+ phase: 'test';
77
+ status: 'quality_forced_pass';
78
+ } | {
79
+ phase: 'review';
80
+ status: 'in_progress';
81
+ } | {
82
+ phase: 'review';
83
+ status: 'quality_checking';
84
+ } | {
85
+ phase: 'review';
86
+ status: 'quality_blocked';
87
+ fixAttempt: number;
88
+ } | {
89
+ phase: 'review';
90
+ status: 'quality_forced_pass';
91
+ } | {
92
+ phase: 'done';
93
+ status: 'completed';
94
+ };
95
+ /**
96
+ * 状态转换触发器
97
+ */
98
+ export type StateMachineTrigger = {
99
+ type: 'TASK_COMPLETED';
100
+ taskId: string;
101
+ } | {
102
+ type: 'ALL_TASKS_COMPLETED';
103
+ } | {
104
+ type: 'QUALITY_CHECK_STARTED';
105
+ } | {
106
+ type: 'QUALITY_CHECK_PASSED';
107
+ level: 'pass' | 'warn';
108
+ } | {
109
+ type: 'QUALITY_CHECK_FAILED';
110
+ issues: string[];
111
+ fixAttempt: number;
112
+ } | {
113
+ type: 'QUALITY_FIX_APPLIED';
114
+ } | {
115
+ type: 'QUALITY_MAX_ATTEMPTS_REACHED';
116
+ unresolvedIssues: string[];
117
+ } | {
118
+ type: 'ACTIVITY_THRESHOLD_TRIGGERED';
119
+ reason: string;
120
+ } | {
121
+ type: 'EMPTY_PHASE_DETECTED';
122
+ } | {
123
+ type: 'MANUAL_ADVANCE';
124
+ reason?: string;
125
+ } | {
126
+ type: 'MANUAL_CLOSE';
127
+ reason?: string;
128
+ };
129
+ /**
130
+ * 状态转换上下文
131
+ */
132
+ export interface StateMachineContext {
133
+ pipelineId: string;
134
+ currentState: PipelineStateMachineState;
135
+ tasks: Array<{
136
+ id: string;
137
+ phase: string;
138
+ status: 'pending' | 'in_progress' | 'completed' | 'failed';
139
+ }>;
140
+ eventCount: number;
141
+ writeEditCount: number;
142
+ lastWriteEditTime?: number;
143
+ }
144
+ /**
145
+ * 状态转换结果
146
+ */
147
+ export interface TransitionResult {
148
+ success: boolean;
149
+ newState?: PipelineStateMachineState;
150
+ events?: Array<{
151
+ type: string;
152
+ payload: any;
153
+ }>;
154
+ error?: string;
155
+ }
156
+ //# sourceMappingURL=state-machine-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-machine-types.d.ts","sourceRoot":"","sources":["../../src/pipeline/state-machine-types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Pipeline 状态机 - 状态定义
3
+ *
4
+ * 定义所有合法的 Pipeline 状态和转换触发器
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=state-machine-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-machine-types.js","sourceRoot":"","sources":["../../src/pipeline/state-machine-types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Pipeline 状态机引擎
3
+ *
4
+ * 职责:
5
+ * 1. 执行状态转换
6
+ * 2. 验证转换合法性(守卫条件)
7
+ * 3. 执行转换动作(生成事件)
8
+ * 4. 保证状态一致性
9
+ */
10
+ import { EventStore } from './event-store.js';
11
+ import { PipelineAggregator } from './aggregator.js';
12
+ import { StateMachineTrigger, TransitionResult } from './state-machine-types.js';
13
+ import { StateTransition } from './transitions.js';
14
+ export declare class PipelineStateMachine {
15
+ private eventStore;
16
+ private aggregator;
17
+ private transitions;
18
+ constructor(eventStore: EventStore, aggregator: PipelineAggregator, transitions?: StateTransition[]);
19
+ /**
20
+ * 执行状态转换
21
+ */
22
+ transition(pipelineId: string, trigger: StateMachineTrigger): Promise<TransitionResult>;
23
+ /**
24
+ * 查找匹配的转换规则
25
+ */
26
+ private findTransition;
27
+ /**
28
+ * 状态匹配检查
29
+ */
30
+ private stateMatches;
31
+ /**
32
+ * 构建转换上下文
33
+ */
34
+ private buildContext;
35
+ /**
36
+ * 检查是否可以执行转换
37
+ */
38
+ canTransition(pipelineId: string, trigger: StateMachineTrigger): boolean;
39
+ /**
40
+ * 获取可用的转换列表
41
+ */
42
+ getAvailableTransitions(pipelineId: string): StateMachineTrigger['type'][];
43
+ }
44
+ //# sourceMappingURL=state-machine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-machine.d.ts","sourceRoot":"","sources":["../../src/pipeline/state-machine.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAEL,mBAAmB,EAEnB,gBAAgB,EACjB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,eAAe,EAAwB,MAAM,kBAAkB,CAAC;AAGzE,qBAAa,oBAAoB;IAE7B,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,WAAW;gBAFX,UAAU,EAAE,UAAU,EACtB,UAAU,EAAE,kBAAkB,EAC9B,WAAW,GAAE,eAAe,EAAyB;IAG/D;;OAEG;IACG,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAuE7F;;OAEG;IACH,OAAO,CAAC,cAAc;IAkBtB;;OAEG;IACH,OAAO,CAAC,YAAY;IAyBpB;;OAEG;IACH,OAAO,CAAC,YAAY;IA0CpB;;OAEG;IACH,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,mBAAmB,GAAG,OAAO;IAqBxE;;OAEG;IACH,uBAAuB,CAAC,UAAU,EAAE,MAAM,GAAG,mBAAmB,CAAC,MAAM,CAAC,EAAE;CAyB3E"}
@@ -0,0 +1,203 @@
1
+ /**
2
+ * Pipeline 状态机引擎
3
+ *
4
+ * 职责:
5
+ * 1. 执行状态转换
6
+ * 2. 验证转换合法性(守卫条件)
7
+ * 3. 执行转换动作(生成事件)
8
+ * 4. 保证状态一致性
9
+ */
10
+ import { PIPELINE_TRANSITIONS } from './transitions.js';
11
+ export class PipelineStateMachine {
12
+ eventStore;
13
+ aggregator;
14
+ transitions;
15
+ constructor(eventStore, aggregator, transitions = PIPELINE_TRANSITIONS) {
16
+ this.eventStore = eventStore;
17
+ this.aggregator = aggregator;
18
+ this.transitions = transitions;
19
+ }
20
+ /**
21
+ * 执行状态转换
22
+ */
23
+ async transition(pipelineId, trigger) {
24
+ // 1. 重建当前状态
25
+ const pipelineState = this.aggregator.rebuild(pipelineId);
26
+ if (!pipelineState) {
27
+ return {
28
+ success: false,
29
+ error: `Pipeline ${pipelineId} not found`,
30
+ };
31
+ }
32
+ const currentState = {
33
+ phase: pipelineState.phase,
34
+ status: pipelineState.status,
35
+ ...(pipelineState.qualityFixAttempt !== undefined ? { fixAttempt: pipelineState.qualityFixAttempt } : {}),
36
+ };
37
+ // 2. 查找匹配的转换规则
38
+ const transition = this.findTransition(currentState, trigger);
39
+ if (!transition) {
40
+ return {
41
+ success: false,
42
+ error: `No transition found from ${JSON.stringify(currentState)} with trigger ${trigger.type}`,
43
+ };
44
+ }
45
+ // 3. 构建上下文
46
+ const context = this.buildContext(pipelineId, currentState, pipelineState);
47
+ // 4. 检查守卫条件
48
+ if (transition.guard && !transition.guard(context, trigger)) {
49
+ return {
50
+ success: false,
51
+ error: `Guard condition failed for transition "${transition.name}"`,
52
+ };
53
+ }
54
+ // 5. 计算新状态
55
+ const newState = typeof transition.to === 'function'
56
+ ? transition.to(context, trigger)
57
+ : transition.to;
58
+ // 6. 执行转换动作(生成事件)
59
+ let events = [];
60
+ if (transition.action) {
61
+ try {
62
+ events = await transition.action(context, trigger);
63
+ }
64
+ catch (err) {
65
+ return {
66
+ success: false,
67
+ error: `Action failed for transition "${transition.name}": ${err}`,
68
+ };
69
+ }
70
+ }
71
+ // 7. 持久化事件
72
+ for (const event of events) {
73
+ this.eventStore.append({
74
+ pipelineId: event.pipelineId,
75
+ type: event.type,
76
+ payload: event.payload,
77
+ metadata: event.metadata,
78
+ });
79
+ }
80
+ return {
81
+ success: true,
82
+ newState,
83
+ events: events.map(e => ({ type: e.type, payload: e.payload })),
84
+ };
85
+ }
86
+ /**
87
+ * 查找匹配的转换规则
88
+ */
89
+ findTransition(currentState, trigger) {
90
+ for (const transition of this.transitions) {
91
+ // 检查触发器类型匹配
92
+ if (transition.trigger.type !== trigger.type) {
93
+ continue;
94
+ }
95
+ // 检查状态匹配
96
+ if (this.stateMatches(transition.from, currentState)) {
97
+ return transition;
98
+ }
99
+ }
100
+ return null;
101
+ }
102
+ /**
103
+ * 状态匹配检查
104
+ */
105
+ stateMatches(pattern, actual) {
106
+ // 通配符匹配
107
+ if ('phase' in pattern && pattern.phase === '*') {
108
+ return true;
109
+ }
110
+ // 精确匹配 phase
111
+ if ('phase' in pattern && pattern.phase !== actual.phase) {
112
+ return false;
113
+ }
114
+ // 精确匹配 status(支持通配符)
115
+ if ('status' in pattern) {
116
+ const patternStatus = pattern.status;
117
+ if (patternStatus && patternStatus !== '*' && patternStatus !== actual.status) {
118
+ return false;
119
+ }
120
+ }
121
+ return true;
122
+ }
123
+ /**
124
+ * 构建转换上下文
125
+ */
126
+ buildContext(pipelineId, currentState, pipelineState) {
127
+ // 获取事件统计
128
+ const events = this.eventStore.getEvents(pipelineId);
129
+ const phaseEvents = events.filter(e => {
130
+ // 找到最近一次阶段推进事件
131
+ const lastPhaseAdvance = events
132
+ .filter(ev => ev.type === 'phase.advanced')
133
+ .reverse()[0];
134
+ if (!lastPhaseAdvance) {
135
+ return true; // 没有阶段推进,所有事件都算
136
+ }
137
+ return e.timestamp > lastPhaseAdvance.timestamp;
138
+ });
139
+ const writeEditEvents = phaseEvents.filter(e => e.type === 'activity.tool_tracked' &&
140
+ e.payload.toolName &&
141
+ ['Write', 'Edit'].includes(e.payload.toolName));
142
+ const lastWriteEdit = writeEditEvents[writeEditEvents.length - 1];
143
+ return {
144
+ pipelineId,
145
+ currentState,
146
+ tasks: pipelineState.tasks.map((t) => ({
147
+ id: t.id,
148
+ phase: t.phase,
149
+ status: t.status,
150
+ })),
151
+ eventCount: phaseEvents.length,
152
+ writeEditCount: writeEditEvents.length,
153
+ lastWriteEditTime: lastWriteEdit?.timestamp,
154
+ };
155
+ }
156
+ /**
157
+ * 检查是否可以执行转换
158
+ */
159
+ canTransition(pipelineId, trigger) {
160
+ const pipelineState = this.aggregator.rebuild(pipelineId);
161
+ if (!pipelineState)
162
+ return false;
163
+ const currentState = {
164
+ phase: pipelineState.phase,
165
+ status: pipelineState.status,
166
+ ...(pipelineState.qualityFixAttempt !== undefined ? { fixAttempt: pipelineState.qualityFixAttempt } : {}),
167
+ };
168
+ const transition = this.findTransition(currentState, trigger);
169
+ if (!transition)
170
+ return false;
171
+ if (transition.guard) {
172
+ const context = this.buildContext(pipelineId, currentState, pipelineState);
173
+ return transition.guard(context, trigger);
174
+ }
175
+ return true;
176
+ }
177
+ /**
178
+ * 获取可用的转换列表
179
+ */
180
+ getAvailableTransitions(pipelineId) {
181
+ const pipelineState = this.aggregator.rebuild(pipelineId);
182
+ if (!pipelineState)
183
+ return [];
184
+ const currentState = {
185
+ phase: pipelineState.phase,
186
+ status: pipelineState.status,
187
+ ...(pipelineState.qualityFixAttempt !== undefined ? { fixAttempt: pipelineState.qualityFixAttempt } : {}),
188
+ };
189
+ const context = this.buildContext(pipelineId, currentState, pipelineState);
190
+ const availableTriggers = [];
191
+ for (const transition of this.transitions) {
192
+ if (this.stateMatches(transition.from, currentState)) {
193
+ if (!transition.guard || transition.guard(context, { type: transition.trigger.type })) {
194
+ if (!availableTriggers.includes(transition.trigger.type)) {
195
+ availableTriggers.push(transition.trigger.type);
196
+ }
197
+ }
198
+ }
199
+ }
200
+ return availableTriggers;
201
+ }
202
+ }
203
+ //# sourceMappingURL=state-machine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-machine.js","sourceRoot":"","sources":["../../src/pipeline/state-machine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Pipeline 状态查询服务
3
+ *
4
+ * 职责:
5
+ * 1. 查询当前状态
6
+ * 2. 检查转换可行性
7
+ * 3. 查询状态历史
8
+ * 4. 提供状态分析
9
+ */
10
+ import { PipelineAggregator } from './aggregator.js';
11
+ import { EventStore } from './event-store.js';
12
+ import { PipelineStateMachine } from './state-machine.js';
13
+ import { PipelineStateMachineState, StateMachineTrigger } from './state-machine-types.js';
14
+ export interface StateHistoryEntry {
15
+ state: PipelineStateMachineState;
16
+ timestamp: number;
17
+ trigger?: string;
18
+ eventId: string;
19
+ }
20
+ export declare class PipelineStateQuery {
21
+ private aggregator;
22
+ private eventStore;
23
+ private stateMachine;
24
+ constructor(aggregator: PipelineAggregator, eventStore: EventStore, stateMachine: PipelineStateMachine);
25
+ /**
26
+ * 获取当前状态
27
+ */
28
+ getCurrentState(pipelineId: string): PipelineStateMachineState | null;
29
+ /**
30
+ * 检查是否可以执行转换
31
+ */
32
+ canTransition(pipelineId: string, trigger: StateMachineTrigger): boolean;
33
+ /**
34
+ * 获取可用的转换列表
35
+ */
36
+ getAvailableTransitions(pipelineId: string): StateMachineTrigger['type'][];
37
+ /**
38
+ * 获取状态历史
39
+ */
40
+ getStateHistory(pipelineId: string): StateHistoryEntry[];
41
+ /**
42
+ * 获取阶段停留时长
43
+ */
44
+ getPhaseDuration(pipelineId: string, phase: string): number | null;
45
+ /**
46
+ * 获取质量门禁统计
47
+ */
48
+ getQualityGateStats(pipelineId: string): {
49
+ totalChecks: number;
50
+ passed: number;
51
+ failed: number;
52
+ forcedPass: number;
53
+ };
54
+ /**
55
+ * 获取阶段事件统计
56
+ */
57
+ getPhaseEventStats(pipelineId: string, phase: string): {
58
+ totalEvents: number;
59
+ toolTracked: number;
60
+ tasksCompleted: number;
61
+ };
62
+ /**
63
+ * 判断是否处于阻塞状态
64
+ */
65
+ isBlocked(pipelineId: string): boolean;
66
+ /**
67
+ * 获取阻塞原因
68
+ */
69
+ getBlockReason(pipelineId: string): string | null;
70
+ }
71
+ //# sourceMappingURL=state-query.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-query.d.ts","sourceRoot":"","sources":["../../src/pipeline/state-query.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EACL,yBAAyB,EACzB,mBAAmB,EACpB,MAAM,0BAA0B,CAAC;AAGlC,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,yBAAyB,CAAC;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,kBAAkB;IAE3B,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,YAAY;gBAFZ,UAAU,EAAE,kBAAkB,EAC9B,UAAU,EAAE,UAAU,EACtB,YAAY,EAAE,oBAAoB;IAG5C;;OAEG;IACH,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,yBAAyB,GAAG,IAAI;IAWrE;;OAEG;IACH,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,mBAAmB,GAAG,OAAO;IAIxE;;OAEG;IACH,uBAAuB,CAAC,UAAU,EAAE,MAAM,GAAG,mBAAmB,CAAC,MAAM,CAAC,EAAE;IAI1E;;OAEG;IACH,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,iBAAiB,EAAE;IA4ExD;;OAEG;IACH,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAYlE;;OAEG;IACH,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG;QACvC,WAAW,EAAE,MAAM,CAAC;QACpB,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;KACpB;IAiBD;;OAEG;IACH,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG;QACrD,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;QACpB,cAAc,EAAE,MAAM,CAAC;KACxB;IAuBD;;OAEG;IACH,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAOtC;;OAEG;IACH,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;CAwBlD"}