sweteam 0.1.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 (206) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +587 -0
  3. package/dist/adapters/adapter.d.ts +19 -0
  4. package/dist/adapters/adapter.d.ts.map +1 -0
  5. package/dist/adapters/adapter.js +20 -0
  6. package/dist/adapters/adapter.js.map +1 -0
  7. package/dist/adapters/claude-code.d.ts +13 -0
  8. package/dist/adapters/claude-code.d.ts.map +1 -0
  9. package/dist/adapters/claude-code.js +150 -0
  10. package/dist/adapters/claude-code.js.map +1 -0
  11. package/dist/adapters/codex.d.ts +13 -0
  12. package/dist/adapters/codex.d.ts.map +1 -0
  13. package/dist/adapters/codex.js +100 -0
  14. package/dist/adapters/codex.js.map +1 -0
  15. package/dist/adapters/custom.d.ts +16 -0
  16. package/dist/adapters/custom.d.ts.map +1 -0
  17. package/dist/adapters/custom.js +167 -0
  18. package/dist/adapters/custom.js.map +1 -0
  19. package/dist/adapters/opencode.d.ts +13 -0
  20. package/dist/adapters/opencode.d.ts.map +1 -0
  21. package/dist/adapters/opencode.js +100 -0
  22. package/dist/adapters/opencode.js.map +1 -0
  23. package/dist/adapters/prompt-detection.d.ts +14 -0
  24. package/dist/adapters/prompt-detection.d.ts.map +1 -0
  25. package/dist/adapters/prompt-detection.js +74 -0
  26. package/dist/adapters/prompt-detection.js.map +1 -0
  27. package/dist/commands/create.d.ts +8 -0
  28. package/dist/commands/create.d.ts.map +1 -0
  29. package/dist/commands/create.js +38 -0
  30. package/dist/commands/create.js.map +1 -0
  31. package/dist/commands/delete.d.ts +2 -0
  32. package/dist/commands/delete.d.ts.map +1 -0
  33. package/dist/commands/delete.js +22 -0
  34. package/dist/commands/delete.js.map +1 -0
  35. package/dist/commands/enter.d.ts +19 -0
  36. package/dist/commands/enter.d.ts.map +1 -0
  37. package/dist/commands/enter.js +73 -0
  38. package/dist/commands/enter.js.map +1 -0
  39. package/dist/commands/init.d.ts +14 -0
  40. package/dist/commands/init.d.ts.map +1 -0
  41. package/dist/commands/init.js +52 -0
  42. package/dist/commands/init.js.map +1 -0
  43. package/dist/commands/list.d.ts +8 -0
  44. package/dist/commands/list.d.ts.map +1 -0
  45. package/dist/commands/list.js +98 -0
  46. package/dist/commands/list.js.map +1 -0
  47. package/dist/commands/show.d.ts +33 -0
  48. package/dist/commands/show.d.ts.map +1 -0
  49. package/dist/commands/show.js +142 -0
  50. package/dist/commands/show.js.map +1 -0
  51. package/dist/commands/stop.d.ts +2 -0
  52. package/dist/commands/stop.d.ts.map +1 -0
  53. package/dist/commands/stop.js +10 -0
  54. package/dist/commands/stop.js.map +1 -0
  55. package/dist/config/discovery.d.ts +12 -0
  56. package/dist/config/discovery.d.ts.map +1 -0
  57. package/dist/config/discovery.js +62 -0
  58. package/dist/config/discovery.js.map +1 -0
  59. package/dist/config/gh-auth.d.ts +5 -0
  60. package/dist/config/gh-auth.d.ts.map +1 -0
  61. package/dist/config/gh-auth.js +18 -0
  62. package/dist/config/gh-auth.js.map +1 -0
  63. package/dist/config/loader.d.ts +38 -0
  64. package/dist/config/loader.d.ts.map +1 -0
  65. package/dist/config/loader.js +72 -0
  66. package/dist/config/loader.js.map +1 -0
  67. package/dist/db/client.d.ts +10 -0
  68. package/dist/db/client.d.ts.map +1 -0
  69. package/dist/db/client.js +84 -0
  70. package/dist/db/client.js.map +1 -0
  71. package/dist/db/schema.d.ts +805 -0
  72. package/dist/db/schema.d.ts.map +1 -0
  73. package/dist/db/schema.js +66 -0
  74. package/dist/db/schema.js.map +1 -0
  75. package/dist/git/git.d.ts +29 -0
  76. package/dist/git/git.d.ts.map +1 -0
  77. package/dist/git/git.js +200 -0
  78. package/dist/git/git.js.map +1 -0
  79. package/dist/index.d.ts +3 -0
  80. package/dist/index.d.ts.map +1 -0
  81. package/dist/index.js +154 -0
  82. package/dist/index.js.map +1 -0
  83. package/dist/lifecycle.d.ts +5 -0
  84. package/dist/lifecycle.d.ts.map +1 -0
  85. package/dist/lifecycle.js +63 -0
  86. package/dist/lifecycle.js.map +1 -0
  87. package/dist/orchestrator/build-handler.d.ts +20 -0
  88. package/dist/orchestrator/build-handler.d.ts.map +1 -0
  89. package/dist/orchestrator/build-handler.js +212 -0
  90. package/dist/orchestrator/build-handler.js.map +1 -0
  91. package/dist/orchestrator/dag.d.ts +10 -0
  92. package/dist/orchestrator/dag.d.ts.map +1 -0
  93. package/dist/orchestrator/dag.js +70 -0
  94. package/dist/orchestrator/dag.js.map +1 -0
  95. package/dist/orchestrator/error-handling.d.ts +21 -0
  96. package/dist/orchestrator/error-handling.d.ts.map +1 -0
  97. package/dist/orchestrator/error-handling.js +124 -0
  98. package/dist/orchestrator/error-handling.js.map +1 -0
  99. package/dist/orchestrator/feedback-handler.d.ts +36 -0
  100. package/dist/orchestrator/feedback-handler.d.ts.map +1 -0
  101. package/dist/orchestrator/feedback-handler.js +316 -0
  102. package/dist/orchestrator/feedback-handler.js.map +1 -0
  103. package/dist/orchestrator/orchestrator.d.ts +21 -0
  104. package/dist/orchestrator/orchestrator.d.ts.map +1 -0
  105. package/dist/orchestrator/orchestrator.js +188 -0
  106. package/dist/orchestrator/orchestrator.js.map +1 -0
  107. package/dist/orchestrator/parallel-runner.d.ts +3 -0
  108. package/dist/orchestrator/parallel-runner.d.ts.map +1 -0
  109. package/dist/orchestrator/parallel-runner.js +111 -0
  110. package/dist/orchestrator/parallel-runner.js.map +1 -0
  111. package/dist/orchestrator/reviewer.d.ts +20 -0
  112. package/dist/orchestrator/reviewer.d.ts.map +1 -0
  113. package/dist/orchestrator/reviewer.js +175 -0
  114. package/dist/orchestrator/reviewer.js.map +1 -0
  115. package/dist/orchestrator/task-runner.d.ts +20 -0
  116. package/dist/orchestrator/task-runner.d.ts.map +1 -0
  117. package/dist/orchestrator/task-runner.js +122 -0
  118. package/dist/orchestrator/task-runner.js.map +1 -0
  119. package/dist/orchestrator/test-runner.d.ts +8 -0
  120. package/dist/orchestrator/test-runner.d.ts.map +1 -0
  121. package/dist/orchestrator/test-runner.js +81 -0
  122. package/dist/orchestrator/test-runner.js.map +1 -0
  123. package/dist/planner/plan-parser.d.ts +14 -0
  124. package/dist/planner/plan-parser.d.ts.map +1 -0
  125. package/dist/planner/plan-parser.js +182 -0
  126. package/dist/planner/plan-parser.js.map +1 -0
  127. package/dist/planner/planner.d.ts +9 -0
  128. package/dist/planner/planner.d.ts.map +1 -0
  129. package/dist/planner/planner.js +151 -0
  130. package/dist/planner/planner.js.map +1 -0
  131. package/dist/repl/repl.d.ts +19 -0
  132. package/dist/repl/repl.d.ts.map +1 -0
  133. package/dist/repl/repl.js +505 -0
  134. package/dist/repl/repl.js.map +1 -0
  135. package/dist/session/agent-log.d.ts +35 -0
  136. package/dist/session/agent-log.d.ts.map +1 -0
  137. package/dist/session/agent-log.js +120 -0
  138. package/dist/session/agent-log.js.map +1 -0
  139. package/dist/session/chat.d.ts +38 -0
  140. package/dist/session/chat.d.ts.map +1 -0
  141. package/dist/session/chat.js +106 -0
  142. package/dist/session/chat.js.map +1 -0
  143. package/dist/session/cost-tracker.d.ts +14 -0
  144. package/dist/session/cost-tracker.d.ts.map +1 -0
  145. package/dist/session/cost-tracker.js +61 -0
  146. package/dist/session/cost-tracker.js.map +1 -0
  147. package/dist/session/export.d.ts +2 -0
  148. package/dist/session/export.d.ts.map +1 -0
  149. package/dist/session/export.js +105 -0
  150. package/dist/session/export.js.map +1 -0
  151. package/dist/session/in-session-commands.d.ts +7 -0
  152. package/dist/session/in-session-commands.d.ts.map +1 -0
  153. package/dist/session/in-session-commands.js +227 -0
  154. package/dist/session/in-session-commands.js.map +1 -0
  155. package/dist/session/interactive.d.ts +37 -0
  156. package/dist/session/interactive.d.ts.map +1 -0
  157. package/dist/session/interactive.js +226 -0
  158. package/dist/session/interactive.js.map +1 -0
  159. package/dist/session/manager.d.ts +63 -0
  160. package/dist/session/manager.d.ts.map +1 -0
  161. package/dist/session/manager.js +229 -0
  162. package/dist/session/manager.js.map +1 -0
  163. package/dist/session/resume.d.ts +7 -0
  164. package/dist/session/resume.d.ts.map +1 -0
  165. package/dist/session/resume.js +53 -0
  166. package/dist/session/resume.js.map +1 -0
  167. package/dist/session/state-machine.d.ts +4 -0
  168. package/dist/session/state-machine.d.ts.map +1 -0
  169. package/dist/session/state-machine.js +47 -0
  170. package/dist/session/state-machine.js.map +1 -0
  171. package/dist/tui/chat-ui.d.ts +16 -0
  172. package/dist/tui/chat-ui.d.ts.map +1 -0
  173. package/dist/tui/chat-ui.js +19 -0
  174. package/dist/tui/chat-ui.js.map +1 -0
  175. package/dist/tui/dashboard.d.ts +17 -0
  176. package/dist/tui/dashboard.d.ts.map +1 -0
  177. package/dist/tui/dashboard.js +57 -0
  178. package/dist/tui/dashboard.js.map +1 -0
  179. package/dist/tui/session-list.d.ts +18 -0
  180. package/dist/tui/session-list.d.ts.map +1 -0
  181. package/dist/tui/session-list.js +26 -0
  182. package/dist/tui/session-list.js.map +1 -0
  183. package/dist/ui/agent-panel.d.ts +9 -0
  184. package/dist/ui/agent-panel.d.ts.map +1 -0
  185. package/dist/ui/agent-panel.js +100 -0
  186. package/dist/ui/agent-panel.js.map +1 -0
  187. package/dist/ui/banner.d.ts +10 -0
  188. package/dist/ui/banner.d.ts.map +1 -0
  189. package/dist/ui/banner.js +100 -0
  190. package/dist/ui/banner.js.map +1 -0
  191. package/dist/ui/markdown.d.ts +19 -0
  192. package/dist/ui/markdown.d.ts.map +1 -0
  193. package/dist/ui/markdown.js +174 -0
  194. package/dist/ui/markdown.js.map +1 -0
  195. package/dist/ui/prompt.d.ts +24 -0
  196. package/dist/ui/prompt.d.ts.map +1 -0
  197. package/dist/ui/prompt.js +226 -0
  198. package/dist/ui/prompt.js.map +1 -0
  199. package/dist/utils/time.d.ts +3 -0
  200. package/dist/utils/time.d.ts.map +1 -0
  201. package/dist/utils/time.js +29 -0
  202. package/dist/utils/time.js.map +1 -0
  203. package/drizzle/migrations/0000_naive_human_fly.sql +56 -0
  204. package/drizzle/migrations/meta/0000_snapshot.json +395 -0
  205. package/drizzle/migrations/meta/_journal.json +13 -0
  206. package/package.json +70 -0
@@ -0,0 +1,212 @@
1
+ import { eq } from "drizzle-orm";
2
+ import { getDb } from "../db/client.js";
3
+ import { sessions, tasks as tasksTable } from "../db/schema.js";
4
+ import { transition } from "../session/state-machine.js";
5
+ import { addMessage, getSession } from "../session/manager.js";
6
+ import { parsePlan } from "../planner/plan-parser.js";
7
+ import { insertTasksFromPlan, getTasksForSession, runOrchestrator, displayTaskId, } from "./orchestrator.js";
8
+ import { git, pushBranch, createPR, getDefaultBranch, deleteBranches } from "../git/git.js";
9
+ import { AgentPanel } from "../ui/agent-panel.js";
10
+ import { clearLog, writeEvent, waitForResponse } from "../session/agent-log.js";
11
+ export function generatePrBody(goal, taskResults, allTasks) {
12
+ const lines = [];
13
+ lines.push(`## Goal`);
14
+ lines.push(goal);
15
+ lines.push("");
16
+ lines.push("## Tasks");
17
+ for (const task of allTasks) {
18
+ let icon;
19
+ switch (task.status) {
20
+ case "done":
21
+ icon = "✓";
22
+ break;
23
+ case "failed":
24
+ icon = "✗";
25
+ break;
26
+ case "blocked":
27
+ icon = "⊘";
28
+ break;
29
+ default:
30
+ icon = "○";
31
+ }
32
+ lines.push(`- ${icon} ${displayTaskId(task.id)}: ${task.title}`);
33
+ }
34
+ lines.push("");
35
+ lines.push("## Summary");
36
+ lines.push(`${taskResults.completed.length} completed, ${taskResults.failed.length} failed, ${taskResults.blocked.length} blocked`);
37
+ if (taskResults.failed.length > 0) {
38
+ lines.push("");
39
+ lines.push("## Escalated Tasks");
40
+ for (const id of taskResults.failed) {
41
+ const task = allTasks.find((t) => t.id === id);
42
+ lines.push(`- ${displayTaskId(id)}: ${task?.title ?? "unknown"}`);
43
+ }
44
+ }
45
+ return lines.join("\n");
46
+ }
47
+ export function formatCompletionReport(taskResults, allTasks, prUrl) {
48
+ const lines = [];
49
+ lines.push("Build complete.");
50
+ lines.push("");
51
+ for (const task of allTasks) {
52
+ let prefix;
53
+ switch (task.status) {
54
+ case "done":
55
+ prefix = " ✓";
56
+ break;
57
+ case "failed":
58
+ prefix = " ⚠";
59
+ break;
60
+ case "blocked":
61
+ prefix = " ⊘";
62
+ break;
63
+ default:
64
+ prefix = " ○";
65
+ }
66
+ lines.push(`${prefix} ${displayTaskId(task.id)} ${task.title}`);
67
+ }
68
+ lines.push("");
69
+ if (prUrl) {
70
+ lines.push(`PR: ${prUrl}`);
71
+ }
72
+ lines.push("");
73
+ lines.push("Review the PR and type @feedback with any changes needed.");
74
+ return lines.join("\n");
75
+ }
76
+ export async function handleBuild(sessionId, planOutput) {
77
+ const db = getDb();
78
+ // Parse the plan
79
+ const plan = parsePlan(planOutput);
80
+ if (plan.tasks.length === 0) {
81
+ const msg = "Could not parse tasks from the plan. Please refine the plan and try @build again.";
82
+ addMessage(sessionId, "system", msg);
83
+ console.log(msg);
84
+ return;
85
+ }
86
+ // Save plan JSON to session
87
+ db.update(sessions)
88
+ .set({
89
+ planJson: JSON.stringify(plan),
90
+ updatedAt: new Date(),
91
+ })
92
+ .where(eq(sessions.id, sessionId))
93
+ .run();
94
+ // Transition to building
95
+ transition(sessionId, "building");
96
+ // Clean up all tasks from previous builds — the entire plan is re-inserted
97
+ db.delete(tasksTable)
98
+ .where(eq(tasksTable.sessionId, sessionId))
99
+ .run();
100
+ // Insert tasks into DB
101
+ insertTasksFromPlan(sessionId, plan.tasks);
102
+ addMessage(sessionId, "system", `Plan finalized with ${plan.tasks.length} tasks. Starting build...`);
103
+ // Print task list so the user sees what will be built
104
+ console.log(`Found ${plan.tasks.length} tasks:\n`);
105
+ for (const t of plan.tasks) {
106
+ const deps = t.dependsOn.length > 0 ? ` (depends on: ${t.dependsOn.join(", ")})` : "";
107
+ console.log(` ${t.id} ${t.title}${deps}`);
108
+ }
109
+ console.log();
110
+ // Run the orchestrator
111
+ const session = getSession(sessionId);
112
+ const repoPath = session.repoLocalPath;
113
+ const sessionBranch = session.workingBranch;
114
+ // Ensure we're on the session branch before cleanup (prevents it from being deleted)
115
+ try {
116
+ git(["checkout", sessionBranch], repoPath);
117
+ }
118
+ catch {
119
+ // May already be on it
120
+ }
121
+ // Clean up stale task branches from previous build attempts.
122
+ // Old naming used "/" (sw/s_ID/taskN-...) which conflicts with session branch sw/s_ID.
123
+ // New naming uses "-" (sw/s_ID-taskN-...) but leftovers from either scheme must go.
124
+ // The session branch itself is safe because it's currently checked out.
125
+ try {
126
+ deleteBranches(`sw/${sessionId}-*`, repoPath); // new-style task branches
127
+ deleteBranches(`sw/${sessionId}/*`, repoPath); // old-style task branches (ref conflict)
128
+ }
129
+ catch {
130
+ // Best-effort cleanup
131
+ }
132
+ // Clear log file so watchers from other processes start fresh
133
+ clearLog(sessionId);
134
+ const panel = new AgentPanel();
135
+ let agentCounter = 0;
136
+ const callbacks = {
137
+ onAgentStart: (taskId, taskTitle, role) => {
138
+ const id = `${role.toLowerCase()}-${++agentCounter}`;
139
+ panel.addAgent(id, role, taskId, taskTitle);
140
+ writeEvent(sessionId, { type: "agent-start", id, role, taskId, title: taskTitle });
141
+ },
142
+ onAgentOutput: (_taskId, role, chunk) => {
143
+ const id = `${role.toLowerCase()}-${agentCounter}`;
144
+ panel.appendOutput(id, chunk);
145
+ writeEvent(sessionId, { type: "output", id, chunk });
146
+ },
147
+ onAgentEnd: (_taskId, role, success) => {
148
+ const id = `${role.toLowerCase()}-${agentCounter}`;
149
+ panel.completeAgent(id, success);
150
+ writeEvent(sessionId, { type: "agent-end", id, success });
151
+ },
152
+ onInputNeeded: async (taskId, role, promptText) => {
153
+ const requestId = `input-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
154
+ writeEvent(sessionId, { type: "input-needed", id: requestId, taskId, role, promptText, requestId });
155
+ return waitForResponse(sessionId, requestId);
156
+ },
157
+ };
158
+ let result;
159
+ try {
160
+ result = await runOrchestrator(sessionId, repoPath, sessionBranch, callbacks);
161
+ }
162
+ catch (err) {
163
+ panel.destroy();
164
+ writeEvent(sessionId, { type: "build-complete", id: "build" });
165
+ // Build failed before completing — go back to planning so user can @build to retry
166
+ try {
167
+ transition(sessionId, "planning");
168
+ }
169
+ catch { /* already transitioned */ }
170
+ throw err;
171
+ }
172
+ panel.destroy();
173
+ writeEvent(sessionId, { type: "build-complete", id: "build" });
174
+ // Get final task states
175
+ const allTasks = getTasksForSession(sessionId).map((t) => ({
176
+ id: t.id,
177
+ title: t.title,
178
+ status: t.status,
179
+ }));
180
+ // Push and create PR if any tasks completed
181
+ let prUrl;
182
+ if (result.completed.length > 0) {
183
+ try {
184
+ pushBranch(sessionBranch, repoPath);
185
+ const prBody = generatePrBody(session.goal, result, allTasks);
186
+ const baseBranch = getDefaultBranch(repoPath);
187
+ prUrl = createPR(session.goal, prBody, baseBranch, sessionBranch, repoPath);
188
+ // Parse PR URL for number
189
+ const prMatch = prUrl.match(/\/pull\/(\d+)/);
190
+ const prNumber = prMatch ? parseInt(prMatch[1], 10) : null;
191
+ db.update(sessions)
192
+ .set({
193
+ prUrl,
194
+ prNumber,
195
+ updatedAt: new Date(),
196
+ })
197
+ .where(eq(sessions.id, sessionId))
198
+ .run();
199
+ }
200
+ catch (err) {
201
+ const errMsg = err instanceof Error ? err.message : String(err);
202
+ addMessage(sessionId, "system", `Failed to create PR: ${errMsg}`);
203
+ }
204
+ }
205
+ // Transition to awaiting_feedback
206
+ transition(sessionId, "awaiting_feedback");
207
+ // Print completion report
208
+ const report = formatCompletionReport(result, allTasks, prUrl);
209
+ addMessage(sessionId, "system", report);
210
+ console.log(report);
211
+ }
212
+ //# sourceMappingURL=build-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-handler.js","sourceRoot":"","sources":["../../src/orchestrator/build-handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { TaskRecord } from "./task-runner.js";
2
+ export interface DagNode {
3
+ id: string;
4
+ dependsOn: string[];
5
+ dependents: string[];
6
+ }
7
+ export declare function buildDag(tasks: TaskRecord[]): Map<string, DagNode>;
8
+ export declare function topologicalSort(dag: Map<string, DagNode>): string[];
9
+ export declare function getReadyTasks(dag: Map<string, DagNode>, completedIds: Set<string>, runningIds: Set<string>, failedIds: Set<string>, blockedIds: Set<string>): string[];
10
+ //# sourceMappingURL=dag.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dag.d.ts","sourceRoot":"","sources":["../../src/orchestrator/dag.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAsBlE;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,EAAE,CA4BnE;AAED,wBAAgB,aAAa,CAC3B,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,EACzB,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,EACzB,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,EACvB,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,EACtB,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,GACtB,MAAM,EAAE,CAyBV"}
@@ -0,0 +1,70 @@
1
+ export function buildDag(tasks) {
2
+ const dag = new Map();
3
+ for (const task of tasks) {
4
+ dag.set(task.id, {
5
+ id: task.id,
6
+ dependsOn: task.dependsOn ? JSON.parse(task.dependsOn) : [],
7
+ dependents: [],
8
+ });
9
+ }
10
+ // Build reverse edges (dependents)
11
+ for (const [, node] of dag) {
12
+ for (const depId of node.dependsOn) {
13
+ const depNode = dag.get(depId);
14
+ if (depNode) {
15
+ depNode.dependents.push(node.id);
16
+ }
17
+ }
18
+ }
19
+ return dag;
20
+ }
21
+ export function topologicalSort(dag) {
22
+ const sorted = [];
23
+ const visited = new Set();
24
+ const visiting = new Set();
25
+ function visit(id) {
26
+ if (visited.has(id))
27
+ return;
28
+ if (visiting.has(id)) {
29
+ throw new Error(`Circular dependency detected involving task: ${id}`);
30
+ }
31
+ visiting.add(id);
32
+ const node = dag.get(id);
33
+ if (node) {
34
+ for (const depId of node.dependsOn) {
35
+ visit(depId);
36
+ }
37
+ }
38
+ visiting.delete(id);
39
+ visited.add(id);
40
+ sorted.push(id);
41
+ }
42
+ for (const [id] of dag) {
43
+ visit(id);
44
+ }
45
+ return sorted;
46
+ }
47
+ export function getReadyTasks(dag, completedIds, runningIds, failedIds, blockedIds) {
48
+ const ready = [];
49
+ for (const [id, node] of dag) {
50
+ if (completedIds.has(id))
51
+ continue;
52
+ if (runningIds.has(id))
53
+ continue;
54
+ if (failedIds.has(id))
55
+ continue;
56
+ if (blockedIds.has(id))
57
+ continue;
58
+ const allDepsMet = node.dependsOn.every((depId) => completedIds.has(depId));
59
+ const anyDepFailed = node.dependsOn.some((depId) => failedIds.has(depId) || blockedIds.has(depId));
60
+ if (anyDepFailed) {
61
+ blockedIds.add(id);
62
+ continue;
63
+ }
64
+ if (allDepsMet) {
65
+ ready.push(id);
66
+ }
67
+ }
68
+ return ready;
69
+ }
70
+ //# sourceMappingURL=dag.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dag.js","sourceRoot":"","sources":["../../src/orchestrator/dag.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { resolveAdapter } from "../adapters/adapter.js";
2
+ import type { TaskRecord } from "./task-runner.js";
3
+ export declare function executeWithRetry(adapter: ReturnType<typeof resolveAdapter>, opts: {
4
+ prompt: string;
5
+ cwd: string;
6
+ timeout?: number;
7
+ onOutput?: (chunk: string) => void;
8
+ }, taskId: string, sessionId: string): Promise<{
9
+ output: string;
10
+ exitCode: number;
11
+ durationMs: number;
12
+ }>;
13
+ /**
14
+ * @deprecated Use `markBlockedTasks` from `orchestrator.ts` instead.
15
+ * Kept for test backward compatibility.
16
+ */
17
+ export declare function propagateFailure(failedTaskId: string, sessionId: string, allTasks: TaskRecord[]): string[];
18
+ export declare function attemptMergeConflictResolution(repoPath: string, taskId: string, sessionId: string): boolean;
19
+ export declare function friendlyError(raw: string): string;
20
+ export declare function persistError(sessionId: string, taskId: string, error: string, phase: string): void;
21
+ //# sourceMappingURL=error-handling.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-handling.d.ts","sourceRoot":"","sources":["../../src/orchestrator/error-handling.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAGxD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,EAC1C,IAAI,EAAE;IACJ,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC,EACD,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CA8DnE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,UAAU,EAAE,GACrB,MAAM,EAAE,CA4BV;AAED,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAChB,OAAO,CAgCT;AAYD,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAOjD;AAED,wBAAgB,YAAY,CAC1B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GACZ,IAAI,CAgBN"}
@@ -0,0 +1,124 @@
1
+ import { eq } from "drizzle-orm";
2
+ import { getDb } from "../db/client.js";
3
+ import { tasks as tasksTable } from "../db/schema.js";
4
+ import { addMessage } from "../session/manager.js";
5
+ import { git } from "../git/git.js";
6
+ export async function executeWithRetry(adapter, opts, taskId, sessionId) {
7
+ const timeout = opts.timeout ?? 0;
8
+ try {
9
+ const result = await adapter.execute({ ...opts, timeout });
10
+ if (result.exitCode !== 0) {
11
+ // First failure — retry with error context
12
+ addMessage(sessionId, "system", `Task ${taskId}: agent exited with code ${result.exitCode}, retrying with error context...`);
13
+ const retryPrompt = `${opts.prompt}\n\n## Previous Attempt Failed\nThe previous attempt produced this error:\n${result.output.slice(0, 1000)}\n\nPlease fix the issues and try again.`;
14
+ const retryResult = await adapter.execute({
15
+ ...opts,
16
+ prompt: retryPrompt,
17
+ timeout,
18
+ });
19
+ if (retryResult.exitCode !== 0) {
20
+ addMessage(sessionId, "system", `Task ${taskId}: retry also failed (exit code ${retryResult.exitCode})`);
21
+ }
22
+ return retryResult;
23
+ }
24
+ return result;
25
+ }
26
+ catch (err) {
27
+ const message = err instanceof Error ? err.message : String(err);
28
+ // Check if timeout
29
+ if (message.includes("timed out")) {
30
+ addMessage(sessionId, "system", `Task ${taskId}: timed out after ${timeout}ms, retrying once...`);
31
+ try {
32
+ const retryResult = await adapter.execute({ ...opts, timeout });
33
+ return retryResult;
34
+ }
35
+ catch (retryErr) {
36
+ const retryMsg = retryErr instanceof Error ? retryErr.message : String(retryErr);
37
+ addMessage(sessionId, "system", `Task ${taskId}: retry also timed out: ${retryMsg}`);
38
+ throw retryErr;
39
+ }
40
+ }
41
+ throw err;
42
+ }
43
+ }
44
+ /**
45
+ * @deprecated Use `markBlockedTasks` from `orchestrator.ts` instead.
46
+ * Kept for test backward compatibility.
47
+ */
48
+ export function propagateFailure(failedTaskId, sessionId, allTasks) {
49
+ const db = getDb();
50
+ const blocked = [];
51
+ for (const task of allTasks) {
52
+ if (task.status !== "queued")
53
+ continue;
54
+ if (!task.dependsOn)
55
+ continue;
56
+ const deps = JSON.parse(task.dependsOn);
57
+ if (deps.includes(failedTaskId)) {
58
+ db.update(tasksTable)
59
+ .set({ status: "blocked", updatedAt: new Date() })
60
+ .where(eq(tasksTable.id, task.id))
61
+ .run();
62
+ blocked.push(task.id);
63
+ addMessage(sessionId, "system", `Task ${task.id} blocked: dependency ${failedTaskId} failed`);
64
+ // Recursively block downstream
65
+ blocked.push(...propagateFailure(task.id, sessionId, allTasks));
66
+ }
67
+ }
68
+ return blocked;
69
+ }
70
+ export function attemptMergeConflictResolution(repoPath, taskId, sessionId) {
71
+ try {
72
+ // Check for conflicts
73
+ const status = git(["status", "--porcelain"], repoPath);
74
+ const hasConflicts = status
75
+ .split("\n")
76
+ .some((line) => line.startsWith("UU") || line.startsWith("AA"));
77
+ if (!hasConflicts)
78
+ return true;
79
+ addMessage(sessionId, "system", `Task ${taskId}: merge conflict detected, attempting auto-resolution...`);
80
+ // Try to resolve by accepting the incoming changes
81
+ try {
82
+ git(["checkout", "--theirs", "."], repoPath);
83
+ git(["add", "-A"], repoPath);
84
+ return true;
85
+ }
86
+ catch {
87
+ addMessage(sessionId, "system", `Task ${taskId}: auto-resolution failed, escalating`);
88
+ return false;
89
+ }
90
+ }
91
+ catch {
92
+ return false;
93
+ }
94
+ }
95
+ const ERROR_PATTERNS = [
96
+ [/ENOENT.*spawn/i, "Command not found. Check that the CLI adapter is installed and on your PATH."],
97
+ [/EACCES/i, "Permission denied. Check file/directory permissions or run with appropriate access."],
98
+ [/authentication|auth.*fail|401|403/i, "Authentication failed. Run `gh auth status` or check your API token."],
99
+ [/TOML|parse error|Expected/i, "Config parse error. Check your sweteam.toml for syntax issues."],
100
+ [/rate.?limit|429|too many requests/i, "Rate limited by the API. Wait a moment and try again."],
101
+ [/ECONNREFUSED|ENOTFOUND|network/i, "Network error. Check your internet connection."],
102
+ [/timed?\s*out/i, "Operation timed out. The task may be too large — try breaking it into smaller steps."],
103
+ ];
104
+ export function friendlyError(raw) {
105
+ for (const [pattern, hint] of ERROR_PATTERNS) {
106
+ if (pattern.test(raw)) {
107
+ return `${raw}\n Hint: ${hint}`;
108
+ }
109
+ }
110
+ return raw;
111
+ }
112
+ export function persistError(sessionId, taskId, error, phase) {
113
+ addMessage(sessionId, "system", `[${phase}] Task ${taskId} error: ${error}`);
114
+ const db = getDb();
115
+ db.update(tasksTable)
116
+ .set({
117
+ status: "failed",
118
+ agentOutput: `[${phase}] ${error}`,
119
+ updatedAt: new Date(),
120
+ })
121
+ .where(eq(tasksTable.id, taskId))
122
+ .run();
123
+ }
124
+ //# sourceMappingURL=error-handling.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-handling.js","sourceRoot":"","sources":["../../src/orchestrator/error-handling.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,KAAK,IAAI,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAGnD,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AAGpC,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,OAA0C,EAC1C,IAKC,EACD,MAAc,EACd,SAAiB;IAEjB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC;IAElC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QAE3D,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;YAC1B,2CAA2C;YAC3C,UAAU,CACR,SAAS,EACT,QAAQ,EACR,QAAQ,MAAM,4BAA4B,MAAM,CAAC,QAAQ,kCAAkC,CAC5F,CAAC;YAEF,MAAM,WAAW,GAAG,GAAG,IAAI,CAAC,MAAM,8EAA8E,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,0CAA0C,CAAC;YAEvL,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC;gBACxC,GAAG,IAAI;gBACP,MAAM,EAAE,WAAW;gBACnB,OAAO;aACR,CAAC,CAAC;YAEH,IAAI,WAAW,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;gBAC/B,UAAU,CACR,SAAS,EACT,QAAQ,EACR,QAAQ,MAAM,kCAAkC,WAAW,CAAC,QAAQ,GAAG,CACxE,CAAC;YACJ,CAAC;YAED,OAAO,WAAW,CAAC;QACrB,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAEjE,mBAAmB;QACnB,IAAI,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YAClC,UAAU,CACR,SAAS,EACT,QAAQ,EACR,QAAQ,MAAM,qBAAqB,OAAO,sBAAsB,CACjE,CAAC;YAEF,IAAI,CAAC;gBACH,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;gBAChE,OAAO,WAAW,CAAC;YACrB,CAAC;YAAC,OAAO,QAAQ,EAAE,CAAC;gBAClB,MAAM,QAAQ,GACZ,QAAQ,YAAY,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBAClE,UAAU,CACR,SAAS,EACT,QAAQ,EACR,QAAQ,MAAM,2BAA2B,QAAQ,EAAE,CACpD,CAAC;gBACF,MAAM,QAAQ,CAAC;YACjB,CAAC;QACH,CAAC;QAED,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAC9B,YAAoB,EACpB,SAAiB,EACjB,QAAsB;IAEtB,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;IACnB,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ;YAAE,SAAS;QACvC,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,SAAS;QAE9B,MAAM,IAAI,GAAa,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAClD,IAAI,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;YAChC,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC;iBAClB,GAAG,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC;iBACjD,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;iBACjC,GAAG,EAAE,CAAC;YAET,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACtB,UAAU,CACR,SAAS,EACT,QAAQ,EACR,QAAQ,IAAI,CAAC,EAAE,wBAAwB,YAAY,SAAS,CAC7D,CAAC;YAEF,+BAA+B;YAC/B,OAAO,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,8BAA8B,CAC5C,QAAgB,EAChB,MAAc,EACd,SAAiB;IAEjB,IAAI,CAAC;QACH,sBAAsB;QACtB,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,QAAQ,EAAE,aAAa,CAAC,EAAE,QAAQ,CAAC,CAAC;QACxD,MAAM,YAAY,GAAG,MAAM;aACxB,KAAK,CAAC,IAAI,CAAC;aACX,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;QAElE,IAAI,CAAC,YAAY;YAAE,OAAO,IAAI,CAAC;QAE/B,UAAU,CACR,SAAS,EACT,QAAQ,EACR,QAAQ,MAAM,0DAA0D,CACzE,CAAC;QAEF,mDAAmD;QACnD,IAAI,CAAC;YACH,GAAG,CAAC,CAAC,UAAU,EAAE,UAAU,EAAE,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;YAC7C,GAAG,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,QAAQ,CAAC,CAAC;YAC7B,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,UAAU,CACR,SAAS,EACT,QAAQ,EACR,QAAQ,MAAM,sCAAsC,CACrD,CAAC;YACF,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,cAAc,GAA4B;IAC9C,CAAC,gBAAgB,EAAE,8EAA8E,CAAC;IAClG,CAAC,SAAS,EAAE,qFAAqF,CAAC;IAClG,CAAC,oCAAoC,EAAE,sEAAsE,CAAC;IAC9G,CAAC,4BAA4B,EAAE,gEAAgE,CAAC;IAChG,CAAC,oCAAoC,EAAE,uDAAuD,CAAC;IAC/F,CAAC,iCAAiC,EAAE,gDAAgD,CAAC;IACrF,CAAC,eAAe,EAAE,sFAAsF,CAAC;CAC1G,CAAC;AAEF,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,KAAK,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,cAAc,EAAE,CAAC;QAC7C,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACtB,OAAO,GAAG,GAAG,aAAa,IAAI,EAAE,CAAC;QACnC,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,SAAiB,EACjB,MAAc,EACd,KAAa,EACb,KAAa;IAEb,UAAU,CACR,SAAS,EACT,QAAQ,EACR,IAAI,KAAK,UAAU,MAAM,WAAW,KAAK,EAAE,CAC5C,CAAC;IAEF,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;IACnB,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC;SAClB,GAAG,CAAC;QACH,MAAM,EAAE,QAAQ;QAChB,WAAW,EAAE,IAAI,KAAK,KAAK,KAAK,EAAE;QAClC,SAAS,EAAE,IAAI,IAAI,EAAE;KACtB,CAAC;SACD,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;SAChC,GAAG,EAAE,CAAC;AACX,CAAC"}
@@ -0,0 +1,36 @@
1
+ export interface PlanDelta {
2
+ modifiedTasks: Array<{
3
+ id: string;
4
+ changes: string;
5
+ }>;
6
+ newTasks: Array<{
7
+ id: string;
8
+ title: string;
9
+ description: string;
10
+ filesLikelyTouched: string[];
11
+ dependsOn: string[];
12
+ acceptanceCriteria: string[];
13
+ }>;
14
+ summary: string;
15
+ }
16
+ export declare function buildFeedbackPrompt(planJson: string, allTasks: Array<{
17
+ id: string;
18
+ title: string;
19
+ status: string;
20
+ description: string;
21
+ diffPatch: string | null;
22
+ }>, feedbackText: string, iterationHistory: Array<{
23
+ iterationNumber: number;
24
+ feedback: string;
25
+ planDelta: string | null;
26
+ }>): string;
27
+ export declare function parsePlanDelta(output: string): PlanDelta;
28
+ export declare function applyPlanDelta(sessionId: string, delta: PlanDelta): void;
29
+ export declare function createIteration(sessionId: string, feedbackText: string, planDelta: PlanDelta | null): number;
30
+ export declare function getIterationHistory(sessionId: string): {
31
+ iterationNumber: number;
32
+ feedback: string;
33
+ planDelta: string | null;
34
+ }[];
35
+ export declare function handleFeedback(sessionId: string, feedbackText: string): Promise<void>;
36
+ //# sourceMappingURL=feedback-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feedback-handler.d.ts","sourceRoot":"","sources":["../../src/orchestrator/feedback-handler.ts"],"names":[],"mappings":"AAmBA,MAAM,WAAW,SAAS;IACxB,aAAa,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACtD,QAAQ,EAAE,KAAK,CAAC;QACd,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,MAAM,CAAC;QACpB,kBAAkB,EAAE,MAAM,EAAE,CAAC;QAC7B,SAAS,EAAE,MAAM,EAAE,CAAC;QACpB,kBAAkB,EAAE,MAAM,EAAE,CAAC;KAC9B,CAAC,CAAC;IACH,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,KAAK,CAAC;IACd,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B,CAAC,EACF,YAAY,EAAE,MAAM,EACpB,gBAAgB,EAAE,KAAK,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B,CAAC,GACD,MAAM,CA0CR;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAqCxD;AAED,wBAAgB,cAAc,CAC5B,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,SAAS,GACf,IAAI,CA8CN;AAED,wBAAgB,eAAe,CAC7B,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,SAAS,GAAG,IAAI,GAC1B,MAAM,CA4BR;AAED,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM;;;;IAYpD;AAED,wBAAsB,cAAc,CAClC,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC,CAmLf"}