agentic-qe 3.6.0 → 3.6.2

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 (204) hide show
  1. package/.claude/agents/v3/qe-devils-advocate.md +218 -0
  2. package/.claude/agents/v3/qe-quality-criteria-recommender.md +2 -2
  3. package/.claude/skills/qe-iterative-loop/SKILL.md +1 -1
  4. package/.claude/skills/release/SKILL.md +17 -31
  5. package/.claude/skills/skills-manifest.json +1 -1
  6. package/README.md +38 -35
  7. package/package.json +1 -1
  8. package/scripts/cloud-db-config.json +1 -1
  9. package/v3/CHANGELOG.md +44 -0
  10. package/v3/README.md +7 -7
  11. package/v3/assets/agents/v3/qe-devils-advocate.md +218 -0
  12. package/v3/assets/agents/v3/qe-quality-criteria-recommender.md +2 -2
  13. package/v3/assets/skills/qe-iterative-loop/SKILL.md +1 -1
  14. package/v3/dist/agents/devils-advocate/agent.d.ts +103 -0
  15. package/v3/dist/agents/devils-advocate/agent.d.ts.map +1 -0
  16. package/v3/dist/agents/devils-advocate/agent.js +240 -0
  17. package/v3/dist/agents/devils-advocate/agent.js.map +1 -0
  18. package/v3/dist/agents/devils-advocate/index.d.ts +60 -0
  19. package/v3/dist/agents/devils-advocate/index.d.ts.map +1 -0
  20. package/v3/dist/agents/devils-advocate/index.js +72 -0
  21. package/v3/dist/agents/devils-advocate/index.js.map +1 -0
  22. package/v3/dist/agents/devils-advocate/strategies.d.ts +59 -0
  23. package/v3/dist/agents/devils-advocate/strategies.d.ts.map +1 -0
  24. package/v3/dist/agents/devils-advocate/strategies.js +438 -0
  25. package/v3/dist/agents/devils-advocate/strategies.js.map +1 -0
  26. package/v3/dist/agents/devils-advocate/types.d.ts +182 -0
  27. package/v3/dist/agents/devils-advocate/types.d.ts.map +1 -0
  28. package/v3/dist/agents/devils-advocate/types.js +96 -0
  29. package/v3/dist/agents/devils-advocate/types.js.map +1 -0
  30. package/v3/dist/agents/index.d.ts +20 -0
  31. package/v3/dist/agents/index.d.ts.map +1 -0
  32. package/v3/dist/agents/index.js +20 -0
  33. package/v3/dist/agents/index.js.map +1 -0
  34. package/v3/dist/cli/bundle.js +4489 -119
  35. package/v3/dist/coordination/agent-teams/adapter.d.ts +108 -0
  36. package/v3/dist/coordination/agent-teams/adapter.d.ts.map +1 -0
  37. package/v3/dist/coordination/agent-teams/adapter.js +316 -0
  38. package/v3/dist/coordination/agent-teams/adapter.js.map +1 -0
  39. package/v3/dist/coordination/agent-teams/domain-team-manager.d.ts +164 -0
  40. package/v3/dist/coordination/agent-teams/domain-team-manager.d.ts.map +1 -0
  41. package/v3/dist/coordination/agent-teams/domain-team-manager.js +342 -0
  42. package/v3/dist/coordination/agent-teams/domain-team-manager.js.map +1 -0
  43. package/v3/dist/coordination/agent-teams/index.d.ts +53 -0
  44. package/v3/dist/coordination/agent-teams/index.d.ts.map +1 -0
  45. package/v3/dist/coordination/agent-teams/index.js +61 -0
  46. package/v3/dist/coordination/agent-teams/index.js.map +1 -0
  47. package/v3/dist/coordination/agent-teams/mailbox.d.ts +142 -0
  48. package/v3/dist/coordination/agent-teams/mailbox.d.ts.map +1 -0
  49. package/v3/dist/coordination/agent-teams/mailbox.js +395 -0
  50. package/v3/dist/coordination/agent-teams/mailbox.js.map +1 -0
  51. package/v3/dist/coordination/agent-teams/tracing.d.ts +199 -0
  52. package/v3/dist/coordination/agent-teams/tracing.d.ts.map +1 -0
  53. package/v3/dist/coordination/agent-teams/tracing.js +308 -0
  54. package/v3/dist/coordination/agent-teams/tracing.js.map +1 -0
  55. package/v3/dist/coordination/agent-teams/types.d.ts +121 -0
  56. package/v3/dist/coordination/agent-teams/types.d.ts.map +1 -0
  57. package/v3/dist/coordination/agent-teams/types.js +17 -0
  58. package/v3/dist/coordination/agent-teams/types.js.map +1 -0
  59. package/v3/dist/coordination/circuit-breaker/breaker-registry.d.ts +146 -0
  60. package/v3/dist/coordination/circuit-breaker/breaker-registry.d.ts.map +1 -0
  61. package/v3/dist/coordination/circuit-breaker/breaker-registry.js +368 -0
  62. package/v3/dist/coordination/circuit-breaker/breaker-registry.js.map +1 -0
  63. package/v3/dist/coordination/circuit-breaker/domain-circuit-breaker.d.ts +134 -0
  64. package/v3/dist/coordination/circuit-breaker/domain-circuit-breaker.d.ts.map +1 -0
  65. package/v3/dist/coordination/circuit-breaker/domain-circuit-breaker.js +337 -0
  66. package/v3/dist/coordination/circuit-breaker/domain-circuit-breaker.js.map +1 -0
  67. package/v3/dist/coordination/circuit-breaker/index.d.ts +46 -0
  68. package/v3/dist/coordination/circuit-breaker/index.d.ts.map +1 -0
  69. package/v3/dist/coordination/circuit-breaker/index.js +51 -0
  70. package/v3/dist/coordination/circuit-breaker/index.js.map +1 -0
  71. package/v3/dist/coordination/circuit-breaker/types.d.ts +112 -0
  72. package/v3/dist/coordination/circuit-breaker/types.d.ts.map +1 -0
  73. package/v3/dist/coordination/circuit-breaker/types.js +10 -0
  74. package/v3/dist/coordination/circuit-breaker/types.js.map +1 -0
  75. package/v3/dist/coordination/competing-hypotheses/hypothesis-manager.d.ts +122 -0
  76. package/v3/dist/coordination/competing-hypotheses/hypothesis-manager.d.ts.map +1 -0
  77. package/v3/dist/coordination/competing-hypotheses/hypothesis-manager.js +377 -0
  78. package/v3/dist/coordination/competing-hypotheses/hypothesis-manager.js.map +1 -0
  79. package/v3/dist/coordination/competing-hypotheses/index.d.ts +34 -0
  80. package/v3/dist/coordination/competing-hypotheses/index.d.ts.map +1 -0
  81. package/v3/dist/coordination/competing-hypotheses/index.js +39 -0
  82. package/v3/dist/coordination/competing-hypotheses/index.js.map +1 -0
  83. package/v3/dist/coordination/competing-hypotheses/types.d.ts +134 -0
  84. package/v3/dist/coordination/competing-hypotheses/types.d.ts.map +1 -0
  85. package/v3/dist/coordination/competing-hypotheses/types.js +20 -0
  86. package/v3/dist/coordination/competing-hypotheses/types.js.map +1 -0
  87. package/v3/dist/coordination/dynamic-scaling/dynamic-scaler.d.ts +173 -0
  88. package/v3/dist/coordination/dynamic-scaling/dynamic-scaler.d.ts.map +1 -0
  89. package/v3/dist/coordination/dynamic-scaling/dynamic-scaler.js +368 -0
  90. package/v3/dist/coordination/dynamic-scaling/dynamic-scaler.js.map +1 -0
  91. package/v3/dist/coordination/dynamic-scaling/index.d.ts +38 -0
  92. package/v3/dist/coordination/dynamic-scaling/index.d.ts.map +1 -0
  93. package/v3/dist/coordination/dynamic-scaling/index.js +39 -0
  94. package/v3/dist/coordination/dynamic-scaling/index.js.map +1 -0
  95. package/v3/dist/coordination/dynamic-scaling/types.d.ts +147 -0
  96. package/v3/dist/coordination/dynamic-scaling/types.d.ts.map +1 -0
  97. package/v3/dist/coordination/dynamic-scaling/types.js +40 -0
  98. package/v3/dist/coordination/dynamic-scaling/types.js.map +1 -0
  99. package/v3/dist/coordination/federation/federation-mailbox.d.ts +215 -0
  100. package/v3/dist/coordination/federation/federation-mailbox.d.ts.map +1 -0
  101. package/v3/dist/coordination/federation/federation-mailbox.js +442 -0
  102. package/v3/dist/coordination/federation/federation-mailbox.js.map +1 -0
  103. package/v3/dist/coordination/federation/index.d.ts +38 -0
  104. package/v3/dist/coordination/federation/index.d.ts.map +1 -0
  105. package/v3/dist/coordination/federation/index.js +39 -0
  106. package/v3/dist/coordination/federation/index.js.map +1 -0
  107. package/v3/dist/coordination/federation/types.d.ts +103 -0
  108. package/v3/dist/coordination/federation/types.d.ts.map +1 -0
  109. package/v3/dist/coordination/federation/types.js +20 -0
  110. package/v3/dist/coordination/federation/types.js.map +1 -0
  111. package/v3/dist/coordination/fleet-tiers/index.d.ts +39 -0
  112. package/v3/dist/coordination/fleet-tiers/index.d.ts.map +1 -0
  113. package/v3/dist/coordination/fleet-tiers/index.js +44 -0
  114. package/v3/dist/coordination/fleet-tiers/index.js.map +1 -0
  115. package/v3/dist/coordination/fleet-tiers/tier-config.d.ts +60 -0
  116. package/v3/dist/coordination/fleet-tiers/tier-config.d.ts.map +1 -0
  117. package/v3/dist/coordination/fleet-tiers/tier-config.js +242 -0
  118. package/v3/dist/coordination/fleet-tiers/tier-config.js.map +1 -0
  119. package/v3/dist/coordination/fleet-tiers/tier-selector.d.ts +134 -0
  120. package/v3/dist/coordination/fleet-tiers/tier-selector.d.ts.map +1 -0
  121. package/v3/dist/coordination/fleet-tiers/tier-selector.js +373 -0
  122. package/v3/dist/coordination/fleet-tiers/tier-selector.js.map +1 -0
  123. package/v3/dist/coordination/fleet-tiers/types.d.ts +137 -0
  124. package/v3/dist/coordination/fleet-tiers/types.d.ts.map +1 -0
  125. package/v3/dist/coordination/fleet-tiers/types.js +20 -0
  126. package/v3/dist/coordination/fleet-tiers/types.js.map +1 -0
  127. package/v3/dist/coordination/index.d.ts +16 -0
  128. package/v3/dist/coordination/index.d.ts.map +1 -1
  129. package/v3/dist/coordination/index.js +29 -0
  130. package/v3/dist/coordination/index.js.map +1 -1
  131. package/v3/dist/coordination/queen-coordinator.d.ts +79 -0
  132. package/v3/dist/coordination/queen-coordinator.d.ts.map +1 -1
  133. package/v3/dist/coordination/queen-coordinator.js +363 -0
  134. package/v3/dist/coordination/queen-coordinator.js.map +1 -1
  135. package/v3/dist/coordination/task-dag/dag.d.ts +93 -0
  136. package/v3/dist/coordination/task-dag/dag.d.ts.map +1 -0
  137. package/v3/dist/coordination/task-dag/dag.js +496 -0
  138. package/v3/dist/coordination/task-dag/dag.js.map +1 -0
  139. package/v3/dist/coordination/task-dag/index.d.ts +54 -0
  140. package/v3/dist/coordination/task-dag/index.d.ts.map +1 -0
  141. package/v3/dist/coordination/task-dag/index.js +62 -0
  142. package/v3/dist/coordination/task-dag/index.js.map +1 -0
  143. package/v3/dist/coordination/task-dag/scheduler.d.ts +123 -0
  144. package/v3/dist/coordination/task-dag/scheduler.d.ts.map +1 -0
  145. package/v3/dist/coordination/task-dag/scheduler.js +262 -0
  146. package/v3/dist/coordination/task-dag/scheduler.js.map +1 -0
  147. package/v3/dist/coordination/task-dag/types.d.ts +103 -0
  148. package/v3/dist/coordination/task-dag/types.d.ts.map +1 -0
  149. package/v3/dist/coordination/task-dag/types.js +9 -0
  150. package/v3/dist/coordination/task-dag/types.js.map +1 -0
  151. package/v3/dist/domains/enterprise-integration/services/odata-service.js +3 -3
  152. package/v3/dist/domains/enterprise-integration/services/odata-service.js.map +1 -1
  153. package/v3/dist/domains/enterprise-integration/services/soap-wsdl-service.d.ts.map +1 -1
  154. package/v3/dist/domains/enterprise-integration/services/soap-wsdl-service.js +9 -4
  155. package/v3/dist/domains/enterprise-integration/services/soap-wsdl-service.js.map +1 -1
  156. package/v3/dist/domains/requirements-validation/services/quality-criteria/quality-criteria-service.js +1 -1
  157. package/v3/dist/domains/requirements-validation/services/quality-criteria/quality-criteria-service.js.map +1 -1
  158. package/v3/dist/hooks/index.d.ts +8 -1
  159. package/v3/dist/hooks/index.d.ts.map +1 -1
  160. package/v3/dist/hooks/index.js +8 -1
  161. package/v3/dist/hooks/index.js.map +1 -1
  162. package/v3/dist/hooks/quality-gate-enforcer.d.ts +134 -0
  163. package/v3/dist/hooks/quality-gate-enforcer.d.ts.map +1 -0
  164. package/v3/dist/hooks/quality-gate-enforcer.js +265 -0
  165. package/v3/dist/hooks/quality-gate-enforcer.js.map +1 -0
  166. package/v3/dist/hooks/reasoning-bank-pattern-store.d.ts +60 -0
  167. package/v3/dist/hooks/reasoning-bank-pattern-store.d.ts.map +1 -0
  168. package/v3/dist/hooks/reasoning-bank-pattern-store.js +179 -0
  169. package/v3/dist/hooks/reasoning-bank-pattern-store.js.map +1 -0
  170. package/v3/dist/hooks/task-completed-hook.d.ts +174 -0
  171. package/v3/dist/hooks/task-completed-hook.d.ts.map +1 -0
  172. package/v3/dist/hooks/task-completed-hook.js +330 -0
  173. package/v3/dist/hooks/task-completed-hook.js.map +1 -0
  174. package/v3/dist/hooks/teammate-idle-hook.d.ts +167 -0
  175. package/v3/dist/hooks/teammate-idle-hook.d.ts.map +1 -0
  176. package/v3/dist/hooks/teammate-idle-hook.js +332 -0
  177. package/v3/dist/hooks/teammate-idle-hook.js.map +1 -0
  178. package/v3/dist/index.d.ts +3 -0
  179. package/v3/dist/index.d.ts.map +1 -1
  180. package/v3/dist/index.js +4 -0
  181. package/v3/dist/index.js.map +1 -1
  182. package/v3/dist/init/agents-installer.d.ts +5 -1
  183. package/v3/dist/init/agents-installer.d.ts.map +1 -1
  184. package/v3/dist/init/agents-installer.js +13 -5
  185. package/v3/dist/init/agents-installer.js.map +1 -1
  186. package/v3/dist/init/phases/12-verification.d.ts.map +1 -1
  187. package/v3/dist/init/phases/12-verification.js +13 -1
  188. package/v3/dist/init/phases/12-verification.js.map +1 -1
  189. package/v3/dist/kernel/unified-memory.d.ts.map +1 -1
  190. package/v3/dist/kernel/unified-memory.js +303 -18
  191. package/v3/dist/kernel/unified-memory.js.map +1 -1
  192. package/v3/dist/learning/pattern-store.js +1 -1
  193. package/v3/dist/learning/pattern-store.js.map +1 -1
  194. package/v3/dist/learning/qe-patterns.d.ts +2 -0
  195. package/v3/dist/learning/qe-patterns.d.ts.map +1 -1
  196. package/v3/dist/learning/qe-patterns.js.map +1 -1
  197. package/v3/dist/learning/qe-reasoning-bank.d.ts.map +1 -1
  198. package/v3/dist/learning/qe-reasoning-bank.js +16 -3
  199. package/v3/dist/learning/qe-reasoning-bank.js.map +1 -1
  200. package/v3/dist/mcp/bundle.js +4473 -133
  201. package/v3/dist/sync/cloud/tunnel-manager.d.ts.map +1 -1
  202. package/v3/dist/sync/cloud/tunnel-manager.js +11 -0
  203. package/v3/dist/sync/cloud/tunnel-manager.js.map +1 -1
  204. package/v3/package.json +1 -1
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Agentic QE v3 - Task Dependency DAG
3
+ * ADR-064 Phase 1E: Core DAG data structure for task dependency tracking
4
+ *
5
+ * Directed acyclic graph where nodes are tasks and edges represent
6
+ * "blocked-by" dependencies. Topological sort via Kahn's algorithm,
7
+ * cycle detection via DFS coloring, critical path via longest-path DP.
8
+ */
9
+ import type { DAGTask, AddTaskInput, DAGStats, DAGEventHandler } from './types.js';
10
+ /**
11
+ * Directed acyclic graph for task dependency management.
12
+ *
13
+ * Tasks are nodes with forward edges (blockedBy) and reverse edges (blocks).
14
+ * Acyclicity is enforced through detection, allowing batch insertions.
15
+ */
16
+ export declare class TaskDAG {
17
+ private readonly nodes;
18
+ private readonly forwardEdges;
19
+ private readonly reverseEdges;
20
+ private readonly eventHandlers;
21
+ /**
22
+ * Add a task to the DAG. Status is 'ready' if no incomplete blockers,
23
+ * otherwise 'blocked'. Reverse edges are computed automatically.
24
+ * @throws Error if a task with the same ID already exists
25
+ */
26
+ addTask(input: AddTaskInput): DAGTask;
27
+ /**
28
+ * Remove a task, clean up edges, and unblock dependents if appropriate.
29
+ * @returns true if removed, false if not found
30
+ */
31
+ removeTask(taskId: string): boolean;
32
+ /** Get a task by ID. */
33
+ getTask(taskId: string): DAGTask | undefined;
34
+ /** Get all tasks with 'ready' status. */
35
+ getReady(): DAGTask[];
36
+ /**
37
+ * Mark a task as in_progress.
38
+ * @throws Error if task not found or not in 'ready' status
39
+ */
40
+ start(taskId: string, agentId: string): void;
41
+ /**
42
+ * Mark a task completed and unblock downstream tasks.
43
+ * @returns Array of newly unblocked task IDs
44
+ * @throws Error if task not found or not 'in_progress'
45
+ */
46
+ complete(taskId: string, result?: unknown): string[];
47
+ /**
48
+ * Mark a task failed and cascade cancellation to dependents.
49
+ * @throws Error if task not found or not in 'in_progress'/'ready'
50
+ */
51
+ fail(taskId: string, error: string): void;
52
+ /**
53
+ * Topological sort using Kahn's algorithm.
54
+ * @throws Error if cycles exist
55
+ */
56
+ topologicalSort(): DAGTask[];
57
+ /**
58
+ * Detect cycles using DFS with white/gray/black coloring.
59
+ * @returns Array of cycles, or null if acyclic
60
+ */
61
+ detectCycles(): string[][] | null;
62
+ /**
63
+ * Find the critical path (longest path through the DAG).
64
+ * @returns Tasks on the critical path in execution order
65
+ */
66
+ getCriticalPath(): DAGTask[];
67
+ /** Get aggregate statistics about the DAG. */
68
+ getStats(): DAGStats;
69
+ /** Remove all tasks from the DAG. */
70
+ clear(): void;
71
+ /** Serialize the DAG for debugging. */
72
+ toJSON(): {
73
+ tasks: DAGTask[];
74
+ edges: Array<{
75
+ from: string;
76
+ to: string;
77
+ }>;
78
+ stats: DAGStats;
79
+ };
80
+ /**
81
+ * Register a handler to receive DAG events.
82
+ * @returns Unsubscribe function
83
+ */
84
+ onEvent(handler: DAGEventHandler): () => void;
85
+ private requireTask;
86
+ private computeStatus;
87
+ private setStatus;
88
+ private unblockDependents;
89
+ private cascadeCancellation;
90
+ private dfsCycles;
91
+ private emit;
92
+ }
93
+ //# sourceMappingURL=dag.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dag.d.ts","sourceRoot":"","sources":["../../../src/coordination/task-dag/dag.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EACV,OAAO,EAEP,YAAY,EACZ,QAAQ,EAER,eAAe,EAChB,MAAM,YAAY,CAAC;AAKpB;;;;;GAKG;AACH,qBAAa,OAAO;IAClB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAmC;IACzD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAuC;IACpE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAuC;IACpE,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAyB;IAEvD;;;;OAIG;IACH,OAAO,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO;IAqDrC;;;OAGG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAmDnC,wBAAwB;IACxB,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAI5C,yCAAyC;IACzC,QAAQ,IAAI,OAAO,EAAE;IAQrB;;;OAGG;IACH,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAa5C;;;;OAIG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,MAAM,EAAE;IAgBpD;;;OAGG;IACH,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAWzC;;;OAGG;IACH,eAAe,IAAI,OAAO,EAAE;IA2C5B;;;OAGG;IACH,YAAY,IAAI,MAAM,EAAE,EAAE,GAAG,IAAI;IAiBjC;;;OAGG;IACH,eAAe,IAAI,OAAO,EAAE;IAyC5B,8CAA8C;IAC9C,QAAQ,IAAI,QAAQ;IAsBpB,qCAAqC;IACrC,KAAK,IAAI,IAAI;IAMb,uCAAuC;IACvC,MAAM,IAAI;QAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QAAC,KAAK,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,EAAE,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAAC,KAAK,EAAE,QAAQ,CAAA;KAAE;IAS3F;;;OAGG;IACH,OAAO,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,IAAI;IAU7C,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,aAAa;IASrB,OAAO,CAAC,SAAS;IASjB,OAAO,CAAC,iBAAiB;IAwBzB,OAAO,CAAC,mBAAmB;IAgC3B,OAAO,CAAC,SAAS;IA+BjB,OAAO,CAAC,IAAI;CAKb"}
@@ -0,0 +1,496 @@
1
+ /**
2
+ * Agentic QE v3 - Task Dependency DAG
3
+ * ADR-064 Phase 1E: Core DAG data structure for task dependency tracking
4
+ *
5
+ * Directed acyclic graph where nodes are tasks and edges represent
6
+ * "blocked-by" dependencies. Topological sort via Kahn's algorithm,
7
+ * cycle detection via DFS coloring, critical path via longest-path DP.
8
+ */
9
+ /** DFS node coloring for cycle detection */
10
+ var NodeColor;
11
+ (function (NodeColor) {
12
+ NodeColor[NodeColor["White"] = 0] = "White";
13
+ NodeColor[NodeColor["Gray"] = 1] = "Gray";
14
+ NodeColor[NodeColor["Black"] = 2] = "Black";
15
+ })(NodeColor || (NodeColor = {}));
16
+ /**
17
+ * Directed acyclic graph for task dependency management.
18
+ *
19
+ * Tasks are nodes with forward edges (blockedBy) and reverse edges (blocks).
20
+ * Acyclicity is enforced through detection, allowing batch insertions.
21
+ */
22
+ export class TaskDAG {
23
+ nodes = new Map();
24
+ forwardEdges = new Map();
25
+ reverseEdges = new Map();
26
+ eventHandlers = [];
27
+ /**
28
+ * Add a task to the DAG. Status is 'ready' if no incomplete blockers,
29
+ * otherwise 'blocked'. Reverse edges are computed automatically.
30
+ * @throws Error if a task with the same ID already exists
31
+ */
32
+ addTask(input) {
33
+ if (this.nodes.has(input.id)) {
34
+ throw new Error(`Task '${input.id}' already exists in the DAG`);
35
+ }
36
+ const blockedBy = input.blockedBy ?? [];
37
+ this.forwardEdges.set(input.id, new Set(blockedBy));
38
+ if (!this.reverseEdges.has(input.id)) {
39
+ this.reverseEdges.set(input.id, new Set());
40
+ }
41
+ for (const blockerId of blockedBy) {
42
+ if (!this.reverseEdges.has(blockerId)) {
43
+ this.reverseEdges.set(blockerId, new Set());
44
+ }
45
+ this.reverseEdges.get(blockerId).add(input.id);
46
+ }
47
+ // Blocks array: tasks already in graph that depend on this one
48
+ const blocks = [];
49
+ const existingDeps = this.reverseEdges.get(input.id);
50
+ if (existingDeps) {
51
+ for (const depId of existingDeps)
52
+ blocks.push(depId);
53
+ }
54
+ const status = this.computeStatus(blockedBy);
55
+ const task = {
56
+ id: input.id,
57
+ name: input.name,
58
+ domain: input.domain,
59
+ priority: input.priority ?? 'p2',
60
+ status,
61
+ blockedBy: [...blockedBy],
62
+ blocks: [...blocks],
63
+ metadata: input.metadata,
64
+ createdAt: Date.now(),
65
+ };
66
+ this.nodes.set(input.id, task);
67
+ // Update blocker tasks' blocks arrays
68
+ for (const blockerId of blockedBy) {
69
+ const blocker = this.nodes.get(blockerId);
70
+ if (blocker && !blocker.blocks.includes(input.id)) {
71
+ this.nodes.set(blockerId, { ...blocker, blocks: [...blocker.blocks, input.id] });
72
+ }
73
+ }
74
+ if (status === 'ready') {
75
+ this.emit({ type: 'task-ready', taskId: input.id, timestamp: Date.now() });
76
+ }
77
+ return task;
78
+ }
79
+ /**
80
+ * Remove a task, clean up edges, and unblock dependents if appropriate.
81
+ * @returns true if removed, false if not found
82
+ */
83
+ removeTask(taskId) {
84
+ if (!this.nodes.has(taskId))
85
+ return false;
86
+ // Detach from blockers
87
+ const forward = this.forwardEdges.get(taskId);
88
+ if (forward) {
89
+ for (const blockerId of forward) {
90
+ this.reverseEdges.get(blockerId)?.delete(taskId);
91
+ const blocker = this.nodes.get(blockerId);
92
+ if (blocker) {
93
+ this.nodes.set(blockerId, {
94
+ ...blocker,
95
+ blocks: blocker.blocks.filter((id) => id !== taskId),
96
+ });
97
+ }
98
+ }
99
+ }
100
+ // Detach from dependents and check for unblocking
101
+ const reverse = this.reverseEdges.get(taskId);
102
+ const unblockedIds = [];
103
+ if (reverse) {
104
+ for (const depId of reverse) {
105
+ this.forwardEdges.get(depId)?.delete(taskId);
106
+ const dep = this.nodes.get(depId);
107
+ if (dep) {
108
+ this.nodes.set(depId, {
109
+ ...dep,
110
+ blockedBy: dep.blockedBy.filter((id) => id !== taskId),
111
+ });
112
+ }
113
+ const updated = this.nodes.get(depId);
114
+ if (updated && (updated.status === 'blocked' || updated.status === 'pending')) {
115
+ if (this.computeStatus(Array.from(this.forwardEdges.get(depId) ?? [])) === 'ready') {
116
+ this.setStatus(depId, 'ready');
117
+ unblockedIds.push(depId);
118
+ }
119
+ }
120
+ }
121
+ }
122
+ this.forwardEdges.delete(taskId);
123
+ this.reverseEdges.delete(taskId);
124
+ this.nodes.delete(taskId);
125
+ if (unblockedIds.length > 0) {
126
+ this.emit({ type: 'tasks-unblocked', unblockedTaskIds: unblockedIds, timestamp: Date.now() });
127
+ }
128
+ return true;
129
+ }
130
+ /** Get a task by ID. */
131
+ getTask(taskId) {
132
+ return this.nodes.get(taskId);
133
+ }
134
+ /** Get all tasks with 'ready' status. */
135
+ getReady() {
136
+ const ready = [];
137
+ for (const task of this.nodes.values()) {
138
+ if (task.status === 'ready')
139
+ ready.push(task);
140
+ }
141
+ return ready;
142
+ }
143
+ /**
144
+ * Mark a task as in_progress.
145
+ * @throws Error if task not found or not in 'ready' status
146
+ */
147
+ start(taskId, agentId) {
148
+ const task = this.requireTask(taskId);
149
+ if (task.status !== 'ready') {
150
+ throw new Error(`Cannot start '${taskId}': status '${task.status}', expected 'ready'`);
151
+ }
152
+ this.nodes.set(taskId, {
153
+ ...task,
154
+ status: 'in_progress',
155
+ assignedTo: agentId,
156
+ startedAt: Date.now(),
157
+ });
158
+ }
159
+ /**
160
+ * Mark a task completed and unblock downstream tasks.
161
+ * @returns Array of newly unblocked task IDs
162
+ * @throws Error if task not found or not 'in_progress'
163
+ */
164
+ complete(taskId, result) {
165
+ const task = this.requireTask(taskId);
166
+ if (task.status !== 'in_progress') {
167
+ throw new Error(`Cannot complete '${taskId}': status '${task.status}', expected 'in_progress'`);
168
+ }
169
+ const now = Date.now();
170
+ this.nodes.set(taskId, { ...task, status: 'completed', completedAt: now, result });
171
+ this.emit({ type: 'task-completed', taskId, timestamp: now });
172
+ const unblockedIds = this.unblockDependents(taskId);
173
+ if (unblockedIds.length > 0) {
174
+ this.emit({ type: 'tasks-unblocked', unblockedTaskIds: unblockedIds, timestamp: Date.now() });
175
+ }
176
+ return unblockedIds;
177
+ }
178
+ /**
179
+ * Mark a task failed and cascade cancellation to dependents.
180
+ * @throws Error if task not found or not in 'in_progress'/'ready'
181
+ */
182
+ fail(taskId, error) {
183
+ const task = this.requireTask(taskId);
184
+ if (task.status !== 'in_progress' && task.status !== 'ready') {
185
+ throw new Error(`Cannot fail '${taskId}': status '${task.status}', expected 'in_progress' or 'ready'`);
186
+ }
187
+ const now = Date.now();
188
+ this.nodes.set(taskId, { ...task, status: 'failed', completedAt: now, error });
189
+ this.emit({ type: 'task-failed', taskId, timestamp: now });
190
+ this.cascadeCancellation(taskId);
191
+ }
192
+ /**
193
+ * Topological sort using Kahn's algorithm.
194
+ * @throws Error if cycles exist
195
+ */
196
+ topologicalSort() {
197
+ const inDegree = new Map();
198
+ for (const nodeId of this.nodes.keys()) {
199
+ let count = 0;
200
+ const fwd = this.forwardEdges.get(nodeId);
201
+ if (fwd) {
202
+ for (const dep of fwd) {
203
+ if (this.nodes.has(dep))
204
+ count++;
205
+ }
206
+ }
207
+ inDegree.set(nodeId, count);
208
+ }
209
+ const queue = [];
210
+ for (const [id, deg] of inDegree) {
211
+ if (deg === 0)
212
+ queue.push(id);
213
+ }
214
+ const sorted = [];
215
+ while (queue.length > 0) {
216
+ const nodeId = queue.shift();
217
+ const task = this.nodes.get(nodeId);
218
+ if (task)
219
+ sorted.push(task);
220
+ const dependents = this.reverseEdges.get(nodeId);
221
+ if (dependents) {
222
+ for (const depId of dependents) {
223
+ if (!this.nodes.has(depId))
224
+ continue;
225
+ const newDeg = (inDegree.get(depId) ?? 0) - 1;
226
+ inDegree.set(depId, newDeg);
227
+ if (newDeg === 0)
228
+ queue.push(depId);
229
+ }
230
+ }
231
+ }
232
+ if (sorted.length !== this.nodes.size) {
233
+ throw new Error(`Cycle detected: sorted ${sorted.length} of ${this.nodes.size} tasks`);
234
+ }
235
+ return sorted;
236
+ }
237
+ /**
238
+ * Detect cycles using DFS with white/gray/black coloring.
239
+ * @returns Array of cycles, or null if acyclic
240
+ */
241
+ detectCycles() {
242
+ const color = new Map();
243
+ const parent = new Map();
244
+ const cycles = [];
245
+ for (const id of this.nodes.keys())
246
+ color.set(id, NodeColor.White);
247
+ for (const id of this.nodes.keys()) {
248
+ if (color.get(id) === NodeColor.White) {
249
+ this.dfsCycles(id, color, parent, cycles);
250
+ }
251
+ }
252
+ if (cycles.length === 0)
253
+ return null;
254
+ this.emit({ type: 'cycle-detected', cycleNodes: cycles.flat(), timestamp: Date.now() });
255
+ return cycles;
256
+ }
257
+ /**
258
+ * Find the critical path (longest path through the DAG).
259
+ * @returns Tasks on the critical path in execution order
260
+ */
261
+ getCriticalPath() {
262
+ if (this.nodes.size === 0)
263
+ return [];
264
+ let sorted;
265
+ try {
266
+ sorted = this.topologicalSort();
267
+ }
268
+ catch {
269
+ return [];
270
+ }
271
+ const dist = new Map();
272
+ const pred = new Map();
273
+ for (const t of sorted) {
274
+ dist.set(t.id, 1);
275
+ pred.set(t.id, null);
276
+ }
277
+ for (const task of sorted) {
278
+ const d = dist.get(task.id);
279
+ const deps = this.reverseEdges.get(task.id);
280
+ if (deps) {
281
+ for (const depId of deps) {
282
+ if (!this.nodes.has(depId))
283
+ continue;
284
+ if (d + 1 > (dist.get(depId) ?? 1)) {
285
+ dist.set(depId, d + 1);
286
+ pred.set(depId, task.id);
287
+ }
288
+ }
289
+ }
290
+ }
291
+ let maxDist = 0;
292
+ let endNode = null;
293
+ for (const [id, d] of dist) {
294
+ if (d > maxDist) {
295
+ maxDist = d;
296
+ endNode = id;
297
+ }
298
+ }
299
+ if (!endNode)
300
+ return [];
301
+ const path = [];
302
+ let cur = endNode;
303
+ while (cur !== null) {
304
+ const t = this.nodes.get(cur);
305
+ if (t)
306
+ path.unshift(t);
307
+ cur = pred.get(cur) ?? null;
308
+ }
309
+ return path;
310
+ }
311
+ /** Get aggregate statistics about the DAG. */
312
+ getStats() {
313
+ let pending = 0, ready = 0, inProgress = 0, completed = 0;
314
+ let failed = 0, blocked = 0, cancelled = 0;
315
+ for (const task of this.nodes.values()) {
316
+ switch (task.status) {
317
+ case 'pending':
318
+ pending++;
319
+ break;
320
+ case 'ready':
321
+ ready++;
322
+ break;
323
+ case 'in_progress':
324
+ inProgress++;
325
+ break;
326
+ case 'completed':
327
+ completed++;
328
+ break;
329
+ case 'failed':
330
+ failed++;
331
+ break;
332
+ case 'blocked':
333
+ blocked++;
334
+ break;
335
+ case 'cancelled':
336
+ cancelled++;
337
+ break;
338
+ }
339
+ }
340
+ return {
341
+ totalTasks: this.nodes.size,
342
+ pending, ready, inProgress, completed, failed, blocked, cancelled,
343
+ longestPath: this.getCriticalPath().length,
344
+ hasCycles: this.detectCycles() !== null,
345
+ };
346
+ }
347
+ /** Remove all tasks from the DAG. */
348
+ clear() {
349
+ this.nodes.clear();
350
+ this.forwardEdges.clear();
351
+ this.reverseEdges.clear();
352
+ }
353
+ /** Serialize the DAG for debugging. */
354
+ toJSON() {
355
+ const tasks = Array.from(this.nodes.values());
356
+ const edges = [];
357
+ for (const [taskId, deps] of this.forwardEdges) {
358
+ for (const depId of deps)
359
+ edges.push({ from: depId, to: taskId });
360
+ }
361
+ return { tasks, edges, stats: this.getStats() };
362
+ }
363
+ /**
364
+ * Register a handler to receive DAG events.
365
+ * @returns Unsubscribe function
366
+ */
367
+ onEvent(handler) {
368
+ this.eventHandlers.push(handler);
369
+ return () => {
370
+ const idx = this.eventHandlers.indexOf(handler);
371
+ if (idx >= 0)
372
+ this.eventHandlers.splice(idx, 1);
373
+ };
374
+ }
375
+ // --- Internal helpers ---
376
+ requireTask(taskId) {
377
+ const task = this.nodes.get(taskId);
378
+ if (!task)
379
+ throw new Error(`Task '${taskId}' not found in the DAG`);
380
+ return task;
381
+ }
382
+ computeStatus(blockerIds) {
383
+ if (blockerIds.length === 0)
384
+ return 'ready';
385
+ for (const id of blockerIds) {
386
+ const b = this.nodes.get(id);
387
+ if (!b || b.status !== 'completed')
388
+ return 'blocked';
389
+ }
390
+ return 'ready';
391
+ }
392
+ setStatus(taskId, status) {
393
+ const task = this.nodes.get(taskId);
394
+ if (!task)
395
+ return;
396
+ this.nodes.set(taskId, { ...task, status });
397
+ if (status === 'ready') {
398
+ this.emit({ type: 'task-ready', taskId, timestamp: Date.now() });
399
+ }
400
+ }
401
+ unblockDependents(completedId) {
402
+ const unblockedIds = [];
403
+ const deps = this.reverseEdges.get(completedId);
404
+ if (!deps)
405
+ return unblockedIds;
406
+ for (const depId of deps) {
407
+ const dep = this.nodes.get(depId);
408
+ if (!dep || dep.status !== 'blocked')
409
+ continue;
410
+ const fwd = this.forwardEdges.get(depId);
411
+ if (!fwd)
412
+ continue;
413
+ let allDone = true;
414
+ for (const bId of fwd) {
415
+ const b = this.nodes.get(bId);
416
+ if (!b || b.status !== 'completed') {
417
+ allDone = false;
418
+ break;
419
+ }
420
+ }
421
+ if (allDone) {
422
+ this.setStatus(depId, 'ready');
423
+ unblockedIds.push(depId);
424
+ }
425
+ }
426
+ return unblockedIds;
427
+ }
428
+ cascadeCancellation(failedId) {
429
+ const deps = this.reverseEdges.get(failedId);
430
+ if (!deps)
431
+ return;
432
+ for (const depId of deps) {
433
+ const dep = this.nodes.get(depId);
434
+ if (!dep || dep.status === 'completed' || dep.status === 'failed' || dep.status === 'cancelled') {
435
+ continue;
436
+ }
437
+ const fwd = this.forwardEdges.get(depId);
438
+ if (!fwd)
439
+ continue;
440
+ let unsatisfiable = false;
441
+ for (const bId of fwd) {
442
+ const b = this.nodes.get(bId);
443
+ if (b && (b.status === 'failed' || b.status === 'cancelled')) {
444
+ unsatisfiable = true;
445
+ break;
446
+ }
447
+ }
448
+ if (unsatisfiable) {
449
+ this.nodes.set(depId, {
450
+ ...dep,
451
+ status: 'cancelled',
452
+ completedAt: Date.now(),
453
+ error: `Cancelled: upstream task '${failedId}' failed`,
454
+ });
455
+ this.cascadeCancellation(depId);
456
+ }
457
+ }
458
+ }
459
+ dfsCycles(nodeId, color, parent, cycles) {
460
+ color.set(nodeId, NodeColor.Gray);
461
+ const dependencies = this.forwardEdges.get(nodeId);
462
+ if (dependencies) {
463
+ for (const depId of dependencies) {
464
+ if (!this.nodes.has(depId))
465
+ continue;
466
+ const c = color.get(depId);
467
+ if (c === NodeColor.White) {
468
+ parent.set(depId, nodeId);
469
+ this.dfsCycles(depId, color, parent, cycles);
470
+ }
471
+ else if (c === NodeColor.Gray) {
472
+ const cycle = [depId, nodeId];
473
+ let cur = nodeId;
474
+ while (cur !== depId) {
475
+ const p = parent.get(cur);
476
+ if (p === null || p === undefined || p === depId)
477
+ break;
478
+ cycle.push(p);
479
+ cur = p;
480
+ }
481
+ cycles.push(cycle);
482
+ }
483
+ }
484
+ }
485
+ color.set(nodeId, NodeColor.Black);
486
+ }
487
+ emit(event) {
488
+ for (const handler of this.eventHandlers) {
489
+ try {
490
+ handler(event);
491
+ }
492
+ catch { /* handler errors are silently ignored */ }
493
+ }
494
+ }
495
+ }
496
+ //# sourceMappingURL=dag.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dag.js","sourceRoot":"","sources":["../../../src/coordination/task-dag/dag.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Agentic QE v3 - Task Dependency DAG
3
+ * ADR-064 Phase 1E: DAG-based task scheduler with dependency tracking
4
+ *
5
+ * Provides a directed acyclic graph for managing task dependencies,
6
+ * with topological sorting, cycle detection, critical path analysis,
7
+ * and priority-aware scheduling.
8
+ *
9
+ * @example
10
+ * ```typescript
11
+ * import { createTaskDAG, createDAGScheduler } from './coordination/task-dag';
12
+ *
13
+ * const dag = createTaskDAG();
14
+ * const scheduler = createDAGScheduler(dag, { maxConcurrent: 4 });
15
+ *
16
+ * // Build a dependency graph
17
+ * dag.addTask({ id: 'lint', name: 'Lint', domain: 'ci', priority: 'p2' });
18
+ * dag.addTask({ id: 'build', name: 'Build', domain: 'ci', priority: 'p1' });
19
+ * dag.addTask({ id: 'test', name: 'Test', domain: 'ci', priority: 'p0', blockedBy: ['build'] });
20
+ * dag.addTask({ id: 'deploy', name: 'Deploy', domain: 'ci', priority: 'p0', blockedBy: ['test', 'lint'] });
21
+ *
22
+ * // Schedule ready tasks
23
+ * const batch = scheduler.schedule(); // [build, lint] (ready, sorted by priority)
24
+ *
25
+ * // Execute and process completions
26
+ * dag.start('build', 'agent-1');
27
+ * dag.start('lint', 'agent-2');
28
+ * const unblocked = scheduler.onTaskComplete('build'); // test may now be ready
29
+ *
30
+ * // Check progress
31
+ * const progress = scheduler.getProgress(); // { completed: 1, total: 4, percentage: 25 }
32
+ * ```
33
+ */
34
+ export type { DAGTaskStatus, DAGTask, AddTaskInput, DAGStats, DAGEventType, DAGEvent, DAGSchedulerConfig, DAGEventHandler, } from './types.js';
35
+ export { TaskDAG } from './dag.js';
36
+ export { DAGScheduler } from './scheduler.js';
37
+ import { TaskDAG } from './dag.js';
38
+ import { DAGScheduler } from './scheduler.js';
39
+ import type { DAGSchedulerConfig } from './types.js';
40
+ /**
41
+ * Create a new empty TaskDAG instance.
42
+ *
43
+ * @returns A fresh TaskDAG with no tasks
44
+ */
45
+ export declare function createTaskDAG(): TaskDAG;
46
+ /**
47
+ * Create a new DAGScheduler wrapping a TaskDAG.
48
+ *
49
+ * @param dag - The TaskDAG to schedule from
50
+ * @param config - Optional scheduler configuration
51
+ * @returns A configured DAGScheduler instance
52
+ */
53
+ export declare function createDAGScheduler(dag: TaskDAG, config?: Partial<DAGSchedulerConfig>): DAGScheduler;
54
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/coordination/task-dag/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAMH,YAAY,EACV,aAAa,EACb,OAAO,EACP,YAAY,EACZ,QAAQ,EACR,YAAY,EACZ,QAAQ,EACR,kBAAkB,EAClB,eAAe,GAChB,MAAM,YAAY,CAAC;AAMpB,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACnC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAM9C,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACnC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD;;;;GAIG;AACH,wBAAgB,aAAa,IAAI,OAAO,CAEvC;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,OAAO,EACZ,MAAM,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,GACnC,YAAY,CAEd"}