contextos-mcp 0.4.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 (223) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +260 -0
  3. package/bin/mcp.mjs +61 -0
  4. package/bin/swarm.mjs +45 -0
  5. package/dist/agents/aider.d.ts +12 -0
  6. package/dist/agents/aider.js +192 -0
  7. package/dist/agents/aider.js.map +1 -0
  8. package/dist/agents/claude-code.d.ts +9 -0
  9. package/dist/agents/claude-code.js +236 -0
  10. package/dist/agents/claude-code.js.map +1 -0
  11. package/dist/agents/codex.d.ts +14 -0
  12. package/dist/agents/codex.js +203 -0
  13. package/dist/agents/codex.js.map +1 -0
  14. package/dist/agents/direct-llm.d.ts +22 -0
  15. package/dist/agents/direct-llm.js +254 -0
  16. package/dist/agents/direct-llm.js.map +1 -0
  17. package/dist/agents/mock.d.ts +10 -0
  18. package/dist/agents/mock.js +170 -0
  19. package/dist/agents/mock.js.map +1 -0
  20. package/dist/agents/opencode.d.ts +23 -0
  21. package/dist/agents/opencode.js +631 -0
  22. package/dist/agents/opencode.js.map +1 -0
  23. package/dist/agents/provider.d.ts +11 -0
  24. package/dist/agents/provider.js +31 -0
  25. package/dist/agents/provider.js.map +1 -0
  26. package/dist/compression/compressor.d.ts +28 -0
  27. package/dist/compression/compressor.js +268 -0
  28. package/dist/compression/compressor.js.map +1 -0
  29. package/dist/config.d.ts +43 -0
  30. package/dist/config.js +172 -0
  31. package/dist/config.js.map +1 -0
  32. package/dist/contextos/loader.d.ts +46 -0
  33. package/dist/contextos/loader.js +120 -0
  34. package/dist/contextos/loader.js.map +1 -0
  35. package/dist/contextos/selector.d.ts +46 -0
  36. package/dist/contextos/selector.js +80 -0
  37. package/dist/contextos/selector.js.map +1 -0
  38. package/dist/core/action-dispatcher.d.ts +15 -0
  39. package/dist/core/action-dispatcher.js +28 -0
  40. package/dist/core/action-dispatcher.js.map +1 -0
  41. package/dist/core/action-schema.d.ts +72 -0
  42. package/dist/core/action-schema.js +86 -0
  43. package/dist/core/action-schema.js.map +1 -0
  44. package/dist/core/repl-interface.d.ts +48 -0
  45. package/dist/core/repl-interface.js +5 -0
  46. package/dist/core/repl-interface.js.map +1 -0
  47. package/dist/core/repl.d.ts +59 -0
  48. package/dist/core/repl.js +353 -0
  49. package/dist/core/repl.js.map +1 -0
  50. package/dist/core/rlm.d.ts +65 -0
  51. package/dist/core/rlm.js +564 -0
  52. package/dist/core/rlm.js.map +1 -0
  53. package/dist/core/runtime.py +470 -0
  54. package/dist/core/types.d.ts +265 -0
  55. package/dist/core/types.js +19 -0
  56. package/dist/core/types.js.map +1 -0
  57. package/dist/env.d.ts +10 -0
  58. package/dist/env.js +75 -0
  59. package/dist/env.js.map +1 -0
  60. package/dist/hooks/runner.d.ts +43 -0
  61. package/dist/hooks/runner.js +173 -0
  62. package/dist/hooks/runner.js.map +1 -0
  63. package/dist/labs/cli.d.ts +15 -0
  64. package/dist/labs/cli.js +295 -0
  65. package/dist/labs/cli.js.map +1 -0
  66. package/dist/labs/episodic-memory.d.ts +132 -0
  67. package/dist/labs/episodic-memory.js +391 -0
  68. package/dist/labs/episodic-memory.js.map +1 -0
  69. package/dist/labs/interactive-swarm.d.ts +20 -0
  70. package/dist/labs/interactive-swarm.js +1173 -0
  71. package/dist/labs/interactive-swarm.js.map +1 -0
  72. package/dist/labs/interactive.d.ts +10 -0
  73. package/dist/labs/interactive.js +2099 -0
  74. package/dist/labs/interactive.js.map +1 -0
  75. package/dist/labs/ts-analyzer.d.ts +74 -0
  76. package/dist/labs/ts-analyzer.js +379 -0
  77. package/dist/labs/ts-analyzer.js.map +1 -0
  78. package/dist/labs/viewer.d.ts +12 -0
  79. package/dist/labs/viewer.js +1284 -0
  80. package/dist/labs/viewer.js.map +1 -0
  81. package/dist/main.d.ts +15 -0
  82. package/dist/main.js +247 -0
  83. package/dist/main.js.map +1 -0
  84. package/dist/mcp/server.d.ts +16 -0
  85. package/dist/mcp/server.js +192775 -0
  86. package/dist/mcp/server.js.map +1 -0
  87. package/dist/mcp/session.d.ts +117 -0
  88. package/dist/mcp/session.js +450 -0
  89. package/dist/mcp/session.js.map +1 -0
  90. package/dist/mcp/state.d.ts +42 -0
  91. package/dist/mcp/state.js +537 -0
  92. package/dist/mcp/state.js.map +1 -0
  93. package/dist/mcp/tools/contextos.d.ts +17 -0
  94. package/dist/mcp/tools/contextos.js +583 -0
  95. package/dist/mcp/tools/contextos.js.map +1 -0
  96. package/dist/mcp/tools.d.ts +15 -0
  97. package/dist/mcp/tools.js +393 -0
  98. package/dist/mcp/tools.js.map +1 -0
  99. package/dist/orchestration/reviewer-gate.d.ts +43 -0
  100. package/dist/orchestration/reviewer-gate.js +280 -0
  101. package/dist/orchestration/reviewer-gate.js.map +1 -0
  102. package/dist/orchestration/reviewer-prompt.d.ts +18 -0
  103. package/dist/orchestration/reviewer-prompt.js +67 -0
  104. package/dist/orchestration/reviewer-prompt.js.map +1 -0
  105. package/dist/orchestration/verification-runner.d.ts +53 -0
  106. package/dist/orchestration/verification-runner.js +352 -0
  107. package/dist/orchestration/verification-runner.js.map +1 -0
  108. package/dist/plugins/adapter.d.ts +11 -0
  109. package/dist/plugins/adapter.js +11 -0
  110. package/dist/plugins/adapter.js.map +1 -0
  111. package/dist/plugins/core/archive.d.ts +9 -0
  112. package/dist/plugins/core/archive.js +128 -0
  113. package/dist/plugins/core/archive.js.map +1 -0
  114. package/dist/plugins/core/digest.d.ts +11 -0
  115. package/dist/plugins/core/digest.js +70 -0
  116. package/dist/plugins/core/digest.js.map +1 -0
  117. package/dist/plugins/core/grants.d.ts +22 -0
  118. package/dist/plugins/core/grants.js +90 -0
  119. package/dist/plugins/core/grants.js.map +1 -0
  120. package/dist/plugins/core/index.d.ts +10 -0
  121. package/dist/plugins/core/index.js +11 -0
  122. package/dist/plugins/core/index.js.map +1 -0
  123. package/dist/plugins/core/pinning.d.ts +15 -0
  124. package/dist/plugins/core/pinning.js +86 -0
  125. package/dist/plugins/core/pinning.js.map +1 -0
  126. package/dist/plugins/core/types.d.ts +105 -0
  127. package/dist/plugins/core/types.js +22 -0
  128. package/dist/plugins/core/types.js.map +1 -0
  129. package/dist/plugins/core/updater.d.ts +16 -0
  130. package/dist/plugins/core/updater.js +64 -0
  131. package/dist/plugins/core/updater.js.map +1 -0
  132. package/dist/plugins/loader.d.ts +65 -0
  133. package/dist/plugins/loader.js +110 -0
  134. package/dist/plugins/loader.js.map +1 -0
  135. package/dist/prompts/orchestrator.d.ts +6 -0
  136. package/dist/prompts/orchestrator.js +114 -0
  137. package/dist/prompts/orchestrator.js.map +1 -0
  138. package/dist/routing/model-resolver.d.ts +27 -0
  139. package/dist/routing/model-resolver.js +265 -0
  140. package/dist/routing/model-resolver.js.map +1 -0
  141. package/dist/routing/model-router.d.ts +130 -0
  142. package/dist/routing/model-router.js +515 -0
  143. package/dist/routing/model-router.js.map +1 -0
  144. package/dist/runtime/attestations.cjs +260 -0
  145. package/dist/runtime/reviewer-pipeline.cjs +319 -0
  146. package/dist/runtime/sandbox.cjs +468 -0
  147. package/dist/runtime/state-machine.cjs +885 -0
  148. package/dist/runtime/thread-store.cjs +175 -0
  149. package/dist/runtime/transactional-git.cjs +315 -0
  150. package/dist/runtime/verification-pipeline.cjs +435 -0
  151. package/dist/sandbox/execution.d.ts +165 -0
  152. package/dist/sandbox/execution.js +497 -0
  153. package/dist/sandbox/execution.js.map +1 -0
  154. package/dist/security/file-policy.d.ts +22 -0
  155. package/dist/security/file-policy.js +53 -0
  156. package/dist/security/file-policy.js.map +1 -0
  157. package/dist/security/repository-boundary.d.ts +21 -0
  158. package/dist/security/repository-boundary.js +119 -0
  159. package/dist/security/repository-boundary.js.map +1 -0
  160. package/dist/security/secret-filter.d.ts +36 -0
  161. package/dist/security/secret-filter.js +149 -0
  162. package/dist/security/secret-filter.js.map +1 -0
  163. package/dist/swarm.d.ts +14 -0
  164. package/dist/swarm.js +624 -0
  165. package/dist/swarm.js.map +1 -0
  166. package/dist/threads/cache.d.ts +64 -0
  167. package/dist/threads/cache.js +241 -0
  168. package/dist/threads/cache.js.map +1 -0
  169. package/dist/threads/manager.d.ts +94 -0
  170. package/dist/threads/manager.js +914 -0
  171. package/dist/threads/manager.js.map +1 -0
  172. package/dist/ui/banner.d.ts +14 -0
  173. package/dist/ui/banner.js +42 -0
  174. package/dist/ui/banner.js.map +1 -0
  175. package/dist/ui/dashboard.d.ts +33 -0
  176. package/dist/ui/dashboard.js +135 -0
  177. package/dist/ui/dashboard.js.map +1 -0
  178. package/dist/ui/index.d.ts +11 -0
  179. package/dist/ui/index.js +12 -0
  180. package/dist/ui/index.js.map +1 -0
  181. package/dist/ui/log.d.ts +39 -0
  182. package/dist/ui/log.js +126 -0
  183. package/dist/ui/log.js.map +1 -0
  184. package/dist/ui/onboarding.d.ts +14 -0
  185. package/dist/ui/onboarding.js +755 -0
  186. package/dist/ui/onboarding.js.map +1 -0
  187. package/dist/ui/run-log.d.ts +50 -0
  188. package/dist/ui/run-log.js +60 -0
  189. package/dist/ui/run-log.js.map +1 -0
  190. package/dist/ui/spinner.d.ts +41 -0
  191. package/dist/ui/spinner.js +172 -0
  192. package/dist/ui/spinner.js.map +1 -0
  193. package/dist/ui/streaming-feed.d.ts +72 -0
  194. package/dist/ui/streaming-feed.js +386 -0
  195. package/dist/ui/streaming-feed.js.map +1 -0
  196. package/dist/ui/summary.d.ts +18 -0
  197. package/dist/ui/summary.js +113 -0
  198. package/dist/ui/summary.js.map +1 -0
  199. package/dist/ui/text-input.d.ts +19 -0
  200. package/dist/ui/text-input.js +266 -0
  201. package/dist/ui/text-input.js.map +1 -0
  202. package/dist/ui/theme.d.ts +63 -0
  203. package/dist/ui/theme.js +97 -0
  204. package/dist/ui/theme.js.map +1 -0
  205. package/dist/utils/command-exists.d.ts +11 -0
  206. package/dist/utils/command-exists.js +41 -0
  207. package/dist/utils/command-exists.js.map +1 -0
  208. package/dist/utils/process-security.d.ts +19 -0
  209. package/dist/utils/process-security.js +90 -0
  210. package/dist/utils/process-security.js.map +1 -0
  211. package/dist/utils/rolling-buffer.d.ts +16 -0
  212. package/dist/utils/rolling-buffer.js +30 -0
  213. package/dist/utils/rolling-buffer.js.map +1 -0
  214. package/dist/utils/safe-spawn.d.ts +13 -0
  215. package/dist/utils/safe-spawn.js +49 -0
  216. package/dist/utils/safe-spawn.js.map +1 -0
  217. package/dist/worktree/manager.d.ts +69 -0
  218. package/dist/worktree/manager.js +593 -0
  219. package/dist/worktree/manager.js.map +1 -0
  220. package/dist/worktree/merge.d.ts +58 -0
  221. package/dist/worktree/merge.js +389 -0
  222. package/dist/worktree/merge.js.map +1 -0
  223. package/package.json +63 -0
@@ -0,0 +1,583 @@
1
+ /**
2
+ * ContextOS MCP tools — the API surface exposed to Antigravity.
3
+ *
4
+ * Tools:
5
+ * - contextos_delegate: Spawn parallel agents with ContextOS rules
6
+ * - contextos_status: Get task/thread state
7
+ * - contextos_compare: High-level summary (no huge diffs)
8
+ * - contextos_diff: Full diff for a specific thread
9
+ * - contextos_merge: Merge a specific thread branch (dumb merge)
10
+ * - contextos_cleanup: Destroy session and worktrees
11
+ *
12
+ * IMPORTANT: Never use console.log() — stdout is the MCP protocol stream.
13
+ */
14
+ import { randomUUID } from "node:crypto";
15
+ import { existsSync, lstatSync, statSync } from "node:fs";
16
+ import { isAbsolute, relative, resolve } from "node:path";
17
+ import { z } from "zod";
18
+ import { assembleContextPrompt } from "../../contextos/loader.js";
19
+ import { parseVerificationSpec, runWorktreeVerification } from "../../orchestration/verification-runner.js";
20
+ import { assertWithinRepository } from "../../security/repository-boundary.js";
21
+ import { redactSecrets } from "../../security/secret-filter.js";
22
+ import { readWorktreeDiff } from "../../worktree/manager.js";
23
+ import { isEligibleForMerge, mergeThreadBranch } from "../../worktree/merge.js";
24
+ import { cleanupSession, getSession, getThreads, inspectSession, recordAsyncJob, spawnThread } from "../session.js";
25
+ import { recordThreadState } from "../state.js";
26
+ export { parseVerificationSpec, runWorktreeVerification };
27
+ // ── Helpers ────────────────────────────────────────────────────────────────
28
+ function _textResult(text) {
29
+ return { content: [{ type: "text", text: redactSecrets(text) }] };
30
+ }
31
+ function errorResult(text) {
32
+ return { content: [{ type: "text", text: redactSecrets(text) }], isError: true };
33
+ }
34
+ function jsonResult(data) {
35
+ return { content: [{ type: "text", text: redactSecrets(JSON.stringify(data, null, 2)) }] };
36
+ }
37
+ function log(msg) {
38
+ process.stderr.write(`[contextos-mcp] ${msg}\n`);
39
+ }
40
+ const repositoryRelativePath = z
41
+ .string()
42
+ .min(1)
43
+ .max(1024)
44
+ .refine((value) => !value.includes("\0"), "Path cannot contain null bytes")
45
+ .refine((value) => !isAbsolute(value), "Path must be repository-relative")
46
+ .refine((value) => !value.replaceAll("\\", "/").split("/").includes(".."), "Path cannot traverse the repository");
47
+ const writeScopeSchema = z
48
+ .object({
49
+ allow: z.array(repositoryRelativePath).min(1).max(200),
50
+ deny: z.array(repositoryRelativePath).max(200).optional().default([]),
51
+ allow_repository_wide: z.boolean().optional().default(false),
52
+ })
53
+ .strict()
54
+ .refine((scope) => !scope.allow.includes(".") || scope.allow_repository_wide, "Repository-wide write scope ('.') requires allow_repository_wide: true");
55
+ // ── Tool Registration ──────────────────────────────────────────────────────
56
+ export function registerContextosTools(server, defaultDir, enableRuntime = false) {
57
+ function findGitRoot(startDir) {
58
+ let current = startDir;
59
+ while (true) {
60
+ if (existsSync(resolve(current, ".git"))) {
61
+ return current;
62
+ }
63
+ const parent = resolve(current, "..");
64
+ if (parent === current)
65
+ break;
66
+ current = parent;
67
+ }
68
+ return null;
69
+ }
70
+ function resolveDir(dir) {
71
+ const target = dir || defaultDir;
72
+ if (!target)
73
+ return null;
74
+ const abs = resolve(target);
75
+ if (!existsSync(abs))
76
+ return null;
77
+ try {
78
+ const stat = statSync(abs);
79
+ if (!stat.isDirectory())
80
+ return null;
81
+ // Reject symlinks for security
82
+ const lstat = lstatSync(abs);
83
+ if (lstat.isSymbolicLink())
84
+ return null;
85
+ // Ensure it's inside a valid git repository
86
+ const gitRoot = findGitRoot(abs);
87
+ if (!gitRoot)
88
+ return null;
89
+ const canonicalRepoRoot = assertWithinRepository(gitRoot, gitRoot);
90
+ const real = assertWithinRepository(abs, canonicalRepoRoot);
91
+ if (defaultDir) {
92
+ const realDefault = assertWithinRepository(resolve(defaultDir), canonicalRepoRoot);
93
+ const rel = relative(realDefault, real);
94
+ if (rel.startsWith("..") || isAbsolute(rel)) {
95
+ return null;
96
+ }
97
+ }
98
+ return real;
99
+ }
100
+ catch {
101
+ return null;
102
+ }
103
+ }
104
+ // ── contextos_delegate ─────────────────────────────────────────────────
105
+ // Spawn parallel coding agents, each in its own worktree.
106
+ // Loads ContextOS rules before sending the task to agents.
107
+ if (enableRuntime) {
108
+ server.registerTool("contextos_delegate", {
109
+ title: "Delegate Task to Agents",
110
+ description: "Delegate a coding task to multiple AI agents running in parallel. " +
111
+ "Each agent works in an isolated git worktree. ContextOS rules from " +
112
+ ".agents/ are automatically injected into agent prompts. " +
113
+ "Supports async (non-blocking) and sync execution, in-worktree test verification, " +
114
+ "and selectable agent backends.",
115
+ inputSchema: z.object({
116
+ dir: z.string().optional().describe("Path to the git repository"),
117
+ task: z.string().describe("The coding task to accomplish"),
118
+ agents: z
119
+ .array(z.object({
120
+ provider: z.string().describe("LLM provider: 'openai', 'anthropic', or 'gemini'"),
121
+ model: z.string().optional().describe("Model ID override (e.g., 'gpt-4o', 'claude-sonnet-4-6')"),
122
+ backend: z
123
+ .enum(["direct-llm", "opencode", "claude-code", "codex", "aider"])
124
+ .optional()
125
+ .describe("Agent backend (default: direct-llm)"),
126
+ }))
127
+ .min(1)
128
+ .max(5)
129
+ .describe("List of agents to run in parallel"),
130
+ files: z
131
+ .array(repositoryRelativePath)
132
+ .optional()
133
+ .describe("Deprecated alias for focus_files; never grants write access"),
134
+ focus_files: z
135
+ .array(repositoryRelativePath)
136
+ .max(200)
137
+ .optional()
138
+ .describe("Files used only for context ranking"),
139
+ write_scope: writeScopeSchema.optional().describe("Mandatory mutation policy; absence denies execution"),
140
+ mode: z
141
+ .enum(["parallel", "sequential"])
142
+ .optional()
143
+ .default("parallel")
144
+ .describe("Execution mode (default: parallel)"),
145
+ wait: z
146
+ .boolean()
147
+ .optional()
148
+ .default(true)
149
+ .describe("If true, wait for completion. If false, returns immediately with task_id for non-blocking monitoring."),
150
+ verification_spec: z
151
+ .union([
152
+ z.string(),
153
+ z.object({
154
+ schemaVersion: z.number().optional().default(1),
155
+ executable: z.string().min(1),
156
+ args: z.array(z.string()).default([]),
157
+ timeoutMs: z.number().positive().optional().default(60000),
158
+ required: z.boolean().optional().default(true),
159
+ network: z.enum(["deny", "allow"]).optional().default("deny"),
160
+ allowedOutputPaths: z.array(z.string()).optional(),
161
+ cwd: z.string().optional(),
162
+ }),
163
+ ])
164
+ .optional()
165
+ .describe("Structured verification specification or command string"),
166
+ verify_command: z
167
+ .string()
168
+ .optional()
169
+ .describe("Legacy verification command string (deprecated: use verification_spec)"),
170
+ }),
171
+ }, async (args) => {
172
+ const resolvedDir = resolveDir(args.dir);
173
+ if (!resolvedDir) {
174
+ if (!args.dir && !defaultDir)
175
+ return errorResult("'dir' is required — specify the repo path");
176
+ return errorResult(`Directory does not exist or is not a git repository: ${resolve(args.dir || defaultDir || "")}`);
177
+ }
178
+ if (!args.write_scope) {
179
+ return errorResult("Mutation denied: write_scope is required. Legacy files/focus_files are context hints only.");
180
+ }
181
+ const writeScope = args.write_scope;
182
+ const focusFiles = args.focus_files || args.files || [];
183
+ if (focusFiles.length > 0) {
184
+ try {
185
+ for (const file of focusFiles) {
186
+ assertWithinRepository(resolve(resolvedDir, file), resolvedDir);
187
+ }
188
+ }
189
+ catch (err) {
190
+ return errorResult(`File path security violation: ${err instanceof Error ? err.message : String(err)}`);
191
+ }
192
+ }
193
+ try {
194
+ // Load ContextOS rules with file context ranking
195
+ const { prompt: contextPrompt, report: contextReport } = assembleContextPrompt(resolvedDir, args.task, {
196
+ files: focusFiles,
197
+ });
198
+ log(`ContextOS prompt: ${contextPrompt.length} chars`);
199
+ const session = await getSession(resolvedDir);
200
+ const taskId = `ctx_${randomUUID()}`;
201
+ const threadIds = args.agents.map((agentConfig, index) => `${taskId}_${agentConfig.provider.replace(/[^a-zA-Z0-9_-]/g, "")}_${index}`);
202
+ const executeAgent = async (agentConfig, index) => {
203
+ const model = agentConfig.model || getDefaultModel(agentConfig.provider);
204
+ const backend = agentConfig.backend || "direct-llm";
205
+ // Enforce unique, safe thread ID without collisions
206
+ const threadId = threadIds[index];
207
+ const verificationInput = args.verification_spec || args.verify_command;
208
+ let parsedSpec;
209
+ if (verificationInput) {
210
+ try {
211
+ parsedSpec = parseVerificationSpec(verificationInput);
212
+ }
213
+ catch {
214
+ // will fail closed during execution
215
+ }
216
+ }
217
+ try {
218
+ const result = await spawnThread(session, {
219
+ id: threadId,
220
+ task: args.task,
221
+ files: focusFiles,
222
+ focusFiles,
223
+ writeScope: writeScope.allow,
224
+ writeScopeDeny: writeScope.deny,
225
+ allowRepositoryWide: writeScope.allow_repository_wide,
226
+ agent: backend,
227
+ model: model,
228
+ context: contextPrompt,
229
+ testCommand: typeof verificationInput === "string"
230
+ ? verificationInput
231
+ : parsedSpec
232
+ ? `${parsedSpec.executable} ${parsedSpec.args.join(" ")}`.trim()
233
+ : undefined,
234
+ verificationSpec: parsedSpec,
235
+ });
236
+ const threads = getThreads(session);
237
+ const currentThread = threads.find((t) => t.id === threadId);
238
+ const verificationResult = verificationInput
239
+ ? {
240
+ verified: currentThread?.verification === "PASS",
241
+ verdict: currentThread?.verification || "PENDING",
242
+ output: currentThread?.verification === "PASS"
243
+ ? "Verification passed"
244
+ : currentThread?.error || "Verification failed",
245
+ }
246
+ : undefined;
247
+ const status = currentThread?.status || (result.success ? "completed" : "failed");
248
+ if (currentThread) {
249
+ // We don't overwrite currentThread.status here anymore
250
+ // because manager.ts already set it to requires_verification, requires_review, etc.
251
+ recordThreadState(session.dir, currentThread, session.config.worktree_base_dir);
252
+ }
253
+ return {
254
+ thread_id: threadId,
255
+ provider: agentConfig.provider,
256
+ model: model,
257
+ backend: backend,
258
+ status: status,
259
+ summary: result.summary,
260
+ files_changed: result.filesChanged,
261
+ duration_ms: result.durationMs,
262
+ cost_usd: result.estimatedCostUsd,
263
+ verification: verificationResult,
264
+ };
265
+ }
266
+ catch (err) {
267
+ return {
268
+ thread_id: threadId,
269
+ provider: agentConfig.provider,
270
+ model: model,
271
+ backend: backend,
272
+ status: "failed",
273
+ error: err instanceof Error ? err.message : String(err),
274
+ };
275
+ }
276
+ };
277
+ // Non-blocking async mode
278
+ if (args.wait === false) {
279
+ recordAsyncJob(session, taskId, args.agents.length, "running");
280
+ const asyncPromises = args.agents.map((agentConfig, i) => executeAgent(agentConfig, i));
281
+ // Run in background without blocking MCP response
282
+ Promise.allSettled(asyncPromises)
283
+ .then((results) => {
284
+ const allSucceeded = results.every((r) => r.status === "fulfilled" && r.value.status === "completed");
285
+ recordAsyncJob(session, taskId, args.agents.length, allSucceeded ? "completed" : "failed");
286
+ })
287
+ .catch((err) => {
288
+ log(`Background delegation error: ${err}`);
289
+ recordAsyncJob(session, taskId, args.agents.length, "failed");
290
+ });
291
+ return jsonResult({
292
+ task_id: taskId,
293
+ status: "running",
294
+ contextos_rules_loaded: contextPrompt.length > 0,
295
+ context_report: contextReport,
296
+ mode: args.mode || "parallel",
297
+ agents: args.agents.map((a, i) => ({
298
+ thread_id: threadIds[i],
299
+ provider: a.provider,
300
+ model: a.model || getDefaultModel(a.provider),
301
+ backend: a.backend || "direct-llm",
302
+ status: "running",
303
+ })),
304
+ message: "Agents spawned in isolated worktrees. Poll status with contextos_status.",
305
+ });
306
+ }
307
+ // Synchronous waiting mode
308
+ let threadResults;
309
+ if (args.mode === "sequential") {
310
+ threadResults = [];
311
+ for (let i = 0; i < args.agents.length; i++) {
312
+ threadResults.push(await executeAgent(args.agents[i], i));
313
+ }
314
+ }
315
+ else {
316
+ const parallelPromises = args.agents.map((agentConfig, i) => executeAgent(agentConfig, i));
317
+ threadResults = await Promise.all(parallelPromises);
318
+ }
319
+ return jsonResult({
320
+ task_id: taskId,
321
+ status: "completed",
322
+ contextos_rules_loaded: contextPrompt.length > 0,
323
+ context_report: contextReport,
324
+ agents: threadResults,
325
+ });
326
+ }
327
+ catch (err) {
328
+ const msg = err instanceof Error ? err.message : String(err);
329
+ return errorResult(`Delegation failed: ${msg}`);
330
+ }
331
+ });
332
+ }
333
+ // ── contextos_status ───────────────────────────────────────────────────
334
+ // Get status of all threads and budget for a session.
335
+ server.registerTool("contextos_status", {
336
+ title: "Session Status",
337
+ description: "Get the current status of a ContextOS session — all threads with their " +
338
+ "status, worktree paths, branch names, budget spent, and cost breakdown.",
339
+ inputSchema: z.object({
340
+ dir: z.string().optional().describe("Path to the git repository"),
341
+ }),
342
+ }, async (args) => {
343
+ const resolvedDir = resolveDir(args.dir);
344
+ if (!resolvedDir) {
345
+ if (!args.dir && !defaultDir)
346
+ return errorResult("'dir' is required");
347
+ return errorResult(`Directory does not exist or is not a git repository: ${resolve(args.dir || defaultDir || "")}`);
348
+ }
349
+ try {
350
+ const inspection = inspectSession(resolvedDir);
351
+ const { threads, budget, asyncTasks } = inspection;
352
+ const threadSummaries = threads.map((t) => ({
353
+ id: t.id,
354
+ task: t.config.task,
355
+ status: t.status,
356
+ phase: t.phase,
357
+ agent: t.config.agent.backend,
358
+ model: t.config.agent.model,
359
+ worktree_path: t.worktreePath || null,
360
+ branch: t.branchName || null,
361
+ files_changed: t.result?.filesChanged || [],
362
+ duration_ms: t.completedAt && t.startedAt ? t.completedAt - t.startedAt : t.startedAt ? Date.now() - t.startedAt : 0,
363
+ cost_usd: t.result?.estimatedCostUsd ?? t.estimatedCostUsd,
364
+ error: t.error,
365
+ }));
366
+ return jsonResult({
367
+ dir: inspection.dir,
368
+ threads: threadSummaries,
369
+ async_tasks: asyncTasks,
370
+ counts: {
371
+ total: threads.length,
372
+ running: threads.filter((t) => t.status === "running").length,
373
+ completed: threads.filter((t) => t.status === "completed").length,
374
+ failed: threads.filter((t) => t.status === "failed" || t.status === "verification_failed").length,
375
+ },
376
+ budget: {
377
+ spent_usd: budget.totalSpentUsd,
378
+ limit_usd: budget.sessionLimitUsd,
379
+ tokens: budget.totalTokens,
380
+ },
381
+ });
382
+ }
383
+ catch (err) {
384
+ const msg = err instanceof Error ? err.message : String(err);
385
+ return errorResult(`Status check failed: ${msg}`);
386
+ }
387
+ });
388
+ // ── contextos_compare ──────────────────────────────────────────────────
389
+ // High-level comparison WITHOUT full diffs (prevents context bloat).
390
+ server.registerTool("contextos_compare", {
391
+ title: "Compare Agent Results",
392
+ description: "Compare results from multiple agents at a high level. Returns files changed, " +
393
+ "insertions/deletions count, and potential conflicts — WITHOUT full diffs. " +
394
+ "Use contextos_diff to get the full diff for a specific thread.",
395
+ inputSchema: z.object({
396
+ dir: z.string().optional().describe("Path to the git repository"),
397
+ }),
398
+ }, async (args) => {
399
+ const resolvedDir = resolveDir(args.dir);
400
+ if (!resolvedDir) {
401
+ if (!args.dir && !defaultDir)
402
+ return errorResult("'dir' is required");
403
+ return errorResult(`Directory does not exist or is not a git repository: ${resolve(args.dir || defaultDir || "")}`);
404
+ }
405
+ try {
406
+ const { threads } = inspectSession(resolvedDir);
407
+ const completed = threads.filter((t) => t.status === "completed" && t.result?.success);
408
+ if (completed.length === 0) {
409
+ return jsonResult({ message: "No completed threads to compare", threads: [] });
410
+ }
411
+ const summaries = completed.map((t) => ({
412
+ id: t.id,
413
+ model: t.config.agent.model,
414
+ files_changed: t.result?.filesChanged || [],
415
+ files_count: (t.result?.filesChanged || []).length,
416
+ diff_stats: t.result?.diffStats || "(no stats)",
417
+ duration_ms: t.result?.durationMs || 0,
418
+ cost_usd: t.result?.estimatedCostUsd || 0,
419
+ }));
420
+ // Detect potential conflicts: files changed by multiple agents
421
+ const fileToAgents = new Map();
422
+ for (const s of summaries) {
423
+ for (const file of s.files_changed) {
424
+ const agents = fileToAgents.get(file) || [];
425
+ agents.push(s.id);
426
+ fileToAgents.set(file, agents);
427
+ }
428
+ }
429
+ const conflicts = [...fileToAgents.entries()]
430
+ .filter(([, agents]) => agents.length > 1)
431
+ .map(([file, agents]) => ({ file, modified_by: agents }));
432
+ return jsonResult({
433
+ agents: summaries,
434
+ potential_conflicts: conflicts,
435
+ recommendation: conflicts.length > 0
436
+ ? "Some files were modified by multiple agents. Use contextos_diff to review each agent's changes before merging."
437
+ : "No conflicts detected. You can safely merge any agent's changes.",
438
+ });
439
+ }
440
+ catch (err) {
441
+ const msg = err instanceof Error ? err.message : String(err);
442
+ return errorResult(`Compare failed: ${msg}`);
443
+ }
444
+ });
445
+ // ── contextos_diff ─────────────────────────────────────────────────────
446
+ // Full diff for a specific thread (on-demand, not in compare).
447
+ server.registerTool("contextos_diff", {
448
+ title: "Get Thread Diff",
449
+ description: "Get the full git diff for a specific thread. Call this after contextos_compare " +
450
+ "to inspect a particular agent's changes in detail.",
451
+ inputSchema: z.object({
452
+ dir: z.string().optional().describe("Path to the git repository"),
453
+ thread_id: z.string().describe("Thread ID to get diff for"),
454
+ }),
455
+ }, async (args) => {
456
+ const resolvedDir = resolveDir(args.dir);
457
+ if (!resolvedDir) {
458
+ if (!args.dir && !defaultDir)
459
+ return errorResult("'dir' is required");
460
+ return errorResult(`Directory does not exist or is not a git repository: ${resolve(args.dir || defaultDir || "")}`);
461
+ }
462
+ try {
463
+ const { threads } = inspectSession(resolvedDir);
464
+ const thread = threads.find((t) => t.id === args.thread_id);
465
+ if (!thread) {
466
+ return errorResult(`Thread ${args.thread_id} not found. Available: ${threads.map((t) => t.id).join(", ")}`);
467
+ }
468
+ if (!thread.worktreePath) {
469
+ return errorResult(`Thread ${args.thread_id} has no worktree (status: ${thread.status})`);
470
+ }
471
+ const diff = await readWorktreeDiff(thread.worktreePath, resolvedDir);
472
+ return jsonResult({
473
+ thread_id: thread.id,
474
+ model: thread.config.agent.model,
475
+ status: thread.status,
476
+ diff: diff,
477
+ files_changed: thread.result?.filesChanged || [],
478
+ });
479
+ }
480
+ catch (err) {
481
+ const msg = err instanceof Error ? err.message : String(err);
482
+ return errorResult(`Diff failed: ${msg}`);
483
+ }
484
+ });
485
+ // ── contextos_merge ────────────────────────────────────────────────────
486
+ // Dumb merge: Antigravity decides, ContextOS just executes git merge.
487
+ if (enableRuntime) {
488
+ server.registerTool("contextos_merge", {
489
+ title: "Merge Thread Branch",
490
+ description: "Merge a specific thread's branch into the main branch. This is a 'dumb' merge — " +
491
+ "ContextOS does not decide which agent is better. Antigravity (you) make that decision " +
492
+ "and tell ContextOS which thread to merge.",
493
+ inputSchema: z.object({
494
+ dir: z.string().optional().describe("Path to the git repository"),
495
+ thread_id: z.string().describe("Thread ID whose branch to merge"),
496
+ }),
497
+ }, async (args) => {
498
+ const resolvedDir = resolveDir(args.dir);
499
+ if (!resolvedDir) {
500
+ if (!args.dir && !defaultDir)
501
+ return errorResult("'dir' is required");
502
+ return errorResult(`Directory does not exist or is not a git repository: ${resolve(args.dir || defaultDir || "")}`);
503
+ }
504
+ try {
505
+ const session = await getSession(resolvedDir);
506
+ const threads = getThreads(session);
507
+ const thread = threads.find((t) => t.id === args.thread_id);
508
+ if (!thread) {
509
+ return errorResult(`Thread ${args.thread_id} not found`);
510
+ }
511
+ if (!thread.branchName) {
512
+ return errorResult(`Thread ${args.thread_id} has no branch (status: ${thread.status})`);
513
+ }
514
+ const eligibility = isEligibleForMerge(thread);
515
+ if (!eligibility.eligible) {
516
+ return errorResult(`Thread ${args.thread_id} cannot be merged: ${eligibility.reason}`);
517
+ }
518
+ const result = await mergeThreadBranch(session.dir, thread.branchName, thread.id, thread);
519
+ return jsonResult({
520
+ merged: result.success,
521
+ branch: result.branch,
522
+ message: result.message,
523
+ conflicts: result.conflicts,
524
+ });
525
+ }
526
+ catch (err) {
527
+ const msg = err instanceof Error ? err.message : String(err);
528
+ return errorResult(`Merge failed: ${msg}`);
529
+ }
530
+ });
531
+ }
532
+ // ── contextos_cleanup ──────────────────────────────────────────────────
533
+ // Destroy session and worktrees.
534
+ if (enableRuntime) {
535
+ server.registerTool("contextos_cleanup", {
536
+ title: "Cleanup Session",
537
+ description: "Clean up a ContextOS session — cancels all running threads, removes " +
538
+ "worktrees, and frees resources. Call this when done with a task.",
539
+ inputSchema: z.object({
540
+ dir: z.string().optional().describe("Path to the git repository"),
541
+ purge_orphans: z
542
+ .boolean()
543
+ .optional()
544
+ .describe("Whether to deeply scan and purge all stale worktree directories and swarm/* branches left by dead processes"),
545
+ dry_run: z
546
+ .boolean()
547
+ .optional()
548
+ .describe("If true, report what would be cleaned without actually deleting. Default: false."),
549
+ }),
550
+ }, async (args) => {
551
+ const resolvedDir = resolveDir(args.dir);
552
+ if (!resolvedDir) {
553
+ if (!args.dir && !defaultDir)
554
+ return errorResult("'dir' is required");
555
+ return errorResult(`Directory does not exist or is not a git repository: ${resolve(args.dir || defaultDir || "")}`);
556
+ }
557
+ try {
558
+ const message = await cleanupSession(resolvedDir, args.purge_orphans, args.dry_run);
559
+ return jsonResult({ cleaned_up: !args.dry_run, dry_run: !!args.dry_run, message });
560
+ }
561
+ catch (err) {
562
+ const msg = err instanceof Error ? err.message : String(err);
563
+ return errorResult(`Cleanup failed: ${msg}`);
564
+ }
565
+ });
566
+ }
567
+ }
568
+ // ── Helpers ────────────────────────────────────────────────────────────────
569
+ /** Get default model ID for a provider. */
570
+ function getDefaultModel(provider) {
571
+ switch (provider.toLowerCase()) {
572
+ case "openai":
573
+ return "gpt-4o";
574
+ case "anthropic":
575
+ return "claude-sonnet-4-6";
576
+ case "gemini":
577
+ case "google":
578
+ return "gemini-2.5-pro";
579
+ default:
580
+ return "claude-sonnet-4-6";
581
+ }
582
+ }
583
+ //# sourceMappingURL=contextos.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contextos.js","sourceRoot":"","sources":["../../../src/mcp/tools/contextos.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE1D,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,4CAA4C,CAAC;AAC5G,OAAO,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAC/E,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAChF,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,UAAU,EAAE,cAAc,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACpH,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,CAAC;AAE1D,8EAA8E;AAE9E,SAAS,WAAW,CAAC,IAAY;IAChC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;AAC5E,CAAC;AAED,SAAS,WAAW,CAAC,IAAY;IAChC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,IAAa,EAAE,CAAC;AACpG,CAAC;AAED,SAAS,UAAU,CAAC,IAAa;IAChC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;AACrG,CAAC;AAED,SAAS,GAAG,CAAC,GAAW;IACvB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,sBAAsB,GAAG,CAAC;KAC9B,MAAM,EAAE;KACR,GAAG,CAAC,CAAC,CAAC;KACN,GAAG,CAAC,IAAI,CAAC;KACT,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,gCAAgC,CAAC;KAC1E,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,kCAAkC,CAAC;KACzE,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,qCAAqC,CAAC,CAAC;AAEnH,MAAM,gBAAgB,GAAG,CAAC;KACxB,MAAM,CAAC;IACP,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;IACtD,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;IACrE,qBAAqB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;CAC5D,CAAC;KACD,MAAM,EAAE;KACR,MAAM,CACN,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,qBAAqB,EACpE,wEAAwE,CACxE,CAAC;AAEH,8EAA8E;AAE9E,MAAM,UAAU,sBAAsB,CAAC,MAAiB,EAAE,UAAmB,EAAE,aAAa,GAAG,KAAK;IACnG,SAAS,WAAW,CAAC,QAAgB;QACpC,IAAI,OAAO,GAAG,QAAQ,CAAC;QACvB,OAAO,IAAI,EAAE,CAAC;YACb,IAAI,UAAU,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;gBAC1C,OAAO,OAAO,CAAC;YAChB,CAAC;YACD,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACtC,IAAI,MAAM,KAAK,OAAO;gBAAE,MAAM;YAC9B,OAAO,GAAG,MAAM,CAAC;QAClB,CAAC;QACD,OAAO,IAAI,CAAC;IACb,CAAC;IAED,SAAS,UAAU,CAAC,GAAY;QAC/B,MAAM,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC;QACjC,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QACzB,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;QAC5B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QAClC,IAAI,CAAC;YACJ,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC3B,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;gBAAE,OAAO,IAAI,CAAC;YACrC,+BAA+B;YAC/B,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;YAC7B,IAAI,KAAK,CAAC,cAAc,EAAE;gBAAE,OAAO,IAAI,CAAC;YACxC,4CAA4C;YAC5C,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;YACjC,IAAI,CAAC,OAAO;gBAAE,OAAO,IAAI,CAAC;YAC1B,MAAM,iBAAiB,GAAG,sBAAsB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACnE,MAAM,IAAI,GAAG,sBAAsB,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;YAC5D,IAAI,UAAU,EAAE,CAAC;gBAChB,MAAM,WAAW,GAAG,sBAAsB,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,iBAAiB,CAAC,CAAC;gBACnF,MAAM,GAAG,GAAG,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;gBACxC,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC7C,OAAO,IAAI,CAAC;gBACb,CAAC;YACF,CAAC;YACD,OAAO,IAAI,CAAC;QACb,CAAC;QAAC,MAAM,CAAC;YACR,OAAO,IAAI,CAAC;QACb,CAAC;IACF,CAAC;IAED,0EAA0E;IAC1E,0DAA0D;IAC1D,2DAA2D;IAE3D,IAAI,aAAa,EAAE,CAAC;QACnB,MAAM,CAAC,YAAY,CAClB,oBAAoB,EACpB;YACC,KAAK,EAAE,yBAAyB;YAChC,WAAW,EACV,oEAAoE;gBACpE,qEAAqE;gBACrE,0DAA0D;gBAC1D,mFAAmF;gBACnF,gCAAgC;YACjC,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;gBACrB,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;gBACjE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;gBAC1D,MAAM,EAAE,CAAC;qBACP,KAAK,CACL,CAAC,CAAC,MAAM,CAAC;oBACR,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kDAAkD,CAAC;oBACjF,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yDAAyD,CAAC;oBAChG,OAAO,EAAE,CAAC;yBACR,IAAI,CAAC,CAAC,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;yBACjE,QAAQ,EAAE;yBACV,QAAQ,CAAC,qCAAqC,CAAC;iBACjD,CAAC,CACF;qBACA,GAAG,CAAC,CAAC,CAAC;qBACN,GAAG,CAAC,CAAC,CAAC;qBACN,QAAQ,CAAC,mCAAmC,CAAC;gBAC/C,KAAK,EAAE,CAAC;qBACN,KAAK,CAAC,sBAAsB,CAAC;qBAC7B,QAAQ,EAAE;qBACV,QAAQ,CAAC,6DAA6D,CAAC;gBACzE,WAAW,EAAE,CAAC;qBACZ,KAAK,CAAC,sBAAsB,CAAC;qBAC7B,GAAG,CAAC,GAAG,CAAC;qBACR,QAAQ,EAAE;qBACV,QAAQ,CAAC,qCAAqC,CAAC;gBACjD,WAAW,EAAE,gBAAgB,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qDAAqD,CAAC;gBACxG,IAAI,EAAE,CAAC;qBACL,IAAI,CAAC,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;qBAChC,QAAQ,EAAE;qBACV,OAAO,CAAC,UAAU,CAAC;qBACnB,QAAQ,CAAC,oCAAoC,CAAC;gBAChD,IAAI,EAAE,CAAC;qBACL,OAAO,EAAE;qBACT,QAAQ,EAAE;qBACV,OAAO,CAAC,IAAI,CAAC;qBACb,QAAQ,CACR,uGAAuG,CACvG;gBACF,iBAAiB,EAAE,CAAC;qBAClB,KAAK,CAAC;oBACN,CAAC,CAAC,MAAM,EAAE;oBACV,CAAC,CAAC,MAAM,CAAC;wBACR,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;wBAC/C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;wBAC7B,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;wBACrC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;wBAC1D,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;wBAC9C,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;wBAC7D,kBAAkB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;wBAClD,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;qBAC1B,CAAC;iBACF,CAAC;qBACD,QAAQ,EAAE;qBACV,QAAQ,CAAC,yDAAyD,CAAC;gBACrE,cAAc,EAAE,CAAC;qBACf,MAAM,EAAE;qBACR,QAAQ,EAAE;qBACV,QAAQ,CAAC,wEAAwE,CAAC;aACpF,CAAC;SACF,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;YACd,MAAM,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACzC,IAAI,CAAC,WAAW,EAAE,CAAC;gBAClB,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,UAAU;oBAAE,OAAO,WAAW,CAAC,2CAA2C,CAAC,CAAC;gBAC9F,OAAO,WAAW,CACjB,wDAAwD,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,UAAU,IAAI,EAAE,CAAC,EAAE,CAC/F,CAAC;YACH,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;gBACvB,OAAO,WAAW,CACjB,4FAA4F,CAC5F,CAAC;YACH,CAAC;YACD,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC;YAEpC,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;YACxD,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC3B,IAAI,CAAC;oBACJ,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;wBAC/B,sBAAsB,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,WAAW,CAAC,CAAC;oBACjE,CAAC;gBACF,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACd,OAAO,WAAW,CAAC,iCAAiC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACzG,CAAC;YACF,CAAC;YAED,IAAI,CAAC;gBACJ,iDAAiD;gBACjD,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,qBAAqB,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,EAAE;oBACtG,KAAK,EAAE,UAAU;iBACjB,CAAC,CAAC;gBACH,GAAG,CAAC,qBAAqB,aAAa,CAAC,MAAM,QAAQ,CAAC,CAAC;gBAEvD,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,WAAW,CAAC,CAAC;gBAC9C,MAAM,MAAM,GAAG,OAAO,UAAU,EAAE,EAAE,CAAC;gBACrC,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAChC,CAAC,WAAW,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,MAAM,IAAI,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,IAAI,KAAK,EAAE,CACnG,CAAC;gBAEF,MAAM,YAAY,GAAG,KAAK,EAAE,WAAyC,EAAE,KAAa,EAAE,EAAE;oBACvF,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,IAAI,eAAe,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;oBACzE,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,IAAI,YAAY,CAAC;oBACpD,oDAAoD;oBACpD,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;oBAElC,MAAM,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,cAAc,CAAC;oBACxE,IAAI,UAAU,CAAC;oBACf,IAAI,iBAAiB,EAAE,CAAC;wBACvB,IAAI,CAAC;4BACJ,UAAU,GAAG,qBAAqB,CAAC,iBAAiB,CAAC,CAAC;wBACvD,CAAC;wBAAC,MAAM,CAAC;4BACR,oCAAoC;wBACrC,CAAC;oBACF,CAAC;oBAED,IAAI,CAAC;wBACJ,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,OAAO,EAAE;4BACzC,EAAE,EAAE,QAAQ;4BACZ,IAAI,EAAE,IAAI,CAAC,IAAI;4BACf,KAAK,EAAE,UAAU;4BACjB,UAAU;4BACV,UAAU,EAAE,UAAU,CAAC,KAAK;4BAC5B,cAAc,EAAE,UAAU,CAAC,IAAI;4BAC/B,mBAAmB,EAAE,UAAU,CAAC,qBAAqB;4BACrD,KAAK,EAAE,OAAO;4BACd,KAAK,EAAE,KAAK;4BACZ,OAAO,EAAE,aAAa;4BACtB,WAAW,EACV,OAAO,iBAAiB,KAAK,QAAQ;gCACpC,CAAC,CAAC,iBAAiB;gCACnB,CAAC,CAAC,UAAU;oCACX,CAAC,CAAC,GAAG,UAAU,CAAC,UAAU,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE;oCAChE,CAAC,CAAC,SAAS;4BACd,gBAAgB,EAAE,UAAU;yBAC5B,CAAC,CAAC;wBAEH,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;wBACpC,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC;wBAE7D,MAAM,kBAAkB,GAAG,iBAAiB;4BAC3C,CAAC,CAAC;gCACA,QAAQ,EAAE,aAAa,EAAE,YAAY,KAAK,MAAM;gCAChD,OAAO,EAAE,aAAa,EAAE,YAAY,IAAI,SAAS;gCACjD,MAAM,EACL,aAAa,EAAE,YAAY,KAAK,MAAM;oCACrC,CAAC,CAAC,qBAAqB;oCACvB,CAAC,CAAC,aAAa,EAAE,KAAK,IAAI,qBAAqB;6BACjD;4BACF,CAAC,CAAC,SAAS,CAAC;wBAEb,MAAM,MAAM,GAAG,aAAa,EAAE,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;wBAElF,IAAI,aAAa,EAAE,CAAC;4BACnB,uDAAuD;4BACvD,oFAAoF;4BACpF,iBAAiB,CAAC,OAAO,CAAC,GAAG,EAAE,aAAa,EAAE,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;wBACjF,CAAC;wBAED,OAAO;4BACN,SAAS,EAAE,QAAQ;4BACnB,QAAQ,EAAE,WAAW,CAAC,QAAQ;4BAC9B,KAAK,EAAE,KAAK;4BACZ,OAAO,EAAE,OAAO;4BAChB,MAAM,EAAE,MAAM;4BACd,OAAO,EAAE,MAAM,CAAC,OAAO;4BACvB,aAAa,EAAE,MAAM,CAAC,YAAY;4BAClC,WAAW,EAAE,MAAM,CAAC,UAAU;4BAC9B,QAAQ,EAAE,MAAM,CAAC,gBAAgB;4BACjC,YAAY,EAAE,kBAAkB;yBAChC,CAAC;oBACH,CAAC;oBAAC,OAAO,GAAG,EAAE,CAAC;wBACd,OAAO;4BACN,SAAS,EAAE,QAAQ;4BACnB,QAAQ,EAAE,WAAW,CAAC,QAAQ;4BAC9B,KAAK,EAAE,KAAK;4BACZ,OAAO,EAAE,OAAO;4BAChB,MAAM,EAAE,QAAQ;4BAChB,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;yBACvD,CAAC;oBACH,CAAC;gBACF,CAAC,CAAC;gBAEF,0BAA0B;gBAC1B,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;oBACzB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;oBAC/D,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC;oBACxF,kDAAkD;oBAClD,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC;yBAC/B,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE;wBACjB,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,WAAW,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC;wBACtG,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;oBAC5F,CAAC,CAAC;yBACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;wBACd,GAAG,CAAC,gCAAgC,GAAG,EAAE,CAAC,CAAC;wBAC3C,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;oBAC/D,CAAC,CAAC,CAAC;oBAEJ,OAAO,UAAU,CAAC;wBACjB,OAAO,EAAE,MAAM;wBACf,MAAM,EAAE,SAAS;wBACjB,sBAAsB,EAAE,aAAa,CAAC,MAAM,GAAG,CAAC;wBAChD,cAAc,EAAE,aAAa;wBAC7B,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,UAAU;wBAC7B,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;4BAClC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;4BACvB,QAAQ,EAAE,CAAC,CAAC,QAAQ;4BACpB,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,eAAe,CAAC,CAAC,CAAC,QAAQ,CAAC;4BAC7C,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,YAAY;4BAClC,MAAM,EAAE,SAAS;yBACjB,CAAC,CAAC;wBACH,OAAO,EAAE,0EAA0E;qBACnF,CAAC,CAAC;gBACJ,CAAC;gBAED,2BAA2B;gBAC3B,IAAI,aAAa,CAAC;gBAClB,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;oBAChC,aAAa,GAAG,EAAE,CAAC;oBACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;wBAC7C,aAAa,CAAC,IAAI,CAAC,MAAM,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;oBAC3D,CAAC;gBACF,CAAC;qBAAM,CAAC;oBACP,MAAM,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC;oBAC3F,aAAa,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;gBACrD,CAAC;gBAED,OAAO,UAAU,CAAC;oBACjB,OAAO,EAAE,MAAM;oBACf,MAAM,EAAE,WAAW;oBACnB,sBAAsB,EAAE,aAAa,CAAC,MAAM,GAAG,CAAC;oBAChD,cAAc,EAAE,aAAa;oBAC7B,MAAM,EAAE,aAAa;iBACrB,CAAC,CAAC;YACJ,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACd,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC7D,OAAO,WAAW,CAAC,sBAAsB,GAAG,EAAE,CAAC,CAAC;YACjD,CAAC;QACF,CAAC,CACD,CAAC;IACH,CAAC;IAED,0EAA0E;IAC1E,sDAAsD;IAEtD,MAAM,CAAC,YAAY,CAClB,kBAAkB,EAClB;QACC,KAAK,EAAE,gBAAgB;QACvB,WAAW,EACV,yEAAyE;YACzE,yEAAyE;QAC1E,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACrB,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;SACjE,CAAC;KACF,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACd,MAAM,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACzC,IAAI,CAAC,WAAW,EAAE,CAAC;YAClB,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,UAAU;gBAAE,OAAO,WAAW,CAAC,mBAAmB,CAAC,CAAC;YACtE,OAAO,WAAW,CACjB,wDAAwD,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,UAAU,IAAI,EAAE,CAAC,EAAE,CAC/F,CAAC;QACH,CAAC;QAED,IAAI,CAAC;YACJ,MAAM,UAAU,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;YAC/C,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,UAAU,CAAC;YAEnD,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC3C,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI;gBACnB,MAAM,EAAE,CAAC,CAAC,MAAM;gBAChB,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO;gBAC7B,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK;gBAC3B,aAAa,EAAE,CAAC,CAAC,YAAY,IAAI,IAAI;gBACrC,MAAM,EAAE,CAAC,CAAC,UAAU,IAAI,IAAI;gBAC5B,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,YAAY,IAAI,EAAE;gBAC3C,WAAW,EACV,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;gBACxG,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,gBAAgB,IAAI,CAAC,CAAC,gBAAgB;gBAC1D,KAAK,EAAE,CAAC,CAAC,KAAK;aACd,CAAC,CAAC,CAAC;YAEJ,OAAO,UAAU,CAAC;gBACjB,GAAG,EAAE,UAAU,CAAC,GAAG;gBACnB,OAAO,EAAE,eAAe;gBACxB,WAAW,EAAE,UAAU;gBACvB,MAAM,EAAE;oBACP,KAAK,EAAE,OAAO,CAAC,MAAM;oBACrB,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,MAAM;oBAC7D,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,MAAM;oBACjE,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,KAAK,qBAAqB,CAAC,CAAC,MAAM;iBACjG;gBACD,MAAM,EAAE;oBACP,SAAS,EAAE,MAAM,CAAC,aAAa;oBAC/B,SAAS,EAAE,MAAM,CAAC,eAAe;oBACjC,MAAM,EAAE,MAAM,CAAC,WAAW;iBAC1B;aACD,CAAC,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,OAAO,WAAW,CAAC,wBAAwB,GAAG,EAAE,CAAC,CAAC;QACnD,CAAC;IACF,CAAC,CACD,CAAC;IAEF,0EAA0E;IAC1E,qEAAqE;IAErE,MAAM,CAAC,YAAY,CAClB,mBAAmB,EACnB;QACC,KAAK,EAAE,uBAAuB;QAC9B,WAAW,EACV,+EAA+E;YAC/E,4EAA4E;YAC5E,gEAAgE;QACjE,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACrB,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;SACjE,CAAC;KACF,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACd,MAAM,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACzC,IAAI,CAAC,WAAW,EAAE,CAAC;YAClB,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,UAAU;gBAAE,OAAO,WAAW,CAAC,mBAAmB,CAAC,CAAC;YACtE,OAAO,WAAW,CACjB,wDAAwD,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,UAAU,IAAI,EAAE,CAAC,EAAE,CAC/F,CAAC;QACH,CAAC;QAED,IAAI,CAAC;YACJ,MAAM,EAAE,OAAO,EAAE,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;YAChD,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,WAAW,IAAI,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAEvF,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC5B,OAAO,UAAU,CAAC,EAAE,OAAO,EAAE,iCAAiC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;YAChF,CAAC;YAED,MAAM,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACvC,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK;gBAC3B,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,YAAY,IAAI,EAAE;gBAC3C,WAAW,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,YAAY,IAAI,EAAE,CAAC,CAAC,MAAM;gBAClD,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,SAAS,IAAI,YAAY;gBAC/C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,UAAU,IAAI,CAAC;gBACtC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,gBAAgB,IAAI,CAAC;aACzC,CAAC,CAAC,CAAC;YAEJ,+DAA+D;YAC/D,MAAM,YAAY,GAAG,IAAI,GAAG,EAAoB,CAAC;YACjD,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;gBAC3B,KAAK,MAAM,IAAI,IAAI,CAAC,CAAC,aAAa,EAAE,CAAC;oBACpC,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;oBAC5C,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;oBAClB,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBAChC,CAAC;YACF,CAAC;YACD,MAAM,SAAS,GAAG,CAAC,GAAG,YAAY,CAAC,OAAO,EAAE,CAAC;iBAC3C,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;iBACzC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;YAE3D,OAAO,UAAU,CAAC;gBACjB,MAAM,EAAE,SAAS;gBACjB,mBAAmB,EAAE,SAAS;gBAC9B,cAAc,EACb,SAAS,CAAC,MAAM,GAAG,CAAC;oBACnB,CAAC,CAAC,gHAAgH;oBAClH,CAAC,CAAC,kEAAkE;aACtE,CAAC,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,OAAO,WAAW,CAAC,mBAAmB,GAAG,EAAE,CAAC,CAAC;QAC9C,CAAC;IACF,CAAC,CACD,CAAC;IAEF,0EAA0E;IAC1E,+DAA+D;IAE/D,MAAM,CAAC,YAAY,CAClB,gBAAgB,EAChB;QACC,KAAK,EAAE,iBAAiB;QACxB,WAAW,EACV,iFAAiF;YACjF,oDAAoD;QACrD,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACrB,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;YACjE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;SAC3D,CAAC;KACF,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACd,MAAM,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACzC,IAAI,CAAC,WAAW,EAAE,CAAC;YAClB,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,UAAU;gBAAE,OAAO,WAAW,CAAC,mBAAmB,CAAC,CAAC;YACtE,OAAO,WAAW,CACjB,wDAAwD,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,UAAU,IAAI,EAAE,CAAC,EAAE,CAC/F,CAAC;QACH,CAAC;QAED,IAAI,CAAC;YACJ,MAAM,EAAE,OAAO,EAAE,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;YAChD,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC;YAE5D,IAAI,CAAC,MAAM,EAAE,CAAC;gBACb,OAAO,WAAW,CAAC,UAAU,IAAI,CAAC,SAAS,0BAA0B,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC7G,CAAC;YAED,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;gBAC1B,OAAO,WAAW,CAAC,UAAU,IAAI,CAAC,SAAS,6BAA6B,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;YAC3F,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,MAAM,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;YAEtE,OAAO,UAAU,CAAC;gBACjB,SAAS,EAAE,MAAM,CAAC,EAAE;gBACpB,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK;gBAChC,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,IAAI,EAAE,IAAI;gBACV,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,IAAI,EAAE;aAChD,CAAC,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,OAAO,WAAW,CAAC,gBAAgB,GAAG,EAAE,CAAC,CAAC;QAC3C,CAAC;IACF,CAAC,CACD,CAAC;IAEF,0EAA0E;IAC1E,sEAAsE;IAEtE,IAAI,aAAa,EAAE,CAAC;QACnB,MAAM,CAAC,YAAY,CAClB,iBAAiB,EACjB;YACC,KAAK,EAAE,qBAAqB;YAC5B,WAAW,EACV,kFAAkF;gBAClF,wFAAwF;gBACxF,2CAA2C;YAC5C,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;gBACrB,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;gBACjE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;aACjE,CAAC;SACF,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;YACd,MAAM,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACzC,IAAI,CAAC,WAAW,EAAE,CAAC;gBAClB,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,UAAU;oBAAE,OAAO,WAAW,CAAC,mBAAmB,CAAC,CAAC;gBACtE,OAAO,WAAW,CACjB,wDAAwD,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,UAAU,IAAI,EAAE,CAAC,EAAE,CAC/F,CAAC;YACH,CAAC;YAED,IAAI,CAAC;gBACJ,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,WAAW,CAAC,CAAC;gBAC9C,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;gBACpC,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC;gBAE5D,IAAI,CAAC,MAAM,EAAE,CAAC;oBACb,OAAO,WAAW,CAAC,UAAU,IAAI,CAAC,SAAS,YAAY,CAAC,CAAC;gBAC1D,CAAC;gBAED,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;oBACxB,OAAO,WAAW,CAAC,UAAU,IAAI,CAAC,SAAS,2BAA2B,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;gBACzF,CAAC;gBAED,MAAM,WAAW,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;gBAC/C,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;oBAC3B,OAAO,WAAW,CAAC,UAAU,IAAI,CAAC,SAAS,sBAAsB,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC;gBACxF,CAAC;gBAED,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;gBAE1F,OAAO,UAAU,CAAC;oBACjB,MAAM,EAAE,MAAM,CAAC,OAAO;oBACtB,MAAM,EAAE,MAAM,CAAC,MAAM;oBACrB,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,SAAS,EAAE,MAAM,CAAC,SAAS;iBAC3B,CAAC,CAAC;YACJ,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACd,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC7D,OAAO,WAAW,CAAC,iBAAiB,GAAG,EAAE,CAAC,CAAC;YAC5C,CAAC;QACF,CAAC,CACD,CAAC;IACH,CAAC;IAED,0EAA0E;IAC1E,iCAAiC;IAEjC,IAAI,aAAa,EAAE,CAAC;QACnB,MAAM,CAAC,YAAY,CAClB,mBAAmB,EACnB;YACC,KAAK,EAAE,iBAAiB;YACxB,WAAW,EACV,sEAAsE;gBACtE,kEAAkE;YACnE,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;gBACrB,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;gBACjE,aAAa,EAAE,CAAC;qBACd,OAAO,EAAE;qBACT,QAAQ,EAAE;qBACV,QAAQ,CACR,6GAA6G,CAC7G;gBACF,OAAO,EAAE,CAAC;qBACR,OAAO,EAAE;qBACT,QAAQ,EAAE;qBACV,QAAQ,CAAC,kFAAkF,CAAC;aAC9F,CAAC;SACF,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;YACd,MAAM,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACzC,IAAI,CAAC,WAAW,EAAE,CAAC;gBAClB,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,UAAU;oBAAE,OAAO,WAAW,CAAC,mBAAmB,CAAC,CAAC;gBACtE,OAAO,WAAW,CACjB,wDAAwD,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,UAAU,IAAI,EAAE,CAAC,EAAE,CAC/F,CAAC;YACH,CAAC;YAED,IAAI,CAAC;gBACJ,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,WAAW,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;gBACpF,OAAO,UAAU,CAAC,EAAE,UAAU,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;YACpF,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACd,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC7D,OAAO,WAAW,CAAC,mBAAmB,GAAG,EAAE,CAAC,CAAC;YAC9C,CAAC;QACF,CAAC,CACD,CAAC;IACH,CAAC;AACF,CAAC;AAED,8EAA8E;AAE9E,2CAA2C;AAC3C,SAAS,eAAe,CAAC,QAAgB;IACxC,QAAQ,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC;QAChC,KAAK,QAAQ;YACZ,OAAO,QAAQ,CAAC;QACjB,KAAK,WAAW;YACf,OAAO,mBAAmB,CAAC;QAC5B,KAAK,QAAQ,CAAC;QACd,KAAK,QAAQ;YACZ,OAAO,gBAAgB,CAAC;QACzB;YACC,OAAO,mBAAmB,CAAC;IAC7B,CAAC;AACF,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * MCP tool definitions and handlers for swarm-code.
3
+ *
4
+ * Tools:
5
+ * - swarm_run: Full orchestrated swarm execution (subprocess)
6
+ * - swarm_thread: Spawn a single coding agent thread in a worktree
7
+ * - swarm_status: Get current session status (threads, budget)
8
+ * - swarm_merge: Merge completed thread branches
9
+ * - swarm_cancel: Cancel running thread(s)
10
+ * - swarm_cleanup: Destroy session and worktrees
11
+ */
12
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
13
+ /** Kill all tracked subprocesses. Called during server shutdown. */
14
+ export declare function killActiveSubprocesses(): void;
15
+ export declare function registerTools(server: McpServer, defaultDir?: string): void;