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,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
+ }