@specforge/mcp 2.6.0 → 3.0.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 (237) hide show
  1. package/README.md +73 -0
  2. package/bin/{specforge-mcp → specforge} +0 -5
  3. package/dist/ai-provider/circuit-breaker.d.ts +63 -0
  4. package/dist/ai-provider/circuit-breaker.d.ts.map +1 -0
  5. package/dist/ai-provider/circuit-breaker.js +160 -0
  6. package/dist/ai-provider/circuit-breaker.js.map +1 -0
  7. package/dist/ai-provider/cli-version.d.ts +50 -0
  8. package/dist/ai-provider/cli-version.d.ts.map +1 -0
  9. package/dist/ai-provider/cli-version.js +141 -0
  10. package/dist/ai-provider/cli-version.js.map +1 -0
  11. package/dist/ai-provider/config-loader.d.ts +45 -0
  12. package/dist/ai-provider/config-loader.d.ts.map +1 -0
  13. package/dist/ai-provider/config-loader.js +106 -0
  14. package/dist/ai-provider/config-loader.js.map +1 -0
  15. package/dist/ai-provider/errors.d.ts +48 -0
  16. package/dist/ai-provider/errors.d.ts.map +1 -0
  17. package/dist/ai-provider/errors.js +102 -0
  18. package/dist/ai-provider/errors.js.map +1 -0
  19. package/dist/ai-provider/events.d.ts +73 -0
  20. package/dist/ai-provider/events.d.ts.map +1 -0
  21. package/dist/ai-provider/events.js +75 -0
  22. package/dist/ai-provider/events.js.map +1 -0
  23. package/dist/ai-provider/factory.d.ts +31 -0
  24. package/dist/ai-provider/factory.d.ts.map +1 -0
  25. package/dist/ai-provider/factory.js +100 -0
  26. package/dist/ai-provider/factory.js.map +1 -0
  27. package/dist/ai-provider/index.d.ts +24 -0
  28. package/dist/ai-provider/index.d.ts.map +1 -0
  29. package/dist/ai-provider/index.js +46 -0
  30. package/dist/ai-provider/index.js.map +1 -0
  31. package/dist/ai-provider/instance-coordinator.d.ts +54 -0
  32. package/dist/ai-provider/instance-coordinator.d.ts.map +1 -0
  33. package/dist/ai-provider/instance-coordinator.js +199 -0
  34. package/dist/ai-provider/instance-coordinator.js.map +1 -0
  35. package/dist/ai-provider/jsonl-parser.d.ts +43 -0
  36. package/dist/ai-provider/jsonl-parser.d.ts.map +1 -0
  37. package/dist/ai-provider/jsonl-parser.js +107 -0
  38. package/dist/ai-provider/jsonl-parser.js.map +1 -0
  39. package/dist/ai-provider/lifecycle.d.ts +50 -0
  40. package/dist/ai-provider/lifecycle.d.ts.map +1 -0
  41. package/dist/ai-provider/lifecycle.js +145 -0
  42. package/dist/ai-provider/lifecycle.js.map +1 -0
  43. package/dist/ai-provider/logger.d.ts +69 -0
  44. package/dist/ai-provider/logger.d.ts.map +1 -0
  45. package/dist/ai-provider/logger.js +161 -0
  46. package/dist/ai-provider/logger.js.map +1 -0
  47. package/dist/ai-provider/metrics.d.ts +91 -0
  48. package/dist/ai-provider/metrics.d.ts.map +1 -0
  49. package/dist/ai-provider/metrics.js +187 -0
  50. package/dist/ai-provider/metrics.js.map +1 -0
  51. package/dist/ai-provider/process-manager.d.ts +97 -0
  52. package/dist/ai-provider/process-manager.d.ts.map +1 -0
  53. package/dist/ai-provider/process-manager.js +477 -0
  54. package/dist/ai-provider/process-manager.js.map +1 -0
  55. package/dist/ai-provider/providers/claude-code.d.ts +64 -0
  56. package/dist/ai-provider/providers/claude-code.d.ts.map +1 -0
  57. package/dist/ai-provider/providers/claude-code.js +205 -0
  58. package/dist/ai-provider/providers/claude-code.js.map +1 -0
  59. package/dist/ai-provider/retry-executor.d.ts +52 -0
  60. package/dist/ai-provider/retry-executor.d.ts.map +1 -0
  61. package/dist/ai-provider/retry-executor.js +138 -0
  62. package/dist/ai-provider/retry-executor.js.map +1 -0
  63. package/dist/ai-provider/safe-args.d.ts +58 -0
  64. package/dist/ai-provider/safe-args.d.ts.map +1 -0
  65. package/dist/ai-provider/safe-args.js +176 -0
  66. package/dist/ai-provider/safe-args.js.map +1 -0
  67. package/dist/ai-provider/semaphore.d.ts +50 -0
  68. package/dist/ai-provider/semaphore.d.ts.map +1 -0
  69. package/dist/ai-provider/semaphore.js +97 -0
  70. package/dist/ai-provider/semaphore.js.map +1 -0
  71. package/dist/ai-provider/tracer.d.ts +67 -0
  72. package/dist/ai-provider/tracer.d.ts.map +1 -0
  73. package/dist/ai-provider/tracer.js +209 -0
  74. package/dist/ai-provider/tracer.js.map +1 -0
  75. package/dist/ai-provider/types.d.ts +181 -0
  76. package/dist/ai-provider/types.d.ts.map +1 -0
  77. package/dist/ai-provider/types.js +8 -0
  78. package/dist/ai-provider/types.js.map +1 -0
  79. package/dist/autopilot/agents/agent-runner.d.ts +109 -0
  80. package/dist/autopilot/agents/agent-runner.d.ts.map +1 -0
  81. package/dist/autopilot/agents/agent-runner.js +731 -0
  82. package/dist/autopilot/agents/agent-runner.js.map +1 -0
  83. package/dist/autopilot/agents/agent-selector.d.ts +59 -0
  84. package/dist/autopilot/agents/agent-selector.d.ts.map +1 -0
  85. package/dist/autopilot/agents/agent-selector.js +234 -0
  86. package/dist/autopilot/agents/agent-selector.js.map +1 -0
  87. package/dist/autopilot/agents/model-selector.d.ts +49 -0
  88. package/dist/autopilot/agents/model-selector.d.ts.map +1 -0
  89. package/dist/autopilot/agents/model-selector.js +62 -0
  90. package/dist/autopilot/agents/model-selector.js.map +1 -0
  91. package/dist/autopilot/agents/profiles/builtin.d.ts +55 -0
  92. package/dist/autopilot/agents/profiles/builtin.d.ts.map +1 -0
  93. package/dist/autopilot/agents/profiles/builtin.js +323 -0
  94. package/dist/autopilot/agents/profiles/builtin.js.map +1 -0
  95. package/dist/autopilot/agents/profiles/types.d.ts +98 -0
  96. package/dist/autopilot/agents/profiles/types.d.ts.map +1 -0
  97. package/dist/autopilot/agents/profiles/types.js +17 -0
  98. package/dist/autopilot/agents/profiles/types.js.map +1 -0
  99. package/dist/autopilot/api/autopilot-api-client.d.ts +217 -0
  100. package/dist/autopilot/api/autopilot-api-client.d.ts.map +1 -0
  101. package/dist/autopilot/api/autopilot-api-client.js +402 -0
  102. package/dist/autopilot/api/autopilot-api-client.js.map +1 -0
  103. package/dist/autopilot/cli/abort.d.ts +20 -0
  104. package/dist/autopilot/cli/abort.d.ts.map +1 -0
  105. package/dist/autopilot/cli/abort.js +201 -0
  106. package/dist/autopilot/cli/abort.js.map +1 -0
  107. package/dist/autopilot/cli/display.d.ts +63 -0
  108. package/dist/autopilot/cli/display.d.ts.map +1 -0
  109. package/dist/autopilot/cli/display.js +260 -0
  110. package/dist/autopilot/cli/display.js.map +1 -0
  111. package/dist/autopilot/cli/index.d.ts +24 -0
  112. package/dist/autopilot/cli/index.d.ts.map +1 -0
  113. package/dist/autopilot/cli/index.js +79 -0
  114. package/dist/autopilot/cli/index.js.map +1 -0
  115. package/dist/autopilot/cli/pause.d.ts +18 -0
  116. package/dist/autopilot/cli/pause.d.ts.map +1 -0
  117. package/dist/autopilot/cli/pause.js +110 -0
  118. package/dist/autopilot/cli/pause.js.map +1 -0
  119. package/dist/autopilot/cli/resume.d.ts +22 -0
  120. package/dist/autopilot/cli/resume.d.ts.map +1 -0
  121. package/dist/autopilot/cli/resume.js +172 -0
  122. package/dist/autopilot/cli/resume.js.map +1 -0
  123. package/dist/autopilot/cli/run.d.ts +25 -0
  124. package/dist/autopilot/cli/run.d.ts.map +1 -0
  125. package/dist/autopilot/cli/run.js +220 -0
  126. package/dist/autopilot/cli/run.js.map +1 -0
  127. package/dist/autopilot/cli/status.d.ts +20 -0
  128. package/dist/autopilot/cli/status.d.ts.map +1 -0
  129. package/dist/autopilot/cli/status.js +217 -0
  130. package/dist/autopilot/cli/status.js.map +1 -0
  131. package/dist/autopilot/config.d.ts +45 -0
  132. package/dist/autopilot/config.d.ts.map +1 -0
  133. package/dist/autopilot/config.js +269 -0
  134. package/dist/autopilot/config.js.map +1 -0
  135. package/dist/autopilot/core/dependency-resolver.d.ts +108 -0
  136. package/dist/autopilot/core/dependency-resolver.d.ts.map +1 -0
  137. package/dist/autopilot/core/dependency-resolver.js +394 -0
  138. package/dist/autopilot/core/dependency-resolver.js.map +1 -0
  139. package/dist/autopilot/core/dispatcher.d.ts +215 -0
  140. package/dist/autopilot/core/dispatcher.d.ts.map +1 -0
  141. package/dist/autopilot/core/dispatcher.js +594 -0
  142. package/dist/autopilot/core/dispatcher.js.map +1 -0
  143. package/dist/autopilot/core/failure-handler.d.ts +145 -0
  144. package/dist/autopilot/core/failure-handler.d.ts.map +1 -0
  145. package/dist/autopilot/core/failure-handler.js +308 -0
  146. package/dist/autopilot/core/failure-handler.js.map +1 -0
  147. package/dist/autopilot/core/rate-limit-handler.d.ts +108 -0
  148. package/dist/autopilot/core/rate-limit-handler.d.ts.map +1 -0
  149. package/dist/autopilot/core/rate-limit-handler.js +195 -0
  150. package/dist/autopilot/core/rate-limit-handler.js.map +1 -0
  151. package/dist/autopilot/core/state-manager.d.ts +160 -0
  152. package/dist/autopilot/core/state-manager.d.ts.map +1 -0
  153. package/dist/autopilot/core/state-manager.js +393 -0
  154. package/dist/autopilot/core/state-manager.js.map +1 -0
  155. package/dist/autopilot/core/timeout-manager.d.ts +95 -0
  156. package/dist/autopilot/core/timeout-manager.d.ts.map +1 -0
  157. package/dist/autopilot/core/timeout-manager.js +188 -0
  158. package/dist/autopilot/core/timeout-manager.js.map +1 -0
  159. package/dist/autopilot/git/branch-manager.d.ts +117 -0
  160. package/dist/autopilot/git/branch-manager.d.ts.map +1 -0
  161. package/dist/autopilot/git/branch-manager.js +238 -0
  162. package/dist/autopilot/git/branch-manager.js.map +1 -0
  163. package/dist/autopilot/git/index.d.ts +9 -0
  164. package/dist/autopilot/git/index.d.ts.map +1 -0
  165. package/dist/autopilot/git/index.js +9 -0
  166. package/dist/autopilot/git/index.js.map +1 -0
  167. package/dist/autopilot/git/merge-manager.d.ts +118 -0
  168. package/dist/autopilot/git/merge-manager.d.ts.map +1 -0
  169. package/dist/autopilot/git/merge-manager.js +304 -0
  170. package/dist/autopilot/git/merge-manager.js.map +1 -0
  171. package/dist/autopilot/git/worktree-manager.d.ts +128 -0
  172. package/dist/autopilot/git/worktree-manager.d.ts.map +1 -0
  173. package/dist/autopilot/git/worktree-manager.js +298 -0
  174. package/dist/autopilot/git/worktree-manager.js.map +1 -0
  175. package/dist/autopilot/index.d.ts +30 -0
  176. package/dist/autopilot/index.d.ts.map +1 -0
  177. package/dist/autopilot/index.js +55 -0
  178. package/dist/autopilot/index.js.map +1 -0
  179. package/dist/autopilot/sync/index.d.ts +7 -0
  180. package/dist/autopilot/sync/index.d.ts.map +1 -0
  181. package/dist/autopilot/sync/index.js +7 -0
  182. package/dist/autopilot/sync/index.js.map +1 -0
  183. package/dist/autopilot/sync/sync-manager.d.ts +168 -0
  184. package/dist/autopilot/sync/sync-manager.d.ts.map +1 -0
  185. package/dist/autopilot/sync/sync-manager.js +303 -0
  186. package/dist/autopilot/sync/sync-manager.js.map +1 -0
  187. package/dist/autopilot/types.d.ts +454 -0
  188. package/dist/autopilot/types.d.ts.map +1 -0
  189. package/dist/autopilot/types.js +26 -0
  190. package/dist/autopilot/types.js.map +1 -0
  191. package/dist/autopilot/utils/audit-logger.d.ts +176 -0
  192. package/dist/autopilot/utils/audit-logger.d.ts.map +1 -0
  193. package/dist/autopilot/utils/audit-logger.js +308 -0
  194. package/dist/autopilot/utils/audit-logger.js.map +1 -0
  195. package/dist/autopilot/utils/cost-tracker.d.ts +162 -0
  196. package/dist/autopilot/utils/cost-tracker.d.ts.map +1 -0
  197. package/dist/autopilot/utils/cost-tracker.js +269 -0
  198. package/dist/autopilot/utils/cost-tracker.js.map +1 -0
  199. package/dist/autopilot/utils/index.d.ts +9 -0
  200. package/dist/autopilot/utils/index.d.ts.map +1 -0
  201. package/dist/autopilot/utils/index.js +9 -0
  202. package/dist/autopilot/utils/index.js.map +1 -0
  203. package/dist/autopilot/utils/progress-reporter.d.ts +132 -0
  204. package/dist/autopilot/utils/progress-reporter.d.ts.map +1 -0
  205. package/dist/autopilot/utils/progress-reporter.js +290 -0
  206. package/dist/autopilot/utils/progress-reporter.js.map +1 -0
  207. package/dist/autopilot/worker/worker-pool.d.ts +179 -0
  208. package/dist/autopilot/worker/worker-pool.d.ts.map +1 -0
  209. package/dist/autopilot/worker/worker-pool.js +331 -0
  210. package/dist/autopilot/worker/worker-pool.js.map +1 -0
  211. package/dist/autopilot/worker/worker-session.d.ts +171 -0
  212. package/dist/autopilot/worker/worker-session.d.ts.map +1 -0
  213. package/dist/autopilot/worker/worker-session.js +295 -0
  214. package/dist/autopilot/worker/worker-session.js.map +1 -0
  215. package/dist/cli/index.d.ts +1 -1
  216. package/dist/cli/index.d.ts.map +1 -1
  217. package/dist/cli/index.js +4 -1
  218. package/dist/cli/index.js.map +1 -1
  219. package/dist/index.js +0 -1
  220. package/dist/index.js.map +1 -1
  221. package/dist/tools/core/epic.js +1 -1
  222. package/dist/tools/core/epic.js.map +1 -1
  223. package/dist/tools/core/lookup.d.ts.map +1 -1
  224. package/dist/tools/core/lookup.js +3 -2
  225. package/dist/tools/core/lookup.js.map +1 -1
  226. package/dist/tools/core/specification.js +1 -1
  227. package/dist/tools/core/specification.js.map +1 -1
  228. package/dist/tools/core/ticket.d.ts.map +1 -1
  229. package/dist/tools/core/ticket.js +4 -6
  230. package/dist/tools/core/ticket.js.map +1 -1
  231. package/dist/tools/index.d.ts.map +1 -1
  232. package/dist/tools/index.js +60 -0
  233. package/dist/tools/index.js.map +1 -1
  234. package/dist/validation/index.d.ts.map +1 -1
  235. package/dist/validation/index.js +4 -1
  236. package/dist/validation/index.js.map +1 -1
  237. package/package.json +8 -4
@@ -0,0 +1,195 @@
1
+ /**
2
+ * Rate Limit Handler
3
+ *
4
+ * Handles rate limit events from AI Provider and pauses workers.
5
+ */
6
+ import { EventEmitter } from 'events';
7
+ import { aiProviderEvents } from '../../ai-provider/index.js';
8
+ /**
9
+ * Rate Limit Handler
10
+ */
11
+ export class RateLimitHandler extends EventEmitter {
12
+ isRateLimited = false;
13
+ rateLimitInfo;
14
+ autoResumeTimeout;
15
+ resumeCheckInterval;
16
+ subscribed = false;
17
+ /**
18
+ * Default backoff time when rate limited (5 minutes)
19
+ */
20
+ backoffMs = 5 * 60 * 1000;
21
+ /**
22
+ * Bound event handlers (stored to enable proper unsubscription)
23
+ */
24
+ boundHandleRateLimitHit = this.handleRateLimitHit.bind(this);
25
+ boundHandleRateLimitCleared = this.handleRateLimitCleared.bind(this);
26
+ /**
27
+ * Subscribe to AI Provider rate limit events
28
+ */
29
+ subscribe() {
30
+ if (this.subscribed)
31
+ return;
32
+ aiProviderEvents.on('rate_limit:hit', this.boundHandleRateLimitHit);
33
+ aiProviderEvents.on('rate_limit:cleared', this.boundHandleRateLimitCleared);
34
+ this.subscribed = true;
35
+ }
36
+ /**
37
+ * Unsubscribe from AI Provider events
38
+ */
39
+ unsubscribe() {
40
+ if (!this.subscribed)
41
+ return;
42
+ aiProviderEvents.off('rate_limit:hit', this.boundHandleRateLimitHit);
43
+ aiProviderEvents.off('rate_limit:cleared', this.boundHandleRateLimitCleared);
44
+ this.subscribed = false;
45
+ this.clearTimers();
46
+ }
47
+ /**
48
+ * Handle rate limit hit event
49
+ */
50
+ handleRateLimitHit(payload) {
51
+ this.isRateLimited = true;
52
+ const hitAt = new Date(payload.timestamp || Date.now());
53
+ const estimatedResumeAt = new Date(hitAt.getTime() + this.backoffMs);
54
+ this.rateLimitInfo = {
55
+ hitAt,
56
+ message: payload.message,
57
+ estimatedResumeAt,
58
+ };
59
+ this.emit('rate_limit:detected', this.rateLimitInfo);
60
+ this.emit('rate_limit:workers_should_pause');
61
+ // Set up auto-resume check
62
+ this.scheduleResumeCheck();
63
+ }
64
+ /**
65
+ * Handle rate limit cleared event
66
+ */
67
+ handleRateLimitCleared() {
68
+ this.clearRateLimit();
69
+ }
70
+ /**
71
+ * Schedule a check to see if we can resume
72
+ */
73
+ scheduleResumeCheck() {
74
+ this.clearTimers();
75
+ // Set up auto-resume after backoff
76
+ this.autoResumeTimeout = setTimeout(() => {
77
+ this.attemptResume();
78
+ }, this.backoffMs);
79
+ // Also check periodically in case manual clear happened
80
+ this.resumeCheckInterval = setInterval(() => {
81
+ if (!this.isRateLimited) {
82
+ this.emit('rate_limit:workers_can_resume');
83
+ this.clearTimers();
84
+ }
85
+ }, 30000); // Check every 30 seconds
86
+ }
87
+ /**
88
+ * Attempt to resume after backoff
89
+ */
90
+ attemptResume() {
91
+ // In a real implementation, we might want to do a test request
92
+ // For now, we'll just clear the rate limit
93
+ this.clearRateLimit();
94
+ }
95
+ /**
96
+ * Clear rate limit state
97
+ */
98
+ clearRateLimit() {
99
+ const wasRateLimited = this.isRateLimited;
100
+ this.isRateLimited = false;
101
+ this.rateLimitInfo = undefined;
102
+ this.clearTimers();
103
+ if (wasRateLimited) {
104
+ this.emit('rate_limit:cleared');
105
+ this.emit('rate_limit:workers_can_resume');
106
+ }
107
+ }
108
+ /**
109
+ * Clear all timers
110
+ */
111
+ clearTimers() {
112
+ if (this.autoResumeTimeout) {
113
+ clearTimeout(this.autoResumeTimeout);
114
+ this.autoResumeTimeout = undefined;
115
+ }
116
+ if (this.resumeCheckInterval) {
117
+ clearInterval(this.resumeCheckInterval);
118
+ this.resumeCheckInterval = undefined;
119
+ }
120
+ }
121
+ /**
122
+ * Manually trigger rate limit (e.g., from failure detection)
123
+ */
124
+ triggerRateLimit(message, backoffMs) {
125
+ if (backoffMs) {
126
+ this.backoffMs = backoffMs;
127
+ }
128
+ this.handleRateLimitHit({
129
+ message,
130
+ timestamp: Date.now(),
131
+ });
132
+ }
133
+ /**
134
+ * Check if currently rate limited
135
+ */
136
+ isCurrentlyRateLimited() {
137
+ return this.isRateLimited;
138
+ }
139
+ /**
140
+ * Get rate limit info
141
+ */
142
+ getRateLimitInfo() {
143
+ return this.rateLimitInfo;
144
+ }
145
+ /**
146
+ * Get estimated time until resume
147
+ */
148
+ getEstimatedResumeTime() {
149
+ return this.rateLimitInfo?.estimatedResumeAt;
150
+ }
151
+ /**
152
+ * Get remaining backoff time in ms
153
+ */
154
+ getRemainingBackoffMs() {
155
+ if (!this.rateLimitInfo?.estimatedResumeAt)
156
+ return 0;
157
+ const remaining = this.rateLimitInfo.estimatedResumeAt.getTime() - Date.now();
158
+ return Math.max(0, remaining);
159
+ }
160
+ /**
161
+ * Update backoff duration
162
+ */
163
+ setBackoffMs(ms) {
164
+ this.backoffMs = ms;
165
+ }
166
+ /**
167
+ * Get backoff duration
168
+ */
169
+ getBackoffMs() {
170
+ return this.backoffMs;
171
+ }
172
+ /**
173
+ * Force resume (skip backoff)
174
+ */
175
+ forceResume() {
176
+ this.clearRateLimit();
177
+ }
178
+ /**
179
+ * Destroy handler and cleanup
180
+ */
181
+ destroy() {
182
+ this.unsubscribe();
183
+ this.clearTimers();
184
+ this.isRateLimited = false;
185
+ this.rateLimitInfo = undefined;
186
+ this.removeAllListeners();
187
+ }
188
+ }
189
+ /**
190
+ * Create a rate limit handler instance
191
+ */
192
+ export function createRateLimitHandler() {
193
+ return new RateLimitHandler();
194
+ }
195
+ //# sourceMappingURL=rate-limit-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limit-handler.js","sourceRoot":"","sources":["../../../src/autopilot/core/rate-limit-handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,160 @@
1
+ /**
2
+ * Autopilot State Manager
3
+ *
4
+ * Manages autopilot state, persistence, and state change events.
5
+ */
6
+ import { EventEmitter } from 'events';
7
+ import type { AutopilotState, AutopilotStatus, WorkerSession, FailedTicket, TokenUsage, RateLimitInfo, AutopilotEventMap } from '../types.js';
8
+ /**
9
+ * State file name
10
+ */
11
+ export declare const STATE_FILE_NAME = "autopilot-state.json";
12
+ /**
13
+ * Typed event emitter for autopilot events
14
+ */
15
+ declare class AutopilotEventEmitter extends EventEmitter {
16
+ emit<K extends keyof AutopilotEventMap>(event: K, payload: AutopilotEventMap[K]): boolean;
17
+ on<K extends keyof AutopilotEventMap>(event: K, listener: (payload: AutopilotEventMap[K]) => void): this;
18
+ once<K extends keyof AutopilotEventMap>(event: K, listener: (payload: AutopilotEventMap[K]) => void): this;
19
+ }
20
+ /**
21
+ * Autopilot State Manager
22
+ */
23
+ export declare class StateManager {
24
+ private state;
25
+ private events;
26
+ private persistPath;
27
+ private persistEnabled;
28
+ constructor(options: {
29
+ specificationId: string;
30
+ projectId: string;
31
+ workingDirectory?: string;
32
+ persistState?: boolean;
33
+ });
34
+ /**
35
+ * Get current state
36
+ */
37
+ getState(): AutopilotState;
38
+ /**
39
+ * Get run ID
40
+ */
41
+ getRunId(): string;
42
+ /**
43
+ * Get event emitter for subscriptions
44
+ */
45
+ getEvents(): AutopilotEventEmitter;
46
+ /**
47
+ * Update status
48
+ */
49
+ setStatus(status: AutopilotStatus, options?: {
50
+ reason?: string;
51
+ }): void;
52
+ /**
53
+ * Set current epic
54
+ */
55
+ setCurrentEpic(epicId: string): void;
56
+ /**
57
+ * Clear current epic
58
+ */
59
+ clearCurrentEpic(summary: {
60
+ completedTickets: number;
61
+ failedTickets: number;
62
+ }): void;
63
+ /**
64
+ * Initialize workers
65
+ */
66
+ initializeWorkers(workers: WorkerSession[]): void;
67
+ /**
68
+ * Update worker state
69
+ */
70
+ updateWorker(workerId: number, updates: Partial<WorkerSession>): void;
71
+ /**
72
+ * Get worker by ID
73
+ */
74
+ getWorker(workerId: number): WorkerSession | undefined;
75
+ /**
76
+ * Record ticket started
77
+ */
78
+ ticketStarted(ticketId: string, workerId: number): void;
79
+ /**
80
+ * Record ticket completed
81
+ */
82
+ ticketCompleted(ticketId: string, workerId: number, result: {
83
+ costUsd: number;
84
+ tokens: TokenUsage;
85
+ }): void;
86
+ /**
87
+ * Record ticket failed
88
+ */
89
+ ticketFailed(ticketId: string, workerId: number, error: string, retryable: boolean): void;
90
+ /**
91
+ * Record ticket skipped
92
+ */
93
+ ticketSkipped(ticketId: string, reason: string): void;
94
+ /**
95
+ * Set rate limit info
96
+ */
97
+ setRateLimited(info: RateLimitInfo): void;
98
+ /**
99
+ * Clear rate limit
100
+ */
101
+ clearRateLimit(): void;
102
+ /**
103
+ * Add cost
104
+ */
105
+ addCost(costUsd: number, tokens: TokenUsage): void;
106
+ /**
107
+ * Get completed ticket count
108
+ */
109
+ getCompletedCount(): number;
110
+ /**
111
+ * Get failed ticket count
112
+ */
113
+ getFailedCount(): number;
114
+ /**
115
+ * Check if ticket was completed
116
+ */
117
+ isTicketCompleted(ticketId: string): boolean;
118
+ /**
119
+ * Check if ticket was failed
120
+ */
121
+ isTicketFailed(ticketId: string): boolean;
122
+ /**
123
+ * Get failure info for ticket
124
+ */
125
+ getFailureInfo(ticketId: string): FailedTicket | undefined;
126
+ /**
127
+ * Emit state change event
128
+ */
129
+ private emitStateChange;
130
+ /**
131
+ * Persist state to disk
132
+ */
133
+ private persist;
134
+ /**
135
+ * Load state from disk
136
+ */
137
+ static load(workingDirectory?: string): AutopilotState | null;
138
+ /**
139
+ * Clear persisted state
140
+ */
141
+ static clear(workingDirectory?: string): void;
142
+ /**
143
+ * Resume from existing state
144
+ */
145
+ static resume(state: AutopilotState, options?: {
146
+ workingDirectory?: string;
147
+ persistState?: boolean;
148
+ }): StateManager;
149
+ }
150
+ /**
151
+ * Create a state manager
152
+ */
153
+ export declare function createStateManager(options: {
154
+ specificationId: string;
155
+ projectId: string;
156
+ workingDirectory?: string;
157
+ persistState?: boolean;
158
+ }): StateManager;
159
+ export {};
160
+ //# sourceMappingURL=state-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-manager.d.ts","sourceRoot":"","sources":["../../../src/autopilot/core/state-manager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAItC,OAAO,KAAK,EACV,cAAc,EACd,eAAe,EACf,aAAa,EACb,YAAY,EACZ,UAAU,EACV,aAAa,EACb,iBAAiB,EAClB,MAAM,aAAa,CAAC;AAErB;;GAEG;AACH,eAAO,MAAM,eAAe,yBAAyB,CAAC;AAGtD;;GAEG;AACH,cAAM,qBAAsB,SAAQ,YAAY;IAC9C,IAAI,CAAC,CAAC,SAAS,MAAM,iBAAiB,EACpC,KAAK,EAAE,CAAC,EACR,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAC5B,OAAO;IAIV,EAAE,CAAC,CAAC,SAAS,MAAM,iBAAiB,EAClC,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAAK,IAAI,GAChD,IAAI;IAIP,IAAI,CAAC,CAAC,SAAS,MAAM,iBAAiB,EACpC,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAAK,IAAI,GAChD,IAAI;CAGR;AAED;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAAiB;IAC9B,OAAO,CAAC,MAAM,CAAwB;IACtC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,cAAc,CAAU;gBAEpB,OAAO,EAAE;QACnB,eAAe,EAAE,MAAM,CAAC;QACxB,SAAS,EAAE,MAAM,CAAC;QAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,YAAY,CAAC,EAAE,OAAO,CAAC;KACxB;IAwBD;;OAEG;IACH,QAAQ,IAAI,cAAc;IAI1B;;OAEG;IACH,QAAQ,IAAI,MAAM;IAIlB;;OAEG;IACH,SAAS,IAAI,qBAAqB;IAIlC;;OAEG;IACH,SAAS,CAAC,MAAM,EAAE,eAAe,EAAE,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IA6BvE;;OAEG;IACH,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAOpC;;OAEG;IACH,gBAAgB,CAAC,OAAO,EAAE;QAAE,gBAAgB,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAapF;;OAEG;IACH,iBAAiB,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,IAAI;IAMjD;;OAEG;IACH,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,IAAI;IASrE;;OAEG;IACH,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAItD;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAcvD;;OAEG;IACH,eAAe,CACb,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,UAAU,CAAA;KAAE,GAC9C,IAAI;IA6BP;;OAEG;IACH,YAAY,CACV,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,OAAO,GACjB,IAAI;IAmCP;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAQrD;;OAEG;IACH,cAAc,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAQzC;;OAEG;IACH,cAAc,IAAI,IAAI;IAUtB;;OAEG;IACH,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI;IAQlD;;OAEG;IACH,iBAAiB,IAAI,MAAM;IAI3B;;OAEG;IACH,cAAc,IAAI,MAAM;IAIxB;;OAEG;IACH,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAI5C;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIzC;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAI1D;;OAEG;IACH,OAAO,CAAC,eAAe;IAIvB;;OAEG;IACH,OAAO,CAAC,OAAO;IAmBf;;OAEG;IACH,MAAM,CAAC,IAAI,CACT,gBAAgB,GAAE,MAAsB,GACvC,cAAc,GAAG,IAAI;IAmCxB;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,gBAAgB,GAAE,MAAsB,GAAG,IAAI;IAW5D;;OAEG;IACH,MAAM,CAAC,MAAM,CACX,KAAK,EAAE,cAAc,EACrB,OAAO,CAAC,EAAE;QAAE,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,OAAO,CAAA;KAAE,GAC9D,YAAY;CAahB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE;IAC1C,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,GAAG,YAAY,CAEf"}