@specforge/mcp 2.6.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +73 -0
- package/bin/{specforge-mcp → specforge} +0 -5
- package/dist/ai-provider/circuit-breaker.d.ts +63 -0
- package/dist/ai-provider/circuit-breaker.d.ts.map +1 -0
- package/dist/ai-provider/circuit-breaker.js +160 -0
- package/dist/ai-provider/circuit-breaker.js.map +1 -0
- package/dist/ai-provider/cli-version.d.ts +50 -0
- package/dist/ai-provider/cli-version.d.ts.map +1 -0
- package/dist/ai-provider/cli-version.js +141 -0
- package/dist/ai-provider/cli-version.js.map +1 -0
- package/dist/ai-provider/config-loader.d.ts +45 -0
- package/dist/ai-provider/config-loader.d.ts.map +1 -0
- package/dist/ai-provider/config-loader.js +106 -0
- package/dist/ai-provider/config-loader.js.map +1 -0
- package/dist/ai-provider/errors.d.ts +48 -0
- package/dist/ai-provider/errors.d.ts.map +1 -0
- package/dist/ai-provider/errors.js +102 -0
- package/dist/ai-provider/errors.js.map +1 -0
- package/dist/ai-provider/events.d.ts +73 -0
- package/dist/ai-provider/events.d.ts.map +1 -0
- package/dist/ai-provider/events.js +75 -0
- package/dist/ai-provider/events.js.map +1 -0
- package/dist/ai-provider/factory.d.ts +31 -0
- package/dist/ai-provider/factory.d.ts.map +1 -0
- package/dist/ai-provider/factory.js +100 -0
- package/dist/ai-provider/factory.js.map +1 -0
- package/dist/ai-provider/index.d.ts +24 -0
- package/dist/ai-provider/index.d.ts.map +1 -0
- package/dist/ai-provider/index.js +46 -0
- package/dist/ai-provider/index.js.map +1 -0
- package/dist/ai-provider/instance-coordinator.d.ts +54 -0
- package/dist/ai-provider/instance-coordinator.d.ts.map +1 -0
- package/dist/ai-provider/instance-coordinator.js +199 -0
- package/dist/ai-provider/instance-coordinator.js.map +1 -0
- package/dist/ai-provider/jsonl-parser.d.ts +43 -0
- package/dist/ai-provider/jsonl-parser.d.ts.map +1 -0
- package/dist/ai-provider/jsonl-parser.js +107 -0
- package/dist/ai-provider/jsonl-parser.js.map +1 -0
- package/dist/ai-provider/lifecycle.d.ts +50 -0
- package/dist/ai-provider/lifecycle.d.ts.map +1 -0
- package/dist/ai-provider/lifecycle.js +145 -0
- package/dist/ai-provider/lifecycle.js.map +1 -0
- package/dist/ai-provider/logger.d.ts +69 -0
- package/dist/ai-provider/logger.d.ts.map +1 -0
- package/dist/ai-provider/logger.js +161 -0
- package/dist/ai-provider/logger.js.map +1 -0
- package/dist/ai-provider/metrics.d.ts +91 -0
- package/dist/ai-provider/metrics.d.ts.map +1 -0
- package/dist/ai-provider/metrics.js +187 -0
- package/dist/ai-provider/metrics.js.map +1 -0
- package/dist/ai-provider/process-manager.d.ts +97 -0
- package/dist/ai-provider/process-manager.d.ts.map +1 -0
- package/dist/ai-provider/process-manager.js +477 -0
- package/dist/ai-provider/process-manager.js.map +1 -0
- package/dist/ai-provider/providers/claude-code.d.ts +64 -0
- package/dist/ai-provider/providers/claude-code.d.ts.map +1 -0
- package/dist/ai-provider/providers/claude-code.js +205 -0
- package/dist/ai-provider/providers/claude-code.js.map +1 -0
- package/dist/ai-provider/retry-executor.d.ts +52 -0
- package/dist/ai-provider/retry-executor.d.ts.map +1 -0
- package/dist/ai-provider/retry-executor.js +138 -0
- package/dist/ai-provider/retry-executor.js.map +1 -0
- package/dist/ai-provider/safe-args.d.ts +58 -0
- package/dist/ai-provider/safe-args.d.ts.map +1 -0
- package/dist/ai-provider/safe-args.js +176 -0
- package/dist/ai-provider/safe-args.js.map +1 -0
- package/dist/ai-provider/semaphore.d.ts +50 -0
- package/dist/ai-provider/semaphore.d.ts.map +1 -0
- package/dist/ai-provider/semaphore.js +97 -0
- package/dist/ai-provider/semaphore.js.map +1 -0
- package/dist/ai-provider/tracer.d.ts +67 -0
- package/dist/ai-provider/tracer.d.ts.map +1 -0
- package/dist/ai-provider/tracer.js +209 -0
- package/dist/ai-provider/tracer.js.map +1 -0
- package/dist/ai-provider/types.d.ts +181 -0
- package/dist/ai-provider/types.d.ts.map +1 -0
- package/dist/ai-provider/types.js +8 -0
- package/dist/ai-provider/types.js.map +1 -0
- package/dist/autopilot/agents/agent-runner.d.ts +109 -0
- package/dist/autopilot/agents/agent-runner.d.ts.map +1 -0
- package/dist/autopilot/agents/agent-runner.js +731 -0
- package/dist/autopilot/agents/agent-runner.js.map +1 -0
- package/dist/autopilot/agents/agent-selector.d.ts +59 -0
- package/dist/autopilot/agents/agent-selector.d.ts.map +1 -0
- package/dist/autopilot/agents/agent-selector.js +234 -0
- package/dist/autopilot/agents/agent-selector.js.map +1 -0
- package/dist/autopilot/agents/model-selector.d.ts +49 -0
- package/dist/autopilot/agents/model-selector.d.ts.map +1 -0
- package/dist/autopilot/agents/model-selector.js +62 -0
- package/dist/autopilot/agents/model-selector.js.map +1 -0
- package/dist/autopilot/agents/profiles/builtin.d.ts +55 -0
- package/dist/autopilot/agents/profiles/builtin.d.ts.map +1 -0
- package/dist/autopilot/agents/profiles/builtin.js +323 -0
- package/dist/autopilot/agents/profiles/builtin.js.map +1 -0
- package/dist/autopilot/agents/profiles/types.d.ts +98 -0
- package/dist/autopilot/agents/profiles/types.d.ts.map +1 -0
- package/dist/autopilot/agents/profiles/types.js +17 -0
- package/dist/autopilot/agents/profiles/types.js.map +1 -0
- package/dist/autopilot/api/autopilot-api-client.d.ts +217 -0
- package/dist/autopilot/api/autopilot-api-client.d.ts.map +1 -0
- package/dist/autopilot/api/autopilot-api-client.js +402 -0
- package/dist/autopilot/api/autopilot-api-client.js.map +1 -0
- package/dist/autopilot/cli/abort.d.ts +20 -0
- package/dist/autopilot/cli/abort.d.ts.map +1 -0
- package/dist/autopilot/cli/abort.js +201 -0
- package/dist/autopilot/cli/abort.js.map +1 -0
- package/dist/autopilot/cli/display.d.ts +63 -0
- package/dist/autopilot/cli/display.d.ts.map +1 -0
- package/dist/autopilot/cli/display.js +260 -0
- package/dist/autopilot/cli/display.js.map +1 -0
- package/dist/autopilot/cli/index.d.ts +24 -0
- package/dist/autopilot/cli/index.d.ts.map +1 -0
- package/dist/autopilot/cli/index.js +79 -0
- package/dist/autopilot/cli/index.js.map +1 -0
- package/dist/autopilot/cli/pause.d.ts +18 -0
- package/dist/autopilot/cli/pause.d.ts.map +1 -0
- package/dist/autopilot/cli/pause.js +110 -0
- package/dist/autopilot/cli/pause.js.map +1 -0
- package/dist/autopilot/cli/resume.d.ts +22 -0
- package/dist/autopilot/cli/resume.d.ts.map +1 -0
- package/dist/autopilot/cli/resume.js +172 -0
- package/dist/autopilot/cli/resume.js.map +1 -0
- package/dist/autopilot/cli/run.d.ts +25 -0
- package/dist/autopilot/cli/run.d.ts.map +1 -0
- package/dist/autopilot/cli/run.js +220 -0
- package/dist/autopilot/cli/run.js.map +1 -0
- package/dist/autopilot/cli/status.d.ts +20 -0
- package/dist/autopilot/cli/status.d.ts.map +1 -0
- package/dist/autopilot/cli/status.js +217 -0
- package/dist/autopilot/cli/status.js.map +1 -0
- package/dist/autopilot/config.d.ts +45 -0
- package/dist/autopilot/config.d.ts.map +1 -0
- package/dist/autopilot/config.js +269 -0
- package/dist/autopilot/config.js.map +1 -0
- package/dist/autopilot/core/dependency-resolver.d.ts +108 -0
- package/dist/autopilot/core/dependency-resolver.d.ts.map +1 -0
- package/dist/autopilot/core/dependency-resolver.js +394 -0
- package/dist/autopilot/core/dependency-resolver.js.map +1 -0
- package/dist/autopilot/core/dispatcher.d.ts +215 -0
- package/dist/autopilot/core/dispatcher.d.ts.map +1 -0
- package/dist/autopilot/core/dispatcher.js +594 -0
- package/dist/autopilot/core/dispatcher.js.map +1 -0
- package/dist/autopilot/core/failure-handler.d.ts +145 -0
- package/dist/autopilot/core/failure-handler.d.ts.map +1 -0
- package/dist/autopilot/core/failure-handler.js +308 -0
- package/dist/autopilot/core/failure-handler.js.map +1 -0
- package/dist/autopilot/core/rate-limit-handler.d.ts +108 -0
- package/dist/autopilot/core/rate-limit-handler.d.ts.map +1 -0
- package/dist/autopilot/core/rate-limit-handler.js +195 -0
- package/dist/autopilot/core/rate-limit-handler.js.map +1 -0
- package/dist/autopilot/core/state-manager.d.ts +160 -0
- package/dist/autopilot/core/state-manager.d.ts.map +1 -0
- package/dist/autopilot/core/state-manager.js +393 -0
- package/dist/autopilot/core/state-manager.js.map +1 -0
- package/dist/autopilot/core/timeout-manager.d.ts +95 -0
- package/dist/autopilot/core/timeout-manager.d.ts.map +1 -0
- package/dist/autopilot/core/timeout-manager.js +188 -0
- package/dist/autopilot/core/timeout-manager.js.map +1 -0
- package/dist/autopilot/git/branch-manager.d.ts +117 -0
- package/dist/autopilot/git/branch-manager.d.ts.map +1 -0
- package/dist/autopilot/git/branch-manager.js +238 -0
- package/dist/autopilot/git/branch-manager.js.map +1 -0
- package/dist/autopilot/git/index.d.ts +9 -0
- package/dist/autopilot/git/index.d.ts.map +1 -0
- package/dist/autopilot/git/index.js +9 -0
- package/dist/autopilot/git/index.js.map +1 -0
- package/dist/autopilot/git/merge-manager.d.ts +118 -0
- package/dist/autopilot/git/merge-manager.d.ts.map +1 -0
- package/dist/autopilot/git/merge-manager.js +304 -0
- package/dist/autopilot/git/merge-manager.js.map +1 -0
- package/dist/autopilot/git/worktree-manager.d.ts +128 -0
- package/dist/autopilot/git/worktree-manager.d.ts.map +1 -0
- package/dist/autopilot/git/worktree-manager.js +298 -0
- package/dist/autopilot/git/worktree-manager.js.map +1 -0
- package/dist/autopilot/index.d.ts +30 -0
- package/dist/autopilot/index.d.ts.map +1 -0
- package/dist/autopilot/index.js +55 -0
- package/dist/autopilot/index.js.map +1 -0
- package/dist/autopilot/sync/index.d.ts +7 -0
- package/dist/autopilot/sync/index.d.ts.map +1 -0
- package/dist/autopilot/sync/index.js +7 -0
- package/dist/autopilot/sync/index.js.map +1 -0
- package/dist/autopilot/sync/sync-manager.d.ts +168 -0
- package/dist/autopilot/sync/sync-manager.d.ts.map +1 -0
- package/dist/autopilot/sync/sync-manager.js +303 -0
- package/dist/autopilot/sync/sync-manager.js.map +1 -0
- package/dist/autopilot/types.d.ts +454 -0
- package/dist/autopilot/types.d.ts.map +1 -0
- package/dist/autopilot/types.js +26 -0
- package/dist/autopilot/types.js.map +1 -0
- package/dist/autopilot/utils/audit-logger.d.ts +176 -0
- package/dist/autopilot/utils/audit-logger.d.ts.map +1 -0
- package/dist/autopilot/utils/audit-logger.js +308 -0
- package/dist/autopilot/utils/audit-logger.js.map +1 -0
- package/dist/autopilot/utils/cost-tracker.d.ts +162 -0
- package/dist/autopilot/utils/cost-tracker.d.ts.map +1 -0
- package/dist/autopilot/utils/cost-tracker.js +269 -0
- package/dist/autopilot/utils/cost-tracker.js.map +1 -0
- package/dist/autopilot/utils/index.d.ts +9 -0
- package/dist/autopilot/utils/index.d.ts.map +1 -0
- package/dist/autopilot/utils/index.js +9 -0
- package/dist/autopilot/utils/index.js.map +1 -0
- package/dist/autopilot/utils/progress-reporter.d.ts +132 -0
- package/dist/autopilot/utils/progress-reporter.d.ts.map +1 -0
- package/dist/autopilot/utils/progress-reporter.js +290 -0
- package/dist/autopilot/utils/progress-reporter.js.map +1 -0
- package/dist/autopilot/worker/worker-pool.d.ts +179 -0
- package/dist/autopilot/worker/worker-pool.d.ts.map +1 -0
- package/dist/autopilot/worker/worker-pool.js +331 -0
- package/dist/autopilot/worker/worker-pool.js.map +1 -0
- package/dist/autopilot/worker/worker-session.d.ts +171 -0
- package/dist/autopilot/worker/worker-session.d.ts.map +1 -0
- package/dist/autopilot/worker/worker-session.js +295 -0
- package/dist/autopilot/worker/worker-session.js.map +1 -0
- package/dist/cli/index.d.ts +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +4 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/index.js +0 -1
- package/dist/index.js.map +1 -1
- package/dist/tools/core/epic.js +1 -1
- package/dist/tools/core/epic.js.map +1 -1
- package/dist/tools/core/lookup.d.ts.map +1 -1
- package/dist/tools/core/lookup.js +3 -2
- package/dist/tools/core/lookup.js.map +1 -1
- package/dist/tools/core/specification.js +1 -1
- package/dist/tools/core/specification.js.map +1 -1
- package/dist/tools/core/ticket.d.ts.map +1 -1
- package/dist/tools/core/ticket.js +4 -6
- package/dist/tools/core/ticket.js.map +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +60 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/validation/index.d.ts.map +1 -1
- package/dist/validation/index.js +4 -1
- package/dist/validation/index.js.map +1 -1
- package/package.json +8 -4
|
@@ -0,0 +1,402 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Autopilot API Client
|
|
3
|
+
*
|
|
4
|
+
* Extended API client for autopilot-specific operations.
|
|
5
|
+
*/
|
|
6
|
+
import { ApiClient } from '../../client/api-client.js';
|
|
7
|
+
/**
|
|
8
|
+
* Extended API client for autopilot operations
|
|
9
|
+
*/
|
|
10
|
+
export class AutopilotApiClient {
|
|
11
|
+
client;
|
|
12
|
+
constructor(config) {
|
|
13
|
+
this.client = new ApiClient(config);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Get specification by ID
|
|
17
|
+
*/
|
|
18
|
+
async getSpecification(specificationId) {
|
|
19
|
+
try {
|
|
20
|
+
const result = await this.client.call('get_specification', { specificationId });
|
|
21
|
+
return result.specification;
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
console.error('Failed to get specification:', error);
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Get all epics for a specification
|
|
30
|
+
*/
|
|
31
|
+
async getEpics(specificationId) {
|
|
32
|
+
try {
|
|
33
|
+
const result = await this.client.call('list_epics', { specificationId });
|
|
34
|
+
return result.items;
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
console.error('Failed to list epics:', error);
|
|
38
|
+
return [];
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Get all tickets for an epic
|
|
43
|
+
*/
|
|
44
|
+
async getTickets(epicId) {
|
|
45
|
+
try {
|
|
46
|
+
const result = await this.client.call('list_tickets', { epicId });
|
|
47
|
+
return result.items;
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
console.error('Failed to list tickets:', error);
|
|
51
|
+
return [];
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Get ticket by ID
|
|
56
|
+
*/
|
|
57
|
+
async getTicket(ticketId) {
|
|
58
|
+
try {
|
|
59
|
+
const result = await this.client.call('get_ticket', { ticketId });
|
|
60
|
+
return result.ticket;
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
console.error('Failed to get ticket:', error);
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Get ticket dependencies
|
|
69
|
+
*/
|
|
70
|
+
async getTicketDependencies(ticketId) {
|
|
71
|
+
try {
|
|
72
|
+
const result = await this.client.call('get_ticket_dependencies', { ticketId });
|
|
73
|
+
return {
|
|
74
|
+
blockedBy: result.blockedBy || [],
|
|
75
|
+
blocks: result.blocks || [],
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
console.error('Failed to get ticket dependencies:', error);
|
|
80
|
+
return { blockedBy: [], blocks: [] };
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Get full implementation context for a ticket
|
|
85
|
+
*/
|
|
86
|
+
async getImplementationContext(ticketId) {
|
|
87
|
+
try {
|
|
88
|
+
const result = await this.client.call('get_implementation_context', { ticketId });
|
|
89
|
+
return result;
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
console.error('Failed to get implementation context:', error);
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Get ticket context for implementation
|
|
98
|
+
*/
|
|
99
|
+
async getTicketContext(ticketId) {
|
|
100
|
+
const context = await this.getImplementationContext(ticketId);
|
|
101
|
+
if (!context)
|
|
102
|
+
return null;
|
|
103
|
+
return {
|
|
104
|
+
ticket: context.ticket,
|
|
105
|
+
epic: context.epic,
|
|
106
|
+
specification: context.specification,
|
|
107
|
+
dependencies: {
|
|
108
|
+
blockedBy: context.dependencies.blockedBy.map(d => ({
|
|
109
|
+
id: d.id,
|
|
110
|
+
title: d.title,
|
|
111
|
+
status: d.status,
|
|
112
|
+
})),
|
|
113
|
+
blocks: context.dependencies.blocks.map(d => ({
|
|
114
|
+
id: d.id,
|
|
115
|
+
title: d.title,
|
|
116
|
+
status: d.status,
|
|
117
|
+
})),
|
|
118
|
+
},
|
|
119
|
+
patterns: context.patterns,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Update ticket status
|
|
124
|
+
*/
|
|
125
|
+
async updateTicketStatus(ticketId, status, options) {
|
|
126
|
+
try {
|
|
127
|
+
const result = await this.client.call('update_ticket', {
|
|
128
|
+
ticketId,
|
|
129
|
+
status,
|
|
130
|
+
progress: options?.progress,
|
|
131
|
+
blockReason: options?.blockReason,
|
|
132
|
+
});
|
|
133
|
+
return result.ticket;
|
|
134
|
+
}
|
|
135
|
+
catch (error) {
|
|
136
|
+
console.error('Failed to update ticket status:', error);
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Mark ticket as completed with extended autopilot data
|
|
142
|
+
*/
|
|
143
|
+
async completeTicket(ticketId, options) {
|
|
144
|
+
try {
|
|
145
|
+
const result = await this.client.call('update_ticket', {
|
|
146
|
+
ticketId,
|
|
147
|
+
status: 'done',
|
|
148
|
+
progress: 100,
|
|
149
|
+
completedAt: new Date().toISOString(),
|
|
150
|
+
actualHours: options?.actualHours,
|
|
151
|
+
testsPassed: options?.testsPassed,
|
|
152
|
+
// Extended autopilot completion fields
|
|
153
|
+
filesCreated: options?.filesCreated,
|
|
154
|
+
filesModified: options?.filesModified,
|
|
155
|
+
filesDeleted: options?.filesDeleted,
|
|
156
|
+
tokensUsed: options?.tokensUsed,
|
|
157
|
+
costUsd: options?.costUsd,
|
|
158
|
+
durationMs: options?.durationMs,
|
|
159
|
+
commitSha: options?.commitSha,
|
|
160
|
+
modelUsed: options?.modelUsed,
|
|
161
|
+
});
|
|
162
|
+
return result.ticket;
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
console.error('Failed to complete ticket:', error);
|
|
166
|
+
return null;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Mark ticket as failed/blocked
|
|
171
|
+
*/
|
|
172
|
+
async failTicket(ticketId, reason) {
|
|
173
|
+
try {
|
|
174
|
+
const result = await this.client.call('update_ticket', {
|
|
175
|
+
ticketId,
|
|
176
|
+
status: 'blocked',
|
|
177
|
+
blockReason: reason,
|
|
178
|
+
});
|
|
179
|
+
return result.ticket;
|
|
180
|
+
}
|
|
181
|
+
catch (error) {
|
|
182
|
+
console.error('Failed to mark ticket as blocked:', error);
|
|
183
|
+
return null;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Start working on a ticket (set to in_progress)
|
|
188
|
+
*/
|
|
189
|
+
async startTicket(ticketId) {
|
|
190
|
+
try {
|
|
191
|
+
const result = await this.client.call('update_ticket', {
|
|
192
|
+
ticketId,
|
|
193
|
+
status: 'in_progress',
|
|
194
|
+
progress: 0,
|
|
195
|
+
});
|
|
196
|
+
return result.ticket;
|
|
197
|
+
}
|
|
198
|
+
catch (error) {
|
|
199
|
+
console.error('Failed to start ticket:', error);
|
|
200
|
+
return null;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Record test results for a ticket
|
|
205
|
+
*/
|
|
206
|
+
async recordTestResults(ticketId, results) {
|
|
207
|
+
try {
|
|
208
|
+
await this.client.call('add_test_result', {
|
|
209
|
+
ticketId,
|
|
210
|
+
testType: results.testType,
|
|
211
|
+
passed: results.passed,
|
|
212
|
+
totalTests: results.totalTests,
|
|
213
|
+
passedTests: results.passedTests,
|
|
214
|
+
failedTests: results.failedTests,
|
|
215
|
+
skippedTests: 0,
|
|
216
|
+
errorDetails: results.errorDetails,
|
|
217
|
+
durationMs: results.durationMs,
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
catch (error) {
|
|
221
|
+
console.error('Failed to record test results:', error);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Link a commit to a ticket
|
|
226
|
+
*/
|
|
227
|
+
async linkCommit(ticketId, commit) {
|
|
228
|
+
try {
|
|
229
|
+
await this.client.call('link_ticket_artifact', {
|
|
230
|
+
ticketId,
|
|
231
|
+
linkType: 'commit',
|
|
232
|
+
url: commit.url,
|
|
233
|
+
sha: commit.sha,
|
|
234
|
+
title: commit.title,
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
catch (error) {
|
|
238
|
+
console.error('Failed to link commit:', error);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Get all tickets for a specification (across all epics)
|
|
243
|
+
*/
|
|
244
|
+
async getAllTicketsForSpec(specificationId) {
|
|
245
|
+
const epics = await this.getEpics(specificationId);
|
|
246
|
+
const allTickets = [];
|
|
247
|
+
for (const epic of epics) {
|
|
248
|
+
const tickets = await this.getTickets(epic.id);
|
|
249
|
+
allTickets.push(...tickets);
|
|
250
|
+
}
|
|
251
|
+
return allTickets;
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Get ready tickets (dependencies satisfied)
|
|
255
|
+
*/
|
|
256
|
+
async getReadyTickets(specificationId) {
|
|
257
|
+
const allTickets = await this.getAllTicketsForSpec(specificationId);
|
|
258
|
+
const readyTickets = [];
|
|
259
|
+
for (const ticket of allTickets) {
|
|
260
|
+
if (ticket.status !== 'todo' && ticket.status !== 'queue') {
|
|
261
|
+
continue;
|
|
262
|
+
}
|
|
263
|
+
const deps = await this.getTicketDependencies(ticket.id);
|
|
264
|
+
const allDepsComplete = deps.blockedBy.every(d => d.status === 'done');
|
|
265
|
+
if (allDepsComplete) {
|
|
266
|
+
readyTickets.push(ticket);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
return readyTickets;
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Sync autopilot state to API (for tracking and webapp monitoring)
|
|
273
|
+
*/
|
|
274
|
+
async syncAutopilotState(state) {
|
|
275
|
+
try {
|
|
276
|
+
await this.client.call('update_autopilot_run', {
|
|
277
|
+
runId: state.runId,
|
|
278
|
+
status: state.status,
|
|
279
|
+
completedTickets: state.completedTickets.map(t => t.ticketId),
|
|
280
|
+
failedTickets: state.failedTickets.map(t => t.ticketId),
|
|
281
|
+
skippedTickets: state.skippedTickets.map(t => t.ticketId),
|
|
282
|
+
currentEpicId: state.currentEpicId,
|
|
283
|
+
currentTicketId: state.currentTicketId,
|
|
284
|
+
activeWorkers: state.activeWorkers,
|
|
285
|
+
totalCostUsd: state.totalCostUsd,
|
|
286
|
+
totalInputTokens: state.totalInputTokens,
|
|
287
|
+
totalOutputTokens: state.totalOutputTokens,
|
|
288
|
+
pausedAt: state.pausedAt,
|
|
289
|
+
pauseReason: state.pauseReason,
|
|
290
|
+
lastError: state.lastError,
|
|
291
|
+
errorCount: state.errorCount,
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
catch (error) {
|
|
295
|
+
// Log but don't fail - sync is non-critical
|
|
296
|
+
console.warn('Failed to sync autopilot state:', error);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* Create a new autopilot run
|
|
301
|
+
*/
|
|
302
|
+
async createAutopilotRun(options) {
|
|
303
|
+
try {
|
|
304
|
+
const result = await this.client.call('create_autopilot_run', options);
|
|
305
|
+
return { runId: result.run.runId };
|
|
306
|
+
}
|
|
307
|
+
catch (error) {
|
|
308
|
+
console.error('Failed to create autopilot run:', error);
|
|
309
|
+
return null;
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Complete an autopilot run
|
|
314
|
+
*/
|
|
315
|
+
async completeAutopilotRun(options) {
|
|
316
|
+
try {
|
|
317
|
+
await this.client.call('complete_autopilot_run', options);
|
|
318
|
+
}
|
|
319
|
+
catch (error) {
|
|
320
|
+
console.error('Failed to complete autopilot run:', error);
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Create a discovery from parsed AI output
|
|
325
|
+
*/
|
|
326
|
+
async createDiscovery(discovery) {
|
|
327
|
+
try {
|
|
328
|
+
const result = await this.client.call('report_discovery', {
|
|
329
|
+
ticketId: discovery.ticketId,
|
|
330
|
+
type: discovery.type,
|
|
331
|
+
description: discovery.description,
|
|
332
|
+
title: discovery.title,
|
|
333
|
+
severity: discovery.severity,
|
|
334
|
+
});
|
|
335
|
+
return { id: result.discoveryId || result.id };
|
|
336
|
+
}
|
|
337
|
+
catch (error) {
|
|
338
|
+
console.error('Failed to create discovery:', error);
|
|
339
|
+
return null;
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
/**
|
|
343
|
+
* Create multiple discoveries from parsed AI output
|
|
344
|
+
*/
|
|
345
|
+
async createDiscoveries(ticketId, specificationId, discoveries) {
|
|
346
|
+
let created = 0;
|
|
347
|
+
let failed = 0;
|
|
348
|
+
for (const discovery of discoveries) {
|
|
349
|
+
const result = await this.createDiscovery({
|
|
350
|
+
ticketId,
|
|
351
|
+
specificationId,
|
|
352
|
+
type: discovery.type,
|
|
353
|
+
severity: discovery.severity,
|
|
354
|
+
title: discovery.title,
|
|
355
|
+
description: discovery.description,
|
|
356
|
+
});
|
|
357
|
+
if (result) {
|
|
358
|
+
created++;
|
|
359
|
+
}
|
|
360
|
+
else {
|
|
361
|
+
failed++;
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
return { created, failed };
|
|
365
|
+
}
|
|
366
|
+
/**
|
|
367
|
+
* Validate API key
|
|
368
|
+
*/
|
|
369
|
+
async validateApiKey() {
|
|
370
|
+
try {
|
|
371
|
+
const result = await this.client.validateApiKey();
|
|
372
|
+
return result.valid;
|
|
373
|
+
}
|
|
374
|
+
catch {
|
|
375
|
+
return false;
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
/**
|
|
379
|
+
* Create client from McpConfig
|
|
380
|
+
*/
|
|
381
|
+
static create(config) {
|
|
382
|
+
return new AutopilotApiClient(config);
|
|
383
|
+
}
|
|
384
|
+
/**
|
|
385
|
+
* Create from API key
|
|
386
|
+
*/
|
|
387
|
+
static fromApiKey(apiKey, options) {
|
|
388
|
+
const config = {
|
|
389
|
+
apiKey,
|
|
390
|
+
apiUrl: options?.apiUrl || 'https://mcp.specforge.com.br/mcp',
|
|
391
|
+
debug: false,
|
|
392
|
+
};
|
|
393
|
+
return new AutopilotApiClient(config);
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
/**
|
|
397
|
+
* Create an autopilot API client from config
|
|
398
|
+
*/
|
|
399
|
+
export function createAutopilotApiClient(config) {
|
|
400
|
+
return AutopilotApiClient.create(config);
|
|
401
|
+
}
|
|
402
|
+
//# sourceMappingURL=autopilot-api-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autopilot-api-client.js","sourceRoot":"","sources":["../../../src/autopilot/api/autopilot-api-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Autopilot Abort Command
|
|
3
|
+
*
|
|
4
|
+
* Aborts an autopilot session and cleans up resources.
|
|
5
|
+
*/
|
|
6
|
+
import { Command } from 'commander';
|
|
7
|
+
/**
|
|
8
|
+
* Abort command options
|
|
9
|
+
*/
|
|
10
|
+
export interface AbortOptions {
|
|
11
|
+
cleanup?: boolean;
|
|
12
|
+
keepBranches?: boolean;
|
|
13
|
+
force?: boolean;
|
|
14
|
+
json?: boolean;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Register abort command
|
|
18
|
+
*/
|
|
19
|
+
export declare function registerAbortCommand(program: Command): void;
|
|
20
|
+
//# sourceMappingURL=abort.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"abort.d.ts","sourceRoot":"","sources":["../../../src/autopilot/cli/abort.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAwLD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA0B3D"}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Autopilot Abort Command
|
|
3
|
+
*
|
|
4
|
+
* Aborts an autopilot session and cleans up resources.
|
|
5
|
+
*/
|
|
6
|
+
import ora from 'ora';
|
|
7
|
+
import * as fs from 'fs/promises';
|
|
8
|
+
import * as path from 'path';
|
|
9
|
+
import { withErrorHandler } from '../../cli/middleware/error-handler.js';
|
|
10
|
+
import { STATE_FILE_NAME } from '../core/state-manager.js';
|
|
11
|
+
import { createWorktreeManager } from '../git/worktree-manager.js';
|
|
12
|
+
import { createBranchManager } from '../git/branch-manager.js';
|
|
13
|
+
import { c, formatCost } from './display.js';
|
|
14
|
+
/**
|
|
15
|
+
* Load state from file
|
|
16
|
+
*/
|
|
17
|
+
async function loadState(workingDirectory) {
|
|
18
|
+
const statePath = path.join(workingDirectory, '.specforge', STATE_FILE_NAME);
|
|
19
|
+
try {
|
|
20
|
+
const content = await fs.readFile(statePath, 'utf-8');
|
|
21
|
+
return JSON.parse(content);
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Remove state file
|
|
29
|
+
*/
|
|
30
|
+
async function removeStateFile(workingDirectory) {
|
|
31
|
+
const statePath = path.join(workingDirectory, '.specforge', STATE_FILE_NAME);
|
|
32
|
+
try {
|
|
33
|
+
await fs.unlink(statePath);
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
// Ignore if file doesn't exist
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Cleanup worktrees
|
|
41
|
+
*/
|
|
42
|
+
async function cleanupWorktrees(workingDirectory) {
|
|
43
|
+
const worktreeManager = createWorktreeManager({ workingDirectory });
|
|
44
|
+
const worktrees = await worktreeManager.listWorktrees();
|
|
45
|
+
const cleaned = [];
|
|
46
|
+
for (const worktree of worktrees) {
|
|
47
|
+
if (worktree.branch?.includes('autopilot/')) {
|
|
48
|
+
try {
|
|
49
|
+
await worktreeManager.removeWorkerWorktree(parseInt(worktree.branch.split('worker-')[1] || '0', 10));
|
|
50
|
+
cleaned.push(worktree.path);
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
// Ignore cleanup errors
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
// Also try to cleanup the worktrees directory
|
|
58
|
+
const worktreesDir = path.join(workingDirectory, '.worktrees');
|
|
59
|
+
try {
|
|
60
|
+
const contents = await fs.readdir(worktreesDir);
|
|
61
|
+
if (contents.length === 0) {
|
|
62
|
+
await fs.rmdir(worktreesDir);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
// Ignore
|
|
67
|
+
}
|
|
68
|
+
return cleaned;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Cleanup branches
|
|
72
|
+
*/
|
|
73
|
+
async function cleanupBranches(workingDirectory, force) {
|
|
74
|
+
const branchManager = createBranchManager({ workingDirectory });
|
|
75
|
+
const branches = await branchManager.getAutopilotBranches();
|
|
76
|
+
const deleted = [];
|
|
77
|
+
for (const branch of branches) {
|
|
78
|
+
try {
|
|
79
|
+
await branchManager.deleteBranch(branch, force);
|
|
80
|
+
deleted.push(branch);
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
// Ignore deletion errors
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return deleted;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Abort command action
|
|
90
|
+
*/
|
|
91
|
+
async function abortAction(options) {
|
|
92
|
+
const workingDirectory = process.cwd();
|
|
93
|
+
// Confirm abort
|
|
94
|
+
if (!options.force) {
|
|
95
|
+
console.log('');
|
|
96
|
+
console.log(c.yellow('⚠ This will abort the autopilot session and cannot be undone.'));
|
|
97
|
+
console.log('');
|
|
98
|
+
console.log('Use --force to confirm, or Ctrl+C to cancel.');
|
|
99
|
+
console.log('');
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
const spinner = ora({
|
|
103
|
+
text: 'Aborting autopilot session...',
|
|
104
|
+
color: 'cyan',
|
|
105
|
+
}).start();
|
|
106
|
+
try {
|
|
107
|
+
// Load state for summary
|
|
108
|
+
const state = await loadState(workingDirectory);
|
|
109
|
+
const results = {
|
|
110
|
+
stateRemoved: false,
|
|
111
|
+
worktreesCleaned: [],
|
|
112
|
+
branchesCleaned: [],
|
|
113
|
+
};
|
|
114
|
+
// Remove state file
|
|
115
|
+
spinner.text = 'Removing state file...';
|
|
116
|
+
await removeStateFile(workingDirectory);
|
|
117
|
+
results.stateRemoved = true;
|
|
118
|
+
// Cleanup worktrees
|
|
119
|
+
if (options.cleanup !== false) {
|
|
120
|
+
spinner.text = 'Cleaning up worktrees...';
|
|
121
|
+
results.worktreesCleaned = await cleanupWorktrees(workingDirectory);
|
|
122
|
+
}
|
|
123
|
+
// Cleanup branches
|
|
124
|
+
if (!options.keepBranches) {
|
|
125
|
+
spinner.text = 'Cleaning up branches...';
|
|
126
|
+
results.branchesCleaned = await cleanupBranches(workingDirectory, true);
|
|
127
|
+
}
|
|
128
|
+
spinner.succeed('Autopilot session aborted');
|
|
129
|
+
if (options.json) {
|
|
130
|
+
console.log(JSON.stringify({
|
|
131
|
+
success: true,
|
|
132
|
+
runId: state?.runId,
|
|
133
|
+
completed: state?.completedTickets.length ?? 0,
|
|
134
|
+
failed: state?.failedTickets.length ?? 0,
|
|
135
|
+
cost: state?.totalCostUsd ?? 0,
|
|
136
|
+
cleanup: results,
|
|
137
|
+
}, null, 2));
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
console.log('');
|
|
141
|
+
console.log(c.bold('Session Aborted'));
|
|
142
|
+
console.log('');
|
|
143
|
+
if (state) {
|
|
144
|
+
console.log(`Run ID: ${c.dim(state.runId)}`);
|
|
145
|
+
console.log(`Completed: ${c.green(state.completedTickets.length.toString())} tickets`);
|
|
146
|
+
console.log(`Failed: ${c.red(state.failedTickets.length.toString())} tickets`);
|
|
147
|
+
console.log(`Cost incurred: ${c.yellow(formatCost(state.totalCostUsd))}`);
|
|
148
|
+
console.log('');
|
|
149
|
+
}
|
|
150
|
+
console.log(c.bold('Cleanup Summary:'));
|
|
151
|
+
console.log(` State file: ${results.stateRemoved ? c.green('Removed') : c.dim('Not found')}`);
|
|
152
|
+
console.log(` Worktrees: ${results.worktreesCleaned.length > 0
|
|
153
|
+
? c.green(`${results.worktreesCleaned.length} removed`)
|
|
154
|
+
: c.dim('None')}`);
|
|
155
|
+
console.log(` Branches: ${results.branchesCleaned.length > 0
|
|
156
|
+
? c.green(`${results.branchesCleaned.length} deleted`)
|
|
157
|
+
: c.dim('None')}`);
|
|
158
|
+
console.log('');
|
|
159
|
+
if (state && state.completedTickets.length > 0) {
|
|
160
|
+
console.log(c.yellow('Note: Commits from completed tickets remain in the repository.'));
|
|
161
|
+
console.log(c.dim('Use `git log` to review changes, or `git reset` to undo if needed.'));
|
|
162
|
+
console.log('');
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
catch (error) {
|
|
167
|
+
spinner.fail('Failed to abort');
|
|
168
|
+
throw error;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Register abort command
|
|
173
|
+
*/
|
|
174
|
+
export function registerAbortCommand(program) {
|
|
175
|
+
program
|
|
176
|
+
.command('abort')
|
|
177
|
+
.description('Abort autopilot session and cleanup resources')
|
|
178
|
+
.option('-f, --force', 'Confirm abort (required)')
|
|
179
|
+
.option('--cleanup', 'Cleanup worktrees (default: true)')
|
|
180
|
+
.option('--keep-branches', 'Keep autopilot branches')
|
|
181
|
+
.option('--json', 'Output as JSON')
|
|
182
|
+
.addHelpText('after', `
|
|
183
|
+
Examples:
|
|
184
|
+
$ specforge autopilot abort --force # Abort and cleanup
|
|
185
|
+
$ specforge autopilot abort --force --keep-branches # Keep branches
|
|
186
|
+
|
|
187
|
+
Cleanup:
|
|
188
|
+
- Removes .specforge/autopilot-state.json
|
|
189
|
+
- Removes .worktrees/worker-* directories
|
|
190
|
+
- Deletes autopilot/* branches (unless --keep-branches)
|
|
191
|
+
|
|
192
|
+
Note:
|
|
193
|
+
Commits made by completed tickets remain in the repository.
|
|
194
|
+
Use git commands to review or undo changes if needed.
|
|
195
|
+
|
|
196
|
+
Warning:
|
|
197
|
+
This action cannot be undone. Progress cannot be resumed after abort.
|
|
198
|
+
`)
|
|
199
|
+
.action(withErrorHandler(abortAction));
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=abort.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"abort.js","sourceRoot":"","sources":["../../../src/autopilot/cli/abort.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAY,MAAM,uCAAuC,CAAC;AACnF,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAa7C;;GAEG;AACH,KAAK,UAAU,SAAS,CAAC,gBAAwB;IAC/C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,YAAY,EAAE,eAAe,CAAC,CAAC;IAE7E,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACtD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAmB,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,eAAe,CAAC,gBAAwB;IACrD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,YAAY,EAAE,eAAe,CAAC,CAAC;IAE7E,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,+BAA+B;IACjC,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,gBAAgB,CAAC,gBAAwB;IACtD,MAAM,eAAe,GAAG,qBAAqB,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC;IACpE,MAAM,SAAS,GAAG,MAAM,eAAe,CAAC,aAAa,EAAE,CAAC;IAExD,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,IAAI,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;YAC5C,IAAI,CAAC;gBACH,MAAM,eAAe,CAAC,oBAAoB,CACxC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC,CACzD,CAAC;gBACF,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC9B,CAAC;YAAC,MAAM,CAAC;gBACP,wBAAwB;YAC1B,CAAC;QACH,CAAC;IACH,CAAC;IAED,8CAA8C;IAC9C,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAAC;IAC/D,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QAChD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,SAAS;IACX,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,eAAe,CAC5B,gBAAwB,EACxB,KAAc;IAEd,MAAM,aAAa,GAAG,mBAAmB,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC;IAChE,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,oBAAoB,EAAE,CAAC;IAE5D,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,MAAM,aAAa,CAAC,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAChD,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACvB,CAAC;QAAC,MAAM,CAAC;YACP,yBAAyB;QAC3B,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,WAAW,CAAC,OAAqB;IAC9C,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAEvC,gBAAgB;IAChB,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,+DAA+D,CAAC,CAAC,CAAC;QACvF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;QAC5D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,CAAC;QAClB,IAAI,EAAE,+BAA+B;QACrC,KAAK,EAAE,MAAM;KACd,CAAC,CAAC,KAAK,EAAE,CAAC;IAEX,IAAI,CAAC;QACH,yBAAyB;QACzB,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAEhD,MAAM,OAAO,GAAG;YACd,YAAY,EAAE,KAAK;YACnB,gBAAgB,EAAE,EAAc;YAChC,eAAe,EAAE,EAAc;SAChC,CAAC;QAEF,oBAAoB;QACpB,OAAO,CAAC,IAAI,GAAG,wBAAwB,CAAC;QACxC,MAAM,eAAe,CAAC,gBAAgB,CAAC,CAAC;QACxC,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;QAE5B,oBAAoB;QACpB,IAAI,OAAO,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;YAC9B,OAAO,CAAC,IAAI,GAAG,0BAA0B,CAAC;YAC1C,OAAO,CAAC,gBAAgB,GAAG,MAAM,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;QACtE,CAAC;QAED,mBAAmB;QACnB,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;YAC1B,OAAO,CAAC,IAAI,GAAG,yBAAyB,CAAC;YACzC,OAAO,CAAC,eAAe,GAAG,MAAM,eAAe,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;QAC1E,CAAC;QAED,OAAO,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC;QAE7C,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;gBACzB,OAAO,EAAE,IAAI;gBACb,KAAK,EAAE,KAAK,EAAE,KAAK;gBACnB,SAAS,EAAE,KAAK,EAAE,gBAAgB,CAAC,MAAM,IAAI,CAAC;gBAC9C,MAAM,EAAE,KAAK,EAAE,aAAa,CAAC,MAAM,IAAI,CAAC;gBACxC,IAAI,EAAE,KAAK,EAAE,YAAY,IAAI,CAAC;gBAC9B,OAAO,EAAE,OAAO;aACjB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACf,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;YACvC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAEhB,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBACrD,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,UAAU,CAAC,CAAC;gBAC5F,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,UAAU,CAAC,CAAC;gBACvF,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC3E,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAClB,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;YACxC,OAAO,CAAC,GAAG,CAAC,mBAAmB,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;YACjG,OAAO,CAAC,GAAG,CAAC,mBAAmB,OAAO,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC;gBAChE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,gBAAgB,CAAC,MAAM,UAAU,CAAC;gBACvD,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,mBAAmB,OAAO,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC;gBAC/D,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC,MAAM,UAAU,CAAC;gBACtD,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAErB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAEhB,IAAI,KAAK,IAAI,KAAK,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC/C,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,gEAAgE,CAAC,CAAC,CAAC;gBACxF,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,oEAAoE,CAAC,CAAC,CAAC;gBACzF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAChC,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACnD,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,+CAA+C,CAAC;SAC5D,MAAM,CAAC,aAAa,EAAE,0BAA0B,CAAC;SACjD,MAAM,CAAC,WAAW,EAAE,mCAAmC,CAAC;SACxD,MAAM,CAAC,iBAAiB,EAAE,yBAAyB,CAAC;SACpD,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,WAAW,CAAC,OAAO,EAAE;;;;;;;;;;;;;;;;CAgBzB,CAAC;SACG,MAAM,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC,CAAC;AAC3C,CAAC"}
|