mcp-subagents-opencode 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 (219) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +602 -0
  3. package/build/config/timeouts.d.ts +9 -0
  4. package/build/config/timeouts.d.ts.map +1 -0
  5. package/build/config/timeouts.js +18 -0
  6. package/build/config/timeouts.js.map +1 -0
  7. package/build/helpers.d.ts +6 -0
  8. package/build/helpers.d.ts.map +1 -0
  9. package/build/helpers.js +47 -0
  10. package/build/helpers.js.map +1 -0
  11. package/build/index.d.ts +3 -0
  12. package/build/index.d.ts.map +1 -0
  13. package/build/index.js +245 -0
  14. package/build/index.js.map +1 -0
  15. package/build/models.d.ts +32 -0
  16. package/build/models.d.ts.map +1 -0
  17. package/build/models.js +58 -0
  18. package/build/models.js.map +1 -0
  19. package/build/server/register-notifications.d.ts +3 -0
  20. package/build/server/register-notifications.d.ts.map +1 -0
  21. package/build/server/register-notifications.js +77 -0
  22. package/build/server/register-notifications.js.map +1 -0
  23. package/build/server/register-resources.d.ts +3 -0
  24. package/build/server/register-resources.d.ts.map +1 -0
  25. package/build/server/register-resources.js +210 -0
  26. package/build/server/register-resources.js.map +1 -0
  27. package/build/server/register-retry-execution.d.ts +2 -0
  28. package/build/server/register-retry-execution.d.ts.map +1 -0
  29. package/build/server/register-retry-execution.js +28 -0
  30. package/build/server/register-retry-execution.js.map +1 -0
  31. package/build/server/register-tasks.d.ts +3 -0
  32. package/build/server/register-tasks.d.ts.map +1 -0
  33. package/build/server/register-tasks.js +52 -0
  34. package/build/server/register-tasks.js.map +1 -0
  35. package/build/server/register-tools.d.ts +3 -0
  36. package/build/server/register-tools.d.ts.map +1 -0
  37. package/build/server/register-tools.js +32 -0
  38. package/build/server/register-tools.js.map +1 -0
  39. package/build/server/resource-helpers.d.ts +21 -0
  40. package/build/server/resource-helpers.d.ts.map +1 -0
  41. package/build/server/resource-helpers.js +84 -0
  42. package/build/server/resource-helpers.js.map +1 -0
  43. package/build/services/account-manager.d.ts +88 -0
  44. package/build/services/account-manager.d.ts.map +1 -0
  45. package/build/services/account-manager.js +239 -0
  46. package/build/services/account-manager.js.map +1 -0
  47. package/build/services/claude-code-runner.d.ts +15 -0
  48. package/build/services/claude-code-runner.d.ts.map +1 -0
  49. package/build/services/claude-code-runner.js +475 -0
  50. package/build/services/claude-code-runner.js.map +1 -0
  51. package/build/services/client-context.d.ts +31 -0
  52. package/build/services/client-context.d.ts.map +1 -0
  53. package/build/services/client-context.js +44 -0
  54. package/build/services/client-context.js.map +1 -0
  55. package/build/services/exhaustion-fallback.d.ts +27 -0
  56. package/build/services/exhaustion-fallback.d.ts.map +1 -0
  57. package/build/services/exhaustion-fallback.js +30 -0
  58. package/build/services/exhaustion-fallback.js.map +1 -0
  59. package/build/services/fallback-orchestrator.d.ts +16 -0
  60. package/build/services/fallback-orchestrator.d.ts.map +1 -0
  61. package/build/services/fallback-orchestrator.js +48 -0
  62. package/build/services/fallback-orchestrator.js.map +1 -0
  63. package/build/services/opencode-client.d.ts +40 -0
  64. package/build/services/opencode-client.d.ts.map +1 -0
  65. package/build/services/opencode-client.js +147 -0
  66. package/build/services/opencode-client.js.map +1 -0
  67. package/build/services/opencode-spawner.d.ts +56 -0
  68. package/build/services/opencode-spawner.d.ts.map +1 -0
  69. package/build/services/opencode-spawner.js +426 -0
  70. package/build/services/opencode-spawner.js.map +1 -0
  71. package/build/services/output-file.d.ts +24 -0
  72. package/build/services/output-file.d.ts.map +1 -0
  73. package/build/services/output-file.js +90 -0
  74. package/build/services/output-file.js.map +1 -0
  75. package/build/services/progress-registry.d.ts +12 -0
  76. package/build/services/progress-registry.d.ts.map +1 -0
  77. package/build/services/progress-registry.js +97 -0
  78. package/build/services/progress-registry.js.map +1 -0
  79. package/build/services/question-registry.d.ts +79 -0
  80. package/build/services/question-registry.d.ts.map +1 -0
  81. package/build/services/question-registry.js +249 -0
  82. package/build/services/question-registry.js.map +1 -0
  83. package/build/services/retry-queue.d.ts +41 -0
  84. package/build/services/retry-queue.d.ts.map +1 -0
  85. package/build/services/retry-queue.js +195 -0
  86. package/build/services/retry-queue.js.map +1 -0
  87. package/build/services/sdk-client-manager.d.ts +149 -0
  88. package/build/services/sdk-client-manager.d.ts.map +1 -0
  89. package/build/services/sdk-client-manager.js +632 -0
  90. package/build/services/sdk-client-manager.js.map +1 -0
  91. package/build/services/sdk-session-adapter.d.ts +203 -0
  92. package/build/services/sdk-session-adapter.d.ts.map +1 -0
  93. package/build/services/sdk-session-adapter.js +1088 -0
  94. package/build/services/sdk-session-adapter.js.map +1 -0
  95. package/build/services/sdk-spawner.d.ts +42 -0
  96. package/build/services/sdk-spawner.d.ts.map +1 -0
  97. package/build/services/sdk-spawner.js +488 -0
  98. package/build/services/sdk-spawner.js.map +1 -0
  99. package/build/services/session-hooks.d.ts +24 -0
  100. package/build/services/session-hooks.d.ts.map +1 -0
  101. package/build/services/session-hooks.js +130 -0
  102. package/build/services/session-hooks.js.map +1 -0
  103. package/build/services/session-snapshot.d.ts +19 -0
  104. package/build/services/session-snapshot.d.ts.map +1 -0
  105. package/build/services/session-snapshot.js +203 -0
  106. package/build/services/session-snapshot.js.map +1 -0
  107. package/build/services/subscription-registry.d.ts +12 -0
  108. package/build/services/subscription-registry.d.ts.map +1 -0
  109. package/build/services/subscription-registry.js +27 -0
  110. package/build/services/subscription-registry.js.map +1 -0
  111. package/build/services/task-manager.d.ts +150 -0
  112. package/build/services/task-manager.d.ts.map +1 -0
  113. package/build/services/task-manager.js +765 -0
  114. package/build/services/task-manager.js.map +1 -0
  115. package/build/services/task-persistence.d.ts +29 -0
  116. package/build/services/task-persistence.d.ts.map +1 -0
  117. package/build/services/task-persistence.js +159 -0
  118. package/build/services/task-persistence.js.map +1 -0
  119. package/build/services/task-status-mapper.d.ts +21 -0
  120. package/build/services/task-status-mapper.d.ts.map +1 -0
  121. package/build/services/task-status-mapper.js +171 -0
  122. package/build/services/task-status-mapper.js.map +1 -0
  123. package/build/templates/index.d.ts +22 -0
  124. package/build/templates/index.d.ts.map +1 -0
  125. package/build/templates/index.js +147 -0
  126. package/build/templates/index.js.map +1 -0
  127. package/build/templates/overlays/coder-csharp.mdx +58 -0
  128. package/build/templates/overlays/coder-go.mdx +53 -0
  129. package/build/templates/overlays/coder-java.mdx +54 -0
  130. package/build/templates/overlays/coder-kotlin.mdx +56 -0
  131. package/build/templates/overlays/coder-nextjs.mdx +65 -0
  132. package/build/templates/overlays/coder-python.mdx +53 -0
  133. package/build/templates/overlays/coder-react.mdx +55 -0
  134. package/build/templates/overlays/coder-ruby.mdx +59 -0
  135. package/build/templates/overlays/coder-rust.mdx +48 -0
  136. package/build/templates/overlays/coder-supabase.mdx +268 -0
  137. package/build/templates/overlays/coder-supastarter.mdx +313 -0
  138. package/build/templates/overlays/coder-swift.mdx +56 -0
  139. package/build/templates/overlays/coder-tauri.mdx +566 -0
  140. package/build/templates/overlays/coder-triggerdev.mdx +296 -0
  141. package/build/templates/overlays/coder-typescript.mdx +45 -0
  142. package/build/templates/overlays/coder-vue.mdx +62 -0
  143. package/build/templates/overlays/planner-architecture.mdx +78 -0
  144. package/build/templates/overlays/planner-bugfix.mdx +36 -0
  145. package/build/templates/overlays/planner-feature.mdx +38 -0
  146. package/build/templates/overlays/planner-migration.mdx +50 -0
  147. package/build/templates/overlays/planner-refactor.mdx +57 -0
  148. package/build/templates/overlays/researcher-library.mdx +59 -0
  149. package/build/templates/overlays/researcher-performance.mdx +68 -0
  150. package/build/templates/overlays/researcher-security.mdx +86 -0
  151. package/build/templates/overlays/tester-graphql.mdx +191 -0
  152. package/build/templates/overlays/tester-playwright.mdx +621 -0
  153. package/build/templates/overlays/tester-rest.mdx +101 -0
  154. package/build/templates/overlays/tester-suite.mdx +177 -0
  155. package/build/templates/super-coder.mdx +529 -0
  156. package/build/templates/super-planner.mdx +568 -0
  157. package/build/templates/super-researcher.mdx +406 -0
  158. package/build/templates/super-tester.mdx +243 -0
  159. package/build/tools/answer-question.d.ts +30 -0
  160. package/build/tools/answer-question.d.ts.map +1 -0
  161. package/build/tools/answer-question.js +108 -0
  162. package/build/tools/answer-question.js.map +1 -0
  163. package/build/tools/cancel-task.d.ts +44 -0
  164. package/build/tools/cancel-task.d.ts.map +1 -0
  165. package/build/tools/cancel-task.js +144 -0
  166. package/build/tools/cancel-task.js.map +1 -0
  167. package/build/tools/send-message.d.ts +39 -0
  168. package/build/tools/send-message.d.ts.map +1 -0
  169. package/build/tools/send-message.js +124 -0
  170. package/build/tools/send-message.js.map +1 -0
  171. package/build/tools/shared-spawn.d.ts +56 -0
  172. package/build/tools/shared-spawn.d.ts.map +1 -0
  173. package/build/tools/shared-spawn.js +114 -0
  174. package/build/tools/shared-spawn.js.map +1 -0
  175. package/build/tools/spawn-agent.d.ts +85 -0
  176. package/build/tools/spawn-agent.d.ts.map +1 -0
  177. package/build/tools/spawn-agent.js +133 -0
  178. package/build/tools/spawn-agent.js.map +1 -0
  179. package/build/tools/spawn-coder.d.ts +70 -0
  180. package/build/tools/spawn-coder.d.ts.map +1 -0
  181. package/build/tools/spawn-coder.js +71 -0
  182. package/build/tools/spawn-coder.js.map +1 -0
  183. package/build/tools/spawn-planner.d.ts +70 -0
  184. package/build/tools/spawn-planner.d.ts.map +1 -0
  185. package/build/tools/spawn-planner.js +71 -0
  186. package/build/tools/spawn-planner.js.map +1 -0
  187. package/build/tools/spawn-researcher.d.ts +70 -0
  188. package/build/tools/spawn-researcher.d.ts.map +1 -0
  189. package/build/tools/spawn-researcher.js +70 -0
  190. package/build/tools/spawn-researcher.js.map +1 -0
  191. package/build/tools/spawn-task.d.ts +74 -0
  192. package/build/tools/spawn-task.d.ts.map +1 -0
  193. package/build/tools/spawn-task.js +107 -0
  194. package/build/tools/spawn-task.js.map +1 -0
  195. package/build/tools/spawn-tester.d.ts +70 -0
  196. package/build/tools/spawn-tester.d.ts.map +1 -0
  197. package/build/tools/spawn-tester.js +69 -0
  198. package/build/tools/spawn-tester.js.map +1 -0
  199. package/build/types.d.ts +101 -0
  200. package/build/types.d.ts.map +1 -0
  201. package/build/types.js +28 -0
  202. package/build/types.js.map +1 -0
  203. package/build/utils/brief-validator.d.ts +30 -0
  204. package/build/utils/brief-validator.d.ts.map +1 -0
  205. package/build/utils/brief-validator.js +254 -0
  206. package/build/utils/brief-validator.js.map +1 -0
  207. package/build/utils/format.d.ts +34 -0
  208. package/build/utils/format.d.ts.map +1 -0
  209. package/build/utils/format.js +55 -0
  210. package/build/utils/format.js.map +1 -0
  211. package/build/utils/sanitize.d.ts +240 -0
  212. package/build/utils/sanitize.d.ts.map +1 -0
  213. package/build/utils/sanitize.js +89 -0
  214. package/build/utils/sanitize.js.map +1 -0
  215. package/build/utils/task-id-generator.d.ts +10 -0
  216. package/build/utils/task-id-generator.d.ts.map +1 -0
  217. package/build/utils/task-id-generator.js +22 -0
  218. package/build/utils/task-id-generator.js.map +1 -0
  219. package/package.json +62 -0
@@ -0,0 +1,210 @@
1
+ import { ListResourcesRequestSchema, ReadResourceRequestSchema, ListResourceTemplatesRequestSchema, SubscribeRequestSchema, UnsubscribeRequestSchema, McpError, ErrorCode, } from '@modelcontextprotocol/sdk/types.js';
2
+ import { taskManager } from '../services/task-manager.js';
3
+ import { getSpawnerStats } from '../services/opencode-spawner.js';
4
+ import { subscriptionRegistry, taskIdToUri, uriToTaskId } from '../services/subscription-registry.js';
5
+ import { TaskStatus } from '../types.js';
6
+ import { TASK_ALL_URI, SYSTEM_STATUS_URI, canSendMessage, extractMessageStats, filterOutputForResource, parseOutputToExecutionLog, } from './resource-helpers.js';
7
+ export function registerResourceHandlers(server) {
8
+ server.setRequestHandler(ListResourcesRequestSchema, async () => {
9
+ const allTasks = taskManager.getAllTasks();
10
+ const pendingQuestions = allTasks.filter((t) => t.pendingQuestion).length;
11
+ const running = allTasks.filter((t) => t.status === TaskStatus.RUNNING).length;
12
+ const resources = [
13
+ {
14
+ uri: SYSTEM_STATUS_URI,
15
+ name: 'System Status',
16
+ description: `Tasks: ${allTasks.length} (${running} running${pendingQuestions ? `, ${pendingQuestions} paused` : ''})`,
17
+ mimeType: 'application/json',
18
+ },
19
+ {
20
+ uri: TASK_ALL_URI,
21
+ name: 'All Tasks',
22
+ description: `${allTasks.length} tasks - replaces list_tasks tool`,
23
+ mimeType: 'application/json',
24
+ },
25
+ ...allTasks.map((task) => {
26
+ let desc = `${task.status}`;
27
+ if (task.pendingQuestion)
28
+ desc += ' (question pending)';
29
+ if (task.labels?.length)
30
+ desc += ` [${task.labels.join(', ')}]`;
31
+ return {
32
+ uri: taskIdToUri(task.id),
33
+ name: task.id,
34
+ description: desc,
35
+ mimeType: 'application/json',
36
+ };
37
+ }),
38
+ ];
39
+ return { resources };
40
+ });
41
+ server.setRequestHandler(ListResourceTemplatesRequestSchema, async () => ({
42
+ resourceTemplates: [
43
+ {
44
+ uriTemplate: 'task:///{task_id}',
45
+ name: 'Task Details',
46
+ description: 'Full task status, output, and session info.',
47
+ mimeType: 'application/json',
48
+ },
49
+ {
50
+ uriTemplate: 'task:///{task_id}/session',
51
+ name: 'Task Session',
52
+ description: 'Execution log with tool calls.',
53
+ mimeType: 'application/json',
54
+ },
55
+ ],
56
+ }));
57
+ server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
58
+ const uri = request.params.uri;
59
+ if (uri === SYSTEM_STATUS_URI) {
60
+ const allTasks = taskManager.getAllTasks();
61
+ const spawnerStats = getSpawnerStats();
62
+ const data = {
63
+ opencode: {
64
+ base_url: spawnerStats.baseUrl,
65
+ active_tasks: spawnerStats.activeTasks,
66
+ },
67
+ tasks: {
68
+ total: allTasks.length,
69
+ by_status: {
70
+ running: allTasks.filter((t) => t.status === TaskStatus.RUNNING).length,
71
+ completed: allTasks.filter((t) => t.status === TaskStatus.COMPLETED).length,
72
+ failed: allTasks.filter((t) => t.status === TaskStatus.FAILED).length,
73
+ rate_limited: allTasks.filter((t) => t.status === TaskStatus.RATE_LIMITED).length,
74
+ pending: allTasks.filter((t) => t.status === TaskStatus.PENDING).length,
75
+ waiting: allTasks.filter((t) => t.status === TaskStatus.WAITING).length,
76
+ },
77
+ with_pending_questions: allTasks.filter((t) => t.pendingQuestion).map((t) => t.id),
78
+ },
79
+ };
80
+ return {
81
+ contents: [{ uri, mimeType: 'application/json', text: JSON.stringify(data) }],
82
+ };
83
+ }
84
+ if (uri === TASK_ALL_URI) {
85
+ const allTasks = taskManager.getAllTasks();
86
+ const data = {
87
+ count: allTasks.length,
88
+ tasks: allTasks.map((task) => {
89
+ const stats = extractMessageStats(task.output);
90
+ return {
91
+ id: task.id,
92
+ status: task.status,
93
+ round: stats.round,
94
+ total_messages: stats.totalMessages,
95
+ last_user_message: stats.lastUserMessage,
96
+ labels: task.labels,
97
+ has_pending_question: !!task.pendingQuestion,
98
+ pending_question: task.pendingQuestion?.question,
99
+ can_send_message: canSendMessage(task),
100
+ session_id: task.sessionId,
101
+ started: task.startTime,
102
+ ended: task.endTime,
103
+ };
104
+ }),
105
+ pending_questions: allTasks
106
+ .filter((t) => t.pendingQuestion)
107
+ .map((t) => ({
108
+ task_id: t.id,
109
+ question: t.pendingQuestion.question,
110
+ choices: t.pendingQuestion.choices,
111
+ })),
112
+ };
113
+ return {
114
+ contents: [{ uri, mimeType: 'application/json', text: JSON.stringify(data) }],
115
+ };
116
+ }
117
+ if (uri.includes('/session')) {
118
+ const taskId = uri.replace('task:///', '').replace('/session', '');
119
+ const task = taskManager.getTask(taskId);
120
+ if (!task) {
121
+ throw new McpError(ErrorCode.InvalidParams, `Task not found: ${taskId}`);
122
+ }
123
+ const executionLog = parseOutputToExecutionLog(task.output);
124
+ const toolCount = executionLog.reduce((sum, e) => sum + e.tools.length, 0);
125
+ const data = {
126
+ task_id: task.id,
127
+ status: task.status,
128
+ execution_summary: {
129
+ turns: executionLog.length,
130
+ tool_calls: toolCount,
131
+ },
132
+ execution_log: executionLog,
133
+ can_send_message: canSendMessage(task),
134
+ };
135
+ return {
136
+ contents: [{ uri, mimeType: 'application/json', text: JSON.stringify(data) }],
137
+ };
138
+ }
139
+ const taskId = uriToTaskId(uri);
140
+ if (!taskId) {
141
+ throw new McpError(ErrorCode.InvalidParams, `Invalid resource URI: ${uri}`);
142
+ }
143
+ const task = taskManager.getTask(taskId);
144
+ if (!task) {
145
+ throw new McpError(ErrorCode.InvalidParams, `Task not found: ${taskId}`);
146
+ }
147
+ const msgStats = extractMessageStats(task.output);
148
+ const filtered = filterOutputForResource(task.output);
149
+ const data = {
150
+ id: task.id,
151
+ status: task.status,
152
+ session_id: task.sessionId,
153
+ can_send_message: canSendMessage(task),
154
+ progress: {
155
+ round: msgStats.round,
156
+ total_messages: msgStats.totalMessages,
157
+ },
158
+ output_lines: task.output.length,
159
+ output_tail: filtered.slice(-50).join('\n'),
160
+ started: task.startTime,
161
+ ended: task.endTime,
162
+ exit_code: task.exitCode,
163
+ error: task.error,
164
+ cwd: task.cwd,
165
+ model: task.model,
166
+ labels: task.labels,
167
+ depends_on: task.dependsOn,
168
+ pending_question: task.pendingQuestion
169
+ ? {
170
+ question: task.pendingQuestion.question,
171
+ choices: task.pendingQuestion.choices,
172
+ allow_freeform: task.pendingQuestion.allowFreeform,
173
+ }
174
+ : undefined,
175
+ retry_info: task.retryInfo
176
+ ? {
177
+ reason: task.retryInfo.reason,
178
+ retry_count: task.retryInfo.retryCount,
179
+ max_retries: task.retryInfo.maxRetries,
180
+ next_retry: task.retryInfo.nextRetryTime,
181
+ }
182
+ : undefined,
183
+ quota_info: task.quotaInfo
184
+ ? {
185
+ remaining_pct: task.quotaInfo.remainingPercentage,
186
+ reset_date: task.quotaInfo.resetDate,
187
+ }
188
+ : undefined,
189
+ failure_context: task.failureContext
190
+ ? {
191
+ type: task.failureContext.errorType,
192
+ status_code: task.failureContext.statusCode,
193
+ recoverable: task.failureContext.recoverable,
194
+ }
195
+ : undefined,
196
+ };
197
+ return {
198
+ contents: [{ uri, mimeType: 'application/json', text: JSON.stringify(data) }],
199
+ };
200
+ });
201
+ server.setRequestHandler(SubscribeRequestSchema, async (request) => {
202
+ subscriptionRegistry.subscribe(request.params.uri);
203
+ return {};
204
+ });
205
+ server.setRequestHandler(UnsubscribeRequestSchema, async (request) => {
206
+ subscriptionRegistry.unsubscribe(request.params.uri);
207
+ return {};
208
+ });
209
+ }
210
+ //# sourceMappingURL=register-resources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register-resources.js","sourceRoot":"","sources":["../../src/server/register-resources.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function registerRetryAndExecutionCallbacks(): void;
2
+ //# sourceMappingURL=register-retry-execution.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register-retry-execution.d.ts","sourceRoot":"","sources":["../../src/server/register-retry-execution.ts"],"names":[],"mappings":"AAEA,wBAAgB,kCAAkC,IAAI,IAAI,CA2BzD"}
@@ -0,0 +1,28 @@
1
+ import { taskManager } from '../services/task-manager.js';
2
+ export function registerRetryAndExecutionCallbacks() {
3
+ taskManager.onRetry(async (task) => {
4
+ const { spawnOpenCodeTask } = await import('../services/opencode-spawner.js');
5
+ console.error(`[index] Retrying task ${task.id}: "${task.prompt.slice(0, 50)}..."`);
6
+ try {
7
+ const newTaskId = await spawnOpenCodeTask({
8
+ prompt: task.prompt,
9
+ cwd: task.cwd,
10
+ model: task.model,
11
+ autonomous: task.autonomous ?? true,
12
+ retryInfo: task.retryInfo,
13
+ fallbackAttempted: task.fallbackAttempted,
14
+ });
15
+ return newTaskId;
16
+ }
17
+ catch (err) {
18
+ console.error(`[index] Failed to retry task ${task.id}:`, err);
19
+ return undefined;
20
+ }
21
+ });
22
+ taskManager.onExecute(async (task) => {
23
+ const { executeWaitingTask } = await import('../services/opencode-spawner.js');
24
+ console.error(`[index] Executing waiting task ${task.id}: "${task.prompt.slice(0, 50)}..."`);
25
+ await executeWaitingTask(task);
26
+ });
27
+ }
28
+ //# sourceMappingURL=register-retry-execution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register-retry-execution.js","sourceRoot":"","sources":["../../src/server/register-retry-execution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAE1D,MAAM,UAAU,kCAAkC;IAChD,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACjC,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,iCAAiC,CAAC,CAAC;QAE9E,OAAO,CAAC,KAAK,CAAC,yBAAyB,IAAI,CAAC,EAAE,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;QAEpF,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,iBAAiB,CAAC;gBACxC,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,GAAG,EAAE,IAAI,CAAC,GAAG;gBACb,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,IAAI;gBACnC,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;aAC1C,CAAC,CAAC;YACH,OAAO,SAAS,CAAC;QACnB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,gCAAgC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;YAC/D,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,WAAW,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACnC,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,MAAM,CAAC,iCAAiC,CAAC,CAAC;QAC/E,OAAO,CAAC,KAAK,CAAC,kCAAkC,IAAI,CAAC,EAAE,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;QAC7F,MAAM,kBAAkB,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Server } from '@modelcontextprotocol/sdk/server/index.js';
2
+ export declare function registerTaskHandlers(server: Server): void;
3
+ //# sourceMappingURL=register-tasks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register-tasks.d.ts","sourceRoot":"","sources":["../../src/server/register-tasks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAcxE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAgDzD"}
@@ -0,0 +1,52 @@
1
+ import { GetTaskRequestSchema, ListTasksRequestSchema, CancelTaskRequestSchema, GetTaskPayloadRequestSchema, McpError, ErrorCode, } from '@modelcontextprotocol/sdk/types.js';
2
+ import { taskManager } from '../services/task-manager.js';
3
+ import { buildMCPTask } from '../services/task-status-mapper.js';
4
+ import { TERMINAL_STATUSES, TaskStatus } from '../types.js';
5
+ import { filterOutputForResource } from './resource-helpers.js';
6
+ export function registerTaskHandlers(server) {
7
+ server.setRequestHandler(GetTaskRequestSchema, async (request) => {
8
+ const task = taskManager.getTask(request.params.taskId);
9
+ if (!task) {
10
+ throw new McpError(ErrorCode.InvalidParams, `Task not found: ${request.params.taskId}`);
11
+ }
12
+ return buildMCPTask(task);
13
+ });
14
+ server.setRequestHandler(ListTasksRequestSchema, async (request) => {
15
+ const PAGE_SIZE = 50;
16
+ const allTasks = taskManager.getAllTasks();
17
+ const startIndex = request.params?.cursor ? parseInt(request.params.cursor, 10) : 0;
18
+ const page = allTasks.slice(startIndex, startIndex + PAGE_SIZE);
19
+ return {
20
+ tasks: page.map(buildMCPTask),
21
+ nextCursor: startIndex + PAGE_SIZE < allTasks.length ? String(startIndex + PAGE_SIZE) : undefined,
22
+ };
23
+ });
24
+ server.setRequestHandler(CancelTaskRequestSchema, async (request) => {
25
+ const { taskId } = request.params;
26
+ const task = taskManager.getTask(taskId);
27
+ if (!task) {
28
+ throw new McpError(ErrorCode.InvalidParams, `Task not found: ${taskId}`);
29
+ }
30
+ const result = taskManager.cancelTask(taskId);
31
+ if (!result.success) {
32
+ throw new McpError(ErrorCode.InvalidParams, result.error || 'Cannot cancel task');
33
+ }
34
+ return buildMCPTask(taskManager.getTask(taskId));
35
+ });
36
+ server.setRequestHandler(GetTaskPayloadRequestSchema, async (request) => {
37
+ const { taskId } = request.params;
38
+ const task = taskManager.getTask(taskId);
39
+ if (!task) {
40
+ throw new McpError(ErrorCode.InvalidParams, `Task not found: ${taskId}`);
41
+ }
42
+ if (!TERMINAL_STATUSES.has(task.status)) {
43
+ throw new McpError(ErrorCode.InvalidParams, `Task ${taskId} is still ${task.status}`);
44
+ }
45
+ const filtered = filterOutputForResource(task.output);
46
+ return {
47
+ content: [{ type: 'text', text: filtered.join('\n') }],
48
+ isError: task.status === TaskStatus.FAILED,
49
+ };
50
+ });
51
+ }
52
+ //# sourceMappingURL=register-tasks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register-tasks.js","sourceRoot":"","sources":["../../src/server/register-tasks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Server } from '@modelcontextprotocol/sdk/server/index.js';
2
+ export declare function registerToolHandlers(server: Server): void;
3
+ //# sourceMappingURL=register-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register-tools.d.ts","sourceRoot":"","sources":["../../src/server/register-tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAgBxE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAoBzD"}
@@ -0,0 +1,32 @@
1
+ import { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js';
2
+ import { mcpText } from '../utils/format.js';
3
+ import { spawnAgentTool, handleSpawnAgent } from '../tools/spawn-agent.js';
4
+ import { sendMessageTool, handleSendMessage } from '../tools/send-message.js';
5
+ import { cancelTaskTool, handleCancelTask } from '../tools/cancel-task.js';
6
+ import { answerQuestionTool, handleAnswerQuestion } from '../tools/answer-question.js';
7
+ const tools = [
8
+ spawnAgentTool,
9
+ sendMessageTool,
10
+ cancelTaskTool,
11
+ answerQuestionTool,
12
+ ];
13
+ export function registerToolHandlers(server) {
14
+ server.setRequestHandler(ListToolsRequestSchema, async () => ({
15
+ tools: tools.map((t) => ({ name: t.name, description: t.description, inputSchema: t.inputSchema })),
16
+ }));
17
+ server.setRequestHandler(CallToolRequestSchema, async (request, extra) => {
18
+ const { name, arguments: args } = request.params;
19
+ const ctx = {
20
+ progressToken: extra._meta?.progressToken,
21
+ sendNotification: extra.sendNotification,
22
+ };
23
+ switch (name) {
24
+ case 'spawn_agent': return handleSpawnAgent(args, ctx);
25
+ case 'send_message': return handleSendMessage(args, ctx);
26
+ case 'cancel_task': return handleCancelTask(args);
27
+ case 'answer_question': return handleAnswerQuestion(args);
28
+ default: return mcpText(`**Error:** Unknown tool \`${name}\`. Use MCP Resources: task:///all or task:///{id}`);
29
+ }
30
+ });
31
+ }
32
+ //# sourceMappingURL=register-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register-tools.js","sourceRoot":"","sources":["../../src/server/register-tools.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AACnG,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE7C,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAEvF,MAAM,KAAK,GAAG;IACZ,cAAc;IACd,eAAe;IACf,cAAc;IACd,kBAAkB;CACnB,CAAC;AAEF,MAAM,UAAU,oBAAoB,CAAC,MAAc;IACjD,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;QAC5D,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;KACpG,CAAC,CAAC,CAAC;IAEJ,MAAM,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QACvE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;QACjD,MAAM,GAAG,GAAgB;YACvB,aAAa,EAAE,KAAK,CAAC,KAAK,EAAE,aAAa;YACzC,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;SACzC,CAAC;QAEF,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,aAAa,CAAC,CAAC,OAAO,gBAAgB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YACvD,KAAK,cAAc,CAAC,CAAC,OAAO,iBAAiB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YACzD,KAAK,aAAa,CAAC,CAAC,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC;YAClD,KAAK,iBAAiB,CAAC,CAAC,OAAO,oBAAoB,CAAC,IAAI,CAAC,CAAC;YAC1D,OAAO,CAAC,CAAC,OAAO,OAAO,CAAC,6BAA6B,IAAI,oDAAoD,CAAC,CAAC;QACjH,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { TaskStatus } from '../types.js';
2
+ export declare const TASK_ALL_URI = "task:///all";
3
+ export declare const SYSTEM_STATUS_URI = "system:///status";
4
+ export declare function filterOutputForResource(output: string[]): string[];
5
+ export declare function parseOutputToExecutionLog(output: string[]): {
6
+ turn: number;
7
+ tools: Array<{
8
+ name: string;
9
+ duration?: string;
10
+ }>;
11
+ }[];
12
+ export declare function extractMessageStats(output: string[]): {
13
+ round: number;
14
+ lastUserMessage?: string;
15
+ totalMessages: number;
16
+ };
17
+ export declare function canSendMessage(task: {
18
+ status: TaskStatus;
19
+ sessionId?: string;
20
+ }): boolean;
21
+ //# sourceMappingURL=resource-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource-helpers.d.ts","sourceRoot":"","sources":["../../src/server/resource-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,eAAO,MAAM,YAAY,gBAAgB,CAAC;AAC1C,eAAO,MAAM,iBAAiB,qBAAqB,CAAC;AAIpD,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAQlE;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,EAAE;UAC3B,MAAM;WAAS,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAqCvF;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG;IACrD,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;CACvB,CAuBA;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAGxF"}
@@ -0,0 +1,84 @@
1
+ import { TaskStatus } from '../types.js';
2
+ export const TASK_ALL_URI = 'task:///all';
3
+ export const SYSTEM_STATUS_URI = 'system:///status';
4
+ const NOISE_PREFIXES = ['[reasoning]', '[usage]', '[quota]', '[hooks]', '[session]'];
5
+ export function filterOutputForResource(output) {
6
+ return output.filter((line) => {
7
+ for (const prefix of NOISE_PREFIXES) {
8
+ if (line.startsWith(prefix))
9
+ return false;
10
+ }
11
+ if (line.startsWith('[assistant] Turn ended') || line.startsWith('[assistant] Message complete'))
12
+ return false;
13
+ return true;
14
+ });
15
+ }
16
+ export function parseOutputToExecutionLog(output) {
17
+ const entries = [];
18
+ let currentTurn = 0;
19
+ let currentEntry = null;
20
+ for (const line of output) {
21
+ if (line.startsWith('--- Turn ')) {
22
+ if (currentEntry)
23
+ entries.push(currentEntry);
24
+ currentTurn++;
25
+ currentEntry = { turn: currentTurn, tools: [] };
26
+ continue;
27
+ }
28
+ if (line.includes('[assistant] Message complete') || line.includes('[turn]')) {
29
+ if (currentEntry)
30
+ entries.push(currentEntry);
31
+ currentTurn++;
32
+ currentEntry = { turn: currentTurn, tools: [] };
33
+ continue;
34
+ }
35
+ const compactMatch = line.match(/^\[tool\] (\S+) \((\d+)ms\)$/);
36
+ if (compactMatch && currentEntry) {
37
+ currentEntry.tools.push({ name: compactMatch[1], duration: `${compactMatch[2]}ms` });
38
+ continue;
39
+ }
40
+ if (line.includes('[tool] Starting:')) {
41
+ const match = line.match(/\[tool\] Starting: (\S+)/);
42
+ if (match && currentEntry)
43
+ currentEntry.tools.push({ name: match[1] });
44
+ }
45
+ if (line.includes('[tool] Completed:')) {
46
+ const match = line.match(/\[tool\] Completed: (\S+) \((\d+)ms\)/);
47
+ if (match && currentEntry && currentEntry.tools.length > 0) {
48
+ const lastTool = currentEntry.tools[currentEntry.tools.length - 1];
49
+ if (lastTool)
50
+ lastTool.duration = `${match[2]}ms`;
51
+ }
52
+ }
53
+ }
54
+ if (currentEntry)
55
+ entries.push(currentEntry);
56
+ return entries;
57
+ }
58
+ export function extractMessageStats(output) {
59
+ let round = 0;
60
+ let lastUserMessage;
61
+ let totalMessages = 0;
62
+ for (const line of output) {
63
+ if (line.startsWith('--- Turn ') || line.includes('[assistant] Message complete') || line.includes('[turn]')) {
64
+ round++;
65
+ totalMessages++;
66
+ }
67
+ if (line.includes('[user]') || line.includes('[prompt]') || line.includes('Sending prompt:')) {
68
+ const msgMatch = line.match(/(?:\[user\]|\[prompt\]|Sending prompt:)\s*(.+)/);
69
+ if (msgMatch) {
70
+ lastUserMessage = msgMatch[1].slice(0, 100) + (msgMatch[1].length > 100 ? '...' : '');
71
+ totalMessages++;
72
+ }
73
+ }
74
+ if (line.includes('[tool] Starting:')) {
75
+ totalMessages++;
76
+ }
77
+ }
78
+ return { round, lastUserMessage, totalMessages };
79
+ }
80
+ export function canSendMessage(task) {
81
+ const allowedStatuses = [TaskStatus.COMPLETED, TaskStatus.FAILED, TaskStatus.RATE_LIMITED, TaskStatus.TIMED_OUT];
82
+ return !!(task.sessionId && allowedStatuses.includes(task.status));
83
+ }
84
+ //# sourceMappingURL=resource-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource-helpers.js","sourceRoot":"","sources":["../../src/server/resource-helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Multi-Account Manager - In-memory round-robin rotation for GitHub PAT tokens.
3
+ *
4
+ * Supports up to 100 GitHub PAT tokens for failover on rate limits and errors.
5
+ * Key features:
6
+ * - Round-robin rotation through configured tokens
7
+ * - Automatic failover on rate limit (429) or server errors (5xx)
8
+ * - Reset to first token on MCP reconnect
9
+ * - Track failed tokens to skip them temporarily
10
+ */
11
+ interface AccountRotationResult {
12
+ success: boolean;
13
+ token?: string;
14
+ tokenIndex?: number;
15
+ allExhausted?: boolean;
16
+ error?: string;
17
+ }
18
+ declare class AccountManager {
19
+ private tokens;
20
+ private currentIndex;
21
+ private rotationCount;
22
+ private lastRotationTime?;
23
+ private initialized;
24
+ /**
25
+ * Initialize the account manager with GitHub PAT tokens.
26
+ * Tokens can be provided via:
27
+ * - GITHUB_PAT_TOKENS env var (comma-separated)
28
+ * - GITHUB_PAT_TOKEN_1, GITHUB_PAT_TOKEN_2, ... env vars
29
+ * - Direct configuration via setTokens()
30
+ */
31
+ initialize(): void;
32
+ /**
33
+ * Set tokens directly (useful for testing or programmatic configuration).
34
+ */
35
+ setTokens(tokens: string[]): void;
36
+ /**
37
+ * Get the current active token.
38
+ * Returns undefined if no tokens configured.
39
+ */
40
+ getCurrentToken(): string | undefined;
41
+ /**
42
+ * Get the current token index.
43
+ */
44
+ getCurrentIndex(): number;
45
+ /**
46
+ * Get total number of configured tokens.
47
+ */
48
+ getTokenCount(): number;
49
+ /**
50
+ * Check if multi-account mode is enabled (more than 1 token).
51
+ */
52
+ isMultiAccountEnabled(): boolean;
53
+ /**
54
+ * Reset to the first token (called on MCP reconnect).
55
+ */
56
+ reset(): void;
57
+ /**
58
+ * Rotate to the next available token.
59
+ * Called when current token encounters rate limit or error.
60
+ *
61
+ * @param reason - Reason for rotation (e.g., 'rate_limit', 'server_error')
62
+ * @returns Result with new token or exhausted status
63
+ */
64
+ rotateToNext(reason?: string): AccountRotationResult;
65
+ /**
66
+ * Check if rotation should happen based on error type.
67
+ * Returns true for rate limits (429) and server errors (5xx).
68
+ */
69
+ shouldRotate(statusCode?: number, errorMessage?: string): boolean;
70
+ /**
71
+ * Get statistics about token usage.
72
+ */
73
+ getStats(): {
74
+ totalTokens: number;
75
+ currentIndex: number;
76
+ rotationCount: number;
77
+ lastRotation?: string;
78
+ failedTokens: number;
79
+ availableTokens: number;
80
+ };
81
+ /**
82
+ * Get a masked version of the current token for logging.
83
+ */
84
+ getMaskedCurrentToken(): string;
85
+ }
86
+ export declare const accountManager: AccountManager;
87
+ export {};
88
+ //# sourceMappingURL=account-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account-manager.d.ts","sourceRoot":"","sources":["../../src/services/account-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAaH,UAAU,qBAAqB;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,cAAM,cAAc;IAClB,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,gBAAgB,CAAC,CAAO;IAChC,OAAO,CAAC,WAAW,CAAS;IAE5B;;;;;;OAMG;IACH,UAAU,IAAI,IAAI;IA2ClB;;OAEG;IACH,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI;IAejC;;;OAGG;IACH,eAAe,IAAI,MAAM,GAAG,SAAS;IAOrC;;OAEG;IACH,eAAe,IAAI,MAAM;IAIzB;;OAEG;IACH,aAAa,IAAI,MAAM;IAIvB;;OAEG;IACH,qBAAqB,IAAI,OAAO;IAIhC;;OAEG;IACH,KAAK,IAAI,IAAI;IAeb;;;;;;OAMG;IACH,YAAY,CAAC,MAAM,GAAE,MAAkB,GAAG,qBAAqB;IAqE/D;;;OAGG;IACH,YAAY,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO;IA6BjE;;OAEG;IACH,QAAQ,IAAI;QACV,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,MAAM,CAAC;QACtB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,YAAY,EAAE,MAAM,CAAC;QACrB,eAAe,EAAE,MAAM,CAAC;KACzB;IAgBD;;OAEG;IACH,qBAAqB,IAAI,MAAM;CAMhC;AAED,eAAO,MAAM,cAAc,gBAAuB,CAAC"}