@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,493 @@
1
+ /**
2
+ * Task Planner
3
+ *
4
+ * Main orchestrator for multi-phase task planning and execution.
5
+ * Coordinates plan generation, storage, and phase execution.
6
+ */
7
+ import { EventEmitter } from "events";
8
+ import { PhaseStatus, PlanStatus, createDefaultExecutionOptions, createDefaultPlannerOptions, } from "./types.js";
9
+ import { getPlanStorage } from "./plan-storage.js";
10
+ import { getPlanGenerator } from "./plan-generator.js";
11
+ import { getDependencyResolver, } from "./dependency-resolver.js";
12
+ import { getTokenEstimator } from "./token-estimator.js";
13
+ // ============================================================================
14
+ // Task Planner Class
15
+ // ============================================================================
16
+ export class TaskPlanner extends EventEmitter {
17
+ options;
18
+ storage;
19
+ generator;
20
+ resolver;
21
+ estimator;
22
+ currentPlan = null;
23
+ isPaused = false;
24
+ isExecuting = false;
25
+ constructor(options) {
26
+ super();
27
+ this.options = {
28
+ ...createDefaultPlannerOptions(),
29
+ ...options,
30
+ };
31
+ this.storage = getPlanStorage();
32
+ this.generator = getPlanGenerator();
33
+ this.resolver = getDependencyResolver();
34
+ this.estimator = getTokenEstimator();
35
+ }
36
+ // ============================================================================
37
+ // Plan Generation
38
+ // ============================================================================
39
+ /**
40
+ * Check if a request should trigger multi-phase planning
41
+ */
42
+ shouldCreatePlan(request) {
43
+ return this.generator.shouldCreatePlan(request);
44
+ }
45
+ /**
46
+ * Generate a plan from user request using LLM
47
+ *
48
+ * @param request - User's request
49
+ * @param llmCaller - Function to call LLM with prompts
50
+ * @param context - Additional context
51
+ */
52
+ async generatePlan(request, llmCaller, context) {
53
+ // Check if simple request
54
+ if (!this.shouldCreatePlan(request)) {
55
+ const plan = this.generator.createSimplePlan(request);
56
+ this.currentPlan = plan;
57
+ await this.storage.savePlan(plan);
58
+ this.emit("plan:created", plan);
59
+ return plan;
60
+ }
61
+ // Generate complex plan using LLM
62
+ const systemPrompt = this.generator.getSystemPrompt();
63
+ const userPrompt = this.generator.buildUserPrompt(request, context);
64
+ try {
65
+ const llmResponse = await llmCaller(systemPrompt, userPrompt);
66
+ const plan = this.generator.generateFromLLMResponse(request, llmResponse, context);
67
+ if (!plan) {
68
+ // Fallback to simple plan
69
+ const simplePlan = this.generator.createSimplePlan(request);
70
+ this.currentPlan = simplePlan;
71
+ await this.storage.savePlan(simplePlan);
72
+ this.emit("plan:created", simplePlan);
73
+ return simplePlan;
74
+ }
75
+ this.currentPlan = plan;
76
+ await this.storage.savePlan(plan);
77
+ this.emit("plan:created", plan);
78
+ return plan;
79
+ }
80
+ catch (error) {
81
+ console.error("Failed to generate plan:", error);
82
+ return null;
83
+ }
84
+ }
85
+ /**
86
+ * Create a plan directly (without LLM, for testing or manual creation)
87
+ */
88
+ async createPlan(plan) {
89
+ this.currentPlan = plan;
90
+ await this.storage.savePlan(plan);
91
+ this.emit("plan:created", plan);
92
+ return plan;
93
+ }
94
+ // ============================================================================
95
+ // Plan Execution
96
+ // ============================================================================
97
+ /**
98
+ * Execute a plan
99
+ *
100
+ * @param plan - Plan to execute
101
+ * @param phaseExecutor - Function to execute a single phase
102
+ * @param options - Execution options
103
+ */
104
+ async executePlan(plan, phaseExecutor, options) {
105
+ const execOptions = {
106
+ ...createDefaultExecutionOptions(),
107
+ ...this.options.defaultExecutionOptions,
108
+ ...options,
109
+ };
110
+ this.currentPlan = plan;
111
+ this.isExecuting = true;
112
+ this.isPaused = false;
113
+ const startTime = Date.now();
114
+ const phaseResults = [];
115
+ const completedPhaseIds = new Set();
116
+ const warnings = [];
117
+ // Update plan status
118
+ plan.status = PlanStatus.EXECUTING;
119
+ plan.updatedAt = new Date();
120
+ await this.storage.savePlan(plan);
121
+ this.emit("plan:started", plan);
122
+ // Resolve dependencies into execution batches
123
+ const resolution = this.resolver.resolve(plan.phases);
124
+ if (!resolution.isValid) {
125
+ plan.status = PlanStatus.FAILED;
126
+ await this.storage.savePlan(plan);
127
+ const error = new Error(resolution.error || "Invalid dependency graph");
128
+ this.emit("plan:failed", plan, error);
129
+ throw error;
130
+ }
131
+ try {
132
+ // Execute batches in order
133
+ for (const batch of resolution.batches) {
134
+ if (this.isPaused) {
135
+ plan.status = PlanStatus.PAUSED;
136
+ await this.storage.saveState(plan, "paused");
137
+ this.emit("plan:paused", plan);
138
+ break;
139
+ }
140
+ this.emit("batch:started", plan, batch);
141
+ const batchResults = await this.executeBatch(plan, batch, phaseExecutor, completedPhaseIds, execOptions);
142
+ phaseResults.push(...batchResults);
143
+ // Update completed phases
144
+ for (const result of batchResults) {
145
+ if (result.success) {
146
+ completedPhaseIds.add(result.phaseId);
147
+ }
148
+ }
149
+ // Check for failures
150
+ const failedResults = batchResults.filter((r) => !r.success);
151
+ if (failedResults.length > 0) {
152
+ // Check fallback strategies
153
+ for (const failed of failedResults) {
154
+ const phase = plan.phases.find((p) => p.id === failed.phaseId);
155
+ if (phase?.fallbackStrategy === "abort") {
156
+ throw new Error(`Phase "${phase.name}" failed: ${failed.error}`);
157
+ }
158
+ if (phase?.fallbackStrategy === "skip") {
159
+ warnings.push(`Skipped phase "${phase.name}" due to failure`);
160
+ }
161
+ }
162
+ }
163
+ this.emit("batch:completed", plan, batch);
164
+ }
165
+ // Calculate final stats
166
+ const totalDuration = Date.now() - startTime;
167
+ const totalTokensUsed = phaseResults.reduce((sum, r) => sum + r.tokensUsed, 0);
168
+ // Update plan
169
+ plan.status = this.isPaused ? PlanStatus.PAUSED : PlanStatus.COMPLETED;
170
+ plan.actualDuration = totalDuration;
171
+ plan.totalTokensUsed = totalTokensUsed;
172
+ plan.phasesCompleted = phaseResults.filter((r) => r.success).length;
173
+ plan.phasesFailed = phaseResults.filter((r) => !r.success).length;
174
+ plan.updatedAt = new Date();
175
+ await this.storage.savePlan(plan);
176
+ const result = {
177
+ planId: plan.id,
178
+ success: plan.phasesFailed === 0,
179
+ phaseResults,
180
+ totalDuration,
181
+ totalTokensUsed,
182
+ summary: this.generateSummary(plan, phaseResults),
183
+ warnings,
184
+ };
185
+ this.emit("plan:completed", plan, result);
186
+ return result;
187
+ }
188
+ catch (error) {
189
+ plan.status = PlanStatus.FAILED;
190
+ plan.updatedAt = new Date();
191
+ await this.storage.savePlan(plan);
192
+ const err = error instanceof Error ? error : new Error(String(error));
193
+ this.emit("plan:failed", plan, err);
194
+ throw err;
195
+ }
196
+ finally {
197
+ this.isExecuting = false;
198
+ }
199
+ }
200
+ /**
201
+ * Execute a batch of phases
202
+ */
203
+ async executeBatch(plan, batch, phaseExecutor, completedPhaseIds, options) {
204
+ const context = {
205
+ planId: plan.id,
206
+ originalRequest: plan.originalPrompt,
207
+ completedPhases: Array.from(completedPhaseIds),
208
+ };
209
+ if (batch.canRunInParallel && batch.phases.length > 1) {
210
+ // Execute in parallel
211
+ const promises = batch.phases.map((phase) => this.executePhase(plan, phase, phaseExecutor, context, options));
212
+ return Promise.all(promises);
213
+ }
214
+ else {
215
+ // Execute sequentially
216
+ const results = [];
217
+ for (const phase of batch.phases) {
218
+ if (this.isPaused)
219
+ break;
220
+ const result = await this.executePhase(plan, phase, phaseExecutor, context, options);
221
+ results.push(result);
222
+ // Update context with completed phase
223
+ if (result.success) {
224
+ context.completedPhases.push(phase.id);
225
+ }
226
+ }
227
+ return results;
228
+ }
229
+ }
230
+ /**
231
+ * Execute a single phase
232
+ */
233
+ async executePhase(plan, phase, phaseExecutor, context, options) {
234
+ // Check for approval
235
+ if (phase.requiresApproval && !options.autoApprove) {
236
+ const shouldAutoApprove = options.autoApproveLowRisk && phase.riskLevel === "low";
237
+ if (!shouldAutoApprove) {
238
+ this.emit("phase:approval-required", plan, phase);
239
+ if (options.onApprovalRequest) {
240
+ const approved = await options.onApprovalRequest(phase);
241
+ if (!approved) {
242
+ phase.status = PhaseStatus.SKIPPED;
243
+ plan.phasesSkipped++;
244
+ this.emit("phase:skipped", plan, phase);
245
+ return {
246
+ phaseId: phase.id,
247
+ success: false,
248
+ error: "User declined approval",
249
+ duration: 0,
250
+ tokensUsed: 0,
251
+ filesModified: [],
252
+ wasRetry: false,
253
+ retryAttempt: 0,
254
+ };
255
+ }
256
+ }
257
+ }
258
+ phase.status = PhaseStatus.APPROVED;
259
+ }
260
+ // Update phase status
261
+ phase.status = PhaseStatus.EXECUTING;
262
+ phase.startedAt = new Date();
263
+ plan.currentPhaseIndex = phase.index;
264
+ await this.storage.savePlan(plan);
265
+ options.onPhaseStart?.(phase);
266
+ this.emit("phase:started", plan, phase);
267
+ const startTime = Date.now();
268
+ try {
269
+ // Execute with retry support
270
+ let result;
271
+ let attempt = 0;
272
+ while (attempt <= phase.maxRetries) {
273
+ try {
274
+ result = await phaseExecutor(phase, context);
275
+ result.wasRetry = attempt > 0;
276
+ result.retryAttempt = attempt;
277
+ if (result.success) {
278
+ break;
279
+ }
280
+ // Check if should retry
281
+ if (phase.fallbackStrategy === "retry" &&
282
+ attempt < phase.maxRetries) {
283
+ attempt++;
284
+ phase.retryCount = attempt;
285
+ continue;
286
+ }
287
+ break;
288
+ }
289
+ catch (error) {
290
+ if (attempt < phase.maxRetries) {
291
+ attempt++;
292
+ phase.retryCount = attempt;
293
+ continue;
294
+ }
295
+ throw error;
296
+ }
297
+ }
298
+ // Ensure result was assigned (defensive check)
299
+ if (!result) {
300
+ throw new Error("Phase execution failed: no result returned");
301
+ }
302
+ // Update phase
303
+ phase.completedAt = new Date();
304
+ phase.duration = Date.now() - startTime;
305
+ phase.status = result.success
306
+ ? PhaseStatus.COMPLETED
307
+ : PhaseStatus.FAILED;
308
+ phase.output = result.output;
309
+ phase.error = result.error;
310
+ phase.tokensUsed = result.tokensUsed;
311
+ phase.filesModified = result.filesModified;
312
+ await this.storage.savePlan(plan);
313
+ if (result.success) {
314
+ plan.phasesCompleted++;
315
+ options.onPhaseComplete?.(phase, result);
316
+ this.emit("phase:completed", plan, phase, result);
317
+ }
318
+ else {
319
+ plan.phasesFailed++;
320
+ options.onPhaseFailed?.(phase, new Error(result.error || "Unknown error"));
321
+ this.emit("phase:failed", plan, phase, new Error(result.error));
322
+ }
323
+ return result;
324
+ }
325
+ catch (error) {
326
+ phase.completedAt = new Date();
327
+ phase.duration = Date.now() - startTime;
328
+ phase.status = PhaseStatus.FAILED;
329
+ phase.error = error instanceof Error ? error.message : String(error);
330
+ plan.phasesFailed++;
331
+ await this.storage.savePlan(plan);
332
+ const err = error instanceof Error ? error : new Error(String(error));
333
+ options.onPhaseFailed?.(phase, err);
334
+ this.emit("phase:failed", plan, phase, err);
335
+ return {
336
+ phaseId: phase.id,
337
+ success: false,
338
+ error: phase.error,
339
+ duration: phase.duration,
340
+ tokensUsed: 0,
341
+ filesModified: [],
342
+ wasRetry: phase.retryCount > 0,
343
+ retryAttempt: phase.retryCount,
344
+ };
345
+ }
346
+ }
347
+ /**
348
+ * Generate summary from results
349
+ */
350
+ generateSummary(plan, results) {
351
+ const completed = results.filter((r) => r.success).length;
352
+ const failed = results.filter((r) => !r.success).length;
353
+ const total = results.length;
354
+ let summary = `Plan "${plan.id}" completed: ${completed}/${total} phases succeeded`;
355
+ if (failed > 0) {
356
+ summary += `, ${failed} failed`;
357
+ }
358
+ const totalTokens = results.reduce((sum, r) => sum + r.tokensUsed, 0);
359
+ summary += `. Total tokens: ${this.estimator.formatEstimate(totalTokens)}`;
360
+ return summary;
361
+ }
362
+ // ============================================================================
363
+ // Plan Control
364
+ // ============================================================================
365
+ /**
366
+ * Pause plan execution
367
+ */
368
+ async pausePlan() {
369
+ if (!this.isExecuting)
370
+ return;
371
+ this.isPaused = true;
372
+ if (this.currentPlan) {
373
+ this.currentPlan.status = PlanStatus.PAUSED;
374
+ await this.storage.saveState(this.currentPlan, "paused");
375
+ }
376
+ }
377
+ /**
378
+ * Resume a paused plan
379
+ */
380
+ async resumePlan(planId, phaseExecutor, options) {
381
+ const state = await this.storage.loadState(planId);
382
+ if (!state)
383
+ return null;
384
+ const plan = state.plan;
385
+ if (plan.status !== PlanStatus.PAUSED) {
386
+ throw new Error(`Plan ${planId} is not paused (status: ${plan.status})`);
387
+ }
388
+ // Reset paused status
389
+ plan.status = PlanStatus.EXECUTING;
390
+ return this.executePlan(plan, phaseExecutor, options);
391
+ }
392
+ /**
393
+ * Skip a specific phase
394
+ */
395
+ async skipPhase(planId, phaseId) {
396
+ const plan = await this.storage.loadPlan(planId);
397
+ if (!plan)
398
+ return false;
399
+ const phase = plan.phases.find((p) => p.id === phaseId);
400
+ if (!phase)
401
+ return false;
402
+ if (phase.status !== PhaseStatus.PENDING) {
403
+ return false;
404
+ }
405
+ phase.status = PhaseStatus.SKIPPED;
406
+ plan.phasesSkipped++;
407
+ plan.updatedAt = new Date();
408
+ await this.storage.savePlan(plan);
409
+ return true;
410
+ }
411
+ /**
412
+ * Abandon a plan
413
+ */
414
+ async abandonPlan(planId) {
415
+ const plan = await this.storage.loadPlan(planId);
416
+ if (!plan)
417
+ return false;
418
+ plan.status = PlanStatus.ABANDONED;
419
+ plan.updatedAt = new Date();
420
+ await this.storage.savePlan(plan);
421
+ if (this.currentPlan?.id === planId) {
422
+ this.currentPlan = null;
423
+ this.isPaused = true;
424
+ }
425
+ return true;
426
+ }
427
+ // ============================================================================
428
+ // Plan Queries
429
+ // ============================================================================
430
+ /**
431
+ * Get current plan
432
+ */
433
+ getCurrentPlan() {
434
+ return this.currentPlan;
435
+ }
436
+ /**
437
+ * Load a plan from storage
438
+ */
439
+ async loadPlan(planId) {
440
+ return this.storage.loadPlan(planId);
441
+ }
442
+ /**
443
+ * List all plans
444
+ */
445
+ async listPlans() {
446
+ return this.storage.listPlans();
447
+ }
448
+ /**
449
+ * List resumable plans
450
+ */
451
+ async listResumablePlans() {
452
+ return this.storage.listResumablePlans();
453
+ }
454
+ /**
455
+ * Get execution batches for a plan
456
+ */
457
+ getExecutionBatches(plan) {
458
+ const result = this.resolver.resolve(plan.phases);
459
+ return result.isValid ? result.batches : [];
460
+ }
461
+ /**
462
+ * Check if currently executing
463
+ */
464
+ isCurrentlyExecuting() {
465
+ return this.isExecuting;
466
+ }
467
+ /**
468
+ * Check if paused
469
+ */
470
+ isCurrentlyPaused() {
471
+ return this.isPaused;
472
+ }
473
+ }
474
+ // ============================================================================
475
+ // Singleton Instance
476
+ // ============================================================================
477
+ let plannerInstance = null;
478
+ /**
479
+ * Get the singleton TaskPlanner instance
480
+ */
481
+ export function getTaskPlanner() {
482
+ if (!plannerInstance) {
483
+ plannerInstance = new TaskPlanner();
484
+ }
485
+ return plannerInstance;
486
+ }
487
+ /**
488
+ * Reset the singleton (for testing)
489
+ */
490
+ export function resetTaskPlanner() {
491
+ plannerInstance = null;
492
+ }
493
+ //# sourceMappingURL=task-planner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-planner.js","sourceRoot":"","sources":["../../src/planner/task-planner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Token Estimator
3
+ *
4
+ * Estimates token usage for phases and plans.
5
+ * Uses heuristics based on objectives and tools.
6
+ */
7
+ import { TaskPhase, TaskPlan } from "./types.js";
8
+ import { ExecutionBatch } from "./dependency-resolver.js";
9
+ export declare class TokenEstimator {
10
+ private baseTokensPerPhase;
11
+ private tokensPerObjective;
12
+ constructor(options?: {
13
+ baseTokensPerPhase?: number;
14
+ tokensPerObjective?: number;
15
+ });
16
+ /**
17
+ * Estimate tokens for a single phase
18
+ */
19
+ estimatePhase(phase: TaskPhase): number;
20
+ /**
21
+ * Estimate tokens for an entire plan
22
+ */
23
+ estimatePlan(plan: TaskPlan): number;
24
+ /**
25
+ * Estimate tokens for an execution batch
26
+ */
27
+ estimateBatch(batch: ExecutionBatch): number;
28
+ /**
29
+ * Estimate duration for a phase (in milliseconds)
30
+ */
31
+ estimatePhaseDuration(phase: TaskPhase): number;
32
+ /**
33
+ * Estimate total duration for a plan
34
+ */
35
+ estimatePlanDuration(_plan: TaskPlan, batches: ExecutionBatch[]): number;
36
+ /**
37
+ * Check if a plan will fit within context limits
38
+ */
39
+ willFitInContext(plan: TaskPlan, contextLimit: number): {
40
+ fits: boolean;
41
+ estimatedTokens: number;
42
+ remainingTokens: number;
43
+ };
44
+ /**
45
+ * Suggest phase splits if plan is too large
46
+ */
47
+ suggestSplits(plan: TaskPlan, contextLimit: number): {
48
+ shouldSplit: boolean;
49
+ suggestions: string[];
50
+ };
51
+ /**
52
+ * Format token estimate for display
53
+ */
54
+ formatEstimate(tokens: number): string;
55
+ /**
56
+ * Format duration for display
57
+ */
58
+ formatDuration(durationMs: number): string;
59
+ }
60
+ /**
61
+ * Get the singleton TokenEstimator instance
62
+ */
63
+ export declare function getTokenEstimator(): TokenEstimator;