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,537 @@
1
+ /**
2
+ * Persistent session and thread state storage for ContextOS MCP server.
3
+ *
4
+ * Ensures that thread execution states, worktree locations, and results
5
+ * survive MCP server process restarts and can be recovered or cleaned up.
6
+ *
7
+ * Integrates with ContextOS Runtime v2 ThreadStore.
8
+ */
9
+ import { execFile } from "node:child_process";
10
+ import * as fs from "node:fs";
11
+ import * as path from "node:path";
12
+ import { promisify } from "node:util";
13
+ // @ts-expect-error
14
+ import { ThreadStore } from "../runtime/thread-store.cjs";
15
+ import { assertWithinRepository } from "../security/repository-boundary.js";
16
+ import { createRepositoryFingerprint } from "../worktree/manager.js";
17
+ const execFileAsync = promisify(execFile);
18
+ const ASYNC_TASKS_FILE_NAME = "async-tasks.json";
19
+ const ASYNC_TASKS_LOCK_NAME = "async-tasks.lock";
20
+ const DEFAULT_WORKTREE_BASE_DIR = ".swarm-worktrees";
21
+ const LOCK_TIMEOUT_MS = 30_000;
22
+ const LOCK_ACQUIRE_TIMEOUT_MS = 2_000;
23
+ export function isProcessAlive(pid) {
24
+ try {
25
+ process.kill(pid, 0);
26
+ return true;
27
+ }
28
+ catch (err) {
29
+ return err.code === "EPERM";
30
+ }
31
+ }
32
+ function getThreadStore(dir) {
33
+ const canonicalDir = assertWithinRepository(dir, dir);
34
+ return new ThreadStore({ baseDir: canonicalDir });
35
+ }
36
+ function getAsyncTasksPath(dir) {
37
+ const canonicalDir = assertWithinRepository(dir, dir);
38
+ const targetBase = path.join(canonicalDir, ".agents", ".contextos", "runtime");
39
+ if (!fs.existsSync(targetBase)) {
40
+ fs.mkdirSync(targetBase, { recursive: true });
41
+ }
42
+ return path.join(targetBase, ASYNC_TASKS_FILE_NAME);
43
+ }
44
+ function getAsyncTasksLockPath(dir) {
45
+ const canonicalDir = assertWithinRepository(dir, dir);
46
+ const targetBase = path.join(canonicalDir, ".agents", ".contextos", "runtime");
47
+ if (!fs.existsSync(targetBase)) {
48
+ fs.mkdirSync(targetBase, { recursive: true });
49
+ }
50
+ return path.join(targetBase, ASYNC_TASKS_LOCK_NAME);
51
+ }
52
+ let LeaseLockClass = null;
53
+ function getLeaseLockClass(dir) {
54
+ const canonicalDir = assertWithinRepository(dir, dir);
55
+ if (!LeaseLockClass) {
56
+ let current = canonicalDir;
57
+ while (current !== path.dirname(current)) {
58
+ const p = path.join(current, ".agents", "runtime", "ipc-lock.js");
59
+ if (fs.existsSync(p)) {
60
+ try {
61
+ LeaseLockClass = require(p).LeaseLock;
62
+ break;
63
+ }
64
+ catch (e) {
65
+ console.error("Failed to load LeaseLock:", e);
66
+ }
67
+ }
68
+ current = path.dirname(current);
69
+ }
70
+ }
71
+ return LeaseLockClass;
72
+ }
73
+ export function acquireStateLock(dir, sessionId) {
74
+ const lockPath = getAsyncTasksLockPath(dir);
75
+ const lockDir = path.dirname(lockPath);
76
+ if (!fs.existsSync(lockDir)) {
77
+ fs.mkdirSync(lockDir, { recursive: true });
78
+ }
79
+ const LL = getLeaseLockClass(dir);
80
+ if (LL) {
81
+ const lock = new LL({
82
+ lockFilePath: lockPath,
83
+ ttlMs: LOCK_TIMEOUT_MS,
84
+ instanceId: sessionId || "mcp-session",
85
+ });
86
+ if (lock.tryAcquire()) {
87
+ return () => {
88
+ lock.release();
89
+ };
90
+ }
91
+ return null;
92
+ }
93
+ // Fallback to naive lock if LeaseLock not available
94
+ if (fs.existsSync(lockPath)) {
95
+ try {
96
+ const raw = fs.readFileSync(lockPath, "utf-8");
97
+ const lock = JSON.parse(raw);
98
+ const isExpired = Date.now() - lock.lockedAt > LOCK_TIMEOUT_MS;
99
+ const isOwnerDead = !isProcessAlive(lock.pid);
100
+ if (isExpired || isOwnerDead) {
101
+ try {
102
+ fs.unlinkSync(lockPath);
103
+ }
104
+ catch { }
105
+ }
106
+ else if (lock.pid !== process.pid) {
107
+ return null;
108
+ }
109
+ }
110
+ catch {
111
+ try {
112
+ fs.unlinkSync(lockPath);
113
+ }
114
+ catch { }
115
+ }
116
+ }
117
+ const lockData = {
118
+ pid: process.pid,
119
+ sessionId,
120
+ lockedAt: Date.now(),
121
+ };
122
+ try {
123
+ fs.writeFileSync(lockPath, JSON.stringify(lockData, null, 2), { flag: "wx" });
124
+ }
125
+ catch {
126
+ return null;
127
+ }
128
+ let released = false;
129
+ return () => {
130
+ if (released)
131
+ return;
132
+ released = true;
133
+ try {
134
+ if (fs.existsSync(lockPath)) {
135
+ fs.unlinkSync(lockPath);
136
+ }
137
+ }
138
+ catch { }
139
+ };
140
+ }
141
+ function acquireStateLockOrThrow(dir, sessionId) {
142
+ const startedAt = Date.now();
143
+ const waitBuffer = new Int32Array(new SharedArrayBuffer(4));
144
+ do {
145
+ const release = acquireStateLock(dir, sessionId);
146
+ if (release)
147
+ return release;
148
+ Atomics.wait(waitBuffer, 0, 0, 10);
149
+ } while (Date.now() - startedAt < LOCK_ACQUIRE_TIMEOUT_MS);
150
+ throw new Error(`Timed out acquiring state lock after ${LOCK_ACQUIRE_TIMEOUT_MS}ms`);
151
+ }
152
+ function atomicWriteJson(filePath, data) {
153
+ const dir = path.dirname(filePath);
154
+ if (!fs.existsSync(dir)) {
155
+ fs.mkdirSync(dir, { recursive: true });
156
+ }
157
+ const tempPath = `${filePath}.${Date.now()}.${Math.random().toString(36).slice(2, 8)}.tmp`;
158
+ const content = JSON.stringify(data, null, 2);
159
+ try {
160
+ fs.writeFileSync(tempPath, content, "utf-8");
161
+ fs.renameSync(tempPath, filePath);
162
+ }
163
+ catch {
164
+ try {
165
+ fs.writeFileSync(filePath, content, "utf-8");
166
+ }
167
+ finally {
168
+ if (fs.existsSync(tempPath)) {
169
+ try {
170
+ fs.unlinkSync(tempPath);
171
+ }
172
+ catch { }
173
+ }
174
+ }
175
+ }
176
+ }
177
+ /**
178
+ * Perform schema migration from legacy session-state.json to ThreadStore
179
+ */
180
+ function migrateLegacySessionState(repoRoot, worktreeBaseDir) {
181
+ const canonicalRoot = assertWithinRepository(repoRoot, repoRoot);
182
+ const targetBase = path.isAbsolute(worktreeBaseDir || DEFAULT_WORKTREE_BASE_DIR)
183
+ ? worktreeBaseDir || DEFAULT_WORKTREE_BASE_DIR
184
+ : path.join(canonicalRoot, worktreeBaseDir || DEFAULT_WORKTREE_BASE_DIR);
185
+ const legacyPath = path.join(assertWithinRepository(targetBase, canonicalRoot), "session-state.json");
186
+ if (!fs.existsSync(legacyPath)) {
187
+ return;
188
+ }
189
+ const store = getThreadStore(canonicalRoot);
190
+ try {
191
+ const raw = fs.readFileSync(legacyPath, "utf-8");
192
+ const parsed = JSON.parse(raw);
193
+ if (store && parsed && typeof parsed.threads === "object") {
194
+ for (const [_id, thread] of Object.entries(parsed.threads)) {
195
+ if (!thread.verification && thread.verificationAttestation?.status) {
196
+ thread.verification = thread.verificationAttestation.status;
197
+ }
198
+ if (!thread.review && thread.reviewAttestation?.llmVerdict) {
199
+ thread.review = {
200
+ specCompliance: thread.reviewAttestation.llmVerdict.specCompliance,
201
+ codeQuality: thread.reviewAttestation.llmVerdict.codeQuality,
202
+ summary: thread.reviewAttestation.llmVerdict.summary,
203
+ reviewerId: thread.reviewAttestation.reviewerExecutionId || "reviewer",
204
+ reviewedAt: thread.completedAt || Date.now(),
205
+ };
206
+ }
207
+ store.save(thread);
208
+ }
209
+ }
210
+ if (parsed?.asyncTasks) {
211
+ const release = acquireStateLockOrThrow(canonicalRoot);
212
+ try {
213
+ const tasksPath = getAsyncTasksPath(canonicalRoot);
214
+ let existingTasks = {};
215
+ if (fs.existsSync(tasksPath)) {
216
+ existingTasks = JSON.parse(fs.readFileSync(tasksPath, "utf-8"));
217
+ }
218
+ atomicWriteJson(tasksPath, { ...existingTasks, ...parsed.asyncTasks });
219
+ }
220
+ finally {
221
+ release();
222
+ }
223
+ }
224
+ // Mark as migrated
225
+ fs.renameSync(legacyPath, `${legacyPath}.migrated`);
226
+ }
227
+ catch (e) {
228
+ console.error("Migration failed:", e);
229
+ }
230
+ }
231
+ export async function reconcileSessionStateWithGit(repoRoot, worktreeBaseDir) {
232
+ const canonicalRoot = assertWithinRepository(repoRoot, repoRoot);
233
+ // Ensure migration runs before we read states
234
+ migrateLegacySessionState(canonicalRoot, worktreeBaseDir);
235
+ const store = getThreadStore(canonicalRoot);
236
+ if (!store)
237
+ return null;
238
+ const threads = store.list();
239
+ const gitWorktrees = [];
240
+ const normalizePath = (p) => {
241
+ try {
242
+ const real = fs.realpathSync.native ? fs.realpathSync.native(p) : fs.realpathSync(p);
243
+ return path.resolve(real).toLowerCase();
244
+ }
245
+ catch {
246
+ return path.resolve(p).toLowerCase();
247
+ }
248
+ };
249
+ try {
250
+ const { stdout } = await execFileAsync("git", ["worktree", "list", "--porcelain"], {
251
+ cwd: canonicalRoot,
252
+ maxBuffer: 10 * 1024 * 1024,
253
+ });
254
+ const entries = stdout
255
+ .trim()
256
+ .split(/\r?\n\r?\n/)
257
+ .filter(Boolean);
258
+ for (const entry of entries) {
259
+ const lines = entry.split(/\r?\n/);
260
+ let worktreePath = "";
261
+ let branch = "";
262
+ let bare = false;
263
+ for (const line of lines) {
264
+ if (line.startsWith("worktree ")) {
265
+ worktreePath = line.slice("worktree ".length).trim();
266
+ }
267
+ else if (line.startsWith("branch refs/heads/")) {
268
+ branch = line.slice("branch refs/heads/".length).trim();
269
+ }
270
+ else if (line === "bare") {
271
+ bare = true;
272
+ }
273
+ }
274
+ if (worktreePath) {
275
+ const norm = normalizePath(worktreePath);
276
+ let ino;
277
+ let dev;
278
+ try {
279
+ const stat = fs.statSync(worktreePath);
280
+ ino = stat.ino;
281
+ dev = stat.dev;
282
+ }
283
+ catch { }
284
+ gitWorktrees.push({ rawPath: worktreePath, normPath: norm, branch, bare, ino, dev });
285
+ }
286
+ }
287
+ }
288
+ catch {
289
+ // Non-fatal if git is unavailable
290
+ }
291
+ for (const thread of threads) {
292
+ let modified = false;
293
+ if (thread.status === "running" || thread.status === "pending") {
294
+ thread.status = "interrupted";
295
+ thread.phase = "interrupted";
296
+ thread.error = thread.error || "Thread interrupted by process restart or crash";
297
+ modified = true;
298
+ }
299
+ if (thread.worktreePath) {
300
+ const existsOnDisk = fs.existsSync(thread.worktreePath);
301
+ const normWt = normalizePath(thread.worktreePath);
302
+ let wtIno;
303
+ let wtDev;
304
+ if (existsOnDisk) {
305
+ try {
306
+ const stat = fs.statSync(thread.worktreePath);
307
+ wtIno = stat.ino;
308
+ wtDev = stat.dev;
309
+ }
310
+ catch { }
311
+ }
312
+ const registered = gitWorktrees.find((w) => {
313
+ if (w.normPath === normWt)
314
+ return true;
315
+ if (existsOnDisk && w.ino !== undefined && wtIno !== undefined && w.ino === wtIno && w.dev === wtDev) {
316
+ return true;
317
+ }
318
+ return false;
319
+ });
320
+ if (!existsOnDisk || !registered) {
321
+ if (thread.status === "interrupted") {
322
+ thread.status = "needs_recovery";
323
+ thread.phase = "needs_recovery";
324
+ thread.error = "Worktree directory or git registration missing after restart";
325
+ modified = true;
326
+ }
327
+ }
328
+ else {
329
+ if (registered.branch && !thread.branchName) {
330
+ thread.branchName = registered.branch;
331
+ modified = true;
332
+ }
333
+ }
334
+ }
335
+ if (modified) {
336
+ store.save(thread);
337
+ }
338
+ }
339
+ // Reconcile async tasks
340
+ const release = acquireStateLockOrThrow(canonicalRoot);
341
+ try {
342
+ const tasksPath = getAsyncTasksPath(canonicalRoot);
343
+ if (fs.existsSync(tasksPath)) {
344
+ let modified = false;
345
+ const tasks = JSON.parse(fs.readFileSync(tasksPath, "utf-8"));
346
+ for (const task of Object.values(tasks)) {
347
+ if (task.status === "running") {
348
+ task.status = "unknown_after_restart";
349
+ modified = true;
350
+ }
351
+ }
352
+ if (modified) {
353
+ atomicWriteJson(tasksPath, tasks);
354
+ }
355
+ }
356
+ }
357
+ finally {
358
+ release();
359
+ }
360
+ return { threads }; // return some dummy state so callers know we survived
361
+ }
362
+ export function recordThreadState(dir, thread, _worktreeBaseDir) {
363
+ const store = getThreadStore(dir);
364
+ if (store) {
365
+ store.save(thread);
366
+ }
367
+ }
368
+ export function savePersistedState(dir, state, worktreeBaseDir = DEFAULT_WORKTREE_BASE_DIR) {
369
+ const canonicalDir = assertWithinRepository(dir, dir);
370
+ const targetBase = path.isAbsolute(worktreeBaseDir) ? worktreeBaseDir : path.join(canonicalDir, worktreeBaseDir);
371
+ const validBase = assertWithinRepository(targetBase, canonicalDir);
372
+ fs.mkdirSync(validBase, { recursive: true });
373
+ const legacyPath = path.join(validBase, "session-state.json");
374
+ fs.writeFileSync(legacyPath, JSON.stringify(state, null, 2), "utf-8");
375
+ }
376
+ export function loadPersistedState(dir, worktreeBaseDir) {
377
+ const canonicalDir = assertWithinRepository(dir, dir);
378
+ const targetBase = path.isAbsolute(worktreeBaseDir || DEFAULT_WORKTREE_BASE_DIR)
379
+ ? worktreeBaseDir || DEFAULT_WORKTREE_BASE_DIR
380
+ : path.join(canonicalDir, worktreeBaseDir || DEFAULT_WORKTREE_BASE_DIR);
381
+ const validBase = assertWithinRepository(targetBase, canonicalDir);
382
+ const legacyPath = path.join(validBase, "session-state.json");
383
+ if (fs.existsSync(legacyPath)) {
384
+ try {
385
+ return JSON.parse(fs.readFileSync(legacyPath, "utf-8"));
386
+ }
387
+ catch {
388
+ return null;
389
+ }
390
+ }
391
+ const store = getThreadStore(canonicalDir);
392
+ if (store) {
393
+ const threads = store.list();
394
+ const threadMap = {};
395
+ for (const t of threads) {
396
+ threadMap[t.id] = t;
397
+ }
398
+ return { threads: threadMap, sequence: threads.length };
399
+ }
400
+ return null;
401
+ }
402
+ export function recordAsyncTask(dir, task, _worktreeBaseDir) {
403
+ const release = acquireStateLockOrThrow(dir);
404
+ try {
405
+ const tasksPath = getAsyncTasksPath(dir);
406
+ let existingTasks = {};
407
+ if (fs.existsSync(tasksPath)) {
408
+ existingTasks = JSON.parse(fs.readFileSync(tasksPath, "utf-8"));
409
+ }
410
+ existingTasks[task.taskId] = task;
411
+ atomicWriteJson(tasksPath, existingTasks);
412
+ }
413
+ finally {
414
+ release();
415
+ }
416
+ }
417
+ export function getPersistedThreads(dir, _worktreeBaseDir) {
418
+ const canonicalDir = assertWithinRepository(dir, dir);
419
+ if (!fs.existsSync(path.join(canonicalDir, ".agents", ".contextos", "threads")))
420
+ return [];
421
+ assertWithinRepository(path.join(canonicalDir, ".agents", ".contextos", "threads"), canonicalDir);
422
+ const store = getThreadStore(dir);
423
+ if (store) {
424
+ return store.list();
425
+ }
426
+ return [];
427
+ }
428
+ export function getPersistedAsyncTasks(dir, _worktreeBaseDir) {
429
+ const canonicalDir = assertWithinRepository(dir, dir);
430
+ const tasksPath = path.join(canonicalDir, ".agents", ".contextos", "runtime", ASYNC_TASKS_FILE_NAME);
431
+ if (fs.existsSync(tasksPath)) {
432
+ assertWithinRepository(tasksPath, canonicalDir);
433
+ try {
434
+ return JSON.parse(fs.readFileSync(tasksPath, "utf-8"));
435
+ }
436
+ catch { }
437
+ }
438
+ return {};
439
+ }
440
+ export function clearPersistedState(_dir, _worktreeBaseDir) {
441
+ // Not deleting thread store to preserve history. Only delete async tasks lock if needed, or don't delete at all.
442
+ }
443
+ export async function scanOrphanWorktrees(repoRoot, worktreeBaseDir) {
444
+ const canonicalRoot = assertWithinRepository(repoRoot, repoRoot);
445
+ const targetBase = path.isAbsolute(worktreeBaseDir || DEFAULT_WORKTREE_BASE_DIR)
446
+ ? worktreeBaseDir || DEFAULT_WORKTREE_BASE_DIR
447
+ : path.join(canonicalRoot, worktreeBaseDir || DEFAULT_WORKTREE_BASE_DIR);
448
+ const baseDir = assertWithinRepository(targetBase, canonicalRoot);
449
+ const worktreeDirs = [];
450
+ const swarmBranches = [];
451
+ if (fs.existsSync(baseDir)) {
452
+ try {
453
+ const entries = fs.readdirSync(baseDir, { withFileTypes: true });
454
+ for (const entry of entries) {
455
+ if (entry.isDirectory() && entry.name !== "." && entry.name !== "..") {
456
+ const entryPath = path.join(baseDir, entry.name);
457
+ const canonicalEntry = assertWithinRepository(entryPath, canonicalRoot);
458
+ const sessionMarkerPath = path.join(canonicalEntry, ".contextos-session");
459
+ if (fs.existsSync(sessionMarkerPath)) {
460
+ try {
461
+ const marker = JSON.parse(fs.readFileSync(sessionMarkerPath, "utf-8"));
462
+ const expectedFingerprint = createRepositoryFingerprint(canonicalRoot);
463
+ if (marker.repositoryFingerprint && marker.repositoryFingerprint !== expectedFingerprint) {
464
+ continue;
465
+ }
466
+ }
467
+ catch {
468
+ // Corrupt marker
469
+ }
470
+ }
471
+ worktreeDirs.push(canonicalEntry);
472
+ }
473
+ }
474
+ }
475
+ catch {
476
+ // Ignore directory read failure
477
+ }
478
+ }
479
+ try {
480
+ const { stdout } = await execFileAsync("git", ["branch", "--list", "swarm/*"], { cwd: canonicalRoot });
481
+ const branches = stdout
482
+ .split("\n")
483
+ .map((b) => b.replace(/^[*+]\s+/, "").trim())
484
+ .filter((b) => b.length > 0 && b.startsWith("swarm/"));
485
+ swarmBranches.push(...branches);
486
+ }
487
+ catch {
488
+ // Ignore git errors if not a repo or git not found
489
+ }
490
+ return { worktreeDirs, swarmBranches };
491
+ }
492
+ export async function purgeOrphans(repoRoot, dryRun = false, worktreeBaseDir) {
493
+ const scanReport = await scanOrphanWorktrees(repoRoot, worktreeBaseDir);
494
+ const canonicalRoot = assertWithinRepository(repoRoot, repoRoot);
495
+ let prunedWorktrees = 0;
496
+ let deletedBranches = 0;
497
+ const report = [];
498
+ for (const wt of scanReport.worktreeDirs) {
499
+ if (dryRun) {
500
+ report.push(`[DRY RUN] Would remove orphan worktree: ${wt}`);
501
+ prunedWorktrees++;
502
+ }
503
+ else {
504
+ try {
505
+ await execFileAsync("git", ["worktree", "remove", "--force", wt], { cwd: canonicalRoot });
506
+ prunedWorktrees++;
507
+ report.push(`Removed orphan worktree: ${wt}`);
508
+ }
509
+ catch (err) {
510
+ report.push(`Failed to remove worktree ${wt}: ${err.message}`);
511
+ try {
512
+ fs.rmSync(wt, { recursive: true, force: true });
513
+ prunedWorktrees++;
514
+ }
515
+ catch { }
516
+ }
517
+ }
518
+ }
519
+ for (const branch of scanReport.swarmBranches) {
520
+ if (dryRun) {
521
+ report.push(`[DRY RUN] Would delete orphan branch: ${branch}`);
522
+ deletedBranches++;
523
+ }
524
+ else {
525
+ try {
526
+ await execFileAsync("git", ["branch", "-D", branch], { cwd: canonicalRoot });
527
+ deletedBranches++;
528
+ report.push(`Deleted orphan branch: ${branch}`);
529
+ }
530
+ catch (err) {
531
+ report.push(`Failed to delete branch ${branch}: ${err.message}`);
532
+ }
533
+ }
534
+ }
535
+ return { prunedWorktrees, deletedBranches, report };
536
+ }
537
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/mcp/state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
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 type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
15
+ import { parseVerificationSpec, runWorktreeVerification } from "../../orchestration/verification-runner.js";
16
+ export { parseVerificationSpec, runWorktreeVerification };
17
+ export declare function registerContextosTools(server: McpServer, defaultDir?: string, enableRuntime?: boolean): void;