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,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Merge thread branches back into the main branch.
|
|
3
|
+
*
|
|
4
|
+
* Phase 2 enhancements:
|
|
5
|
+
* - Partial merge: continues merging non-conflicting branches after a conflict
|
|
6
|
+
* - Conflict hunks: captures the actual diff of conflicted files
|
|
7
|
+
* - Merge ordering: accepts optional order array from orchestrator
|
|
8
|
+
*/
|
|
9
|
+
import type { MergeResult, ThreadState } from "../core/types.js";
|
|
10
|
+
export interface MergeEligibility {
|
|
11
|
+
eligible: boolean;
|
|
12
|
+
reason?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface MergeEligibilityOptions {
|
|
15
|
+
currentHeadSha?: string;
|
|
16
|
+
currentDiffSha256?: string;
|
|
17
|
+
repositoryFingerprint?: string;
|
|
18
|
+
isAutoMerge?: boolean;
|
|
19
|
+
userOverride?: boolean;
|
|
20
|
+
isFromRepoConfig?: boolean;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Strict merge predicate:
|
|
24
|
+
* A thread is eligible for merge if and only if:
|
|
25
|
+
* 1. Status is "completed"
|
|
26
|
+
* 2. Result exists and success is true
|
|
27
|
+
* 3. Scope violation flag is false/absent
|
|
28
|
+
* 4. Automated verification attestation passed ("PASS") with valid proof-of-work evidence
|
|
29
|
+
* 5. Independent review attestation passed ("PASS") with rawOutputDigest and dual PASS verdicts
|
|
30
|
+
* 6. Attestation subjects match each other and bind to exact candidate state (headSha, diffSha256, repositoryFingerprint)
|
|
31
|
+
* 7. Candidate state has not diverged from attestation subjects (otherwise marks attestations STALE)
|
|
32
|
+
*/
|
|
33
|
+
export declare function isEligibleForMerge(thread: ThreadState, options?: MergeEligibilityOptions): MergeEligibility;
|
|
34
|
+
/**
|
|
35
|
+
* Merge a single thread branch into the current branch.
|
|
36
|
+
* On conflict, captures the conflicted file list and diff hunks before aborting.
|
|
37
|
+
*/
|
|
38
|
+
export declare function mergeThreadBranch(repoRoot: string, branchName: string, threadId: string, threadState?: ThreadState): Promise<MergeResult>;
|
|
39
|
+
export interface MergeAllOptions {
|
|
40
|
+
/** Explicit merge order — thread IDs in desired merge sequence. */
|
|
41
|
+
order?: string[];
|
|
42
|
+
/** If true, continue merging remaining branches after a conflict (default: true). */
|
|
43
|
+
continueOnConflict?: boolean;
|
|
44
|
+
/** If true, user-local safety override to allow host-unsafe auto-merge. */
|
|
45
|
+
userOverride?: boolean;
|
|
46
|
+
/** If true, indicates the override originated from repo-scoped config (strictly rejected). */
|
|
47
|
+
isFromRepoConfig?: boolean;
|
|
48
|
+
/** Whether this is an auto-merge batch invocation (defaults to false for backwards-compatibility). */
|
|
49
|
+
isAutoMerge?: boolean;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Merge all completed thread branches sequentially.
|
|
53
|
+
*
|
|
54
|
+
* Supports:
|
|
55
|
+
* - Custom merge order via options.order
|
|
56
|
+
* - Partial merge: by default continues past conflicts (skips conflicting branch)
|
|
57
|
+
*/
|
|
58
|
+
export declare function mergeAllThreads(repoRoot: string, threads: ThreadState[], options?: MergeAllOptions): Promise<MergeResult[]>;
|
|
@@ -0,0 +1,389 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Merge thread branches back into the main branch.
|
|
3
|
+
*
|
|
4
|
+
* Phase 2 enhancements:
|
|
5
|
+
* - Partial merge: continues merging non-conflicting branches after a conflict
|
|
6
|
+
* - Conflict hunks: captures the actual diff of conflicted files
|
|
7
|
+
* - Merge ordering: accepts optional order array from orchestrator
|
|
8
|
+
*/
|
|
9
|
+
import { execFile } from "node:child_process";
|
|
10
|
+
import { createHash } from "node:crypto";
|
|
11
|
+
import * as path from "node:path";
|
|
12
|
+
import { assertWithinRepository, SecurityBoundaryException } from "../security/repository-boundary.js";
|
|
13
|
+
import { createRepositoryFingerprint } from "./manager.js";
|
|
14
|
+
function git(args, cwd) {
|
|
15
|
+
return new Promise((resolve, reject) => {
|
|
16
|
+
execFile("git", args, { cwd, maxBuffer: 10 * 1024 * 1024 }, (err, stdout, stderr) => {
|
|
17
|
+
if (err) {
|
|
18
|
+
// Include stdout in error message — git merge writes CONFLICT info to stdout
|
|
19
|
+
const detail = [stderr, stdout].filter((s) => s?.trim()).join("\n") || err.message;
|
|
20
|
+
reject(new Error(`git ${args[0]} failed: ${detail}`));
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
resolve({ stdout, stderr });
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
/** Abort a merge safely without ever destroying user's uncommitted work tree. */
|
|
29
|
+
async function abortMergeSafe(repoRoot) {
|
|
30
|
+
try {
|
|
31
|
+
await git(["merge", "--abort"], repoRoot);
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
// NEVER run git reset --hard HEAD in repoRoot: it would erase user's uncommitted files.
|
|
35
|
+
// If git merge --abort failed, leave the workspace intact for manual inspection.
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Strict merge predicate:
|
|
40
|
+
* A thread is eligible for merge if and only if:
|
|
41
|
+
* 1. Status is "completed"
|
|
42
|
+
* 2. Result exists and success is true
|
|
43
|
+
* 3. Scope violation flag is false/absent
|
|
44
|
+
* 4. Automated verification attestation passed ("PASS") with valid proof-of-work evidence
|
|
45
|
+
* 5. Independent review attestation passed ("PASS") with rawOutputDigest and dual PASS verdicts
|
|
46
|
+
* 6. Attestation subjects match each other and bind to exact candidate state (headSha, diffSha256, repositoryFingerprint)
|
|
47
|
+
* 7. Candidate state has not diverged from attestation subjects (otherwise marks attestations STALE)
|
|
48
|
+
*/
|
|
49
|
+
export function isEligibleForMerge(thread, options) {
|
|
50
|
+
if (thread.status !== "completed") {
|
|
51
|
+
return { eligible: false, reason: `Thread status is "${thread.status}", expected "completed"` };
|
|
52
|
+
}
|
|
53
|
+
if (!thread.result?.success) {
|
|
54
|
+
return { eligible: false, reason: "Thread execution result is not successful" };
|
|
55
|
+
}
|
|
56
|
+
if (thread.scopeViolation) {
|
|
57
|
+
return { eligible: false, reason: "Thread touched files outside its assigned writeScope" };
|
|
58
|
+
}
|
|
59
|
+
// 1. Verification Attestation validation
|
|
60
|
+
if (!thread.verificationAttestation) {
|
|
61
|
+
return {
|
|
62
|
+
eligible: false,
|
|
63
|
+
reason: "Missing verification attestation",
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
const vAtt = thread.verificationAttestation;
|
|
67
|
+
// Invalidation to STALE if live candidate options provided and mismatched
|
|
68
|
+
if (options?.currentHeadSha && vAtt.subject?.headSha && vAtt.subject.headSha !== options.currentHeadSha) {
|
|
69
|
+
vAtt.status = "STALE";
|
|
70
|
+
if (thread.reviewAttestation)
|
|
71
|
+
thread.reviewAttestation.status = "STALE";
|
|
72
|
+
thread.verificationStatus = "STALE";
|
|
73
|
+
thread.reviewStatus = "STALE";
|
|
74
|
+
thread.mergeStatus = "BLOCKED";
|
|
75
|
+
return {
|
|
76
|
+
eligible: false,
|
|
77
|
+
reason: `Candidate branch HEAD commit (${options.currentHeadSha}) does not match verification subject headSha (${vAtt.subject.headSha}): attestation is STALE`,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
if (options?.currentDiffSha256 && vAtt.subject?.diffSha256 && vAtt.subject.diffSha256 !== options.currentDiffSha256) {
|
|
81
|
+
vAtt.status = "STALE";
|
|
82
|
+
if (thread.reviewAttestation)
|
|
83
|
+
thread.reviewAttestation.status = "STALE";
|
|
84
|
+
thread.verificationStatus = "STALE";
|
|
85
|
+
thread.reviewStatus = "STALE";
|
|
86
|
+
thread.mergeStatus = "BLOCKED";
|
|
87
|
+
return {
|
|
88
|
+
eligible: false,
|
|
89
|
+
reason: `Candidate diff hash (${options.currentDiffSha256}) does not match verification subject diffSha256 (${vAtt.subject.diffSha256}): attestation is STALE`,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
if (options?.repositoryFingerprint &&
|
|
93
|
+
vAtt.subject?.repositoryFingerprint &&
|
|
94
|
+
vAtt.subject.repositoryFingerprint !== options.repositoryFingerprint) {
|
|
95
|
+
return {
|
|
96
|
+
eligible: false,
|
|
97
|
+
reason: `Repository fingerprint mismatch: attestation is for "${vAtt.subject.repositoryFingerprint}", repository is "${options.repositoryFingerprint}"`,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
// Negative status matrix check for verification
|
|
101
|
+
if (vAtt.status !== "PASS") {
|
|
102
|
+
const detail = vAtt.status === "NOT_CONFIGURED"
|
|
103
|
+
? "evidence-bearing PASS required"
|
|
104
|
+
: vAtt.status === "STALE"
|
|
105
|
+
? "candidate changed after verification"
|
|
106
|
+
: vAtt.status === "UNAVAILABLE"
|
|
107
|
+
? "verifier service unavailable"
|
|
108
|
+
: vAtt.status === "MALFORMED"
|
|
109
|
+
? "verifier output malformed"
|
|
110
|
+
: vAtt.status;
|
|
111
|
+
return {
|
|
112
|
+
eligible: false,
|
|
113
|
+
reason: `Verification status is not PASS. Status is "${vAtt.status}" (${detail})`,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
// Verification Evidence verification (evidence-bearing PASS)
|
|
117
|
+
if (!vAtt.evidence) {
|
|
118
|
+
return {
|
|
119
|
+
eligible: false,
|
|
120
|
+
reason: "Verification attestation is missing proof-of-work evidence",
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
if (vAtt.subject?.headSha && (!vAtt.evidence.outputSha256 || !vAtt.evidence.outputSha256.trim())) {
|
|
124
|
+
return {
|
|
125
|
+
eligible: false,
|
|
126
|
+
reason: "Verification attestation is missing proof-of-work evidence: outputSha256 digest required",
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
// Host-unsafe auto-merge governance (Section 19.1 & W5.4)
|
|
130
|
+
if (options?.isAutoMerge && vAtt.runnerMode === "host-unsafe") {
|
|
131
|
+
if (options.userOverride) {
|
|
132
|
+
if (options.isFromRepoConfig) {
|
|
133
|
+
return {
|
|
134
|
+
eligible: false,
|
|
135
|
+
reason: "Auto-merge blocked: repository configuration cannot enable host-unsafe auto-merge override. Only user-local safety override is permitted.",
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
return {
|
|
141
|
+
eligible: false,
|
|
142
|
+
reason: "Auto-merge blocked: candidate was verified in host-unsafe mode. Isolated OCI container or explicit user-local safety override required.",
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
// 2. Review Attestation validation
|
|
147
|
+
if (!thread.reviewAttestation) {
|
|
148
|
+
return {
|
|
149
|
+
eligible: false,
|
|
150
|
+
reason: "Missing review attestation: rejected by independent reviewer gate",
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
const rAtt = thread.reviewAttestation;
|
|
154
|
+
// Invalidation to STALE if live candidate options provided and mismatched
|
|
155
|
+
if (options?.currentHeadSha && rAtt.subject?.headSha && rAtt.subject.headSha !== options.currentHeadSha) {
|
|
156
|
+
rAtt.status = "STALE";
|
|
157
|
+
thread.reviewStatus = "STALE";
|
|
158
|
+
thread.mergeStatus = "BLOCKED";
|
|
159
|
+
return {
|
|
160
|
+
eligible: false,
|
|
161
|
+
reason: `Candidate branch HEAD commit (${options.currentHeadSha}) does not match review subject headSha (${rAtt.subject.headSha}): attestation is STALE`,
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
if (options?.currentDiffSha256 && rAtt.subject?.diffSha256 && rAtt.subject.diffSha256 !== options.currentDiffSha256) {
|
|
165
|
+
rAtt.status = "STALE";
|
|
166
|
+
thread.reviewStatus = "STALE";
|
|
167
|
+
thread.mergeStatus = "BLOCKED";
|
|
168
|
+
return {
|
|
169
|
+
eligible: false,
|
|
170
|
+
reason: `Candidate diff hash (${options.currentDiffSha256}) does not match review subject diffSha256 (${rAtt.subject.diffSha256}): attestation is STALE`,
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
// Negative status matrix check for review
|
|
174
|
+
if (rAtt.status !== "PASS") {
|
|
175
|
+
const detail = rAtt.status === "NOT_CONFIGURED"
|
|
176
|
+
? "evidence-bearing PASS required"
|
|
177
|
+
: rAtt.status === "STALE"
|
|
178
|
+
? "candidate changed after review"
|
|
179
|
+
: rAtt.status === "UNAVAILABLE"
|
|
180
|
+
? "reviewer service unavailable"
|
|
181
|
+
: rAtt.status === "MALFORMED"
|
|
182
|
+
? "reviewer output malformed"
|
|
183
|
+
: rAtt.status;
|
|
184
|
+
return {
|
|
185
|
+
eligible: false,
|
|
186
|
+
reason: `Review status is not PASS. Status is "${rAtt.status}" (${detail})`,
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
// Review Evidence verification (rawOutputDigest required)
|
|
190
|
+
if (rAtt.subject?.headSha && (!rAtt.rawOutputDigest || !rAtt.rawOutputDigest.trim())) {
|
|
191
|
+
return {
|
|
192
|
+
eligible: false,
|
|
193
|
+
reason: "Review attestation is missing evidence: rawOutputDigest digest required",
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
// Dual-verdict checks
|
|
197
|
+
if (rAtt.llmVerdict?.specCompliance !== "PASS") {
|
|
198
|
+
return {
|
|
199
|
+
eligible: false,
|
|
200
|
+
reason: `Review failed: specCompliance is ${rAtt.llmVerdict?.specCompliance || "MISSING"}. Summary: ${rAtt.llmVerdict?.summary}`,
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
if (rAtt.llmVerdict?.codeQuality !== "PASS") {
|
|
204
|
+
return {
|
|
205
|
+
eligible: false,
|
|
206
|
+
reason: `Review failed: codeQuality is ${rAtt.llmVerdict?.codeQuality || "MISSING"}. Summary: ${rAtt.llmVerdict?.summary}`,
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
// 3. Subject Completeness and Cross-Attestation Binding
|
|
210
|
+
const vSub = vAtt.subject;
|
|
211
|
+
const rSub = rAtt.subject;
|
|
212
|
+
if (!vSub || !rSub) {
|
|
213
|
+
return { eligible: false, reason: "Missing attestation subject" };
|
|
214
|
+
}
|
|
215
|
+
// Cross-attestation consistency
|
|
216
|
+
if (vSub.headSha && rSub.headSha && vSub.headSha !== rSub.headSha) {
|
|
217
|
+
return {
|
|
218
|
+
eligible: false,
|
|
219
|
+
reason: `Subject headSha mismatch between verification ("${vSub.headSha}") and review ("${rSub.headSha}") attestations`,
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
if (vSub.diffSha256 && rSub.diffSha256 && vSub.diffSha256 !== rSub.diffSha256) {
|
|
223
|
+
return {
|
|
224
|
+
eligible: false,
|
|
225
|
+
reason: `Subject diffSha256 mismatch between verification ("${vSub.diffSha256}") and review ("${rSub.diffSha256}") attestations`,
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
if (vSub.repositoryFingerprint &&
|
|
229
|
+
rSub.repositoryFingerprint &&
|
|
230
|
+
vSub.repositoryFingerprint !== rSub.repositoryFingerprint) {
|
|
231
|
+
return {
|
|
232
|
+
eligible: false,
|
|
233
|
+
reason: `Subject repositoryFingerprint mismatch between verification ("${vSub.repositoryFingerprint}") and review ("${rSub.repositoryFingerprint}") attestations`,
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
if (vSub.baseSha && rSub.baseSha && vSub.baseSha !== rSub.baseSha) {
|
|
237
|
+
return {
|
|
238
|
+
eligible: false,
|
|
239
|
+
reason: `Subject baseSha mismatch between verification ("${vSub.baseSha}") and review ("${rSub.baseSha}") attestations`,
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
return { eligible: true };
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Merge a single thread branch into the current branch.
|
|
246
|
+
* On conflict, captures the conflicted file list and diff hunks before aborting.
|
|
247
|
+
*/
|
|
248
|
+
export async function mergeThreadBranch(repoRoot, branchName, threadId, threadState) {
|
|
249
|
+
const canonicalRepoRoot = assertWithinRepository(repoRoot, repoRoot);
|
|
250
|
+
if (!branchName || branchName.startsWith("-") || branchName.includes("..") || path.isAbsolute(branchName)) {
|
|
251
|
+
throw new SecurityBoundaryException(`Invalid branch name: ${branchName}`);
|
|
252
|
+
}
|
|
253
|
+
assertWithinRepository(path.resolve(canonicalRepoRoot, ".git", "refs", "heads", branchName), canonicalRepoRoot);
|
|
254
|
+
if (threadState) {
|
|
255
|
+
let currentHeadSha;
|
|
256
|
+
let currentDiffSha256;
|
|
257
|
+
try {
|
|
258
|
+
const { stdout: headOut } = await git(["rev-parse", branchName], canonicalRepoRoot);
|
|
259
|
+
currentHeadSha = headOut.trim();
|
|
260
|
+
const baseSha = threadState.verificationAttestation?.subject?.baseSha || threadState.taskBrief?.baseSha;
|
|
261
|
+
if (baseSha) {
|
|
262
|
+
const { stdout: diffOut } = await git(["diff", `${baseSha}...${branchName}`, "--", ":(exclude).contextos-owner", ":(exclude).contextos-session"], canonicalRepoRoot);
|
|
263
|
+
currentDiffSha256 = createHash("sha256").update(diffOut).digest("hex");
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
catch {
|
|
267
|
+
// Branch query failure will be surfaced either by predicate or git merge
|
|
268
|
+
}
|
|
269
|
+
const repoFingerprint = createRepositoryFingerprint(canonicalRepoRoot);
|
|
270
|
+
const check = isEligibleForMerge(threadState, {
|
|
271
|
+
currentHeadSha,
|
|
272
|
+
currentDiffSha256,
|
|
273
|
+
repositoryFingerprint: repoFingerprint,
|
|
274
|
+
});
|
|
275
|
+
if (!check.eligible) {
|
|
276
|
+
return {
|
|
277
|
+
success: false,
|
|
278
|
+
branch: branchName,
|
|
279
|
+
conflicts: [],
|
|
280
|
+
conflictDiff: "",
|
|
281
|
+
message: `Merge blocked by strict merge predicate: ${check.reason}`,
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
try {
|
|
286
|
+
const { stdout } = await git(["merge", "--no-ff", "-m", `swarm: merge thread ${threadId}`, branchName], canonicalRepoRoot);
|
|
287
|
+
if (threadState) {
|
|
288
|
+
threadState.mergeStatus = "MERGED";
|
|
289
|
+
}
|
|
290
|
+
return {
|
|
291
|
+
success: true,
|
|
292
|
+
branch: branchName,
|
|
293
|
+
conflicts: [],
|
|
294
|
+
conflictDiff: "",
|
|
295
|
+
message: stdout.trim() || `Merged ${branchName}`,
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
catch (err) {
|
|
299
|
+
const errMsg = String(err);
|
|
300
|
+
// Check for merge conflicts
|
|
301
|
+
if (errMsg.includes("CONFLICT") || errMsg.includes("Merge conflict")) {
|
|
302
|
+
try {
|
|
303
|
+
// Get list of conflicted files
|
|
304
|
+
const { stdout: conflicted } = await git(["diff", "--name-only", "--diff-filter=U"], repoRoot);
|
|
305
|
+
const conflicts = conflicted.trim().split("\n").filter(Boolean);
|
|
306
|
+
// Capture the conflict diff (shows <<<<<<< markers)
|
|
307
|
+
let conflictDiff = "";
|
|
308
|
+
try {
|
|
309
|
+
const { stdout: diff } = await git(["diff"], repoRoot);
|
|
310
|
+
conflictDiff = diff.slice(0, 5000); // Cap at 5KB
|
|
311
|
+
}
|
|
312
|
+
catch {
|
|
313
|
+
// diff might fail in weird states
|
|
314
|
+
}
|
|
315
|
+
// Abort the merge to restore clean state
|
|
316
|
+
await abortMergeSafe(repoRoot);
|
|
317
|
+
return {
|
|
318
|
+
success: false,
|
|
319
|
+
branch: branchName,
|
|
320
|
+
conflicts,
|
|
321
|
+
conflictDiff,
|
|
322
|
+
message: `Merge conflicts in: ${conflicts.join(", ")}`,
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
catch {
|
|
326
|
+
await abortMergeSafe(repoRoot);
|
|
327
|
+
return {
|
|
328
|
+
success: false,
|
|
329
|
+
branch: branchName,
|
|
330
|
+
conflicts: [],
|
|
331
|
+
conflictDiff: "",
|
|
332
|
+
message: errMsg,
|
|
333
|
+
};
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
return {
|
|
337
|
+
success: false,
|
|
338
|
+
branch: branchName,
|
|
339
|
+
conflicts: [],
|
|
340
|
+
conflictDiff: "",
|
|
341
|
+
message: errMsg,
|
|
342
|
+
};
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
/**
|
|
346
|
+
* Merge all completed thread branches sequentially.
|
|
347
|
+
*
|
|
348
|
+
* Supports:
|
|
349
|
+
* - Custom merge order via options.order
|
|
350
|
+
* - Partial merge: by default continues past conflicts (skips conflicting branch)
|
|
351
|
+
*/
|
|
352
|
+
export async function mergeAllThreads(repoRoot, threads, options = {}) {
|
|
353
|
+
const canonicalRepoRoot = assertWithinRepository(repoRoot, repoRoot);
|
|
354
|
+
const { order, continueOnConflict = true, userOverride, isFromRepoConfig, isAutoMerge } = options;
|
|
355
|
+
const results = [];
|
|
356
|
+
// Filter strictly to threads passing isEligibleForMerge with a valid branch
|
|
357
|
+
const eligible = threads.filter((t) => Boolean(t.branchName) &&
|
|
358
|
+
isEligibleForMerge(t, {
|
|
359
|
+
isAutoMerge,
|
|
360
|
+
userOverride,
|
|
361
|
+
isFromRepoConfig,
|
|
362
|
+
}).eligible);
|
|
363
|
+
// Apply ordering if specified
|
|
364
|
+
let ordered;
|
|
365
|
+
if (order && order.length > 0) {
|
|
366
|
+
const orderMap = new Map(order.map((id, idx) => [id, idx]));
|
|
367
|
+
ordered = [...eligible].sort((a, b) => {
|
|
368
|
+
const aIdx = orderMap.get(a.id) ?? Infinity;
|
|
369
|
+
const bIdx = orderMap.get(b.id) ?? Infinity;
|
|
370
|
+
return aIdx - bIdx;
|
|
371
|
+
});
|
|
372
|
+
}
|
|
373
|
+
else {
|
|
374
|
+
// Default: merge in completion order (earliest first)
|
|
375
|
+
ordered = [...eligible].sort((a, b) => (a.completedAt || 0) - (b.completedAt || 0));
|
|
376
|
+
}
|
|
377
|
+
for (const thread of ordered) {
|
|
378
|
+
const result = await mergeThreadBranch(canonicalRepoRoot, thread.branchName, thread.id, thread);
|
|
379
|
+
results.push(result);
|
|
380
|
+
if (!result.success && !continueOnConflict) {
|
|
381
|
+
// Stop on first conflict (legacy behavior)
|
|
382
|
+
break;
|
|
383
|
+
}
|
|
384
|
+
// If conflict but continueOnConflict is true, we skip this branch
|
|
385
|
+
// and proceed to the next. The merge was already aborted in mergeThreadBranch.
|
|
386
|
+
}
|
|
387
|
+
return results;
|
|
388
|
+
}
|
|
389
|
+
//# sourceMappingURL=merge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge.js","sourceRoot":"","sources":["../../src/worktree/merge.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "contextos-mcp",
|
|
3
|
+
"version": "0.4.0",
|
|
4
|
+
"description": "ContextOS Execution Layer and MCP Server",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"contextos-mcp": "./bin/mcp.mjs"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist",
|
|
11
|
+
"bin"
|
|
12
|
+
],
|
|
13
|
+
"scripts": {
|
|
14
|
+
"dev": "tsx src/main.ts",
|
|
15
|
+
"build": "node scripts/clean-dist.cjs && tsc && npm run build:bundle && node -e \"require('fs').mkdirSync('dist/core', {recursive: true}); require('fs').copyFileSync('src/core/runtime.py', 'dist/core/runtime.py'); require('fs').cpSync('src/runtime', 'dist/runtime', {recursive: true});\"",
|
|
16
|
+
"build:bundle": "esbuild src/mcp/server.ts --bundle --platform=node --target=node20 --format=esm --outfile=dist/mcp/server.js --banner:js=\"import { createRequire as topLevelCreateRequire } from 'module'; const require = topLevelCreateRequire(import.meta.url);\" && esbuild src/plugins/adapter.ts --bundle --platform=node --target=node20 --format=cjs --outfile=../.agents/runtime/plugin-supply-chain-bundle.js",
|
|
17
|
+
"build:supply-chain": "esbuild src/plugins/adapter.ts --bundle --platform=node --target=node20 --format=cjs --outfile=../.agents/runtime/plugin-supply-chain-bundle.js",
|
|
18
|
+
"start": "node dist/main.js",
|
|
19
|
+
"cli": "tsx src/labs/cli.ts",
|
|
20
|
+
"swarm": "tsx src/main.ts",
|
|
21
|
+
"bench:oolong": "tsx benchmarks/oolong_synth.ts",
|
|
22
|
+
"bench:longbench": "tsx benchmarks/longbench_narrativeqa.ts",
|
|
23
|
+
"test": "vitest run",
|
|
24
|
+
"test:watch": "vitest",
|
|
25
|
+
"lint": "biome check src/ tests/",
|
|
26
|
+
"lint:fix": "biome check --fix src/ tests/",
|
|
27
|
+
"prepublishOnly": "npm run build"
|
|
28
|
+
},
|
|
29
|
+
"keywords": [
|
|
30
|
+
"mcp",
|
|
31
|
+
"model-context-protocol",
|
|
32
|
+
"contextos",
|
|
33
|
+
"coding-agent",
|
|
34
|
+
"execution-runtime",
|
|
35
|
+
"ai",
|
|
36
|
+
"subagents",
|
|
37
|
+
"worktree"
|
|
38
|
+
],
|
|
39
|
+
"license": "MIT",
|
|
40
|
+
"homepage": "https://github.com/kok-o/contextos-agents#readme",
|
|
41
|
+
"repository": {
|
|
42
|
+
"type": "git",
|
|
43
|
+
"url": "https://github.com/kok-o/contextos-agents.git"
|
|
44
|
+
},
|
|
45
|
+
"dependencies": {
|
|
46
|
+
"@mariozechner/pi-ai": "^0.55.1",
|
|
47
|
+
"@modelcontextprotocol/sdk": "^1.27.1",
|
|
48
|
+
"typescript": "^5.7.0",
|
|
49
|
+
"zod": "^4.3.6"
|
|
50
|
+
},
|
|
51
|
+
"devDependencies": {
|
|
52
|
+
"@biomejs/biome": "^2.4.7",
|
|
53
|
+
"esbuild": "^0.27.3",
|
|
54
|
+
"tsx": "^4.19.0",
|
|
55
|
+
"vitest": "^4.1.0"
|
|
56
|
+
},
|
|
57
|
+
"engines": {
|
|
58
|
+
"node": ">=20"
|
|
59
|
+
},
|
|
60
|
+
"overrides": {
|
|
61
|
+
"minimatch": ">=10.2.1"
|
|
62
|
+
}
|
|
63
|
+
}
|