@defai.digital/ax-cli 2.7.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 (197) hide show
  1. package/.ax-cli/checkpoints/2025-11-20/checkpoint-2dd84869-e62d-46c8-9885-7e45f37f36e2.json +69 -0
  2. package/.ax-cli/checkpoints/2025-11-20/checkpoint-484dc350-353f-4808-9ed1-ebb3cefdab37.json +24 -0
  3. package/.ax-cli/checkpoints/2025-11-20/checkpoint-74a18b87-6172-4215-962b-44bb9f46a662.json +69 -0
  4. package/.ax-cli/checkpoints/2025-11-20/checkpoint-870a5fb9-6e82-4ff2-8ec8-af4c251cc514.json +44 -0
  5. package/.ax-cli/checkpoints/2025-11-20/checkpoint-93946601-0e83-456c-ba47-def9713124dd.json +24 -0
  6. package/.ax-cli/checkpoints/metadata.json +62 -0
  7. package/README.md +87 -11
  8. package/dist/agent/context-manager.d.ts +2 -2
  9. package/dist/agent/context-manager.js +37 -15
  10. package/dist/agent/context-manager.js.map +1 -1
  11. package/dist/agent/dependency-resolver.d.ts +83 -0
  12. package/dist/agent/dependency-resolver.js +310 -0
  13. package/dist/agent/dependency-resolver.js.map +1 -0
  14. package/dist/agent/llm-agent.d.ts +111 -0
  15. package/dist/agent/llm-agent.js +625 -3
  16. package/dist/agent/llm-agent.js.map +1 -1
  17. package/dist/agent/specialized/analysis-agent.d.ts +11 -0
  18. package/dist/agent/specialized/analysis-agent.js +33 -0
  19. package/dist/agent/specialized/analysis-agent.js.map +1 -0
  20. package/dist/agent/specialized/debug-agent.d.ts +11 -0
  21. package/dist/agent/specialized/debug-agent.js +33 -0
  22. package/dist/agent/specialized/debug-agent.js.map +1 -0
  23. package/dist/agent/specialized/documentation-agent.d.ts +11 -0
  24. package/dist/agent/specialized/documentation-agent.js +33 -0
  25. package/dist/agent/specialized/documentation-agent.js.map +1 -0
  26. package/dist/agent/specialized/index.d.ts +11 -0
  27. package/dist/agent/specialized/index.js +12 -0
  28. package/dist/agent/specialized/index.js.map +1 -0
  29. package/dist/agent/specialized/performance-agent.d.ts +11 -0
  30. package/dist/agent/specialized/performance-agent.js +33 -0
  31. package/dist/agent/specialized/performance-agent.js.map +1 -0
  32. package/dist/agent/specialized/refactoring-agent.d.ts +11 -0
  33. package/dist/agent/specialized/refactoring-agent.js +33 -0
  34. package/dist/agent/specialized/refactoring-agent.js.map +1 -0
  35. package/dist/agent/specialized/testing-agent.d.ts +11 -0
  36. package/dist/agent/specialized/testing-agent.js +33 -0
  37. package/dist/agent/specialized/testing-agent.js.map +1 -0
  38. package/dist/agent/subagent-orchestrator.d.ts +128 -0
  39. package/dist/agent/subagent-orchestrator.js +388 -0
  40. package/dist/agent/subagent-orchestrator.js.map +1 -0
  41. package/dist/agent/subagent-types.d.ts +262 -0
  42. package/dist/agent/subagent-types.js +152 -0
  43. package/dist/agent/subagent-types.js.map +1 -0
  44. package/dist/agent/subagent.d.ts +88 -0
  45. package/dist/agent/subagent.js +426 -0
  46. package/dist/agent/subagent.js.map +1 -0
  47. package/dist/checkpoint/index.d.ts +9 -0
  48. package/dist/checkpoint/index.js +11 -0
  49. package/dist/checkpoint/index.js.map +1 -0
  50. package/dist/checkpoint/manager.d.ts +99 -0
  51. package/dist/checkpoint/manager.js +281 -0
  52. package/dist/checkpoint/manager.js.map +1 -0
  53. package/dist/checkpoint/storage.d.ts +31 -0
  54. package/dist/checkpoint/storage.js +265 -0
  55. package/dist/checkpoint/storage.js.map +1 -0
  56. package/dist/checkpoint/types.d.ts +111 -0
  57. package/dist/checkpoint/types.js +17 -0
  58. package/dist/checkpoint/types.js.map +1 -0
  59. package/dist/commands/cache.js +5 -3
  60. package/dist/commands/cache.js.map +1 -1
  61. package/dist/commands/memory.js +21 -16
  62. package/dist/commands/memory.js.map +1 -1
  63. package/dist/commands/plan.d.ts +43 -0
  64. package/dist/commands/plan.js +385 -0
  65. package/dist/commands/plan.js.map +1 -0
  66. package/dist/commands/rewind.d.ts +19 -0
  67. package/dist/commands/rewind.js +221 -0
  68. package/dist/commands/rewind.js.map +1 -0
  69. package/dist/constants.d.ts +28 -0
  70. package/dist/constants.js +29 -0
  71. package/dist/constants.js.map +1 -1
  72. package/dist/hooks/use-enhanced-input.d.ts +5 -1
  73. package/dist/hooks/use-enhanced-input.js +23 -10
  74. package/dist/hooks/use-enhanced-input.js.map +1 -1
  75. package/dist/hooks/use-input-handler.d.ts +11 -1
  76. package/dist/hooks/use-input-handler.js +294 -2
  77. package/dist/hooks/use-input-handler.js.map +1 -1
  78. package/dist/llm/client.js +2 -1
  79. package/dist/llm/client.js.map +1 -1
  80. package/dist/llm/tools.d.ts +5 -0
  81. package/dist/llm/tools.js +57 -6
  82. package/dist/llm/tools.js.map +1 -1
  83. package/dist/mcp/client.d.ts +1 -0
  84. package/dist/mcp/client.js +30 -8
  85. package/dist/mcp/client.js.map +1 -1
  86. package/dist/mcp/transports.d.ts +0 -1
  87. package/dist/mcp/transports.js +10 -7
  88. package/dist/mcp/transports.js.map +1 -1
  89. package/dist/planner/dependency-resolver.d.ts +72 -0
  90. package/dist/planner/dependency-resolver.js +272 -0
  91. package/dist/planner/dependency-resolver.js.map +1 -0
  92. package/dist/planner/index.d.ts +12 -0
  93. package/dist/planner/index.js +26 -0
  94. package/dist/planner/index.js.map +1 -0
  95. package/dist/planner/plan-generator.d.ts +74 -0
  96. package/dist/planner/plan-generator.js +244 -0
  97. package/dist/planner/plan-generator.js.map +1 -0
  98. package/dist/planner/plan-storage.d.ts +98 -0
  99. package/dist/planner/plan-storage.js +325 -0
  100. package/dist/planner/plan-storage.js.map +1 -0
  101. package/dist/planner/prompts/planning-prompt.d.ts +41 -0
  102. package/dist/planner/prompts/planning-prompt.js +289 -0
  103. package/dist/planner/prompts/planning-prompt.js.map +1 -0
  104. package/dist/planner/task-planner.d.ts +135 -0
  105. package/dist/planner/task-planner.js +493 -0
  106. package/dist/planner/task-planner.js.map +1 -0
  107. package/dist/planner/token-estimator.d.ts +63 -0
  108. package/dist/planner/token-estimator.js +295 -0
  109. package/dist/planner/token-estimator.js.map +1 -0
  110. package/dist/planner/types.d.ts +669 -0
  111. package/dist/planner/types.js +213 -0
  112. package/dist/planner/types.js.map +1 -0
  113. package/dist/schemas/api-schemas.js +4 -0
  114. package/dist/schemas/api-schemas.js.map +1 -1
  115. package/dist/schemas/confirmation-schemas.d.ts +5 -0
  116. package/dist/schemas/confirmation-schemas.js +7 -0
  117. package/dist/schemas/confirmation-schemas.js.map +1 -1
  118. package/dist/schemas/index.d.ts +4 -4
  119. package/dist/tools/bash-output.d.ts +25 -0
  120. package/dist/tools/bash-output.js +145 -0
  121. package/dist/tools/bash-output.js.map +1 -0
  122. package/dist/tools/bash.d.ts +46 -2
  123. package/dist/tools/bash.js +241 -42
  124. package/dist/tools/bash.js.map +1 -1
  125. package/dist/tools/search.js +34 -9
  126. package/dist/tools/search.js.map +1 -1
  127. package/dist/tools/text-editor.d.ts +16 -0
  128. package/dist/tools/text-editor.js +37 -2
  129. package/dist/tools/text-editor.js.map +1 -1
  130. package/dist/ui/components/chat-history.d.ts +1 -0
  131. package/dist/ui/components/chat-history.js +125 -41
  132. package/dist/ui/components/chat-history.js.map +1 -1
  133. package/dist/ui/components/chat-input.js +10 -3
  134. package/dist/ui/components/chat-input.js.map +1 -1
  135. package/dist/ui/components/chat-interface.js +154 -45
  136. package/dist/ui/components/chat-interface.js.map +1 -1
  137. package/dist/ui/components/collapsible-tool-result.d.ts +26 -0
  138. package/dist/ui/components/collapsible-tool-result.js +172 -0
  139. package/dist/ui/components/collapsible-tool-result.js.map +1 -0
  140. package/dist/ui/components/command-suggestions.js +2 -1
  141. package/dist/ui/components/command-suggestions.js.map +1 -1
  142. package/dist/ui/components/confirmation-dialog.js +25 -36
  143. package/dist/ui/components/confirmation-dialog.js.map +1 -1
  144. package/dist/ui/components/index.d.ts +8 -0
  145. package/dist/ui/components/index.js +9 -0
  146. package/dist/ui/components/index.js.map +1 -1
  147. package/dist/ui/components/keyboard-hints.d.ts +35 -0
  148. package/dist/ui/components/keyboard-hints.js +134 -0
  149. package/dist/ui/components/keyboard-hints.js.map +1 -0
  150. package/dist/ui/components/loading-spinner.d.ts +2 -1
  151. package/dist/ui/components/loading-spinner.js +86 -34
  152. package/dist/ui/components/loading-spinner.js.map +1 -1
  153. package/dist/ui/components/phase-progress.d.ts +21 -0
  154. package/dist/ui/components/phase-progress.js +228 -0
  155. package/dist/ui/components/phase-progress.js.map +1 -0
  156. package/dist/ui/components/quick-actions.d.ts +12 -0
  157. package/dist/ui/components/quick-actions.js +122 -0
  158. package/dist/ui/components/quick-actions.js.map +1 -0
  159. package/dist/ui/components/reasoning-display.d.ts +0 -80
  160. package/dist/ui/components/reasoning-display.js +0 -83
  161. package/dist/ui/components/reasoning-display.js.map +1 -1
  162. package/dist/ui/components/status-bar.d.ts +25 -0
  163. package/dist/ui/components/status-bar.js +125 -0
  164. package/dist/ui/components/status-bar.js.map +1 -0
  165. package/dist/ui/components/subagent-monitor.d.ts +29 -0
  166. package/dist/ui/components/subagent-monitor.js +150 -0
  167. package/dist/ui/components/subagent-monitor.js.map +1 -0
  168. package/dist/ui/components/toast-notification.d.ts +123 -0
  169. package/dist/ui/components/toast-notification.js +143 -0
  170. package/dist/ui/components/toast-notification.js.map +1 -0
  171. package/dist/ui/components/welcome-panel.d.ts +10 -0
  172. package/dist/ui/components/welcome-panel.js +107 -0
  173. package/dist/ui/components/welcome-panel.js.map +1 -0
  174. package/dist/utils/background-task-manager.d.ts +95 -0
  175. package/dist/utils/background-task-manager.js +330 -0
  176. package/dist/utils/background-task-manager.js.map +1 -0
  177. package/dist/utils/confirmation-service.js +8 -3
  178. package/dist/utils/confirmation-service.js.map +1 -1
  179. package/dist/utils/history-manager.d.ts +1 -0
  180. package/dist/utils/history-manager.js +40 -5
  181. package/dist/utils/history-manager.js.map +1 -1
  182. package/dist/utils/json-utils.d.ts +7 -0
  183. package/dist/utils/json-utils.js +70 -2
  184. package/dist/utils/json-utils.js.map +1 -1
  185. package/dist/utils/message-optimizer.d.ts +1 -0
  186. package/dist/utils/message-optimizer.js +7 -1
  187. package/dist/utils/message-optimizer.js.map +1 -1
  188. package/dist/utils/project-analyzer.js +5 -2
  189. package/dist/utils/project-analyzer.js.map +1 -1
  190. package/dist/utils/settings-manager.js +12 -10
  191. package/dist/utils/settings-manager.js.map +1 -1
  192. package/dist/utils/text-utils.js +3 -3
  193. package/dist/utils/text-utils.js.map +1 -1
  194. package/dist/utils/token-counter.d.ts +5 -0
  195. package/dist/utils/token-counter.js +18 -3
  196. package/dist/utils/token-counter.js.map +1 -1
  197. package/package.json +3 -1
@@ -0,0 +1,272 @@
1
+ /**
2
+ * Dependency Resolver
3
+ *
4
+ * Resolves phase dependencies using topological sort.
5
+ * Groups phases into execution batches that can run in parallel.
6
+ */
7
+ // ============================================================================
8
+ // Dependency Resolver Class
9
+ // ============================================================================
10
+ export class DependencyResolver {
11
+ /**
12
+ * Resolve dependencies and create execution batches
13
+ *
14
+ * Uses Kahn's algorithm for topological sorting.
15
+ * Groups phases that have no dependencies between them into batches.
16
+ */
17
+ resolve(phases) {
18
+ // Validate phase IDs are unique
19
+ const ids = new Set();
20
+ for (const phase of phases) {
21
+ if (ids.has(phase.id)) {
22
+ return {
23
+ batches: [],
24
+ isValid: false,
25
+ error: `Duplicate phase ID: ${phase.id}`,
26
+ };
27
+ }
28
+ ids.add(phase.id);
29
+ }
30
+ // Create adjacency list and in-degree map
31
+ const phaseMap = new Map();
32
+ const inDegree = new Map();
33
+ const dependents = new Map();
34
+ for (const phase of phases) {
35
+ phaseMap.set(phase.id, phase);
36
+ inDegree.set(phase.id, 0);
37
+ dependents.set(phase.id, []);
38
+ }
39
+ // Build dependency graph
40
+ for (const phase of phases) {
41
+ for (const depId of phase.dependencies) {
42
+ // Validate dependency exists
43
+ if (!phaseMap.has(depId)) {
44
+ return {
45
+ batches: [],
46
+ isValid: false,
47
+ error: `Phase "${phase.id}" depends on non-existent phase "${depId}"`,
48
+ };
49
+ }
50
+ // Increment in-degree
51
+ inDegree.set(phase.id, (inDegree.get(phase.id) || 0) + 1);
52
+ // Add to dependents list
53
+ const deps = dependents.get(depId) || [];
54
+ deps.push(phase.id);
55
+ dependents.set(depId, deps);
56
+ }
57
+ }
58
+ // Kahn's algorithm with batching
59
+ const batches = [];
60
+ const processed = new Set();
61
+ while (processed.size < phases.length) {
62
+ // Find all phases with in-degree 0 (no unprocessed dependencies)
63
+ const ready = [];
64
+ for (const phase of phases) {
65
+ if (processed.has(phase.id))
66
+ continue;
67
+ const degree = inDegree.get(phase.id) || 0;
68
+ if (degree === 0) {
69
+ ready.push(phase);
70
+ }
71
+ }
72
+ // No phases ready = cycle detected
73
+ if (ready.length === 0) {
74
+ const remaining = phases
75
+ .filter((p) => !processed.has(p.id))
76
+ .map((p) => p.id);
77
+ return {
78
+ batches: [],
79
+ isValid: false,
80
+ error: `Cyclic dependency detected among phases: ${remaining.join(", ")}`,
81
+ cyclicPhases: remaining,
82
+ };
83
+ }
84
+ // Determine if this batch can run in parallel
85
+ // Phases can run in parallel if:
86
+ // 1. All phases in the batch have canRunInParallel: true
87
+ // 2. No phase in the batch depends on another phase in the same batch
88
+ const canRunInParallel = ready.length > 1 && ready.every((p) => p.canRunInParallel);
89
+ // Create batch
90
+ const batch = {
91
+ index: batches.length,
92
+ phases: ready,
93
+ canRunInParallel,
94
+ estimatedTokens: 0, // Will be filled by TokenEstimator
95
+ };
96
+ batches.push(batch);
97
+ // Mark as processed and update in-degrees
98
+ for (const phase of ready) {
99
+ processed.add(phase.id);
100
+ // Decrease in-degree for all dependents
101
+ const deps = dependents.get(phase.id) || [];
102
+ for (const depId of deps) {
103
+ const current = inDegree.get(depId) || 0;
104
+ inDegree.set(depId, current - 1);
105
+ }
106
+ }
107
+ }
108
+ return {
109
+ batches,
110
+ isValid: true,
111
+ };
112
+ }
113
+ /**
114
+ * Get phases that can execute immediately (no pending dependencies)
115
+ */
116
+ getReadyPhases(phases, completedPhaseIds) {
117
+ return phases.filter((phase) => {
118
+ // Already completed
119
+ if (completedPhaseIds.has(phase.id))
120
+ return false;
121
+ // Check all dependencies are completed
122
+ return phase.dependencies.every((depId) => completedPhaseIds.has(depId));
123
+ });
124
+ }
125
+ /**
126
+ * Check if a phase can be executed given current state
127
+ */
128
+ canExecutePhase(phase, completedPhaseIds) {
129
+ const blockedBy = [];
130
+ for (const depId of phase.dependencies) {
131
+ if (!completedPhaseIds.has(depId)) {
132
+ blockedBy.push(depId);
133
+ }
134
+ }
135
+ return {
136
+ canExecute: blockedBy.length === 0,
137
+ blockedBy,
138
+ };
139
+ }
140
+ /**
141
+ * Get the critical path (longest dependency chain)
142
+ */
143
+ getCriticalPath(phases) {
144
+ const phaseMap = new Map();
145
+ for (const phase of phases) {
146
+ phaseMap.set(phase.id, phase);
147
+ }
148
+ // Calculate longest path to each phase using dynamic programming
149
+ const longestPath = new Map();
150
+ const predecessor = new Map();
151
+ // Initialize
152
+ for (const phase of phases) {
153
+ longestPath.set(phase.id, 0);
154
+ predecessor.set(phase.id, null);
155
+ }
156
+ // Process in topological order
157
+ const result = this.resolve(phases);
158
+ if (!result.isValid)
159
+ return [];
160
+ for (const batch of result.batches) {
161
+ for (const phase of batch.phases) {
162
+ const currentLength = longestPath.get(phase.id) || 0;
163
+ for (const depId of phase.dependencies) {
164
+ const depLength = longestPath.get(depId) || 0;
165
+ if (depLength + 1 > currentLength) {
166
+ longestPath.set(phase.id, depLength + 1);
167
+ predecessor.set(phase.id, depId);
168
+ }
169
+ }
170
+ }
171
+ }
172
+ // Find the phase with the longest path
173
+ let maxLength = -1;
174
+ let maxPhaseId = null;
175
+ for (const [id, length] of longestPath.entries()) {
176
+ if (length > maxLength) {
177
+ maxLength = length;
178
+ maxPhaseId = id;
179
+ }
180
+ }
181
+ // Reconstruct the critical path
182
+ const criticalPath = [];
183
+ let currentId = maxPhaseId;
184
+ while (currentId) {
185
+ const phase = phaseMap.get(currentId);
186
+ if (phase) {
187
+ criticalPath.unshift(phase);
188
+ }
189
+ currentId = predecessor.get(currentId) || null;
190
+ }
191
+ return criticalPath;
192
+ }
193
+ /**
194
+ * Validate dependency graph
195
+ */
196
+ validate(phases) {
197
+ const errors = [];
198
+ const ids = new Set();
199
+ // Check for duplicate IDs
200
+ for (const phase of phases) {
201
+ if (ids.has(phase.id)) {
202
+ errors.push(`Duplicate phase ID: ${phase.id}`);
203
+ }
204
+ ids.add(phase.id);
205
+ }
206
+ // Check for invalid dependencies
207
+ for (const phase of phases) {
208
+ for (const depId of phase.dependencies) {
209
+ if (!ids.has(depId)) {
210
+ errors.push(`Phase "${phase.id}" depends on non-existent phase "${depId}"`);
211
+ }
212
+ // Check for self-dependency
213
+ if (depId === phase.id) {
214
+ errors.push(`Phase "${phase.id}" cannot depend on itself`);
215
+ }
216
+ }
217
+ }
218
+ // Check for cycles
219
+ const result = this.resolve(phases);
220
+ if (!result.isValid && result.cyclicPhases) {
221
+ errors.push(`Cyclic dependency detected: ${result.cyclicPhases.join(" -> ")}`);
222
+ }
223
+ return {
224
+ isValid: errors.length === 0,
225
+ errors,
226
+ };
227
+ }
228
+ /**
229
+ * Get a visualization of the dependency graph (ASCII)
230
+ */
231
+ visualize(phases) {
232
+ const result = this.resolve(phases);
233
+ if (!result.isValid) {
234
+ return `Invalid dependency graph: ${result.error}`;
235
+ }
236
+ const lines = [];
237
+ lines.push("Execution Order:");
238
+ lines.push("================");
239
+ for (const batch of result.batches) {
240
+ const phaseNames = batch.phases.map((p) => p.name).join(", ");
241
+ const parallel = batch.canRunInParallel ? " [parallel]" : "";
242
+ lines.push(`Batch ${batch.index + 1}: ${phaseNames}${parallel}`);
243
+ }
244
+ lines.push("");
245
+ lines.push("Dependencies:");
246
+ lines.push("=============");
247
+ for (const phase of phases) {
248
+ if (phase.dependencies.length > 0) {
249
+ const deps = phase.dependencies.join(", ");
250
+ lines.push(`${phase.name} <- [${deps}]`);
251
+ }
252
+ else {
253
+ lines.push(`${phase.name} (no dependencies)`);
254
+ }
255
+ }
256
+ return lines.join("\n");
257
+ }
258
+ }
259
+ // ============================================================================
260
+ // Singleton Instance
261
+ // ============================================================================
262
+ let resolverInstance = null;
263
+ /**
264
+ * Get the singleton DependencyResolver instance
265
+ */
266
+ export function getDependencyResolver() {
267
+ if (!resolverInstance) {
268
+ resolverInstance = new DependencyResolver();
269
+ }
270
+ return resolverInstance;
271
+ }
272
+ //# sourceMappingURL=dependency-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependency-resolver.js","sourceRoot":"","sources":["../../src/planner/dependency-resolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Multi-Phase Task Planning System
3
+ *
4
+ * Exports all planner components for use in ax-cli.
5
+ */
6
+ export { RiskLevel, FallbackStrategy, PhaseStatus, PlanStatus, type TaskPhase, type TaskPlan, type PhaseResult, type PlanResult, type ExecutionOptions, type PlannerOptions, type SavedPlanState, type PhaseDisplayInfo, type PlanSummary, type RecoveryAction, type LLMPhaseResponse, type LLMPlanResponse, TaskPhaseSchema, TaskPlanSchema, PhaseResultSchema, LLMPhaseResponseSchema, LLMPlanResponseSchema, createPhase, createPlan, createDefaultExecutionOptions, createDefaultPlannerOptions, } from "./types.js";
7
+ export { PlanStorage, getPlanStorage, resetPlanStorage, } from "./plan-storage.js";
8
+ export { DependencyResolver, getDependencyResolver, type ExecutionBatch, type DependencyResolutionResult, } from "./dependency-resolver.js";
9
+ export { TokenEstimator, getTokenEstimator, } from "./token-estimator.js";
10
+ export { PlanGenerator, getPlanGenerator, type PlanGeneratorOptions, type GenerationContext, } from "./plan-generator.js";
11
+ export { TaskPlanner, getTaskPlanner, resetTaskPlanner, type TaskPlannerEvents, } from "./task-planner.js";
12
+ export { PLANNING_SYSTEM_PROMPT, buildPlanningPrompt, buildPhaseExecutionPrompt, buildPlanSummaryPrompt, isComplexRequest, estimateMinPhases, COMPLEX_KEYWORDS, SIMPLE_KEYWORDS, } from "./prompts/planning-prompt.js";
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Multi-Phase Task Planning System
3
+ *
4
+ * Exports all planner components for use in ax-cli.
5
+ */
6
+ // Types
7
+ export {
8
+ // Enums
9
+ RiskLevel, FallbackStrategy, PhaseStatus, PlanStatus,
10
+ // Schemas
11
+ TaskPhaseSchema, TaskPlanSchema, PhaseResultSchema, LLMPhaseResponseSchema, LLMPlanResponseSchema,
12
+ // Factory functions
13
+ createPhase, createPlan, createDefaultExecutionOptions, createDefaultPlannerOptions, } from "./types.js";
14
+ // Plan Storage
15
+ export { PlanStorage, getPlanStorage, resetPlanStorage, } from "./plan-storage.js";
16
+ // Dependency Resolver
17
+ export { DependencyResolver, getDependencyResolver, } from "./dependency-resolver.js";
18
+ // Token Estimator
19
+ export { TokenEstimator, getTokenEstimator, } from "./token-estimator.js";
20
+ // Plan Generator
21
+ export { PlanGenerator, getPlanGenerator, } from "./plan-generator.js";
22
+ // Task Planner (main orchestrator)
23
+ export { TaskPlanner, getTaskPlanner, resetTaskPlanner, } from "./task-planner.js";
24
+ // Prompts
25
+ export { PLANNING_SYSTEM_PROMPT, buildPlanningPrompt, buildPhaseExecutionPrompt, buildPlanSummaryPrompt, isComplexRequest, estimateMinPhases, COMPLEX_KEYWORDS, SIMPLE_KEYWORDS, } from "./prompts/planning-prompt.js";
26
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/planner/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,QAAQ;AACR,OAAO;AACL,QAAQ;AACR,SAAS,EACT,gBAAgB,EAChB,WAAW,EACX,UAAU;AAgBV,UAAU;AACV,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,sBAAsB,EACtB,qBAAqB;AAErB,oBAAoB;AACpB,WAAW,EACX,UAAU,EACV,6BAA6B,EAC7B,2BAA2B,GAC5B,MAAM,YAAY,CAAC;AAEpB,eAAe;AACf,OAAO,EACL,WAAW,EACX,cAAc,EACd,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAE3B,sBAAsB;AACtB,OAAO,EACL,kBAAkB,EAClB,qBAAqB,GAGtB,MAAM,0BAA0B,CAAC;AAElC,kBAAkB;AAClB,OAAO,EACL,cAAc,EACd,iBAAiB,GAClB,MAAM,sBAAsB,CAAC;AAE9B,iBAAiB;AACjB,OAAO,EACL,aAAa,EACb,gBAAgB,GAGjB,MAAM,qBAAqB,CAAC;AAE7B,mCAAmC;AACnC,OAAO,EACL,WAAW,EACX,cAAc,EACd,gBAAgB,GAEjB,MAAM,mBAAmB,CAAC;AAE3B,UAAU;AACV,OAAO,EACL,sBAAsB,EACtB,mBAAmB,EACnB,yBAAyB,EACzB,sBAAsB,EACtB,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,GAChB,MAAM,8BAA8B,CAAC"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Plan Generator
3
+ *
4
+ * Generates execution plans from user requests using LLM.
5
+ */
6
+ import { TaskPlan, RiskLevel } from "./types.js";
7
+ export interface PlanGeneratorOptions {
8
+ /** Maximum phases to generate */
9
+ maxPhases: number;
10
+ /** Default risk level for unspecified phases */
11
+ defaultRiskLevel: RiskLevel;
12
+ /** Whether to auto-require approval for high-risk phases */
13
+ requireApprovalForHighRisk: boolean;
14
+ }
15
+ export interface GenerationContext {
16
+ /** Project type (e.g., "typescript", "react") */
17
+ projectType?: string;
18
+ /** Relevant files for context */
19
+ files?: string[];
20
+ /** Recent conversation history */
21
+ recentHistory?: string[];
22
+ /** Custom instructions */
23
+ customInstructions?: string;
24
+ }
25
+ export declare class PlanGenerator {
26
+ private options;
27
+ constructor(options?: Partial<PlanGeneratorOptions>);
28
+ /**
29
+ * Check if a request should trigger multi-phase planning
30
+ */
31
+ shouldCreatePlan(request: string): boolean;
32
+ /**
33
+ * Generate a plan from LLM response
34
+ *
35
+ * @param request - User's original request
36
+ * @param llmResponse - Raw JSON response from LLM
37
+ * @param context - Additional context
38
+ */
39
+ generateFromLLMResponse(request: string, llmResponse: string, _context?: GenerationContext): TaskPlan | null;
40
+ /**
41
+ * Build a TaskPlan from validated LLM response
42
+ */
43
+ private buildPlanFromResponse;
44
+ /**
45
+ * Parse risk level string to enum
46
+ */
47
+ private parseRiskLevel;
48
+ /**
49
+ * Resolve dependency references to phase IDs
50
+ *
51
+ * LLM might return dependencies as names or indices
52
+ */
53
+ private resolveDependencies;
54
+ /**
55
+ * Create a simple single-phase plan for non-complex requests
56
+ */
57
+ createSimplePlan(request: string): TaskPlan;
58
+ /**
59
+ * Get the system prompt for planning
60
+ */
61
+ getSystemPrompt(): string;
62
+ /**
63
+ * Build the user prompt for planning
64
+ */
65
+ buildUserPrompt(request: string, context?: GenerationContext): string;
66
+ /**
67
+ * Update plan with estimates after creation
68
+ */
69
+ updatePlanEstimates(plan: TaskPlan): TaskPlan;
70
+ }
71
+ /**
72
+ * Get the singleton PlanGenerator instance
73
+ */
74
+ export declare function getPlanGenerator(): PlanGenerator;
@@ -0,0 +1,244 @@
1
+ /**
2
+ * Plan Generator
3
+ *
4
+ * Generates execution plans from user requests using LLM.
5
+ */
6
+ import { randomUUID } from "crypto";
7
+ import { PhaseStatus, PlanStatus, RiskLevel, FallbackStrategy, LLMPlanResponseSchema, createPlan, createPhase, } from "./types.js";
8
+ import { PLANNING_SYSTEM_PROMPT, buildPlanningPrompt, isComplexRequest, } from "./prompts/planning-prompt.js";
9
+ import { getDependencyResolver } from "./dependency-resolver.js";
10
+ import { getTokenEstimator } from "./token-estimator.js";
11
+ // ============================================================================
12
+ // Plan Generator Class
13
+ // ============================================================================
14
+ export class PlanGenerator {
15
+ options;
16
+ constructor(options) {
17
+ this.options = {
18
+ maxPhases: 10,
19
+ defaultRiskLevel: RiskLevel.LOW,
20
+ requireApprovalForHighRisk: true,
21
+ ...options,
22
+ };
23
+ }
24
+ /**
25
+ * Check if a request should trigger multi-phase planning
26
+ */
27
+ shouldCreatePlan(request) {
28
+ return isComplexRequest(request);
29
+ }
30
+ /**
31
+ * Generate a plan from LLM response
32
+ *
33
+ * @param request - User's original request
34
+ * @param llmResponse - Raw JSON response from LLM
35
+ * @param context - Additional context
36
+ */
37
+ generateFromLLMResponse(request, llmResponse, _context) {
38
+ try {
39
+ // Parse JSON response
40
+ const parsed = JSON.parse(llmResponse);
41
+ // Validate against schema
42
+ const result = LLMPlanResponseSchema.safeParse(parsed);
43
+ if (!result.success) {
44
+ console.error("Invalid LLM response format:", result.error);
45
+ return null;
46
+ }
47
+ return this.buildPlanFromResponse(request, result.data);
48
+ }
49
+ catch (error) {
50
+ console.error("Failed to parse LLM response:", error);
51
+ return null;
52
+ }
53
+ }
54
+ /**
55
+ * Build a TaskPlan from validated LLM response
56
+ */
57
+ buildPlanFromResponse(request, response) {
58
+ const planId = `plan_${randomUUID().slice(0, 8)}`;
59
+ const now = new Date();
60
+ // Convert LLM phases to TaskPhases
61
+ const phases = response.phases
62
+ .slice(0, this.options.maxPhases)
63
+ .map((llmPhase, index) => {
64
+ const phaseId = `phase_${index + 1}`;
65
+ // Convert risk level string to enum
66
+ const riskLevel = this.parseRiskLevel(llmPhase.riskLevel);
67
+ // Auto-set approval for high-risk phases
68
+ const requiresApproval = llmPhase.requiresApproval ||
69
+ (this.options.requireApprovalForHighRisk &&
70
+ riskLevel === RiskLevel.HIGH);
71
+ // Determine fallback strategy based on risk
72
+ const fallbackStrategy = riskLevel === RiskLevel.HIGH
73
+ ? FallbackStrategy.ABORT
74
+ : FallbackStrategy.RETRY;
75
+ return createPhase({
76
+ id: phaseId,
77
+ index,
78
+ name: llmPhase.name,
79
+ description: llmPhase.description,
80
+ objectives: llmPhase.objectives,
81
+ toolsRequired: llmPhase.toolsRequired,
82
+ dependencies: this.resolveDependencies(llmPhase.dependencies, index),
83
+ canRunInParallel: llmPhase.canRunInParallel,
84
+ riskLevel,
85
+ requiresApproval,
86
+ fallbackStrategy,
87
+ maxRetries: riskLevel === RiskLevel.HIGH ? 1 : 3,
88
+ status: PhaseStatus.PENDING,
89
+ retryCount: 0,
90
+ });
91
+ });
92
+ // Validate dependencies
93
+ const resolver = getDependencyResolver();
94
+ const validation = resolver.validate(phases);
95
+ if (!validation.isValid) {
96
+ console.warn("Plan has dependency issues:", validation.errors);
97
+ // Fix dependencies by removing invalid ones
98
+ for (const phase of phases) {
99
+ phase.dependencies = phase.dependencies.filter((depId) => phases.some((p) => p.id === depId));
100
+ }
101
+ }
102
+ // Estimate tokens and duration
103
+ const estimator = getTokenEstimator();
104
+ const batches = resolver.resolve(phases);
105
+ const estimatedTokens = phases.reduce((sum, p) => sum + estimator.estimatePhase(p), 0);
106
+ const estimatedDuration = batches.isValid
107
+ ? estimator.estimatePlanDuration({ phases }, batches.batches)
108
+ : estimatedTokens * 20; // Fallback estimate
109
+ return createPlan({
110
+ id: planId,
111
+ originalPrompt: request,
112
+ reasoning: response.reasoning,
113
+ complexity: response.complexity,
114
+ phases,
115
+ status: PlanStatus.CREATED,
116
+ createdAt: now,
117
+ updatedAt: now,
118
+ estimatedTotalTokens: estimatedTokens,
119
+ estimatedDuration,
120
+ });
121
+ }
122
+ /**
123
+ * Parse risk level string to enum
124
+ */
125
+ parseRiskLevel(level) {
126
+ switch (level.toLowerCase()) {
127
+ case "high":
128
+ return RiskLevel.HIGH;
129
+ case "medium":
130
+ return RiskLevel.MEDIUM;
131
+ case "low":
132
+ default:
133
+ return RiskLevel.LOW;
134
+ }
135
+ }
136
+ /**
137
+ * Resolve dependency references to phase IDs
138
+ *
139
+ * LLM might return dependencies as names or indices
140
+ */
141
+ resolveDependencies(deps, currentIndex) {
142
+ return deps
143
+ .map((dep) => {
144
+ // If it looks like a phase ID, use as-is
145
+ if (dep.startsWith("phase_")) {
146
+ return dep;
147
+ }
148
+ // If it's a number, convert to phase ID
149
+ const num = parseInt(dep, 10);
150
+ if (!isNaN(num) && num > 0 && num < currentIndex + 1) {
151
+ return `phase_${num}`;
152
+ }
153
+ // If it's "previous", reference the previous phase
154
+ if (dep.toLowerCase() === "previous" && currentIndex > 0) {
155
+ return `phase_${currentIndex}`;
156
+ }
157
+ // Can't resolve - skip
158
+ return null;
159
+ })
160
+ .filter((dep) => dep !== null);
161
+ }
162
+ /**
163
+ * Create a simple single-phase plan for non-complex requests
164
+ */
165
+ createSimplePlan(request) {
166
+ const planId = `plan_${randomUUID().slice(0, 8)}`;
167
+ const now = new Date();
168
+ const phase = createPhase({
169
+ id: "phase_1",
170
+ index: 0,
171
+ name: "Execute Request",
172
+ description: request,
173
+ objectives: [request],
174
+ toolsRequired: [],
175
+ dependencies: [],
176
+ canRunInParallel: false,
177
+ riskLevel: RiskLevel.LOW,
178
+ requiresApproval: false,
179
+ fallbackStrategy: FallbackStrategy.RETRY,
180
+ maxRetries: 3,
181
+ status: PhaseStatus.PENDING,
182
+ retryCount: 0,
183
+ });
184
+ const estimator = getTokenEstimator();
185
+ return createPlan({
186
+ id: planId,
187
+ originalPrompt: request,
188
+ reasoning: "Simple request - single phase execution",
189
+ complexity: "simple",
190
+ phases: [phase],
191
+ status: PlanStatus.CREATED,
192
+ createdAt: now,
193
+ updatedAt: now,
194
+ estimatedTotalTokens: estimator.estimatePhase(phase),
195
+ estimatedDuration: estimator.estimatePhaseDuration(phase),
196
+ });
197
+ }
198
+ /**
199
+ * Get the system prompt for planning
200
+ */
201
+ getSystemPrompt() {
202
+ return PLANNING_SYSTEM_PROMPT;
203
+ }
204
+ /**
205
+ * Build the user prompt for planning
206
+ */
207
+ buildUserPrompt(request, context) {
208
+ return buildPlanningPrompt(request, {
209
+ projectType: context?.projectType,
210
+ files: context?.files,
211
+ recentHistory: context?.recentHistory,
212
+ });
213
+ }
214
+ /**
215
+ * Update plan with estimates after creation
216
+ */
217
+ updatePlanEstimates(plan) {
218
+ const estimator = getTokenEstimator();
219
+ const resolver = getDependencyResolver();
220
+ const batches = resolver.resolve(plan.phases);
221
+ return {
222
+ ...plan,
223
+ estimatedTotalTokens: estimator.estimatePlan(plan),
224
+ estimatedDuration: batches.isValid
225
+ ? estimator.estimatePlanDuration(plan, batches.batches)
226
+ : plan.estimatedDuration,
227
+ updatedAt: new Date(),
228
+ };
229
+ }
230
+ }
231
+ // ============================================================================
232
+ // Singleton Instance
233
+ // ============================================================================
234
+ let generatorInstance = null;
235
+ /**
236
+ * Get the singleton PlanGenerator instance
237
+ */
238
+ export function getPlanGenerator() {
239
+ if (!generatorInstance) {
240
+ generatorInstance = new PlanGenerator();
241
+ }
242
+ return generatorInstance;
243
+ }
244
+ //# sourceMappingURL=plan-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-generator.js","sourceRoot":"","sources":["../../src/planner/plan-generator.ts"],"names":[],"mappings":"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"}