@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 @@
1
+ {"version":3,"file":"dependency-resolver.d.ts","sourceRoot":"","sources":["../../../src/autopilot/core/dependency-resolver.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAU,YAAY,EAAoB,MAAM,sBAAsB,CAAC;AACnF,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAEzE;;GAEG;AACH,qBAAa,kBAAkB;IAIjB,OAAO,CAAC,SAAS;IAH7B,OAAO,CAAC,KAAK,CAA0C;IACvD,OAAO,CAAC,WAAW,CAAoC;gBAEnC,SAAS,EAAE,kBAAkB;IAEjD;;OAEG;IACG,UAAU,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmCxD;;OAEG;IACH,iBAAiB,IAAI,IAAI;IAMzB;;OAEG;IACH,OAAO,CAAC,WAAW;IAiBnB;;OAEG;IACH,eAAe,IAAI,MAAM,EAAE;IAY3B;;OAEG;IACH,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE;IAchD;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE;IA4BzC;;OAEG;IACH,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE;IA+BtC;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAQtC;;OAEG;IACH,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI;IAQ1D;;OAEG;IACH,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAIrD;;OAEG;IACH,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE;IAIxC;;OAEG;IACH,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAavC;;OAEG;IACH,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG;QAC/B,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;KACjB;IAuCD;;OAEG;IACH,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE;IAYxC;;OAEG;IACH,UAAU,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,YAAY,EAAE;IA6C3C;;OAEG;IACH,0BAA0B,IAAI,MAAM,EAAE,EAAE;IAyCxC;;OAEG;IACH,mBAAmB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE;IAkC9C;;OAEG;IACH,QAAQ,IAAI;QACV,YAAY,EAAE,MAAM,CAAC;QACrB,YAAY,EAAE,MAAM,CAAC;QACrB,gBAAgB,EAAE,MAAM,CAAC;QACzB,cAAc,EAAE,MAAM,CAAC;QACvB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,SAAS,EAAE,MAAM,CAAC;KACnB;CAuBF;AAGD;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,kBAAkB,GAAG,kBAAkB,CAE1F"}
@@ -0,0 +1,394 @@
1
+ /**
2
+ * Dependency Resolver
3
+ *
4
+ * Builds ticket DAG, finds ready tickets, and manages dependency blocking.
5
+ */
6
+ /**
7
+ * Dependency graph for tickets
8
+ */
9
+ export class DependencyResolver {
10
+ apiClient;
11
+ nodes = new Map();
12
+ epicTickets = new Map();
13
+ constructor(apiClient) {
14
+ this.apiClient = apiClient;
15
+ }
16
+ /**
17
+ * Build dependency graph for all tickets in specification
18
+ */
19
+ async buildGraph(specificationId) {
20
+ this.nodes.clear();
21
+ this.epicTickets.clear();
22
+ // Get all epics and tickets
23
+ const epics = await this.apiClient.getEpics(specificationId);
24
+ for (const epic of epics) {
25
+ const tickets = await this.apiClient.getTickets(epic.id);
26
+ const ticketIds = [];
27
+ for (const ticket of tickets) {
28
+ ticketIds.push(ticket.id);
29
+ // Get dependencies for this ticket
30
+ const deps = await this.apiClient.getTicketDependencies(ticket.id);
31
+ this.nodes.set(ticket.id, {
32
+ ticketId: ticket.id,
33
+ status: ticket.status,
34
+ dependsOn: deps.blockedBy.map(d => d.id),
35
+ blockedBy: deps.blockedBy
36
+ .filter(d => d.status !== 'done')
37
+ .map(d => d.id),
38
+ ready: false,
39
+ });
40
+ }
41
+ this.epicTickets.set(epic.id, ticketIds);
42
+ }
43
+ // Calculate ready state for all nodes
44
+ this.updateReadyStates();
45
+ }
46
+ /**
47
+ * Update ready states based on current dependency status
48
+ */
49
+ updateReadyStates() {
50
+ for (const node of this.nodes.values()) {
51
+ node.ready = this.isNodeReady(node);
52
+ }
53
+ }
54
+ /**
55
+ * Check if a node is ready (all dependencies satisfied)
56
+ */
57
+ isNodeReady(node) {
58
+ // Skip if not in actionable status
59
+ if (node.status !== 'todo' && node.status !== 'queue') {
60
+ return false;
61
+ }
62
+ // Check all dependencies are completed
63
+ for (const depId of node.dependsOn) {
64
+ const depNode = this.nodes.get(depId);
65
+ if (!depNode || depNode.status !== 'done') {
66
+ return false;
67
+ }
68
+ }
69
+ return true;
70
+ }
71
+ /**
72
+ * Get all ready tickets
73
+ */
74
+ getReadyTickets() {
75
+ const ready = [];
76
+ for (const node of this.nodes.values()) {
77
+ if (node.ready) {
78
+ ready.push(node.ticketId);
79
+ }
80
+ }
81
+ return ready;
82
+ }
83
+ /**
84
+ * Get ready tickets for a specific epic
85
+ */
86
+ getReadyTicketsForEpic(epicId) {
87
+ const epicTicketIds = this.epicTickets.get(epicId) || [];
88
+ const ready = [];
89
+ for (const ticketId of epicTicketIds) {
90
+ const node = this.nodes.get(ticketId);
91
+ if (node?.ready) {
92
+ ready.push(ticketId);
93
+ }
94
+ }
95
+ return ready;
96
+ }
97
+ /**
98
+ * Mark ticket as completed and update dependents
99
+ */
100
+ markCompleted(ticketId) {
101
+ const node = this.nodes.get(ticketId);
102
+ if (!node)
103
+ return [];
104
+ node.status = 'done';
105
+ node.ready = false;
106
+ // Update all nodes that depend on this ticket
107
+ const nowReady = [];
108
+ for (const otherNode of this.nodes.values()) {
109
+ if (otherNode.dependsOn.includes(ticketId)) {
110
+ // Remove from blockedBy
111
+ otherNode.blockedBy = otherNode.blockedBy.filter(id => id !== ticketId);
112
+ // Check if now ready
113
+ const wasReady = otherNode.ready;
114
+ otherNode.ready = this.isNodeReady(otherNode);
115
+ if (!wasReady && otherNode.ready) {
116
+ nowReady.push(otherNode.ticketId);
117
+ }
118
+ }
119
+ }
120
+ return nowReady;
121
+ }
122
+ /**
123
+ * Mark ticket as failed and cascade to dependents
124
+ */
125
+ markFailed(ticketId) {
126
+ const node = this.nodes.get(ticketId);
127
+ if (!node)
128
+ return [];
129
+ node.status = 'blocked';
130
+ node.ready = false;
131
+ // Find all tickets that transitively depend on this one
132
+ const affected = [];
133
+ const toProcess = [ticketId];
134
+ const processed = new Set();
135
+ while (toProcess.length > 0) {
136
+ const currentId = toProcess.shift();
137
+ if (processed.has(currentId))
138
+ continue;
139
+ processed.add(currentId);
140
+ for (const otherNode of this.nodes.values()) {
141
+ if (otherNode.dependsOn.includes(currentId)) {
142
+ otherNode.ready = false;
143
+ if (!processed.has(otherNode.ticketId)) {
144
+ affected.push(otherNode.ticketId);
145
+ toProcess.push(otherNode.ticketId);
146
+ }
147
+ }
148
+ }
149
+ }
150
+ return affected;
151
+ }
152
+ /**
153
+ * Mark ticket as in progress
154
+ */
155
+ markInProgress(ticketId) {
156
+ const node = this.nodes.get(ticketId);
157
+ if (node) {
158
+ node.status = 'in_progress';
159
+ node.ready = false;
160
+ }
161
+ }
162
+ /**
163
+ * Update ticket status
164
+ */
165
+ updateStatus(ticketId, status) {
166
+ const node = this.nodes.get(ticketId);
167
+ if (node) {
168
+ node.status = status;
169
+ this.updateReadyStates();
170
+ }
171
+ }
172
+ /**
173
+ * Get node by ticket ID
174
+ */
175
+ getNode(ticketId) {
176
+ return this.nodes.get(ticketId);
177
+ }
178
+ /**
179
+ * Get all tickets for an epic
180
+ */
181
+ getEpicTickets(epicId) {
182
+ return this.epicTickets.get(epicId) || [];
183
+ }
184
+ /**
185
+ * Check if epic is complete (all tickets done or skipped)
186
+ */
187
+ isEpicComplete(epicId) {
188
+ const ticketIds = this.epicTickets.get(epicId) || [];
189
+ for (const ticketId of ticketIds) {
190
+ const node = this.nodes.get(ticketId);
191
+ if (node && node.status !== 'done') {
192
+ return false;
193
+ }
194
+ }
195
+ return true;
196
+ }
197
+ /**
198
+ * Get epic progress
199
+ */
200
+ getEpicProgress(epicId) {
201
+ const ticketIds = this.epicTickets.get(epicId) || [];
202
+ const stats = {
203
+ total: ticketIds.length,
204
+ completed: 0,
205
+ failed: 0,
206
+ inProgress: 0,
207
+ ready: 0,
208
+ blocked: 0,
209
+ };
210
+ for (const ticketId of ticketIds) {
211
+ const node = this.nodes.get(ticketId);
212
+ if (!node)
213
+ continue;
214
+ switch (node.status) {
215
+ case 'done':
216
+ stats.completed++;
217
+ break;
218
+ case 'blocked':
219
+ stats.failed++;
220
+ break;
221
+ case 'in_progress':
222
+ stats.inProgress++;
223
+ break;
224
+ case 'todo':
225
+ case 'queue':
226
+ if (node.ready) {
227
+ stats.ready++;
228
+ }
229
+ else {
230
+ stats.blocked++;
231
+ }
232
+ break;
233
+ }
234
+ }
235
+ return stats;
236
+ }
237
+ /**
238
+ * Get tickets blocked by a specific ticket
239
+ */
240
+ getBlockedBy(ticketId) {
241
+ const blocked = [];
242
+ for (const node of this.nodes.values()) {
243
+ if (node.dependsOn.includes(ticketId) && node.status !== 'done') {
244
+ blocked.push(node.ticketId);
245
+ }
246
+ }
247
+ return blocked;
248
+ }
249
+ /**
250
+ * Build priority queue of ready tickets
251
+ */
252
+ buildQueue(epicId) {
253
+ const queue = [];
254
+ for (const [nodeTicketId, node] of this.nodes.entries()) {
255
+ // Filter by epic if specified
256
+ if (epicId) {
257
+ const epicTicketIds = this.epicTickets.get(epicId) || [];
258
+ if (!epicTicketIds.includes(nodeTicketId))
259
+ continue;
260
+ }
261
+ if (!node.ready)
262
+ continue;
263
+ // Find epic ID for this ticket
264
+ let ticketEpicId = epicId || '';
265
+ if (!ticketEpicId) {
266
+ for (const [eId, tIds] of this.epicTickets) {
267
+ if (tIds.includes(nodeTicketId)) {
268
+ ticketEpicId = eId;
269
+ break;
270
+ }
271
+ }
272
+ }
273
+ // Calculate priority based on:
274
+ // 1. Number of dependents (more = higher priority)
275
+ // 2. Ticket complexity (smaller = higher priority)
276
+ const dependentCount = this.getBlockedBy(nodeTicketId).length;
277
+ const priority = -dependentCount; // Negative so higher counts are processed first
278
+ queue.push({
279
+ ticketId: nodeTicketId,
280
+ epicId: ticketEpicId,
281
+ dependsOn: node.dependsOn,
282
+ ready: true,
283
+ priority,
284
+ complexity: 'medium', // Default, should be enriched from ticket data
285
+ });
286
+ }
287
+ // Sort by priority (lower value = higher priority)
288
+ queue.sort((a, b) => a.priority - b.priority);
289
+ return queue;
290
+ }
291
+ /**
292
+ * Detect circular dependencies
293
+ */
294
+ detectCircularDependencies() {
295
+ const cycles = [];
296
+ const visited = new Set();
297
+ const stack = new Set();
298
+ const dfs = (ticketId, path) => {
299
+ if (stack.has(ticketId)) {
300
+ // Found cycle - extract it
301
+ const cycleStart = path.indexOf(ticketId);
302
+ cycles.push(path.slice(cycleStart));
303
+ return true;
304
+ }
305
+ if (visited.has(ticketId)) {
306
+ return false;
307
+ }
308
+ visited.add(ticketId);
309
+ stack.add(ticketId);
310
+ path.push(ticketId);
311
+ const node = this.nodes.get(ticketId);
312
+ if (node) {
313
+ for (const depId of node.dependsOn) {
314
+ dfs(depId, [...path]);
315
+ }
316
+ }
317
+ stack.delete(ticketId);
318
+ return false;
319
+ };
320
+ for (const ticketId of this.nodes.keys()) {
321
+ if (!visited.has(ticketId)) {
322
+ dfs(ticketId, []);
323
+ }
324
+ }
325
+ return cycles;
326
+ }
327
+ /**
328
+ * Get topological order for tickets
329
+ */
330
+ getTopologicalOrder(epicId) {
331
+ const order = [];
332
+ const visited = new Set();
333
+ const temp = new Set();
334
+ const visit = (ticketId) => {
335
+ if (visited.has(ticketId))
336
+ return;
337
+ if (temp.has(ticketId))
338
+ return; // Skip cycles
339
+ temp.add(ticketId);
340
+ const node = this.nodes.get(ticketId);
341
+ if (node) {
342
+ for (const depId of node.dependsOn) {
343
+ visit(depId);
344
+ }
345
+ }
346
+ temp.delete(ticketId);
347
+ visited.add(ticketId);
348
+ order.push(ticketId);
349
+ };
350
+ const ticketIds = epicId
351
+ ? this.epicTickets.get(epicId) || []
352
+ : [...this.nodes.keys()];
353
+ for (const ticketId of ticketIds) {
354
+ visit(ticketId);
355
+ }
356
+ return order;
357
+ }
358
+ /**
359
+ * Get statistics about the graph
360
+ */
361
+ getStats() {
362
+ let ready = 0;
363
+ let completed = 0;
364
+ let blocked = 0;
365
+ let inProgress = 0;
366
+ for (const node of this.nodes.values()) {
367
+ if (node.status === 'done')
368
+ completed++;
369
+ else if (node.status === 'blocked')
370
+ blocked++;
371
+ else if (node.status === 'in_progress')
372
+ inProgress++;
373
+ else if (node.ready)
374
+ ready++;
375
+ else
376
+ blocked++;
377
+ }
378
+ return {
379
+ totalTickets: this.nodes.size,
380
+ readyTickets: ready,
381
+ completedTickets: completed,
382
+ blockedTickets: blocked,
383
+ inProgressTickets: inProgress,
384
+ epicCount: this.epicTickets.size,
385
+ };
386
+ }
387
+ }
388
+ /**
389
+ * Create a dependency resolver
390
+ */
391
+ export function createDependencyResolver(apiClient) {
392
+ return new DependencyResolver(apiClient);
393
+ }
394
+ //# sourceMappingURL=dependency-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependency-resolver.js","sourceRoot":"","sources":["../../../src/autopilot/core/dependency-resolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,215 @@
1
+ /**
2
+ * Autopilot Dispatcher
3
+ *
4
+ * Main orchestrator for epics, ticket queue, and worker assignment.
5
+ */
6
+ import { EventEmitter } from 'events';
7
+ import type { Epic, Ticket } from '../../types/index.js';
8
+ import type { AutopilotConfig, AutopilotState, RunSummary, ImplementationResult } from '../types.js';
9
+ import { StateManager } from './state-manager.js';
10
+ import { DependencyResolver } from './dependency-resolver.js';
11
+ import type { AutopilotApiClient } from '../api/autopilot-api-client.js';
12
+ /**
13
+ * Dispatcher configuration
14
+ */
15
+ export interface DispatcherOptions {
16
+ config: AutopilotConfig;
17
+ apiClient: AutopilotApiClient;
18
+ specificationId: string;
19
+ projectId: string;
20
+ workingDirectory: string;
21
+ onImplementTicket?: (ticket: Ticket, workerId: number, worktreePath: string) => Promise<ImplementationResult>;
22
+ }
23
+ /**
24
+ * Dispatcher Events
25
+ */
26
+ export interface DispatcherEvents {
27
+ 'started': void;
28
+ 'paused': {
29
+ reason: string;
30
+ };
31
+ 'resumed': void;
32
+ 'completed': RunSummary;
33
+ 'aborted': {
34
+ reason: string;
35
+ };
36
+ 'state:changed': AutopilotState;
37
+ 'epic:started': {
38
+ epic: Epic;
39
+ };
40
+ 'epic:completed': {
41
+ epic: Epic;
42
+ stats: {
43
+ completed: number;
44
+ failed: number;
45
+ };
46
+ };
47
+ 'ticket:assigned': {
48
+ ticketId: string;
49
+ workerId: number;
50
+ };
51
+ 'ticket:completed': {
52
+ ticketId: string;
53
+ workerId: number;
54
+ };
55
+ 'ticket:failed': {
56
+ ticketId: string;
57
+ workerId: number;
58
+ error: string;
59
+ };
60
+ 'worker:idle': {
61
+ workerId: number;
62
+ };
63
+ 'cost:warning': {
64
+ current: number;
65
+ max: number;
66
+ };
67
+ 'cost:exceeded': {
68
+ current: number;
69
+ max: number;
70
+ };
71
+ 'rate_limit:paused': void;
72
+ 'rate_limit:resumed': void;
73
+ }
74
+ /**
75
+ * Autopilot Dispatcher
76
+ *
77
+ * Orchestrates the entire autopilot run.
78
+ */
79
+ export declare class Dispatcher extends EventEmitter {
80
+ private config;
81
+ private apiClient;
82
+ private stateManager;
83
+ private dependencyResolver;
84
+ private timeoutManager;
85
+ private failureHandler;
86
+ private rateLimitHandler;
87
+ private workingDirectory;
88
+ private onImplementTicket?;
89
+ private specification?;
90
+ private epics;
91
+ private currentEpicIndex;
92
+ private ticketQueue;
93
+ private activeWorkers;
94
+ private isRunning;
95
+ private isPaused;
96
+ private shouldStop;
97
+ constructor(options: DispatcherOptions);
98
+ /**
99
+ * Set up internal event handlers
100
+ */
101
+ private setupEventHandlers;
102
+ /**
103
+ * Start the autopilot run
104
+ */
105
+ start(): Promise<RunSummary>;
106
+ /**
107
+ * Load specification and epics from API
108
+ */
109
+ private loadSpecification;
110
+ /**
111
+ * Initialize worker sessions
112
+ */
113
+ private initializeWorkers;
114
+ /**
115
+ * Process all epics
116
+ */
117
+ private processEpics;
118
+ /**
119
+ * Process a single epic
120
+ */
121
+ private processEpic;
122
+ /**
123
+ * Assign tickets to idle workers
124
+ */
125
+ private assignTicketsToWorkers;
126
+ /**
127
+ * Process a single ticket
128
+ */
129
+ private processTicket;
130
+ /**
131
+ * Handle successful ticket completion
132
+ */
133
+ private handleTicketSuccess;
134
+ /**
135
+ * Handle ticket failure
136
+ */
137
+ private handleTicketFailure;
138
+ /**
139
+ * Handle ticket timeout
140
+ */
141
+ private handleTicketTimeout;
142
+ /**
143
+ * Refresh ticket queue for epic
144
+ */
145
+ private refreshQueue;
146
+ /**
147
+ * Wait for at least one worker to complete
148
+ */
149
+ private waitForWorkerCompletion;
150
+ /**
151
+ * Wait for all workers to complete
152
+ */
153
+ private waitForAllWorkers;
154
+ /**
155
+ * Wait for resume from pause
156
+ */
157
+ private waitForResume;
158
+ /**
159
+ * Wait for rate limit to clear
160
+ */
161
+ private waitForRateLimitClear;
162
+ /**
163
+ * Check cost limits
164
+ */
165
+ private checkCostLimits;
166
+ /**
167
+ * Estimate cost from tokens
168
+ */
169
+ private estimateCost;
170
+ /**
171
+ * Pause the run
172
+ */
173
+ pause(reason: string): void;
174
+ /**
175
+ * Resume the run
176
+ */
177
+ resume(): void;
178
+ /**
179
+ * Complete the run
180
+ */
181
+ private complete;
182
+ /**
183
+ * Abort the run
184
+ */
185
+ abort(reason: string): RunSummary;
186
+ /**
187
+ * Cleanup resources
188
+ */
189
+ private cleanup;
190
+ /**
191
+ * Get current state
192
+ */
193
+ getState(): AutopilotState;
194
+ /**
195
+ * Get state manager
196
+ */
197
+ getStateManager(): StateManager;
198
+ /**
199
+ * Get dependency resolver
200
+ */
201
+ getDependencyResolver(): DependencyResolver;
202
+ /**
203
+ * Check if running
204
+ */
205
+ isActive(): boolean;
206
+ /**
207
+ * Check if paused
208
+ */
209
+ isPausedState(): boolean;
210
+ }
211
+ /**
212
+ * Create a dispatcher
213
+ */
214
+ export declare function createDispatcher(options: DispatcherOptions): Dispatcher;
215
+ //# sourceMappingURL=dispatcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatcher.d.ts","sourceRoot":"","sources":["../../../src/autopilot/core/dispatcher.ts"],"names":[],"mappings":"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"}