agentopia 1.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 (140) hide show
  1. package/.claude/settings.local.json +28 -0
  2. package/dist/app.d.ts +10 -0
  3. package/dist/app.d.ts.map +1 -0
  4. package/dist/app.js +121 -0
  5. package/dist/app.js.map +1 -0
  6. package/dist/config.d.ts +9 -0
  7. package/dist/config.d.ts.map +1 -0
  8. package/dist/config.js +19 -0
  9. package/dist/config.js.map +1 -0
  10. package/dist/db/database.d.ts +5 -0
  11. package/dist/db/database.d.ts.map +1 -0
  12. package/dist/db/database.js +39 -0
  13. package/dist/db/database.js.map +1 -0
  14. package/dist/db/schema.d.ts +3 -0
  15. package/dist/db/schema.d.ts.map +1 -0
  16. package/dist/db/schema.js +621 -0
  17. package/dist/db/schema.js.map +1 -0
  18. package/dist/index.d.ts +2 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +49 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/logger.d.ts +4 -0
  23. package/dist/logger.d.ts.map +1 -0
  24. package/dist/logger.js +9 -0
  25. package/dist/logger.js.map +1 -0
  26. package/dist/middleware/auth.d.ts +13 -0
  27. package/dist/middleware/auth.d.ts.map +1 -0
  28. package/dist/middleware/auth.js +733 -0
  29. package/dist/middleware/auth.js.map +1 -0
  30. package/dist/routes/agents.d.ts +3 -0
  31. package/dist/routes/agents.d.ts.map +1 -0
  32. package/dist/routes/agents.js +1058 -0
  33. package/dist/routes/agents.js.map +1 -0
  34. package/dist/routes/issues.d.ts +4 -0
  35. package/dist/routes/issues.d.ts.map +1 -0
  36. package/dist/routes/issues.js +946 -0
  37. package/dist/routes/issues.js.map +1 -0
  38. package/dist/routes/knowledge.d.ts +3 -0
  39. package/dist/routes/knowledge.d.ts.map +1 -0
  40. package/dist/routes/knowledge.js +117 -0
  41. package/dist/routes/knowledge.js.map +1 -0
  42. package/dist/routes/memories.d.ts +3 -0
  43. package/dist/routes/memories.d.ts.map +1 -0
  44. package/dist/routes/memories.js +115 -0
  45. package/dist/routes/memories.js.map +1 -0
  46. package/dist/routes/messages.d.ts +3 -0
  47. package/dist/routes/messages.d.ts.map +1 -0
  48. package/dist/routes/messages.js +130 -0
  49. package/dist/routes/messages.js.map +1 -0
  50. package/dist/routes/projects.d.ts +3 -0
  51. package/dist/routes/projects.d.ts.map +1 -0
  52. package/dist/routes/projects.js +754 -0
  53. package/dist/routes/projects.js.map +1 -0
  54. package/dist/routes/templates.d.ts +3 -0
  55. package/dist/routes/templates.d.ts.map +1 -0
  56. package/dist/routes/templates.js +117 -0
  57. package/dist/routes/templates.js.map +1 -0
  58. package/dist/routes/ui.d.ts +3 -0
  59. package/dist/routes/ui.d.ts.map +1 -0
  60. package/dist/routes/ui.js +38 -0
  61. package/dist/routes/ui.js.map +1 -0
  62. package/dist/services/agent-hierarchy.d.ts +14 -0
  63. package/dist/services/agent-hierarchy.d.ts.map +1 -0
  64. package/dist/services/agent-hierarchy.js +58 -0
  65. package/dist/services/agent-hierarchy.js.map +1 -0
  66. package/dist/services/agent-issue-batch.d.ts +17 -0
  67. package/dist/services/agent-issue-batch.d.ts.map +1 -0
  68. package/dist/services/agent-issue-batch.js +57 -0
  69. package/dist/services/agent-issue-batch.js.map +1 -0
  70. package/dist/services/controller.d.ts +4 -0
  71. package/dist/services/controller.d.ts.map +1 -0
  72. package/dist/services/controller.js +237 -0
  73. package/dist/services/controller.js.map +1 -0
  74. package/dist/services/langgraph-runner.d.ts +33 -0
  75. package/dist/services/langgraph-runner.d.ts.map +1 -0
  76. package/dist/services/langgraph-runner.js +478 -0
  77. package/dist/services/langgraph-runner.js.map +1 -0
  78. package/dist/services/orchestrator.d.ts +9 -0
  79. package/dist/services/orchestrator.d.ts.map +1 -0
  80. package/dist/services/orchestrator.js +116 -0
  81. package/dist/services/orchestrator.js.map +1 -0
  82. package/dist/services/pre-controller.d.ts +7 -0
  83. package/dist/services/pre-controller.d.ts.map +1 -0
  84. package/dist/services/pre-controller.js +101 -0
  85. package/dist/services/pre-controller.js.map +1 -0
  86. package/dist/services/process-manager.d.ts +67 -0
  87. package/dist/services/process-manager.d.ts.map +1 -0
  88. package/dist/services/process-manager.js +938 -0
  89. package/dist/services/process-manager.js.map +1 -0
  90. package/dist/services/project-permissions.d.ts +84 -0
  91. package/dist/services/project-permissions.d.ts.map +1 -0
  92. package/dist/services/project-permissions.js +129 -0
  93. package/dist/services/project-permissions.js.map +1 -0
  94. package/dist/services/scheduler.d.ts +6 -0
  95. package/dist/services/scheduler.d.ts.map +1 -0
  96. package/dist/services/scheduler.js +300 -0
  97. package/dist/services/scheduler.js.map +1 -0
  98. package/dist/services/system-prompt.d.ts +3 -0
  99. package/dist/services/system-prompt.d.ts.map +1 -0
  100. package/dist/services/system-prompt.js +285 -0
  101. package/dist/services/system-prompt.js.map +1 -0
  102. package/dist/services/terminal.d.ts +18 -0
  103. package/dist/services/terminal.d.ts.map +1 -0
  104. package/dist/services/terminal.js +222 -0
  105. package/dist/services/terminal.js.map +1 -0
  106. package/dist/services/websocket.d.ts +15 -0
  107. package/dist/services/websocket.d.ts.map +1 -0
  108. package/dist/services/websocket.js +204 -0
  109. package/dist/services/websocket.js.map +1 -0
  110. package/dist/types.d.ts +108 -0
  111. package/dist/types.d.ts.map +1 -0
  112. package/dist/types.js +3 -0
  113. package/dist/types.js.map +1 -0
  114. package/env.ini +18 -0
  115. package/package.json +38 -0
  116. package/project_id +0 -0
  117. package/public/admin-users.html +188 -0
  118. package/public/agent.html +199 -0
  119. package/public/css/issues.css +275 -0
  120. package/public/css/style.css +1299 -0
  121. package/public/index.html +166 -0
  122. package/public/issue.html +76 -0
  123. package/public/js/agent.js +19 -0
  124. package/public/js/common.js +735 -0
  125. package/public/js/dashboard.js +772 -0
  126. package/public/js/files-panel.js +703 -0
  127. package/public/js/interactive-terminal.js +201 -0
  128. package/public/js/issue-renderer.js +559 -0
  129. package/public/js/issue.js +57 -0
  130. package/public/js/project.js +2425 -0
  131. package/public/js/terminal.js +564 -0
  132. package/public/project.html +430 -0
  133. package/public/terminal.html +67 -0
  134. package/public/vendor/marked.js +74 -0
  135. package/public/vendor/xterm-addon-fit.js +2 -0
  136. package/public/vendor/xterm.css +209 -0
  137. package/public/vendor/xterm.js +2 -0
  138. package/send_message_and_update_issue.js +65 -0
  139. package/tsconfig.json +19 -0
  140. package/update_round2_and_create_round3.js +284 -0
@@ -0,0 +1,237 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.buildControllerTaskPrompt = buildControllerTaskPrompt;
7
+ exports.triggerControllerAgent = triggerControllerAgent;
8
+ const database_1 = require("../db/database");
9
+ const orchestrator_1 = require("./orchestrator");
10
+ const logger_1 = __importDefault(require("../logger"));
11
+ const TRIGGER_DEBOUNCE_MS = 180000; // 3 minutes — reduce idle triggers to save cost
12
+ function buildActivitySnapshot(projectId) {
13
+ const db = (0, database_1.getDatabase)();
14
+ const issueStats = db.prepare(`SELECT
15
+ COUNT(*) AS active_count,
16
+ SUM(CASE WHEN assigned_to IS NULL OR assigned_to = 'all' THEN 1 ELSE 0 END) AS unassigned_count,
17
+ SUM(CASE WHEN assigned_to = 'user' THEN 1 ELSE 0 END) AS user_waiting_count,
18
+ SUM(CASE WHEN status = 'open' THEN 1 ELSE 0 END) AS open_count,
19
+ SUM(CASE WHEN status = 'in_progress' THEN 1 ELSE 0 END) AS in_progress_count,
20
+ MAX(updated_at) AS issue_updated_max
21
+ FROM issues
22
+ WHERE project_id = ? AND status IN ('open', 'in_progress')`).get(projectId);
23
+ const commentStats = db.prepare(`SELECT
24
+ COUNT(*) AS comment_count,
25
+ MAX(ic.created_at) AS comment_created_max
26
+ FROM issue_comments ic
27
+ JOIN issues i ON ic.issue_id = i.id
28
+ WHERE i.project_id = ?`).get(projectId);
29
+ const workerStats = db.prepare(`SELECT
30
+ SUM(CASE WHEN status = 'idle' AND paused = 0 THEN 1 ELSE 0 END) AS idle_count,
31
+ SUM(CASE WHEN status = 'running' THEN 1 ELSE 0 END) AS running_count,
32
+ SUM(CASE WHEN status = 'error' THEN 1 ELSE 0 END) AS error_count,
33
+ SUM(CASE WHEN paused = 1 THEN 1 ELSE 0 END) AS paused_count,
34
+ MAX(finished_at) AS finished_max
35
+ FROM agents
36
+ WHERE project_id = ? AND is_controller = 0`).get(projectId);
37
+ return [
38
+ issueStats?.active_count ?? 0,
39
+ issueStats?.unassigned_count ?? 0,
40
+ issueStats?.user_waiting_count ?? 0,
41
+ issueStats?.open_count ?? 0,
42
+ issueStats?.in_progress_count ?? 0,
43
+ issueStats?.issue_updated_max || '',
44
+ commentStats?.comment_count ?? 0,
45
+ commentStats?.comment_created_max || '',
46
+ workerStats?.idle_count ?? 0,
47
+ workerStats?.running_count ?? 0,
48
+ workerStats?.error_count ?? 0,
49
+ workerStats?.paused_count ?? 0,
50
+ workerStats?.finished_max || '',
51
+ ].join('|');
52
+ }
53
+ function buildControllerTaskPrompt(project, triggerIssueNumber) {
54
+ const db = (0, database_1.getDatabase)();
55
+ const issues = triggerIssueNumber
56
+ ? db.prepare("SELECT * FROM issues WHERE project_id = ? AND number = ?").all(project.id, triggerIssueNumber)
57
+ : db.prepare("SELECT * FROM issues WHERE project_id = ? AND status IN ('open', 'in_progress') ORDER BY priority DESC, created_at").all(project.id);
58
+ // Pending issues: already decomposed into sub-issues, show summary only
59
+ const pendingIssues = triggerIssueNumber
60
+ ? []
61
+ : db.prepare("SELECT * FROM issues WHERE project_id = ? AND status = 'pending' ORDER BY priority DESC, created_at").all(project.id);
62
+ const agents = db.prepare('SELECT id, name, role, status, paused, is_controller FROM agents WHERE project_id = ?').all(project.id);
63
+ const workers = agents.filter((a) => !a.is_controller);
64
+ const priorityLabel = (p) => (p >= 10 ? '🔴 USER' : p >= 5 ? '🟡 CTRL' : '⚪ AGENT');
65
+ // Build child issue count map for parent-child display
66
+ const childCounts = db.prepare(`SELECT parent_id, COUNT(*) as total,
67
+ SUM(CASE WHEN status IN ('done','closed') THEN 1 ELSE 0 END) as completed
68
+ FROM issues WHERE project_id = ? AND parent_id IS NOT NULL
69
+ GROUP BY parent_id`).all(project.id);
70
+ const childCountMap = new Map(childCounts.map((r) => [r.parent_id, r]));
71
+ const unassigned = issues.filter((i) => !i.assigned_to || i.assigned_to === 'all');
72
+ const assigned = issues.filter((i) => i.assigned_to && i.assigned_to !== 'all');
73
+ const formatIssue = (i) => {
74
+ const assignee = i.assigned_to
75
+ ? (workers.find((a) => a.id === i.assigned_to)?.name || (i.assigned_to === 'user' ? 'User' : i.assigned_to))
76
+ : 'unassigned';
77
+ const labels = i.labels ? ` [${i.labels}]` : '';
78
+ // Parent-child info
79
+ const parentInfo = i.parent_id
80
+ ? ` [child of #${db.prepare('SELECT number FROM issues WHERE id = ?').get(i.parent_id)?.number || '?'}]`
81
+ : '';
82
+ const cc = childCountMap.get(i.id);
83
+ const childInfo = cc ? ` [children: ${cc.completed}/${cc.total} done]` : '';
84
+ const comments = db.prepare('SELECT author_id, body, created_at FROM issue_comments WHERE issue_id = ? ORDER BY created_at').all(i.id);
85
+ const commentsText = comments.length > 0
86
+ ? '\n Comments:\n' + comments.map((c) => {
87
+ const author = c.author_id === 'user'
88
+ ? 'User'
89
+ : (workers.find((a) => a.id === c.author_id)?.name || c.author_id.slice(0, 8));
90
+ return ` [${author}] ${c.body || ''}`;
91
+ }).join('\n')
92
+ : '';
93
+ return `#${i.number} [${priorityLabel(i.priority)}] [${i.status}] ${i.title} -> ${assignee}${labels}${parentInfo}${childInfo}\n ${i.body || ''}${commentsText}`;
94
+ };
95
+ const doneRecent = db.prepare("SELECT * FROM issues WHERE project_id = ? AND status IN ('done', 'closed') ORDER BY updated_at DESC").all(project.id);
96
+ const triggerHint = triggerIssueNumber
97
+ ? `\n## Trigger Context\n本次由 issue #${triggerIssueNumber} 触发,仅展示该 issue 信息。如需查看所有 issue,请通过 API 查询。\n`
98
+ : '';
99
+ return `## Project Task
100
+ ${project.task_description}
101
+ ${triggerHint}
102
+ ## Unassigned Issues (${unassigned.length}) - ACTION REQUIRED
103
+ ${unassigned.map(formatIssue).join('\n\n') || 'None - all issues are assigned.'}
104
+
105
+ ## Assigned / In-Progress Issues (${assigned.length})
106
+ ${assigned.map(formatIssue).join('\n\n') || 'None.'}
107
+
108
+ ## Pending Issues (${pendingIssues.length}) — waiting for sub-issues to complete
109
+ ${pendingIssues.map((i) => {
110
+ const assignee = i.assigned_to
111
+ ? (workers.find((a) => a.id === i.assigned_to)?.name || (i.assigned_to === 'user' ? 'User' : i.assigned_to))
112
+ : 'unassigned';
113
+ const cc = childCountMap.get(i.id);
114
+ const progress = cc ? ` [${cc.completed}/${cc.total} done]` : '';
115
+ return `#${i.number} [pending] ${i.title} -> ${assignee}${progress}`;
116
+ }).join('\n') || 'None.'}
117
+
118
+ ## Recently Completed (${doneRecent.length})
119
+ ${doneRecent.map((i) => `#${i.number} [${i.status}] ${i.title}`).join('\n') || 'None.'}
120
+
121
+ ## Existing Workers
122
+ ${workers.map((a) => {
123
+ let line = `- ${a.name} (ID: ${a.id}, Status: ${a.status}${a.paused ? ', ⏸ PAUSED' : ''}, Role: ${a.role})`;
124
+ if (a.paused) {
125
+ line = `- ⏸ ${a.name} PAUSED (ID: ${a.id}, Role: ${a.role}) — user paused, do NOT start, do NOT assign issues, do NOT call unpause`;
126
+ }
127
+ else if (a.status === 'error') {
128
+ const errLog = db.prepare("SELECT content FROM conversation_logs WHERE agent_id = ? AND stream = 'stderr' ORDER BY id DESC LIMIT 1").get(a.id);
129
+ const errMsg = errLog?.content || 'Unknown error';
130
+ line = `- ⚠️ ${a.name} ERRORED (ID: ${a.id}, Role: ${a.role}) — last error: ${errMsg}`;
131
+ }
132
+ return line;
133
+ }).join('\n') || '(none yet)'}
134
+
135
+ ## Rules
136
+ 1. **复用agent。** NEVER create a new agent if one with a similar role already exists. Reuse existing agents.
137
+ 2. **分配unassigned issues。** 将未分配的issue分配给合适的idle agent,或"user"用于需要人工处理的任务。
138
+ 3. **不要手动启动agent。** 系统会自动启动有assigned issue的idle agent,你只需要分配issue即可。**NEVER start paused agents。NEVER assign issues to paused agents。NEVER call unpause on paused agents — only the user can unpause。**
139
+ 4. **拆分issue用parent_id。** 将大issue拆成子issue时,创建子issue时设置\`parent_id\`指向父issue的ID,然后将父issue状态设为\`pending\`。系统会自动追踪子issue进度,全部完成后自动通知。创建子issue示例:\`{"title":"子任务","parent_id":"父issue的ID",...}\`
140
+ 5. **用户issue自动回流。** 用户创建的issue完成后,系统会自动assign回user,你不需要手动处理。但如果你发现用户issue的结果需要补充说明,可以添加评论。
141
+ 6. **NEVER自己写代码。** Controller只负责协调和决策。所有代码修改(无论大小)都必须分配给开发agent。
142
+ 7. **与用户沟通用issue。** 需要用户输入、审批、决策时,创建issue assigned给"user"。
143
+ 8. **NEVER长时间等待。** 不要用sleep/wait/poll。如需等worker完成就直接退出,系统会在worker完成后自动触发你。每次turn应在60秒内完成。
144
+ 9. **需求需用户确认。** 产品agent提出的新功能需求必须先分配给"user"等待确认。Bug修复可以直接分配开发。
145
+ 10. **开发→测试流程。** 开发完成后创建测试验证issue(设parent_id关联父issue)分配给测试agent。测试通过标done,发现bug创建bug issue分配给开发。
146
+ 11. **新issue还是新session。** 启动worker时通过start API的\`force_new_session\`决定:任务相关用默认session,全新任务用\`"force_new_session": true\`。
147
+
148
+ Assignable targets: ${agents.map((a) => `"${a.id}" (${a.name})`).join(', ')}, "user" for human tasks, or "all" to broadcast to everyone.`;
149
+ }
150
+ const lastTriggerTime = new Map();
151
+ const lastTriggerAtMs = new Map();
152
+ const lastTriggerSnapshot = new Map();
153
+ function hasNewActivity(projectId, since) {
154
+ const db = (0, database_1.getDatabase)();
155
+ const newIssues = db.prepare("SELECT 1 FROM issues WHERE project_id = ? AND (created_at > ? OR updated_at > ?) LIMIT 1").get(projectId, since, since);
156
+ if (newIssues)
157
+ return true;
158
+ const newComments = db.prepare("SELECT 1 FROM issue_comments ic JOIN issues i ON ic.issue_id = i.id WHERE i.project_id = ? AND ic.created_at > ? LIMIT 1").get(projectId, since);
159
+ if (newComments)
160
+ return true;
161
+ const agentChanges = db.prepare("SELECT 1 FROM agents WHERE project_id = ? AND is_controller = 0 AND finished_at > ? LIMIT 1").get(projectId, since);
162
+ if (agentChanges)
163
+ return true;
164
+ return false;
165
+ }
166
+ function nowAsDbTimestamp() {
167
+ return new Date().toISOString().replace('T', ' ').replace('Z', '');
168
+ }
169
+ function triggerControllerAgent(project, skipActivityCheck = false, triggerIssueNumber) {
170
+ const db = (0, database_1.getDatabase)();
171
+ const controller = db.prepare('SELECT * FROM agents WHERE project_id = ? AND is_controller = 1').get(project.id);
172
+ if (!controller) {
173
+ logger_1.default.warn(`No controller agent found for project ${project.id}`);
174
+ return;
175
+ }
176
+ if (controller.status === 'running') {
177
+ logger_1.default.info(`Controller agent for project ${project.id} is already running, skipping.`);
178
+ return;
179
+ }
180
+ if (controller.paused) {
181
+ logger_1.default.info(`Controller agent for project ${project.id} is paused, skipping.`);
182
+ return;
183
+ }
184
+ const now = Date.now();
185
+ // Idle-period optimization: skip LLM call entirely when controller has nothing to do.
186
+ if (!triggerIssueNumber) {
187
+ // Check 1: any issues that need controller to assign or handle?
188
+ const needsControllerAction = db.prepare(`SELECT 1 FROM issues WHERE project_id = ? AND status IN ('open', 'in_progress')
189
+ AND (assigned_to IS NULL OR assigned_to = 'all' OR assigned_to IN (
190
+ SELECT id FROM agents WHERE project_id = ? AND is_controller = 1
191
+ )) LIMIT 1`).get(project.id, project.id);
192
+ if (!needsControllerAction) {
193
+ // Check 2: any workers in error state that controller might need to handle?
194
+ const errorWorkers = db.prepare(`SELECT 1 FROM agents WHERE project_id = ? AND is_controller = 0 AND status = 'error' AND paused = 0 LIMIT 1`).get(project.id);
195
+ if (!errorWorkers) {
196
+ logger_1.default.info(`Skipping controller trigger: no unassigned issues and no errored workers in project "${project.name}"`);
197
+ return;
198
+ }
199
+ // If there are errored workers, let controller handle them
200
+ logger_1.default.info(`Controller trigger: errored workers detected in project "${project.name}"`);
201
+ }
202
+ }
203
+ if (!skipActivityCheck) {
204
+ const lastAt = lastTriggerAtMs.get(project.id);
205
+ if (lastAt && now - lastAt < TRIGGER_DEBOUNCE_MS) {
206
+ logger_1.default.info(`Skipping controller trigger: debounced (${now - lastAt}ms < ${TRIGGER_DEBOUNCE_MS}ms) for project "${project.name}"`);
207
+ return;
208
+ }
209
+ const since = lastTriggerTime.get(project.id);
210
+ if (since && !hasNewActivity(project.id, since)) {
211
+ logger_1.default.info(`Skipping controller trigger: no new activity since last run for project "${project.name}"`);
212
+ return;
213
+ }
214
+ }
215
+ const snapshot = buildActivitySnapshot(project.id);
216
+ if (!skipActivityCheck) {
217
+ const prevSnapshot = lastTriggerSnapshot.get(project.id);
218
+ if (prevSnapshot && prevSnapshot === snapshot) {
219
+ logger_1.default.info(`Skipping controller trigger: no-op snapshot unchanged for project "${project.name}"`);
220
+ return;
221
+ }
222
+ }
223
+ const triggerTime = nowAsDbTimestamp();
224
+ const taskPrompt = buildControllerTaskPrompt(project, triggerIssueNumber);
225
+ lastTriggerAtMs.set(project.id, now);
226
+ try {
227
+ logger_1.default.info(`Triggering controller agent for project "${project.name}"`);
228
+ (0, orchestrator_1.startControllerOrchestration)({ project, controller, taskPrompt, triggerIssueNumber });
229
+ lastTriggerTime.set(project.id, triggerTime);
230
+ lastTriggerSnapshot.set(project.id, snapshot);
231
+ }
232
+ catch (err) {
233
+ lastTriggerAtMs.delete(project.id);
234
+ throw err;
235
+ }
236
+ }
237
+ //# sourceMappingURL=controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controller.js","sourceRoot":"","sources":["../../src/services/controller.ts"],"names":[],"mappings":";;;;;AA2DA,8DA6HC;AA+BD,wDAwFC;AA/SD,6CAA6C;AAE7C,iDAA8D;AAC9D,uDAA+B;AAE/B,MAAM,mBAAmB,GAAG,MAAM,CAAC,CAAC,gDAAgD;AAEpF,SAAS,qBAAqB,CAAC,SAAiB;IAC9C,MAAM,EAAE,GAAG,IAAA,sBAAW,GAAE,CAAC;IAEzB,MAAM,UAAU,GAAG,EAAE,CAAC,OAAO,CAC3B;;;;;;;;+DAQ2D,CAC5D,CAAC,GAAG,CAAC,SAAS,CAAQ,CAAC;IAExB,MAAM,YAAY,GAAG,EAAE,CAAC,OAAO,CAC7B;;;;;2BAKuB,CACxB,CAAC,GAAG,CAAC,SAAS,CAAQ,CAAC;IAExB,MAAM,WAAW,GAAG,EAAE,CAAC,OAAO,CAC5B;;;;;;;+CAO2C,CAC5C,CAAC,GAAG,CAAC,SAAS,CAAQ,CAAC;IAExB,OAAO;QACL,UAAU,EAAE,YAAY,IAAI,CAAC;QAC7B,UAAU,EAAE,gBAAgB,IAAI,CAAC;QACjC,UAAU,EAAE,kBAAkB,IAAI,CAAC;QACnC,UAAU,EAAE,UAAU,IAAI,CAAC;QAC3B,UAAU,EAAE,iBAAiB,IAAI,CAAC;QAClC,UAAU,EAAE,iBAAiB,IAAI,EAAE;QACnC,YAAY,EAAE,aAAa,IAAI,CAAC;QAChC,YAAY,EAAE,mBAAmB,IAAI,EAAE;QACvC,WAAW,EAAE,UAAU,IAAI,CAAC;QAC5B,WAAW,EAAE,aAAa,IAAI,CAAC;QAC/B,WAAW,EAAE,WAAW,IAAI,CAAC;QAC7B,WAAW,EAAE,YAAY,IAAI,CAAC;QAC9B,WAAW,EAAE,YAAY,IAAI,EAAE;KAChC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACd,CAAC;AAED,SAAgB,yBAAyB,CAAC,OAAgB,EAAE,kBAA2B;IACrF,MAAM,EAAE,GAAG,IAAA,sBAAW,GAAE,CAAC;IAEzB,MAAM,MAAM,GAAG,kBAAkB;QAC/B,CAAC,CAAC,EAAE,CAAC,OAAO,CACR,0DAA0D,CAC3D,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,kBAAkB,CAAY;QAClD,CAAC,CAAC,EAAE,CAAC,OAAO,CACR,oHAAoH,CACrH,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAY,CAAC;IAEjC,wEAAwE;IACxE,MAAM,aAAa,GAAG,kBAAkB;QACtC,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,EAAE,CAAC,OAAO,CACR,qGAAqG,CACtG,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAY,CAAC;IAEjC,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CACvB,uFAAuF,CACxF,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAU,CAAC;IAE3B,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;IAC5D,MAAM,aAAa,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAE5F,uDAAuD;IACvD,MAAM,WAAW,GAAG,EAAE,CAAC,OAAO,CAC5B;;;wBAGoB,CACrB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAU,CAAC;IAC3B,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAE7E,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,WAAW,KAAK,KAAK,CAAC,CAAC;IACnF,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,WAAW,KAAK,KAAK,CAAC,CAAC;IAEhF,MAAM,WAAW,GAAG,CAAC,CAAQ,EAAU,EAAE;QACvC,MAAM,QAAQ,GAAG,CAAC,CAAC,WAAW;YAC5B,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,WAAW,CAAC,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,WAAW,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;YACjH,CAAC,CAAC,YAAY,CAAC;QACjB,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAEhD,oBAAoB;QACpB,MAAM,UAAU,GAAG,CAAC,CAAC,SAAS;YAC5B,CAAC,CAAC,eAAgB,EAAE,CAAC,OAAO,CAAC,wCAAwC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAS,EAAE,MAAM,IAAI,GAAG,GAAG;YACjH,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,EAAE,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACnC,MAAM,SAAS,GAAG,EAAE,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,SAAS,IAAI,EAAE,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;QAE5E,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CACzB,+FAA+F,CAChG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAA+C,CAAC;QAE1D,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC;YACtC,CAAC,CAAC,kBAAkB,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;gBACtC,MAAM,MAAM,GAAG,CAAC,CAAC,SAAS,KAAK,MAAM;oBACnC,CAAC,CAAC,MAAM;oBACR,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,SAAS,CAAC,EAAE,IAAI,IAAI,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBACtF,OAAO,OAAO,MAAM,KAAK,CAAC,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;YAC1C,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YACf,CAAC,CAAC,EAAE,CAAC;QAEP,OAAO,IAAI,CAAC,CAAC,MAAM,KAAK,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,KAAK,OAAO,QAAQ,GAAG,MAAM,GAAG,UAAU,GAAG,SAAS,QAAQ,CAAC,CAAC,IAAI,IAAI,EAAE,GAAG,YAAY,EAAE,CAAC;IACpK,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,EAAE,CAAC,OAAO,CAC3B,qGAAqG,CACtG,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAY,CAAC;IAE7B,MAAM,WAAW,GAAG,kBAAkB;QACpC,CAAC,CAAC,oCAAoC,kBAAkB,8CAA8C;QACtG,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO;EACP,OAAO,CAAC,gBAAgB;EACxB,WAAW;wBACW,UAAU,CAAC,MAAM;EACvC,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,iCAAiC;;oCAE3C,QAAQ,CAAC,MAAM;EACjD,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,OAAO;;qBAE9B,aAAa,CAAC,MAAM;EACvC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACtB,MAAM,QAAQ,GAAG,CAAC,CAAC,WAAW;YAC5B,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,WAAW,CAAC,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,WAAW,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;YACjH,CAAC,CAAC,YAAY,CAAC;QACjB,MAAM,EAAE,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACnC,MAAM,QAAQ,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,SAAS,IAAI,EAAE,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;QACjE,OAAO,IAAI,CAAC,CAAC,MAAM,cAAc,CAAC,CAAC,KAAK,OAAO,QAAQ,GAAG,QAAQ,EAAE,CAAC;IACvE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,OAAO;;yBAED,UAAU,CAAC,MAAM;EACxC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,OAAO;;;EAGpF,OAAO,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE;QACrB,IAAI,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,IAAI,GAAG,CAAC;QAC5G,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;YACb,IAAI,GAAG,OAAO,CAAC,CAAC,IAAI,gBAAgB,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,IAAI,0EAA0E,CAAC;QACtI,CAAC;aAAM,IAAI,CAAC,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;YAChC,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CACvB,yGAAyG,CAC1G,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAoC,CAAC;YAC/C,MAAM,MAAM,GAAG,MAAM,EAAE,OAAO,IAAI,eAAe,CAAC;YAClD,IAAI,GAAG,QAAQ,CAAC,CAAC,IAAI,iBAAiB,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,IAAI,mBAAmB,MAAM,EAAE,CAAC;QACzF,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,YAAY;;;;;;;;;;;;;;;sBAeT,MAAM,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,8DAA8D,CAAC;AAC/I,CAAC;AAED,MAAM,eAAe,GAAG,IAAI,GAAG,EAAkB,CAAC;AAClD,MAAM,eAAe,GAAG,IAAI,GAAG,EAAkB,CAAC;AAClD,MAAM,mBAAmB,GAAG,IAAI,GAAG,EAAkB,CAAC;AAEtD,SAAS,cAAc,CAAC,SAAiB,EAAE,KAAa;IACtD,MAAM,EAAE,GAAG,IAAA,sBAAW,GAAE,CAAC;IAEzB,MAAM,SAAS,GAAG,EAAE,CAAC,OAAO,CAC1B,0FAA0F,CAC3F,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IAC/B,IAAI,SAAS;QAAE,OAAO,IAAI,CAAC;IAE3B,MAAM,WAAW,GAAG,EAAE,CAAC,OAAO,CAC5B,0HAA0H,CAC3H,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IACxB,IAAI,WAAW;QAAE,OAAO,IAAI,CAAC;IAE7B,MAAM,YAAY,GAAG,EAAE,CAAC,OAAO,CAC7B,6FAA6F,CAC9F,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IACxB,IAAI,YAAY;QAAE,OAAO,IAAI,CAAC;IAE9B,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,gBAAgB;IACvB,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;AACrE,CAAC;AAED,SAAgB,sBAAsB,CAAC,OAAgB,EAAE,iBAAiB,GAAG,KAAK,EAAE,kBAA2B;IAC7G,MAAM,EAAE,GAAG,IAAA,sBAAW,GAAE,CAAC;IACzB,MAAM,UAAU,GAAG,EAAE,CAAC,OAAO,CAC3B,iEAAiE,CAClE,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAsB,CAAC;IAEvC,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,gBAAM,CAAC,IAAI,CAAC,yCAAyC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;QACnE,OAAO;IACT,CAAC;IAED,IAAI,UAAU,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACpC,gBAAM,CAAC,IAAI,CAAC,gCAAgC,OAAO,CAAC,EAAE,gCAAgC,CAAC,CAAC;QACxF,OAAO;IACT,CAAC;IAED,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;QACtB,gBAAM,CAAC,IAAI,CAAC,gCAAgC,OAAO,CAAC,EAAE,uBAAuB,CAAC,CAAC;QAC/E,OAAO;IACT,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAEvB,sFAAsF;IACtF,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACxB,gEAAgE;QAChE,MAAM,qBAAqB,GAAG,EAAE,CAAC,OAAO,CACtC;;;kBAGY,CACb,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;QAE9B,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAC3B,4EAA4E;YAC5E,MAAM,YAAY,GAAG,EAAE,CAAC,OAAO,CAC7B,6GAA6G,CAC9G,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAElB,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,gBAAM,CAAC,IAAI,CAAC,wFAAwF,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC;gBACrH,OAAO;YACT,CAAC;YACD,2DAA2D;YAC3D,gBAAM,CAAC,IAAI,CAAC,4DAA4D,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC;QAC3F,CAAC;IACH,CAAC;IAED,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC/C,IAAI,MAAM,IAAI,GAAG,GAAG,MAAM,GAAG,mBAAmB,EAAE,CAAC;YACjD,gBAAM,CAAC,IAAI,CACT,2CAA2C,GAAG,GAAG,MAAM,QAAQ,mBAAmB,oBAAoB,OAAO,CAAC,IAAI,GAAG,CACtH,CAAC;YACF,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC9C,IAAI,KAAK,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC;YAChD,gBAAM,CAAC,IAAI,CAAC,4EAA4E,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC;YACzG,OAAO;QACT,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,qBAAqB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACnD,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACvB,MAAM,YAAY,GAAG,mBAAmB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACzD,IAAI,YAAY,IAAI,YAAY,KAAK,QAAQ,EAAE,CAAC;YAC9C,gBAAM,CAAC,IAAI,CAAC,sEAAsE,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC;YACnG,OAAO;QACT,CAAC;IACH,CAAC;IAED,MAAM,WAAW,GAAG,gBAAgB,EAAE,CAAC;IACvC,MAAM,UAAU,GAAG,yBAAyB,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;IAE1E,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IAErC,IAAI,CAAC;QACH,gBAAM,CAAC,IAAI,CAAC,4CAA4C,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC;QACzE,IAAA,2CAA4B,EAAC,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAEtF,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;QAC7C,mBAAmB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;IAChD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACnC,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC"}
@@ -0,0 +1,33 @@
1
+ import { Agent, Project } from '../types';
2
+ export interface LangGraphControllerInput {
3
+ project: Project;
4
+ controller: Agent;
5
+ taskPrompt: string;
6
+ triggerIssueNumber?: number;
7
+ }
8
+ export interface OrchestrationWorkerAction {
9
+ agentId: string;
10
+ issueIds: string[];
11
+ issueNumbers: number[];
12
+ reason: string;
13
+ }
14
+ export interface OrchestrationDispatchResult {
15
+ agentId: string;
16
+ started: boolean;
17
+ message: string;
18
+ runId?: string;
19
+ pid?: number;
20
+ }
21
+ export type ControllerDecision = 'execute_controller' | 'finish';
22
+ export declare function runControllerWithLangGraph(input: LangGraphControllerInput): Promise<{
23
+ controllerStarted: boolean;
24
+ runId?: string;
25
+ pid?: number;
26
+ decision: ControllerDecision;
27
+ dispatchSummary: string;
28
+ dispatchCount: number;
29
+ controllerReasons: string[];
30
+ actions: OrchestrationWorkerAction[];
31
+ dispatchResults: OrchestrationDispatchResult[];
32
+ }>;
33
+ //# sourceMappingURL=langgraph-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"langgraph-runner.d.ts","sourceRoot":"","sources":["../../src/services/langgraph-runner.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAS,OAAO,EAAE,MAAM,UAAU,CAAC;AAQjD,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,KAAK,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,2BAA2B;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,MAAM,kBAAkB,GAAG,oBAAoB,GAAG,QAAQ,CAAC;AAiiBjE,wBAAsB,0BAA0B,CAC9C,KAAK,EAAE,wBAAwB,GAC9B,OAAO,CAAC;IACT,iBAAiB,EAAE,OAAO,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,OAAO,EAAE,yBAAyB,EAAE,CAAC;IACrC,eAAe,EAAE,2BAA2B,EAAE,CAAC;CAChD,CAAC,CA2BD"}