@martinloop/mcp 0.3.8 → 0.5.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 (161) hide show
  1. package/README.md +90 -106
  2. package/dist/discovery-metadata.d.ts +1 -1
  3. package/dist/discovery-metadata.js +1 -1
  4. package/dist/resources.d.ts +1 -2
  5. package/dist/resources.js +190 -238
  6. package/dist/server-validation.d.ts +1 -1
  7. package/dist/server-validation.js +16 -11
  8. package/dist/server.d.ts +23 -0
  9. package/dist/server.js +152 -7
  10. package/dist/tools/run-dossier.d.ts +3 -1
  11. package/dist/tools/run-dossier.js +40 -2
  12. package/dist/tools/run-loop.d.ts +1 -4
  13. package/dist/tools/run-loop.js +6 -15
  14. package/dist/tools/tool-support.d.ts +2 -1
  15. package/dist/tools/tool-support.js +1 -12
  16. package/dist/vendor/adapters/claude-cli.js +38 -35
  17. package/dist/vendor/adapters/cli-bridge.d.ts +9 -1
  18. package/dist/vendor/adapters/cli-bridge.js +54 -13
  19. package/dist/vendor/adapters/codex-launcher.d.ts +61 -1
  20. package/dist/vendor/adapters/codex-launcher.js +118 -19
  21. package/dist/vendor/adapters/index.d.ts +1 -3
  22. package/dist/vendor/adapters/index.js +1 -3
  23. package/dist/vendor/adapters/openai-compatible.js +57 -18
  24. package/dist/vendor/contracts/adapter-capabilities.d.ts +1 -1
  25. package/dist/vendor/contracts/context-handoff.d.ts +100 -0
  26. package/dist/vendor/contracts/context-handoff.js +11 -0
  27. package/dist/vendor/contracts/context-manifest.d.ts +195 -0
  28. package/dist/vendor/contracts/context-manifest.js +17 -0
  29. package/dist/vendor/contracts/context-shadow.d.ts +75 -0
  30. package/dist/vendor/contracts/context-shadow.js +8 -0
  31. package/dist/vendor/contracts/exits.d.ts +126 -0
  32. package/dist/vendor/contracts/exits.js +32 -0
  33. package/dist/vendor/contracts/index.d.ts +39 -2
  34. package/dist/vendor/contracts/index.js +22 -0
  35. package/dist/vendor/contracts/mission.d.ts +102 -0
  36. package/dist/vendor/contracts/mission.js +64 -0
  37. package/dist/vendor/contracts/operator.d.ts +3 -1
  38. package/dist/vendor/contracts/operator.js +2 -1
  39. package/dist/vendor/contracts/verified-handoff.d.ts +100 -0
  40. package/dist/vendor/contracts/verified-handoff.js +35 -0
  41. package/dist/vendor/core/context-chain-gate.d.ts +89 -0
  42. package/dist/vendor/core/context-chain-gate.js +173 -0
  43. package/dist/vendor/core/context-compiler.d.ts +53 -0
  44. package/dist/vendor/core/context-compiler.js +261 -0
  45. package/dist/vendor/core/context-handoff.d.ts +42 -0
  46. package/dist/vendor/core/context-handoff.js +167 -0
  47. package/dist/vendor/core/context-shadow.d.ts +39 -0
  48. package/dist/vendor/core/context-shadow.js +200 -0
  49. package/dist/vendor/core/exit-signal.d.ts +88 -0
  50. package/dist/vendor/core/exit-signal.js +339 -0
  51. package/dist/vendor/core/exits.d.ts +41 -0
  52. package/dist/vendor/core/exits.js +258 -0
  53. package/dist/vendor/core/index.d.ts +42 -1
  54. package/dist/vendor/core/index.js +1086 -662
  55. package/dist/vendor/core/mission/aggregate.d.ts +27 -0
  56. package/dist/vendor/core/mission/aggregate.js +42 -0
  57. package/dist/vendor/core/mission/index.d.ts +2 -0
  58. package/dist/vendor/core/mission/index.js +1 -0
  59. package/dist/vendor/core/persistence/compiler.d.ts +8 -0
  60. package/dist/vendor/core/persistence/compiler.js +156 -0
  61. package/dist/vendor/core/persistence/context-handoff-store.d.ts +68 -0
  62. package/dist/vendor/core/persistence/context-handoff-store.js +112 -0
  63. package/dist/vendor/core/persistence/index.d.ts +4 -0
  64. package/dist/vendor/core/persistence/index.js +2 -0
  65. package/dist/vendor/core/persistence/ledger.d.ts +1 -1
  66. package/dist/vendor/core/persistence/mission-store.d.ts +56 -0
  67. package/dist/vendor/core/persistence/mission-store.js +281 -0
  68. package/dist/vendor/core/policy.d.ts +2 -0
  69. package/dist/vendor/core/policy.js +5 -2
  70. package/dist/vendor/core/rollback.js +15 -1
  71. package/dist/vendor/core/savings.d.ts +13 -0
  72. package/dist/vendor/core/savings.js +22 -0
  73. package/dist/vendor/core/termination-store.d.ts +15 -0
  74. package/dist/vendor/core/termination-store.js +44 -0
  75. package/dist/vendor/core/verified-handoff.d.ts +67 -0
  76. package/dist/vendor/core/verified-handoff.js +210 -0
  77. package/package.json +76 -83
  78. package/server.json +21 -21
  79. package/LICENSE +0 -216
  80. package/dist/vendor/adapters/adapters/src/claude-cli.d.ts +0 -146
  81. package/dist/vendor/adapters/adapters/src/claude-cli.js +0 -1100
  82. package/dist/vendor/adapters/adapters/src/cli-bridge.d.ts +0 -103
  83. package/dist/vendor/adapters/adapters/src/cli-bridge.js +0 -569
  84. package/dist/vendor/adapters/adapters/src/codex-launcher.d.ts +0 -78
  85. package/dist/vendor/adapters/adapters/src/codex-launcher.js +0 -663
  86. package/dist/vendor/adapters/adapters/src/direct-provider.d.ts +0 -10
  87. package/dist/vendor/adapters/adapters/src/direct-provider.js +0 -40
  88. package/dist/vendor/adapters/adapters/src/index.d.ts +0 -8
  89. package/dist/vendor/adapters/adapters/src/index.js +0 -8
  90. package/dist/vendor/adapters/adapters/src/openai-compatible.d.ts +0 -62
  91. package/dist/vendor/adapters/adapters/src/openai-compatible.js +0 -306
  92. package/dist/vendor/adapters/adapters/src/runtime-support.d.ts +0 -17
  93. package/dist/vendor/adapters/adapters/src/runtime-support.js +0 -59
  94. package/dist/vendor/adapters/adapters/src/stub-agent-cli.d.ts +0 -8
  95. package/dist/vendor/adapters/adapters/src/stub-agent-cli.js +0 -40
  96. package/dist/vendor/adapters/adapters/src/stub-direct-provider.d.ts +0 -8
  97. package/dist/vendor/adapters/adapters/src/stub-direct-provider.js +0 -12
  98. package/dist/vendor/adapters/adapters/src/verifier-only.d.ts +0 -9
  99. package/dist/vendor/adapters/adapters/src/verifier-only.js +0 -63
  100. package/dist/vendor/adapters/contracts/src/context-graph.d.ts +0 -48
  101. package/dist/vendor/adapters/contracts/src/context-graph.js +0 -26
  102. package/dist/vendor/adapters/contracts/src/execution-policy.d.ts +0 -78
  103. package/dist/vendor/adapters/contracts/src/execution-policy.js +0 -43
  104. package/dist/vendor/adapters/contracts/src/governance.d.ts +0 -24
  105. package/dist/vendor/adapters/contracts/src/governance.js +0 -11
  106. package/dist/vendor/adapters/contracts/src/identity.d.ts +0 -29
  107. package/dist/vendor/adapters/contracts/src/identity.js +0 -30
  108. package/dist/vendor/adapters/contracts/src/index.d.ts +0 -412
  109. package/dist/vendor/adapters/contracts/src/index.js +0 -225
  110. package/dist/vendor/adapters/contracts/src/operator.d.ts +0 -19
  111. package/dist/vendor/adapters/contracts/src/operator.js +0 -11
  112. package/dist/vendor/adapters/contracts/src/trajectory.d.ts +0 -26
  113. package/dist/vendor/adapters/contracts/src/trajectory.js +0 -27
  114. package/dist/vendor/adapters/core/src/compiler.d.ts +0 -52
  115. package/dist/vendor/adapters/core/src/compiler.js +0 -52
  116. package/dist/vendor/adapters/core/src/context-graph.d.ts +0 -3
  117. package/dist/vendor/adapters/core/src/context-graph.js +0 -371
  118. package/dist/vendor/adapters/core/src/context-integrity.d.ts +0 -26
  119. package/dist/vendor/adapters/core/src/context-integrity.js +0 -80
  120. package/dist/vendor/adapters/core/src/grounding.d.ts +0 -38
  121. package/dist/vendor/adapters/core/src/grounding.js +0 -273
  122. package/dist/vendor/adapters/core/src/identity.d.ts +0 -20
  123. package/dist/vendor/adapters/core/src/identity.js +0 -86
  124. package/dist/vendor/adapters/core/src/index.d.ts +0 -186
  125. package/dist/vendor/adapters/core/src/index.js +0 -1495
  126. package/dist/vendor/adapters/core/src/leash.d.ts +0 -48
  127. package/dist/vendor/adapters/core/src/leash.js +0 -497
  128. package/dist/vendor/adapters/core/src/persistence/compiler.d.ts +0 -18
  129. package/dist/vendor/adapters/core/src/persistence/compiler.js +0 -34
  130. package/dist/vendor/adapters/core/src/persistence/index.d.ts +0 -10
  131. package/dist/vendor/adapters/core/src/persistence/index.js +0 -5
  132. package/dist/vendor/adapters/core/src/persistence/integrity.d.ts +0 -39
  133. package/dist/vendor/adapters/core/src/persistence/integrity.js +0 -252
  134. package/dist/vendor/adapters/core/src/persistence/ledger.d.ts +0 -23
  135. package/dist/vendor/adapters/core/src/persistence/ledger.js +0 -9
  136. package/dist/vendor/adapters/core/src/persistence/memory-store.d.ts +0 -63
  137. package/dist/vendor/adapters/core/src/persistence/memory-store.js +0 -115
  138. package/dist/vendor/adapters/core/src/persistence/runs-reader.d.ts +0 -66
  139. package/dist/vendor/adapters/core/src/persistence/runs-reader.js +0 -140
  140. package/dist/vendor/adapters/core/src/persistence/store.d.ts +0 -89
  141. package/dist/vendor/adapters/core/src/persistence/store.js +0 -125
  142. package/dist/vendor/adapters/core/src/persistence/trace-store.d.ts +0 -85
  143. package/dist/vendor/adapters/core/src/persistence/trace-store.js +0 -125
  144. package/dist/vendor/adapters/core/src/policy-compiler.d.ts +0 -2
  145. package/dist/vendor/adapters/core/src/policy-compiler.js +0 -195
  146. package/dist/vendor/adapters/core/src/policy.d.ts +0 -156
  147. package/dist/vendor/adapters/core/src/policy.js +0 -704
  148. package/dist/vendor/adapters/core/src/repo-analyzer.d.ts +0 -53
  149. package/dist/vendor/adapters/core/src/repo-analyzer.js +0 -263
  150. package/dist/vendor/adapters/core/src/rollback.d.ts +0 -15
  151. package/dist/vendor/adapters/core/src/rollback.js +0 -253
  152. package/dist/vendor/adapters/core/src/routing.d.ts +0 -82
  153. package/dist/vendor/adapters/core/src/routing.js +0 -336
  154. package/dist/vendor/adapters/core/src/test-integrity.d.ts +0 -64
  155. package/dist/vendor/adapters/core/src/test-integrity.js +0 -197
  156. package/dist/vendor/adapters/core/src/trajectory.d.ts +0 -18
  157. package/dist/vendor/adapters/core/src/trajectory.js +0 -295
  158. package/dist/vendor/adapters/stub-agent-cli.d.ts +0 -8
  159. package/dist/vendor/adapters/stub-agent-cli.js +0 -40
  160. package/dist/vendor/adapters/verifier-only.d.ts +0 -9
  161. package/dist/vendor/adapters/verifier-only.js +0 -63
@@ -1,295 +0,0 @@
1
- import { cloneCircuitBreakDecision, cloneTrajectoryAssessment } from "../../../contracts/index.js";
2
- const STOP_WORDS = new Set([
3
- "about",
4
- "after",
5
- "again",
6
- "along",
7
- "also",
8
- "been",
9
- "before",
10
- "being",
11
- "between",
12
- "could",
13
- "failed",
14
- "failure",
15
- "from",
16
- "have",
17
- "into",
18
- "just",
19
- "keep",
20
- "made",
21
- "make",
22
- "need",
23
- "only",
24
- "over",
25
- "same",
26
- "should",
27
- "still",
28
- "than",
29
- "that",
30
- "their",
31
- "them",
32
- "then",
33
- "there",
34
- "these",
35
- "they",
36
- "this",
37
- "those",
38
- "touching",
39
- "without",
40
- "would"
41
- ]);
42
- const STALL_FAILURE_CLASSES = new Set([
43
- "logic_error",
44
- "verification_failure",
45
- "repo_grounding_failure",
46
- "scope_creep",
47
- "no_progress"
48
- ]);
49
- export function assessTrajectory(input) {
50
- const attempts = input.attempts.filter((attempt) => attempt.index > 0);
51
- if (attempts.length === 0) {
52
- return cloneTrajectoryAssessment({
53
- status: "healthy",
54
- confidence: "low",
55
- summary: "No prior attempts exist, so Martin has no drift evidence yet.",
56
- signals: []
57
- });
58
- }
59
- const signals = [];
60
- const recentAttempts = attempts.slice(-4);
61
- const lastThree = recentAttempts.slice(-3);
62
- const lastTwo = recentAttempts.slice(-2);
63
- const oscillation = detectFailureOscillation(lastThree);
64
- if (oscillation) {
65
- signals.push(oscillation);
66
- }
67
- const repetition = detectAttemptRepetition(lastThree);
68
- if (repetition) {
69
- signals.push(repetition);
70
- }
71
- const verificationStall = detectVerificationStall(lastTwo);
72
- if (verificationStall) {
73
- signals.push(verificationStall);
74
- }
75
- const objectiveDrift = detectObjectiveDrift({
76
- objective: input.objective,
77
- verificationPlan: input.verificationPlan,
78
- attempts: lastTwo
79
- });
80
- if (objectiveDrift) {
81
- signals.push(objectiveDrift);
82
- }
83
- const status = deriveTrajectoryStatus(signals);
84
- const confidence = deriveTrajectoryConfidence(signals);
85
- const recommendedIntervention = deriveRecommendedIntervention(signals);
86
- if (signals.length === 0) {
87
- return cloneTrajectoryAssessment({
88
- status: "healthy",
89
- confidence: "medium",
90
- summary: "Recent attempts stay aligned enough that Martin does not need a circuit break yet.",
91
- signals: []
92
- });
93
- }
94
- const summary = summarizeTrajectory(status, signals);
95
- return cloneTrajectoryAssessment({
96
- status,
97
- confidence,
98
- summary,
99
- signals,
100
- ...(recommendedIntervention ? { recommendedIntervention } : {})
101
- });
102
- }
103
- export function decideCircuitBreak(input) {
104
- const assessment = assessTrajectory(input);
105
- const remainingIterations = input.remainingIterations ?? Number.POSITIVE_INFINITY;
106
- const stopForHighSignal = assessment.signals.some((signal) => signal.severity === "high");
107
- const stopForLateDrift = assessment.status === "drifting" &&
108
- remainingIterations <= 1 &&
109
- assessment.signals.some((signal) => signal.code === "objective_drift");
110
- const stopForLateStall = assessment.status === "watch" &&
111
- remainingIterations <= 1 &&
112
- assessment.signals.some((signal) => signal.code === "verification_stall");
113
- const shouldStop = stopForHighSignal || stopForLateDrift || stopForLateStall;
114
- return cloneCircuitBreakDecision({
115
- shouldStop,
116
- reason: shouldStop
117
- ? assessment.summary
118
- : "Trajectory signals do not justify a hard circuit break yet.",
119
- assessment,
120
- ...(assessment.recommendedIntervention
121
- ? { recommendedIntervention: assessment.recommendedIntervention }
122
- : {})
123
- });
124
- }
125
- function detectFailureOscillation(attempts) {
126
- if (attempts.length < 3) {
127
- return undefined;
128
- }
129
- const [first, second, third] = attempts;
130
- if (!first?.failureClass ||
131
- !second?.failureClass ||
132
- !third?.failureClass ||
133
- first.failureClass === second.failureClass ||
134
- first.failureClass !== third.failureClass) {
135
- return undefined;
136
- }
137
- return {
138
- code: "failure_oscillation",
139
- severity: "high",
140
- summary: `Attempts ${first.index}, ${second.index}, and ${third.index} oscillate between failure classes instead of converging.`,
141
- attemptIndexes: [first.index, second.index, third.index]
142
- };
143
- }
144
- function detectAttemptRepetition(attempts) {
145
- if (attempts.length < 3) {
146
- return undefined;
147
- }
148
- const tokenSets = attempts.map((attempt) => toTokenSet(attempt.summary));
149
- if (tokenSets.some((tokens) => tokens.size < 4)) {
150
- return undefined;
151
- }
152
- const pairScores = [
153
- jaccardSimilarity(tokenSets[0], tokenSets[1]),
154
- jaccardSimilarity(tokenSets[1], tokenSets[2]),
155
- jaccardSimilarity(tokenSets[0], tokenSets[2])
156
- ];
157
- if (pairScores.every((score) => score >= 0.55)) {
158
- const matchedTerms = intersectSets(tokenSets[0], new Set(intersectSets(tokenSets[1], tokenSets[2])));
159
- return {
160
- code: "attempt_repetition",
161
- severity: "high",
162
- summary: `Attempts ${attempts.map((attempt) => attempt.index).join(", ")} are materially repetitive and are not exploring a new path.`,
163
- attemptIndexes: attempts.map((attempt) => attempt.index),
164
- ...(matchedTerms.length > 0 ? { matchedTerms: matchedTerms.slice(0, 6) } : {})
165
- };
166
- }
167
- return undefined;
168
- }
169
- function detectVerificationStall(attempts) {
170
- if (attempts.length < 2) {
171
- return undefined;
172
- }
173
- const relevant = attempts.filter((attempt) => {
174
- const failureClass = attempt.failureClass;
175
- return failureClass !== undefined && STALL_FAILURE_CLASSES.has(failureClass);
176
- });
177
- if (relevant.length < 2) {
178
- return undefined;
179
- }
180
- const tokenSets = relevant.map((attempt) => toTokenSet(attempt.summary));
181
- const overlap = tokenSets
182
- .slice(1)
183
- .map((tokens, index) => jaccardSimilarity(tokenSets[index], tokens))
184
- .reduce((highest, score) => Math.max(highest, score), 0);
185
- if (overlap < 0.35) {
186
- return undefined;
187
- }
188
- const latest = relevant.at(-1);
189
- return {
190
- code: "verification_stall",
191
- severity: "medium",
192
- summary: `Recent attempts keep landing on the same verifier-facing failure surface (${latest.failureClass}).`,
193
- attemptIndexes: relevant.map((attempt) => attempt.index)
194
- };
195
- }
196
- function detectObjectiveDrift(input) {
197
- if (input.attempts.length < 2) {
198
- return undefined;
199
- }
200
- const objectiveTerms = toTokenSet(`${input.objective} ${(input.verificationPlan ?? []).join(" ")}`);
201
- if (objectiveTerms.size < 4) {
202
- return undefined;
203
- }
204
- const summaryTerms = input.attempts.map((attempt) => toTokenSet(attempt.summary));
205
- const overlaps = summaryTerms.map((terms) => jaccardSimilarity(terms, objectiveTerms));
206
- if (overlaps.some((score) => score >= 0.18)) {
207
- return undefined;
208
- }
209
- const sharedDriftTerms = intersectSets(summaryTerms[0], summaryTerms[1]);
210
- if (sharedDriftTerms.length < 3) {
211
- return undefined;
212
- }
213
- return {
214
- code: "objective_drift",
215
- severity: "medium",
216
- summary: "Recent attempt summaries are converging on work that does not overlap with the original objective or verifier plan.",
217
- attemptIndexes: input.attempts.map((attempt) => attempt.index),
218
- matchedTerms: sharedDriftTerms.slice(0, 6)
219
- };
220
- }
221
- function deriveTrajectoryStatus(signals) {
222
- if (signals.some((signal) => signal.severity === "high")) {
223
- return "stalled";
224
- }
225
- if (signals.some((signal) => signal.code === "objective_drift")) {
226
- return "drifting";
227
- }
228
- if (signals.some((signal) => signal.severity === "medium")) {
229
- return "watch";
230
- }
231
- return "healthy";
232
- }
233
- function deriveTrajectoryConfidence(signals) {
234
- if (signals.some((signal) => signal.severity === "high")) {
235
- return "high";
236
- }
237
- if (signals.some((signal) => signal.severity === "medium")) {
238
- return "medium";
239
- }
240
- return "low";
241
- }
242
- function deriveRecommendedIntervention(signals) {
243
- if (signals.some((signal) => signal.code === "failure_oscillation" || signal.code === "attempt_repetition")) {
244
- return "escalate_human";
245
- }
246
- if (signals.some((signal) => signal.code === "objective_drift")) {
247
- return "tighten_task";
248
- }
249
- if (signals.some((signal) => signal.code === "verification_stall")) {
250
- return "run_verifier";
251
- }
252
- return undefined;
253
- }
254
- function summarizeTrajectory(status, signals) {
255
- const lead = signals[0];
256
- if (!lead) {
257
- return "Trajectory is healthy.";
258
- }
259
- switch (status) {
260
- case "stalled":
261
- return `Trajectory stalled: ${lead.summary}`;
262
- case "drifting":
263
- return `Trajectory drift detected: ${lead.summary}`;
264
- case "watch":
265
- return `Trajectory warning: ${lead.summary}`;
266
- default:
267
- return lead.summary;
268
- }
269
- }
270
- function toTokenSet(text) {
271
- return new Set((text ?? "")
272
- .toLowerCase()
273
- .match(/[a-z][a-z0-9_/-]{2,}/g)
274
- ?.flatMap((token) => splitCompositeToken(token))
275
- .map((token) => token.trim())
276
- .filter((token) => token.length >= 3 && !STOP_WORDS.has(token)) ?? []);
277
- }
278
- function splitCompositeToken(token) {
279
- return token
280
- .split(/[-_/]/g)
281
- .flatMap((part) => part.split(/(?=[A-Z])/g))
282
- .map((part) => part.toLowerCase())
283
- .filter(Boolean);
284
- }
285
- function jaccardSimilarity(left, right) {
286
- if (left.size === 0 || right.size === 0) {
287
- return 0;
288
- }
289
- const intersection = intersectSets(left, right).length;
290
- const union = new Set([...left, ...right]).size;
291
- return union === 0 ? 0 : intersection / union;
292
- }
293
- function intersectSets(left, right) {
294
- return [...left].filter((term) => right.has(term));
295
- }
@@ -1,8 +0,0 @@
1
- import type { MartinAdapter, MartinAdapterRequest, MartinAdapterResult } from "../core/index.js";
2
- export interface StubAgentCliAdapterOptions {
3
- command: string[];
4
- profile?: string;
5
- label?: string;
6
- responder?: (request: MartinAdapterRequest) => Promise<MartinAdapterResult> | MartinAdapterResult;
7
- }
8
- export declare function createStubAgentCliAdapter(options: StubAgentCliAdapterOptions): MartinAdapter;
@@ -1,40 +0,0 @@
1
- import { createAdapterCapabilities } from "./runtime-support.js";
2
- export function createStubAgentCliAdapter(options) {
3
- const metadata = {
4
- command: options.command.join(" "),
5
- providerId: "agent-cli",
6
- model: options.profile ?? options.command[0] ?? "default",
7
- transport: "cli",
8
- capabilities: createAdapterCapabilities(),
9
- ...(options.profile ? { profile: options.profile } : {})
10
- };
11
- return {
12
- adapterId: `agent-cli:${options.command.join(":")}`,
13
- kind: "agent-cli",
14
- label: options.label ?? `Stub agent CLI (${options.command.join(" ")})`,
15
- metadata,
16
- async execute(request) {
17
- if (options.responder) {
18
- return await options.responder(request);
19
- }
20
- return {
21
- status: "failed",
22
- summary: `Stub agent CLI ${options.command.join(" ")} did not execute a live session.`,
23
- usage: {
24
- actualUsd: 0,
25
- tokensIn: 0,
26
- tokensOut: 0,
27
- provenance: "unavailable"
28
- },
29
- verification: {
30
- passed: false,
31
- summary: "No CLI execution was attempted."
32
- },
33
- failure: {
34
- message: `Agent CLI ${options.command.join(" ")} is not configured for live execution.`,
35
- classHint: "environment_mismatch"
36
- }
37
- };
38
- }
39
- };
40
- }
@@ -1,9 +0,0 @@
1
- import type { MartinAdapter } from "../core/index.js";
2
- import { type SpawnLike } from "./cli-bridge.js";
3
- export interface VerifierOnlyAdapterOptions {
4
- workingDirectory?: string;
5
- verifyTimeoutMs?: number;
6
- label?: string;
7
- spawnImpl?: SpawnLike;
8
- }
9
- export declare function createVerifierOnlyAdapter(options?: VerifierOnlyAdapterOptions): MartinAdapter;
@@ -1,63 +0,0 @@
1
- import { readGitChangedFiles, runVerification } from "./cli-bridge.js";
2
- import { createAdapterCapabilities, normalizeUsage } from "./runtime-support.js";
3
- export function createVerifierOnlyAdapter(options = {}) {
4
- const workingDirectory = options.workingDirectory ?? process.cwd();
5
- const verifyTimeoutMs = options.verifyTimeoutMs ?? 120_000;
6
- return {
7
- adapterId: "direct:verifier:verify-only",
8
- kind: "direct-provider",
9
- label: options.label ?? "Verifier-only adapter",
10
- metadata: {
11
- providerId: "verifier",
12
- model: "verify-only",
13
- transport: "cli",
14
- capabilities: createAdapterCapabilities({
15
- usageSettlement: true,
16
- diffArtifacts: true
17
- })
18
- },
19
- async execute(request) {
20
- const shouldTrackVerifierWrites = request.context.verificationPlan.length > 0 ||
21
- (request.context.verificationStack?.length ?? 0) > 0;
22
- const baselineChangedFiles = shouldTrackVerifierWrites
23
- ? new Set(await readGitChangedFiles(workingDirectory, 5_000, options.spawnImpl))
24
- : new Set();
25
- const verification = await runVerification(request.context.verificationPlan, workingDirectory, verifyTimeoutMs, request.context.verificationStack, options.spawnImpl);
26
- const changedFiles = shouldTrackVerifierWrites
27
- ? (await readGitChangedFiles(workingDirectory, 5_000, options.spawnImpl)).filter((file) => !baselineChangedFiles.has(file))
28
- : [];
29
- const execution = { changedFiles };
30
- if (verification.passed) {
31
- return {
32
- status: "completed",
33
- summary: changedFiles.length > 0
34
- ? `Verifier-only run completed but modified files: ${changedFiles.join(", ")}`
35
- : "Verifier-only run completed without file edits.",
36
- usage: normalizeUsage({
37
- actualUsd: 0,
38
- tokensIn: 0,
39
- tokensOut: 0,
40
- provenance: "actual"
41
- }),
42
- verification,
43
- execution
44
- };
45
- }
46
- return {
47
- status: "failed",
48
- summary: "Verifier-only run failed.",
49
- usage: normalizeUsage({
50
- actualUsd: 0,
51
- tokensIn: 0,
52
- tokensOut: 0,
53
- provenance: "actual"
54
- }),
55
- verification,
56
- execution,
57
- failure: {
58
- message: verification.summary
59
- }
60
- };
61
- }
62
- };
63
- }