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.
- package/LICENSE +21 -0
- package/README.md +260 -0
- package/bin/mcp.mjs +61 -0
- package/bin/swarm.mjs +45 -0
- package/dist/agents/aider.d.ts +12 -0
- package/dist/agents/aider.js +192 -0
- package/dist/agents/aider.js.map +1 -0
- package/dist/agents/claude-code.d.ts +9 -0
- package/dist/agents/claude-code.js +236 -0
- package/dist/agents/claude-code.js.map +1 -0
- package/dist/agents/codex.d.ts +14 -0
- package/dist/agents/codex.js +203 -0
- package/dist/agents/codex.js.map +1 -0
- package/dist/agents/direct-llm.d.ts +22 -0
- package/dist/agents/direct-llm.js +254 -0
- package/dist/agents/direct-llm.js.map +1 -0
- package/dist/agents/mock.d.ts +10 -0
- package/dist/agents/mock.js +170 -0
- package/dist/agents/mock.js.map +1 -0
- package/dist/agents/opencode.d.ts +23 -0
- package/dist/agents/opencode.js +631 -0
- package/dist/agents/opencode.js.map +1 -0
- package/dist/agents/provider.d.ts +11 -0
- package/dist/agents/provider.js +31 -0
- package/dist/agents/provider.js.map +1 -0
- package/dist/compression/compressor.d.ts +28 -0
- package/dist/compression/compressor.js +268 -0
- package/dist/compression/compressor.js.map +1 -0
- package/dist/config.d.ts +43 -0
- package/dist/config.js +172 -0
- package/dist/config.js.map +1 -0
- package/dist/contextos/loader.d.ts +46 -0
- package/dist/contextos/loader.js +120 -0
- package/dist/contextos/loader.js.map +1 -0
- package/dist/contextos/selector.d.ts +46 -0
- package/dist/contextos/selector.js +80 -0
- package/dist/contextos/selector.js.map +1 -0
- package/dist/core/action-dispatcher.d.ts +15 -0
- package/dist/core/action-dispatcher.js +28 -0
- package/dist/core/action-dispatcher.js.map +1 -0
- package/dist/core/action-schema.d.ts +72 -0
- package/dist/core/action-schema.js +86 -0
- package/dist/core/action-schema.js.map +1 -0
- package/dist/core/repl-interface.d.ts +48 -0
- package/dist/core/repl-interface.js +5 -0
- package/dist/core/repl-interface.js.map +1 -0
- package/dist/core/repl.d.ts +59 -0
- package/dist/core/repl.js +353 -0
- package/dist/core/repl.js.map +1 -0
- package/dist/core/rlm.d.ts +65 -0
- package/dist/core/rlm.js +564 -0
- package/dist/core/rlm.js.map +1 -0
- package/dist/core/runtime.py +470 -0
- package/dist/core/types.d.ts +265 -0
- package/dist/core/types.js +19 -0
- package/dist/core/types.js.map +1 -0
- package/dist/env.d.ts +10 -0
- package/dist/env.js +75 -0
- package/dist/env.js.map +1 -0
- package/dist/hooks/runner.d.ts +43 -0
- package/dist/hooks/runner.js +173 -0
- package/dist/hooks/runner.js.map +1 -0
- package/dist/labs/cli.d.ts +15 -0
- package/dist/labs/cli.js +295 -0
- package/dist/labs/cli.js.map +1 -0
- package/dist/labs/episodic-memory.d.ts +132 -0
- package/dist/labs/episodic-memory.js +391 -0
- package/dist/labs/episodic-memory.js.map +1 -0
- package/dist/labs/interactive-swarm.d.ts +20 -0
- package/dist/labs/interactive-swarm.js +1173 -0
- package/dist/labs/interactive-swarm.js.map +1 -0
- package/dist/labs/interactive.d.ts +10 -0
- package/dist/labs/interactive.js +2099 -0
- package/dist/labs/interactive.js.map +1 -0
- package/dist/labs/ts-analyzer.d.ts +74 -0
- package/dist/labs/ts-analyzer.js +379 -0
- package/dist/labs/ts-analyzer.js.map +1 -0
- package/dist/labs/viewer.d.ts +12 -0
- package/dist/labs/viewer.js +1284 -0
- package/dist/labs/viewer.js.map +1 -0
- package/dist/main.d.ts +15 -0
- package/dist/main.js +247 -0
- package/dist/main.js.map +1 -0
- package/dist/mcp/server.d.ts +16 -0
- package/dist/mcp/server.js +192775 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/session.d.ts +117 -0
- package/dist/mcp/session.js +450 -0
- package/dist/mcp/session.js.map +1 -0
- package/dist/mcp/state.d.ts +42 -0
- package/dist/mcp/state.js +537 -0
- package/dist/mcp/state.js.map +1 -0
- package/dist/mcp/tools/contextos.d.ts +17 -0
- package/dist/mcp/tools/contextos.js +583 -0
- package/dist/mcp/tools/contextos.js.map +1 -0
- package/dist/mcp/tools.d.ts +15 -0
- package/dist/mcp/tools.js +393 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/orchestration/reviewer-gate.d.ts +43 -0
- package/dist/orchestration/reviewer-gate.js +280 -0
- package/dist/orchestration/reviewer-gate.js.map +1 -0
- package/dist/orchestration/reviewer-prompt.d.ts +18 -0
- package/dist/orchestration/reviewer-prompt.js +67 -0
- package/dist/orchestration/reviewer-prompt.js.map +1 -0
- package/dist/orchestration/verification-runner.d.ts +53 -0
- package/dist/orchestration/verification-runner.js +352 -0
- package/dist/orchestration/verification-runner.js.map +1 -0
- package/dist/plugins/adapter.d.ts +11 -0
- package/dist/plugins/adapter.js +11 -0
- package/dist/plugins/adapter.js.map +1 -0
- package/dist/plugins/core/archive.d.ts +9 -0
- package/dist/plugins/core/archive.js +128 -0
- package/dist/plugins/core/archive.js.map +1 -0
- package/dist/plugins/core/digest.d.ts +11 -0
- package/dist/plugins/core/digest.js +70 -0
- package/dist/plugins/core/digest.js.map +1 -0
- package/dist/plugins/core/grants.d.ts +22 -0
- package/dist/plugins/core/grants.js +90 -0
- package/dist/plugins/core/grants.js.map +1 -0
- package/dist/plugins/core/index.d.ts +10 -0
- package/dist/plugins/core/index.js +11 -0
- package/dist/plugins/core/index.js.map +1 -0
- package/dist/plugins/core/pinning.d.ts +15 -0
- package/dist/plugins/core/pinning.js +86 -0
- package/dist/plugins/core/pinning.js.map +1 -0
- package/dist/plugins/core/types.d.ts +105 -0
- package/dist/plugins/core/types.js +22 -0
- package/dist/plugins/core/types.js.map +1 -0
- package/dist/plugins/core/updater.d.ts +16 -0
- package/dist/plugins/core/updater.js +64 -0
- package/dist/plugins/core/updater.js.map +1 -0
- package/dist/plugins/loader.d.ts +65 -0
- package/dist/plugins/loader.js +110 -0
- package/dist/plugins/loader.js.map +1 -0
- package/dist/prompts/orchestrator.d.ts +6 -0
- package/dist/prompts/orchestrator.js +114 -0
- package/dist/prompts/orchestrator.js.map +1 -0
- package/dist/routing/model-resolver.d.ts +27 -0
- package/dist/routing/model-resolver.js +265 -0
- package/dist/routing/model-resolver.js.map +1 -0
- package/dist/routing/model-router.d.ts +130 -0
- package/dist/routing/model-router.js +515 -0
- package/dist/routing/model-router.js.map +1 -0
- package/dist/runtime/attestations.cjs +260 -0
- package/dist/runtime/reviewer-pipeline.cjs +319 -0
- package/dist/runtime/sandbox.cjs +468 -0
- package/dist/runtime/state-machine.cjs +885 -0
- package/dist/runtime/thread-store.cjs +175 -0
- package/dist/runtime/transactional-git.cjs +315 -0
- package/dist/runtime/verification-pipeline.cjs +435 -0
- package/dist/sandbox/execution.d.ts +165 -0
- package/dist/sandbox/execution.js +497 -0
- package/dist/sandbox/execution.js.map +1 -0
- package/dist/security/file-policy.d.ts +22 -0
- package/dist/security/file-policy.js +53 -0
- package/dist/security/file-policy.js.map +1 -0
- package/dist/security/repository-boundary.d.ts +21 -0
- package/dist/security/repository-boundary.js +119 -0
- package/dist/security/repository-boundary.js.map +1 -0
- package/dist/security/secret-filter.d.ts +36 -0
- package/dist/security/secret-filter.js +149 -0
- package/dist/security/secret-filter.js.map +1 -0
- package/dist/swarm.d.ts +14 -0
- package/dist/swarm.js +624 -0
- package/dist/swarm.js.map +1 -0
- package/dist/threads/cache.d.ts +64 -0
- package/dist/threads/cache.js +241 -0
- package/dist/threads/cache.js.map +1 -0
- package/dist/threads/manager.d.ts +94 -0
- package/dist/threads/manager.js +914 -0
- package/dist/threads/manager.js.map +1 -0
- package/dist/ui/banner.d.ts +14 -0
- package/dist/ui/banner.js +42 -0
- package/dist/ui/banner.js.map +1 -0
- package/dist/ui/dashboard.d.ts +33 -0
- package/dist/ui/dashboard.js +135 -0
- package/dist/ui/dashboard.js.map +1 -0
- package/dist/ui/index.d.ts +11 -0
- package/dist/ui/index.js +12 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui/log.d.ts +39 -0
- package/dist/ui/log.js +126 -0
- package/dist/ui/log.js.map +1 -0
- package/dist/ui/onboarding.d.ts +14 -0
- package/dist/ui/onboarding.js +755 -0
- package/dist/ui/onboarding.js.map +1 -0
- package/dist/ui/run-log.d.ts +50 -0
- package/dist/ui/run-log.js +60 -0
- package/dist/ui/run-log.js.map +1 -0
- package/dist/ui/spinner.d.ts +41 -0
- package/dist/ui/spinner.js +172 -0
- package/dist/ui/spinner.js.map +1 -0
- package/dist/ui/streaming-feed.d.ts +72 -0
- package/dist/ui/streaming-feed.js +386 -0
- package/dist/ui/streaming-feed.js.map +1 -0
- package/dist/ui/summary.d.ts +18 -0
- package/dist/ui/summary.js +113 -0
- package/dist/ui/summary.js.map +1 -0
- package/dist/ui/text-input.d.ts +19 -0
- package/dist/ui/text-input.js +266 -0
- package/dist/ui/text-input.js.map +1 -0
- package/dist/ui/theme.d.ts +63 -0
- package/dist/ui/theme.js +97 -0
- package/dist/ui/theme.js.map +1 -0
- package/dist/utils/command-exists.d.ts +11 -0
- package/dist/utils/command-exists.js +41 -0
- package/dist/utils/command-exists.js.map +1 -0
- package/dist/utils/process-security.d.ts +19 -0
- package/dist/utils/process-security.js +90 -0
- package/dist/utils/process-security.js.map +1 -0
- package/dist/utils/rolling-buffer.d.ts +16 -0
- package/dist/utils/rolling-buffer.js +30 -0
- package/dist/utils/rolling-buffer.js.map +1 -0
- package/dist/utils/safe-spawn.d.ts +13 -0
- package/dist/utils/safe-spawn.js +49 -0
- package/dist/utils/safe-spawn.js.map +1 -0
- package/dist/worktree/manager.d.ts +69 -0
- package/dist/worktree/manager.js +593 -0
- package/dist/worktree/manager.js.map +1 -0
- package/dist/worktree/merge.d.ts +58 -0
- package/dist/worktree/merge.js +389 -0
- package/dist/worktree/merge.js.map +1 -0
- package/package.json +63 -0
|
@@ -0,0 +1,593 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git worktree manager — creates isolated worktrees for thread execution.
|
|
3
|
+
*
|
|
4
|
+
* Phase 2 enhancements:
|
|
5
|
+
* - Mutex on create() to prevent branch name races under concurrency
|
|
6
|
+
* - Retry logic for git worktree add (transient lock file contention)
|
|
7
|
+
*
|
|
8
|
+
* Lifecycle:
|
|
9
|
+
* 1. create() — git worktree add -b swarm/<id> <path> HEAD
|
|
10
|
+
* 2. Agent runs in worktree directory
|
|
11
|
+
* 3. getDiff() — capture changes
|
|
12
|
+
* 4. commit() — commit changes in worktree
|
|
13
|
+
* 5. destroy() — git worktree remove + branch cleanup
|
|
14
|
+
*/
|
|
15
|
+
import { execFile } from "node:child_process";
|
|
16
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
17
|
+
import { existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, unlinkSync, writeFileSync } from "node:fs";
|
|
18
|
+
import * as os from "node:os";
|
|
19
|
+
import * as path from "node:path";
|
|
20
|
+
import { isPathAllowed } from "../security/file-policy.js";
|
|
21
|
+
import { assertWithinRepository } from "../security/repository-boundary.js";
|
|
22
|
+
import { containsSecrets, isBlockedPath, redactSecrets } from "../security/secret-filter.js";
|
|
23
|
+
function git(args, cwd, extraEnv) {
|
|
24
|
+
return new Promise((resolve, reject) => {
|
|
25
|
+
const env = extraEnv ? { ...process.env, ...extraEnv } : process.env;
|
|
26
|
+
execFile("git", args, { cwd, maxBuffer: 10 * 1024 * 1024, env }, (err, stdout, stderr) => {
|
|
27
|
+
if (err) {
|
|
28
|
+
reject(new Error(`git ${args[0]} failed: ${stderr || err.message}`));
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
resolve({ stdout, stderr });
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
/** Read a worktree without initializing a runtime or changing its real index. */
|
|
37
|
+
export async function readWorktreeDiff(worktreePath, repoRoot) {
|
|
38
|
+
assertWithinRepository(worktreePath, repoRoot);
|
|
39
|
+
const tempBase = path.resolve(os.tmpdir());
|
|
40
|
+
const tempRoot = mkdtempSync(path.join(tempBase, "ctx-diff-"));
|
|
41
|
+
if (path.dirname(tempRoot) !== tempBase || !path.basename(tempRoot).startsWith("ctx-diff-")) {
|
|
42
|
+
throw new Error("Invalid temporary diff path");
|
|
43
|
+
}
|
|
44
|
+
const tmpIndex = path.join(tempRoot, "index");
|
|
45
|
+
const objects = path.join(tempRoot, "objects");
|
|
46
|
+
mkdirSync(objects);
|
|
47
|
+
let diff;
|
|
48
|
+
try {
|
|
49
|
+
const { stdout: originalObjects } = await git(["rev-parse", "--git-path", "objects"], worktreePath, {
|
|
50
|
+
GIT_OPTIONAL_LOCKS: "0",
|
|
51
|
+
});
|
|
52
|
+
const env = {
|
|
53
|
+
GIT_INDEX_FILE: tmpIndex,
|
|
54
|
+
GIT_OPTIONAL_LOCKS: "0",
|
|
55
|
+
GIT_OBJECT_DIRECTORY: objects,
|
|
56
|
+
GIT_ALTERNATE_OBJECT_DIRECTORIES: path.resolve(worktreePath, originalObjects.trim()),
|
|
57
|
+
};
|
|
58
|
+
await git(["read-tree", "HEAD"], worktreePath, env);
|
|
59
|
+
const { stdout: status } = await git(["status", "--porcelain", "-z"], worktreePath, { GIT_OPTIONAL_LOCKS: "0" });
|
|
60
|
+
const untracked = status
|
|
61
|
+
.split("\0")
|
|
62
|
+
.filter((s) => s.startsWith("?? "))
|
|
63
|
+
.map((s) => s.slice(3))
|
|
64
|
+
.filter((file) => file !== ".contextos-owner" && file !== ".contextos-session");
|
|
65
|
+
for (let i = 0; i < untracked.length; i += 100) {
|
|
66
|
+
await git(["add", "-N", "--", ...untracked.slice(i, i + 100)], worktreePath, env);
|
|
67
|
+
}
|
|
68
|
+
const { stdout } = await git(["diff", "HEAD", "--", ":(exclude).contextos-owner", ":(exclude).contextos-session"], worktreePath, env);
|
|
69
|
+
diff = redactSecrets(stdout || "(no changes)");
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
try {
|
|
73
|
+
rmSync(tempRoot, { recursive: true, force: true });
|
|
74
|
+
}
|
|
75
|
+
catch (cleanupError) {
|
|
76
|
+
throw new AggregateError([error, cleanupError], "Git diff failed and temporary directory cleanup failed");
|
|
77
|
+
}
|
|
78
|
+
throw error;
|
|
79
|
+
}
|
|
80
|
+
rmSync(tempRoot, { recursive: true, force: true });
|
|
81
|
+
return diff;
|
|
82
|
+
}
|
|
83
|
+
/** Simple async mutex for serializing worktree creation. */
|
|
84
|
+
class Mutex {
|
|
85
|
+
locked = false;
|
|
86
|
+
waiters = [];
|
|
87
|
+
async acquire() {
|
|
88
|
+
if (!this.locked) {
|
|
89
|
+
this.locked = true;
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
return new Promise((resolve) => {
|
|
93
|
+
this.waiters.push(resolve);
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
release() {
|
|
97
|
+
this.locked = false;
|
|
98
|
+
const next = this.waiters.shift();
|
|
99
|
+
if (next)
|
|
100
|
+
next();
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
const WORKTREE_CREATE_RETRIES = 3;
|
|
104
|
+
const WORKTREE_RETRY_DELAY_MS = 500;
|
|
105
|
+
export class ScopeViolationError extends Error {
|
|
106
|
+
files;
|
|
107
|
+
constructor(files) {
|
|
108
|
+
super(`scope_violation: changes outside writeScope: ${files.join(", ")}`);
|
|
109
|
+
this.name = "ScopeViolationError";
|
|
110
|
+
this.files = files;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
export function normalizeGitPath(file) {
|
|
114
|
+
return file.replace(/\\/g, "/").replace(/^\.\//, "").replace(/\/$/, "");
|
|
115
|
+
}
|
|
116
|
+
export function isWithinWriteScope(file, writeScope) {
|
|
117
|
+
const normalized = normalizeGitPath(file);
|
|
118
|
+
return writeScope.some((scope) => {
|
|
119
|
+
const allowed = normalizeGitPath(scope);
|
|
120
|
+
if (allowed === "." || allowed === "")
|
|
121
|
+
return true;
|
|
122
|
+
return normalized === allowed || normalized.startsWith(`${allowed}/`);
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
export function isDeniedByWriteScope(file, denyScope) {
|
|
126
|
+
return isWithinWriteScope(file, denyScope);
|
|
127
|
+
}
|
|
128
|
+
function parseNameStatus(raw) {
|
|
129
|
+
const fields = raw.split("\0").filter(Boolean);
|
|
130
|
+
const files = [];
|
|
131
|
+
for (let index = 0; index < fields.length;) {
|
|
132
|
+
const status = fields[index++];
|
|
133
|
+
const file = fields[index++];
|
|
134
|
+
if (!file)
|
|
135
|
+
break;
|
|
136
|
+
files.push(file);
|
|
137
|
+
if (status.startsWith("R") || status.startsWith("C")) {
|
|
138
|
+
const previous = fields[index++];
|
|
139
|
+
if (previous)
|
|
140
|
+
files.push(previous);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return files;
|
|
144
|
+
}
|
|
145
|
+
function parsePorcelainV2(raw) {
|
|
146
|
+
const records = raw.split("\0").filter(Boolean);
|
|
147
|
+
const files = [];
|
|
148
|
+
for (let index = 0; index < records.length; index++) {
|
|
149
|
+
const record = records[index];
|
|
150
|
+
if (record.startsWith("? "))
|
|
151
|
+
files.push(record.slice(2));
|
|
152
|
+
else if (record.startsWith("1 "))
|
|
153
|
+
files.push(record.split(" ").slice(8).join(" "));
|
|
154
|
+
else if (record.startsWith("2 ")) {
|
|
155
|
+
files.push(record.split(" ").slice(9).join(" "));
|
|
156
|
+
const previous = records[++index];
|
|
157
|
+
if (previous)
|
|
158
|
+
files.push(previous);
|
|
159
|
+
}
|
|
160
|
+
else if (record.startsWith("u "))
|
|
161
|
+
files.push(record.split(" ").slice(10).join(" "));
|
|
162
|
+
}
|
|
163
|
+
return files;
|
|
164
|
+
}
|
|
165
|
+
export function createRepositoryFingerprint(repoRoot) {
|
|
166
|
+
const canonical = path.resolve(repoRoot).toLowerCase();
|
|
167
|
+
return createHash("sha256").update(canonical).digest("hex").slice(0, 16);
|
|
168
|
+
}
|
|
169
|
+
export class WorktreeManager {
|
|
170
|
+
repoRoot;
|
|
171
|
+
baseDir;
|
|
172
|
+
sessionId;
|
|
173
|
+
repoFingerprint;
|
|
174
|
+
worktrees = new Map();
|
|
175
|
+
createMutex = new Mutex();
|
|
176
|
+
constructor(repoRoot, baseDir = ".swarm-worktrees", sessionId) {
|
|
177
|
+
this.repoRoot = assertWithinRepository(repoRoot, repoRoot);
|
|
178
|
+
const targetBase = path.isAbsolute(baseDir) ? baseDir : path.join(this.repoRoot, baseDir);
|
|
179
|
+
this.baseDir = assertWithinRepository(targetBase, this.repoRoot);
|
|
180
|
+
this.sessionId = sessionId || `session-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 6)}`;
|
|
181
|
+
this.repoFingerprint = createRepositoryFingerprint(this.repoRoot);
|
|
182
|
+
}
|
|
183
|
+
getSessionId() {
|
|
184
|
+
return this.sessionId;
|
|
185
|
+
}
|
|
186
|
+
getRepositoryFingerprint() {
|
|
187
|
+
return this.repoFingerprint;
|
|
188
|
+
}
|
|
189
|
+
isContextosWorktree(wtPath) {
|
|
190
|
+
const sessionMarkerPath = path.join(wtPath, ".contextos-session");
|
|
191
|
+
const ownerMarkerPath = path.join(wtPath, ".contextos-owner");
|
|
192
|
+
if (existsSync(sessionMarkerPath)) {
|
|
193
|
+
try {
|
|
194
|
+
const raw = readFileSync(sessionMarkerPath, "utf-8");
|
|
195
|
+
const marker = JSON.parse(raw);
|
|
196
|
+
return (marker.schemaVersion === 1 &&
|
|
197
|
+
marker.repositoryFingerprint === this.repoFingerprint &&
|
|
198
|
+
typeof marker.sessionId === "string" &&
|
|
199
|
+
typeof marker.threadId === "string" &&
|
|
200
|
+
typeof marker.worktreePath === "string" &&
|
|
201
|
+
typeof marker.branchName === "string" &&
|
|
202
|
+
typeof marker.ownerToken === "string" &&
|
|
203
|
+
typeof marker.createdAt === "number");
|
|
204
|
+
}
|
|
205
|
+
catch {
|
|
206
|
+
return false;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
if (existsSync(ownerMarkerPath)) {
|
|
210
|
+
try {
|
|
211
|
+
const raw = readFileSync(ownerMarkerPath, "utf-8");
|
|
212
|
+
const owner = JSON.parse(raw);
|
|
213
|
+
return typeof owner.threadId === "string";
|
|
214
|
+
}
|
|
215
|
+
catch {
|
|
216
|
+
return false;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
return false;
|
|
220
|
+
}
|
|
221
|
+
/** Ensure we're in a git repo and the base directory exists. */
|
|
222
|
+
async init() {
|
|
223
|
+
try {
|
|
224
|
+
await git(["rev-parse", "--git-dir"], this.repoRoot);
|
|
225
|
+
}
|
|
226
|
+
catch {
|
|
227
|
+
throw new Error(`Not a git repository: ${this.repoRoot}`);
|
|
228
|
+
}
|
|
229
|
+
if (!existsSync(this.baseDir)) {
|
|
230
|
+
mkdirSync(this.baseDir, { recursive: true });
|
|
231
|
+
}
|
|
232
|
+
// Add base dir to .gitignore if not already
|
|
233
|
+
const gitignorePath = path.join(this.repoRoot, ".gitignore");
|
|
234
|
+
const baseDirRelative = path.relative(this.repoRoot, this.baseDir);
|
|
235
|
+
try {
|
|
236
|
+
const { readFileSync, appendFileSync } = await import("node:fs");
|
|
237
|
+
let content = "";
|
|
238
|
+
if (existsSync(gitignorePath)) {
|
|
239
|
+
content = readFileSync(gitignorePath, "utf-8");
|
|
240
|
+
}
|
|
241
|
+
if (!content.includes(baseDirRelative)) {
|
|
242
|
+
appendFileSync(gitignorePath, `\n# Swarm worktrees\n${baseDirRelative}/\n`);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
catch {
|
|
246
|
+
// Non-fatal — .gitignore might be read-only
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Create a new worktree for a thread.
|
|
251
|
+
* Serialized via mutex to prevent branch name races.
|
|
252
|
+
* Retries on transient lock-file contention.
|
|
253
|
+
*/
|
|
254
|
+
async create(threadId) {
|
|
255
|
+
await this.createMutex.acquire();
|
|
256
|
+
try {
|
|
257
|
+
return await this.createWorktreeWithRetry(threadId);
|
|
258
|
+
}
|
|
259
|
+
finally {
|
|
260
|
+
this.createMutex.release();
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
async createWorktreeWithRetry(threadId) {
|
|
264
|
+
if (!/^[a-zA-Z0-9_-]+$/.test(threadId)) {
|
|
265
|
+
throw new Error(`Invalid threadId "${threadId}": must contain only alphanumeric characters, underscores, and dashes.`);
|
|
266
|
+
}
|
|
267
|
+
const branch = `swarm/${threadId}`;
|
|
268
|
+
const wtPath = assertWithinRepository(path.resolve(this.baseDir, `wt-${threadId}`), this.repoRoot);
|
|
269
|
+
const rel = path.relative(path.resolve(this.baseDir), wtPath);
|
|
270
|
+
if (rel.startsWith("..") || path.isAbsolute(rel)) {
|
|
271
|
+
throw new Error(`Path traversal detected: worktree path "${wtPath}" escapes base directory "${this.baseDir}"`);
|
|
272
|
+
}
|
|
273
|
+
// Remove stale worktree if it exists
|
|
274
|
+
if (existsSync(wtPath)) {
|
|
275
|
+
try {
|
|
276
|
+
await git(["worktree", "remove", "--force", wtPath], this.repoRoot);
|
|
277
|
+
}
|
|
278
|
+
catch {
|
|
279
|
+
rmSync(wtPath, { recursive: true, force: true, maxRetries: 5, retryDelay: 200 });
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
// Delete stale branch if exists
|
|
283
|
+
try {
|
|
284
|
+
await git(["branch", "-D", branch], this.repoRoot);
|
|
285
|
+
}
|
|
286
|
+
catch {
|
|
287
|
+
// Branch didn't exist — fine
|
|
288
|
+
}
|
|
289
|
+
// Create worktree with retry for lock-file contention
|
|
290
|
+
let lastErr;
|
|
291
|
+
for (let attempt = 1; attempt <= WORKTREE_CREATE_RETRIES; attempt++) {
|
|
292
|
+
try {
|
|
293
|
+
await git(["worktree", "add", "-b", branch, wtPath, "HEAD"], this.repoRoot);
|
|
294
|
+
const info = { id: threadId, path: wtPath, branch };
|
|
295
|
+
this.worktrees.set(threadId, info);
|
|
296
|
+
// Write ownership marker to distinguish ContextOS worktrees from user directories
|
|
297
|
+
try {
|
|
298
|
+
const sessionMarker = {
|
|
299
|
+
schemaVersion: 1,
|
|
300
|
+
sessionId: this.sessionId,
|
|
301
|
+
repositoryFingerprint: this.repoFingerprint,
|
|
302
|
+
worktreePath: wtPath,
|
|
303
|
+
branchName: branch,
|
|
304
|
+
threadId,
|
|
305
|
+
ownerToken: randomUUID(),
|
|
306
|
+
createdAt: Date.now(),
|
|
307
|
+
};
|
|
308
|
+
writeFileSync(path.join(wtPath, ".contextos-session"), JSON.stringify(sessionMarker, null, 2));
|
|
309
|
+
writeFileSync(path.join(wtPath, ".contextos-owner"), JSON.stringify({
|
|
310
|
+
threadId,
|
|
311
|
+
createdAt: Date.now(),
|
|
312
|
+
creatorPid: process.pid,
|
|
313
|
+
}, null, 2));
|
|
314
|
+
}
|
|
315
|
+
catch {
|
|
316
|
+
// Non-fatal
|
|
317
|
+
}
|
|
318
|
+
return info;
|
|
319
|
+
}
|
|
320
|
+
catch (err) {
|
|
321
|
+
lastErr = err instanceof Error ? err : new Error(String(err));
|
|
322
|
+
const isLockError = lastErr.message.includes(".lock") ||
|
|
323
|
+
lastErr.message.includes("Unable to create") ||
|
|
324
|
+
lastErr.message.includes("index.lock");
|
|
325
|
+
if (isLockError && attempt < WORKTREE_CREATE_RETRIES) {
|
|
326
|
+
// Wait with jitter before retrying
|
|
327
|
+
const delay = WORKTREE_RETRY_DELAY_MS * attempt + Math.random() * 200;
|
|
328
|
+
await new Promise((r) => setTimeout(r, delay));
|
|
329
|
+
continue;
|
|
330
|
+
}
|
|
331
|
+
throw lastErr;
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
throw lastErr || new Error("Failed to create worktree");
|
|
335
|
+
}
|
|
336
|
+
/** Get HEAD commit SHA of a worktree. */
|
|
337
|
+
async getHeadSha(threadId) {
|
|
338
|
+
const info = this.worktrees.get(threadId);
|
|
339
|
+
if (!info)
|
|
340
|
+
throw new Error(`No worktree for thread ${threadId}`);
|
|
341
|
+
assertWithinRepository(info.path, this.repoRoot);
|
|
342
|
+
const { stdout } = await git(["rev-parse", "HEAD"], info.path);
|
|
343
|
+
return stdout.trim();
|
|
344
|
+
}
|
|
345
|
+
/** Get diff of candidate worktree commits against baseSha. */
|
|
346
|
+
async getCandidateDiff(threadId, baseSha) {
|
|
347
|
+
const info = this.worktrees.get(threadId);
|
|
348
|
+
if (!info)
|
|
349
|
+
throw new Error(`No worktree for thread ${threadId}`);
|
|
350
|
+
assertWithinRepository(info.path, this.repoRoot);
|
|
351
|
+
if (!baseSha || !/^[0-9a-fA-F]{7,64}$/.test(baseSha)) {
|
|
352
|
+
throw new Error("Invalid TaskBrief baseSha");
|
|
353
|
+
}
|
|
354
|
+
const { stdout } = await git(["diff", `${baseSha}...HEAD`, "--", ":(exclude).contextos-owner", ":(exclude).contextos-session"], info.path);
|
|
355
|
+
return stdout;
|
|
356
|
+
}
|
|
357
|
+
/** Get the git diff of uncommitted changes in a worktree. */
|
|
358
|
+
async getDiff(threadId) {
|
|
359
|
+
const info = this.worktrees.get(threadId);
|
|
360
|
+
if (!info)
|
|
361
|
+
throw new Error(`No worktree for thread ${threadId}`);
|
|
362
|
+
return readWorktreeDiff(info.path, this.repoRoot);
|
|
363
|
+
}
|
|
364
|
+
/** Get diff stats (short summary). */
|
|
365
|
+
async getDiffStats(threadId) {
|
|
366
|
+
const info = this.worktrees.get(threadId);
|
|
367
|
+
if (!info)
|
|
368
|
+
throw new Error(`No worktree for thread ${threadId}`);
|
|
369
|
+
assertWithinRepository(info.path, this.repoRoot);
|
|
370
|
+
const tmpIndex = path.join(os.tmpdir(), `ctx-idx-${randomUUID()}`);
|
|
371
|
+
try {
|
|
372
|
+
await git(["read-tree", "HEAD"], info.path, { GIT_INDEX_FILE: tmpIndex });
|
|
373
|
+
const { stdout: status } = await git(["status", "--porcelain", "-z"], info.path);
|
|
374
|
+
const untracked = status
|
|
375
|
+
.split("\0")
|
|
376
|
+
.filter(Boolean)
|
|
377
|
+
.filter((s) => s.startsWith("?? "))
|
|
378
|
+
.map((s) => s.slice(3))
|
|
379
|
+
.filter((f) => f !== ".contextos-owner" && f !== ".contextos-session");
|
|
380
|
+
if (untracked.length > 0) {
|
|
381
|
+
const chunkSize = 100;
|
|
382
|
+
for (let i = 0; i < untracked.length; i += chunkSize) {
|
|
383
|
+
await git(["add", "-N", "--", ...untracked.slice(i, i + chunkSize)], info.path, {
|
|
384
|
+
GIT_INDEX_FILE: tmpIndex,
|
|
385
|
+
});
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
const { stdout } = await git(["diff", "HEAD", "--stat", "--", ":(exclude).contextos-owner", ":(exclude).contextos-session"], info.path, { GIT_INDEX_FILE: tmpIndex });
|
|
389
|
+
return redactSecrets(stdout.trim() || "(no changes)");
|
|
390
|
+
}
|
|
391
|
+
catch {
|
|
392
|
+
const { stdout: fallbackStats } = await git(["diff", "HEAD", "--stat", "--", ":(exclude).contextos-owner", ":(exclude).contextos-session"], info.path);
|
|
393
|
+
return redactSecrets(fallbackStats.trim() || "(no changes)");
|
|
394
|
+
}
|
|
395
|
+
finally {
|
|
396
|
+
try {
|
|
397
|
+
if (existsSync(tmpIndex))
|
|
398
|
+
unlinkSync(tmpIndex);
|
|
399
|
+
}
|
|
400
|
+
catch {
|
|
401
|
+
/* cleanup best-effort */
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
/** Get list of changed files without mutating Git index. */
|
|
406
|
+
async getChangedFiles(threadId) {
|
|
407
|
+
const info = this.worktrees.get(threadId);
|
|
408
|
+
if (!info)
|
|
409
|
+
throw new Error(`No worktree for thread ${threadId}`);
|
|
410
|
+
assertWithinRepository(info.path, this.repoRoot);
|
|
411
|
+
const { stdout: status } = await git(["status", "--porcelain=v2", "-z", "--untracked-files=all"], info.path);
|
|
412
|
+
const internal = new Set([".contextos-owner", ".contextos-session"]);
|
|
413
|
+
return [
|
|
414
|
+
...new Set(parsePorcelainV2(status)
|
|
415
|
+
.map(normalizeGitPath)
|
|
416
|
+
.filter((file) => file && !internal.has(file) && !isBlockedPath(file))),
|
|
417
|
+
];
|
|
418
|
+
}
|
|
419
|
+
/**
|
|
420
|
+
* Detect every worktree change, including untracked, staged, unstaged,
|
|
421
|
+
* committed, and both sides of renames, then enforce the immutable scope.
|
|
422
|
+
*/
|
|
423
|
+
async assertWriteScope(threadId, baseSha, writeScope, denyScope = []) {
|
|
424
|
+
const info = this.worktrees.get(threadId);
|
|
425
|
+
if (!info)
|
|
426
|
+
throw new Error(`No worktree for thread ${threadId}`);
|
|
427
|
+
assertWithinRepository(info.path, this.repoRoot);
|
|
428
|
+
if (!baseSha || !/^[0-9a-fA-F]{7,64}$/.test(baseSha))
|
|
429
|
+
throw new Error("Invalid TaskBrief baseSha");
|
|
430
|
+
if (writeScope.length === 0)
|
|
431
|
+
throw new ScopeViolationError(["<empty writeScope>"]);
|
|
432
|
+
const [{ stdout: status }, { stdout: committed }, { stdout: staged }] = await Promise.all([
|
|
433
|
+
git(["status", "--porcelain=v2", "-z", "--untracked-files=all"], info.path),
|
|
434
|
+
git(["diff", "--name-status", "-z", `${baseSha}...HEAD`], info.path),
|
|
435
|
+
git(["diff", "--cached", "--name-status", "-z"], info.path),
|
|
436
|
+
]);
|
|
437
|
+
const internal = new Set([".contextos-owner", ".contextos-session"]);
|
|
438
|
+
const touched = [
|
|
439
|
+
...new Set([...parsePorcelainV2(status), ...parseNameStatus(committed), ...parseNameStatus(staged)]),
|
|
440
|
+
]
|
|
441
|
+
.map(normalizeGitPath)
|
|
442
|
+
.filter((file) => file && !internal.has(file));
|
|
443
|
+
for (const file of touched)
|
|
444
|
+
assertWithinRepository(path.resolve(info.path, file), info.path);
|
|
445
|
+
const violations = touched.filter((file) => !isWithinWriteScope(file, writeScope) || isDeniedByWriteScope(file, denyScope));
|
|
446
|
+
if (violations.length > 0)
|
|
447
|
+
throw new ScopeViolationError(violations);
|
|
448
|
+
return touched;
|
|
449
|
+
}
|
|
450
|
+
/** Commit all changes in a worktree. */
|
|
451
|
+
async commit(threadId, message, writeScope = [], denyScope = []) {
|
|
452
|
+
const info = this.worktrees.get(threadId);
|
|
453
|
+
if (!info)
|
|
454
|
+
throw new Error(`No worktree for thread ${threadId}`);
|
|
455
|
+
assertWithinRepository(info.path, this.repoRoot);
|
|
456
|
+
const tmpIndex = path.join(os.tmpdir(), `ctx-idx-${randomUUID()}`);
|
|
457
|
+
try {
|
|
458
|
+
// 1. Check porcelain status to inspect changed & untracked files
|
|
459
|
+
const { stdout: statusRaw } = await git(["status", "--porcelain=v2", "-z", "--untracked-files=all"], info.path);
|
|
460
|
+
if (!statusRaw.trim())
|
|
461
|
+
return false;
|
|
462
|
+
// 2. Validate changed paths against security policies
|
|
463
|
+
const changedFiles = parsePorcelainV2(statusRaw);
|
|
464
|
+
const pathsToStage = [];
|
|
465
|
+
for (const file of changedFiles) {
|
|
466
|
+
if (file === ".contextos-owner" || file === ".contextos-session") {
|
|
467
|
+
continue; // Do not commit internal ownership markers
|
|
468
|
+
}
|
|
469
|
+
if (isBlockedPath(file)) {
|
|
470
|
+
throw new Error(`SECURITY_POLICY_FAILED: Attempted commit of blocked sensitive path: "${file}"`);
|
|
471
|
+
}
|
|
472
|
+
if (writeScope.length > 0 && (!isWithinWriteScope(file, writeScope) || isDeniedByWriteScope(file, denyScope))) {
|
|
473
|
+
throw new ScopeViolationError([file]);
|
|
474
|
+
}
|
|
475
|
+
if (!isPathAllowed(file, info.path)) {
|
|
476
|
+
throw new Error(`SECURITY_POLICY_FAILED: Path traversal violation attempt: "${file}"`);
|
|
477
|
+
}
|
|
478
|
+
const absPath = path.join(info.path, file);
|
|
479
|
+
if (existsSync(absPath)) {
|
|
480
|
+
const content = readFileSync(absPath, "utf-8");
|
|
481
|
+
if (containsSecrets(content)) {
|
|
482
|
+
throw new Error(`SECURITY_POLICY_FAILED: Secret detected in file content: "${file}"`);
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
pathsToStage.push(file);
|
|
486
|
+
}
|
|
487
|
+
if (pathsToStage.length === 0) {
|
|
488
|
+
return false;
|
|
489
|
+
}
|
|
490
|
+
// 3. Read current HEAD into tmp index
|
|
491
|
+
await git(["read-tree", "HEAD"], info.path, { GIT_INDEX_FILE: tmpIndex });
|
|
492
|
+
// 4. Stage only verified paths in temporary index
|
|
493
|
+
const chunkSize = 100;
|
|
494
|
+
for (let i = 0; i < pathsToStage.length; i += chunkSize) {
|
|
495
|
+
await git(["add", "--", ...pathsToStage.slice(i, i + chunkSize)], info.path, {
|
|
496
|
+
GIT_INDEX_FILE: tmpIndex,
|
|
497
|
+
});
|
|
498
|
+
}
|
|
499
|
+
// 5. Verify staged inventory strictly against blocked paths
|
|
500
|
+
const { stdout: stagedStatus } = await git(["diff", "--cached", "--name-only", "-z"], info.path, {
|
|
501
|
+
GIT_INDEX_FILE: tmpIndex,
|
|
502
|
+
});
|
|
503
|
+
const stagedFiles = stagedStatus.split("\0").filter(Boolean);
|
|
504
|
+
for (const file of stagedFiles) {
|
|
505
|
+
if (isBlockedPath(file) || !isPathAllowed(file, info.path)) {
|
|
506
|
+
throw new Error(`SECURITY_POLICY_FAILED: Sensitive or disallowed path detected in staged index: "${file}"`);
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
if (stagedFiles.length === 0)
|
|
510
|
+
return false;
|
|
511
|
+
// 6. Write tree and commit
|
|
512
|
+
const { stdout: treeShaRaw } = await git(["write-tree"], info.path, { GIT_INDEX_FILE: tmpIndex });
|
|
513
|
+
const treeSha = treeShaRaw.trim();
|
|
514
|
+
const { stdout: commitShaRaw } = await git(["commit-tree", treeSha, "-p", "HEAD", "-m", message], info.path, {
|
|
515
|
+
GIT_INDEX_FILE: tmpIndex,
|
|
516
|
+
});
|
|
517
|
+
const commitSha = commitShaRaw.trim();
|
|
518
|
+
// 7. Update HEAD and working tree
|
|
519
|
+
await git(["update-ref", "HEAD", commitSha], info.path);
|
|
520
|
+
await git(["reset", "--hard", "HEAD"], info.path);
|
|
521
|
+
return true;
|
|
522
|
+
}
|
|
523
|
+
catch (err) {
|
|
524
|
+
if (String(err).includes("nothing to commit"))
|
|
525
|
+
return false;
|
|
526
|
+
throw err;
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
/** Destroy a worktree and optionally its branch. */
|
|
530
|
+
async destroy(threadId, deleteBranch = false) {
|
|
531
|
+
const info = this.worktrees.get(threadId);
|
|
532
|
+
if (!info)
|
|
533
|
+
return;
|
|
534
|
+
assertWithinRepository(info.path, this.repoRoot);
|
|
535
|
+
if (existsSync(info.path)) {
|
|
536
|
+
if (!this.isContextosWorktree(info.path)) {
|
|
537
|
+
throw new Error(`Refusing to destroy worktree "${info.path}": invalid, missing, or mismatched ownership marker`);
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
try {
|
|
541
|
+
await git(["worktree", "remove", "--force", info.path], this.repoRoot);
|
|
542
|
+
}
|
|
543
|
+
catch {
|
|
544
|
+
// Force remove the directory if git worktree remove fails
|
|
545
|
+
if (existsSync(info.path)) {
|
|
546
|
+
rmSync(info.path, { recursive: true, force: true, maxRetries: 5, retryDelay: 200 });
|
|
547
|
+
}
|
|
548
|
+
// Prune stale worktree entries
|
|
549
|
+
try {
|
|
550
|
+
await git(["worktree", "prune"], this.repoRoot);
|
|
551
|
+
}
|
|
552
|
+
catch {
|
|
553
|
+
/* non-fatal */
|
|
554
|
+
}
|
|
555
|
+
}
|
|
556
|
+
if (deleteBranch) {
|
|
557
|
+
try {
|
|
558
|
+
await git(["branch", "-D", info.branch], this.repoRoot);
|
|
559
|
+
}
|
|
560
|
+
catch {
|
|
561
|
+
// Branch already gone
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
this.worktrees.delete(threadId);
|
|
565
|
+
}
|
|
566
|
+
/** Get info for a thread's worktree. */
|
|
567
|
+
getWorktreeInfo(threadId) {
|
|
568
|
+
return this.worktrees.get(threadId);
|
|
569
|
+
}
|
|
570
|
+
/** Cleanup all worktrees. Resilient — continues past individual failures. */
|
|
571
|
+
async destroyAll() {
|
|
572
|
+
assertWithinRepository(this.baseDir, this.repoRoot);
|
|
573
|
+
for (const [id] of this.worktrees) {
|
|
574
|
+
try {
|
|
575
|
+
await this.destroy(id, true);
|
|
576
|
+
}
|
|
577
|
+
catch {
|
|
578
|
+
// Continue cleaning up remaining worktrees
|
|
579
|
+
}
|
|
580
|
+
}
|
|
581
|
+
// Remove base directory if empty
|
|
582
|
+
try {
|
|
583
|
+
const { readdirSync } = await import("node:fs");
|
|
584
|
+
if (existsSync(this.baseDir) && readdirSync(this.baseDir).length === 0) {
|
|
585
|
+
rmSync(this.baseDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 200 });
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
catch {
|
|
589
|
+
/* non-fatal */
|
|
590
|
+
}
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
//# sourceMappingURL=manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/worktree/manager.ts"],"names":[],"mappings":"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"}
|