@dsiloed/silo-link 1.13.7 → 1.15.1
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/dist/api/dsiloed-client.d.ts +5 -1
- package/dist/api/dsiloed-client.d.ts.map +1 -1
- package/dist/api/dsiloed-client.js +11 -6
- package/dist/api/dsiloed-client.js.map +1 -1
- package/dist/cli/commands.d.ts.map +1 -1
- package/dist/cli/commands.js +21 -5
- package/dist/cli/commands.js.map +1 -1
- package/dist/cli/file-log.d.ts +21 -0
- package/dist/cli/file-log.d.ts.map +1 -0
- package/dist/cli/file-log.js +52 -0
- package/dist/cli/file-log.js.map +1 -0
- package/dist/core/agent-launcher.d.ts +24 -0
- package/dist/core/agent-launcher.d.ts.map +1 -1
- package/dist/core/auto-updater.d.ts +9 -2
- package/dist/core/auto-updater.d.ts.map +1 -1
- package/dist/core/auto-updater.js +57 -36
- package/dist/core/auto-updater.js.map +1 -1
- package/dist/core/base-tmux-launcher.d.ts +73 -3
- package/dist/core/base-tmux-launcher.d.ts.map +1 -1
- package/dist/core/base-tmux-launcher.js +212 -14
- package/dist/core/base-tmux-launcher.js.map +1 -1
- package/dist/core/bridge.d.ts +38 -0
- package/dist/core/bridge.d.ts.map +1 -1
- package/dist/core/bridge.js +226 -7
- package/dist/core/bridge.js.map +1 -1
- package/dist/core/claude-launcher.d.ts +8 -2
- package/dist/core/claude-launcher.d.ts.map +1 -1
- package/dist/core/claude-launcher.js +19 -4
- package/dist/core/claude-launcher.js.map +1 -1
- package/dist/core/codex-launcher.d.ts +4 -2
- package/dist/core/codex-launcher.d.ts.map +1 -1
- package/dist/core/codex-launcher.js +7 -4
- package/dist/core/codex-launcher.js.map +1 -1
- package/dist/core/gemini-launcher.d.ts +4 -2
- package/dist/core/gemini-launcher.d.ts.map +1 -1
- package/dist/core/gemini-launcher.js +7 -4
- package/dist/core/gemini-launcher.js.map +1 -1
- package/dist/core/launcher-factory.d.ts +2 -1
- package/dist/core/launcher-factory.d.ts.map +1 -1
- package/dist/core/launcher-factory.js +5 -5
- package/dist/core/launcher-factory.js.map +1 -1
- package/dist/core/usage-ledger.d.ts +55 -0
- package/dist/core/usage-ledger.d.ts.map +1 -0
- package/dist/core/usage-ledger.js +82 -0
- package/dist/core/usage-ledger.js.map +1 -0
- package/dist/index.js +0 -0
- package/dist/mcp/server.d.ts +9 -0
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +50 -0
- package/dist/mcp/server.js.map +1 -1
- package/package.json +1 -1
- package/dist/core/baseline-verify.d.ts +0 -54
- package/dist/core/baseline-verify.d.ts.map +0 -1
- package/dist/core/baseline-verify.js +0 -164
- package/dist/core/baseline-verify.js.map +0 -1
package/dist/mcp/server.js
CHANGED
|
@@ -10,6 +10,19 @@ import { registerTools } from './tools/register-tools.js';
|
|
|
10
10
|
const __filename = fileURLToPath(import.meta.url);
|
|
11
11
|
const __dirname = path.dirname(__filename);
|
|
12
12
|
const pkg = JSON.parse(fs.readFileSync(path.resolve(__dirname, '../../package.json'), 'utf-8'));
|
|
13
|
+
/**
|
|
14
|
+
* True when an error means the code/modules this process was started from are
|
|
15
|
+
* gone or broken on disk (install swapped underneath us). Express/body-parser
|
|
16
|
+
* lazily load pieces (e.g. iconv-lite's encodings) on the first request that
|
|
17
|
+
* needs them, so this surfaces as a request error long after startup.
|
|
18
|
+
*/
|
|
19
|
+
export function isModuleLoadFailure(err) {
|
|
20
|
+
if (!(err instanceof Error))
|
|
21
|
+
return false;
|
|
22
|
+
const code = err.code;
|
|
23
|
+
return code === 'MODULE_NOT_FOUND' || code === 'ERR_MODULE_NOT_FOUND'
|
|
24
|
+
|| /Cannot find module/i.test(err.message);
|
|
25
|
+
}
|
|
13
26
|
export class SiloLinkMcpServer {
|
|
14
27
|
app;
|
|
15
28
|
server = null;
|
|
@@ -102,8 +115,45 @@ export class SiloLinkMcpServer {
|
|
|
102
115
|
uptime_seconds: uptimeSeconds,
|
|
103
116
|
active_sessions: this.deps.sessionManager.getAll().length,
|
|
104
117
|
cable: this.deps.cableClient.getState(),
|
|
118
|
+
// "Can this daemon actually parse an MCP POST?" — GET /health can't
|
|
119
|
+
// prove that (it parses no body), which let a broken-install daemon
|
|
120
|
+
// look healthy for hours. See POST /probe.
|
|
121
|
+
mcp_post: this.deps.probeStatus?.() ?? 'unknown',
|
|
105
122
|
});
|
|
106
123
|
});
|
|
124
|
+
/**
|
|
125
|
+
* POST /probe — exercises the JSON body-parse path (the same middleware
|
|
126
|
+
* every MCP call goes through). Two jobs:
|
|
127
|
+
* 1. Warm-up: the bridge hits this once at startup, forcing body-parser/
|
|
128
|
+
* iconv-lite to load their lazy pieces while the install is intact —
|
|
129
|
+
* so a later file swap can't break already-cached codecs.
|
|
130
|
+
* 2. Canary: the bridge re-probes periodically; if the install has been
|
|
131
|
+
* replaced underneath us, the parse throws MODULE_NOT_FOUND, the error
|
|
132
|
+
* middleware below reports it, and the daemon self-restarts instead of
|
|
133
|
+
* zombie-ing with a green /health.
|
|
134
|
+
*/
|
|
135
|
+
this.app.post('/probe', (req, res) => {
|
|
136
|
+
res.json({ ok: true, echoed: req.body ?? null });
|
|
137
|
+
});
|
|
138
|
+
// Error middleware (must be registered last, must keep 4 args). A module-
|
|
139
|
+
// load failure here means our files were swapped out from under us — every
|
|
140
|
+
// subsequent MCP POST would fail the same way, so escalate for self-heal.
|
|
141
|
+
this.app.use((err, _req, res, _next) => {
|
|
142
|
+
if (isModuleLoadFailure(err)) {
|
|
143
|
+
console.error(`[MCP] FATAL: request failed loading a module — the installed package has likely been replaced/deleted under this running daemon: ${err.message}`);
|
|
144
|
+
this.deps.onModuleLoadFailure?.(err);
|
|
145
|
+
if (!res.headersSent) {
|
|
146
|
+
res.status(503).json({ error: 'silolink install replaced under running daemon; restarting', detail: err.message });
|
|
147
|
+
}
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
const status = err.status
|
|
151
|
+
?? err.statusCode
|
|
152
|
+
?? 500;
|
|
153
|
+
if (!res.headersSent) {
|
|
154
|
+
res.status(status).json({ error: err.message });
|
|
155
|
+
}
|
|
156
|
+
});
|
|
107
157
|
}
|
|
108
158
|
/**
|
|
109
159
|
* Bind the MCP server, preferring `preferredPort`. If that port is already
|
package/dist/mcp/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AACnG,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAUzE,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE1D,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,oBAAoB,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
import type { DSiloedClient } from '../api/dsiloed-client.js';
|
|
2
|
-
import type { WorkspaceManager } from '../core/workspace-manager.js';
|
|
3
|
-
import type { Session } from '../types/index.js';
|
|
4
|
-
import type { ParsedTestRun, TestResultsResponse } from '../types/index.js';
|
|
5
|
-
export declare const DEFAULT_TEST_TIMEOUT_MS: number;
|
|
6
|
-
export interface CommandRunResult {
|
|
7
|
-
stdout: string;
|
|
8
|
-
stderr: string;
|
|
9
|
-
exitCode: number;
|
|
10
|
-
}
|
|
11
|
-
export type CommandRunner = (command: string, cwd: string, timeoutMs: number) => CommandRunResult;
|
|
12
|
-
export declare const defaultCommandRunner: CommandRunner;
|
|
13
|
-
/**
|
|
14
|
-
* Extract the single `{ "examples": <int>, "failed_ids": [...] }` JSON object the
|
|
15
|
-
* test-command wrapper prints to stdout. Tolerant of surrounding suite output:
|
|
16
|
-
* scans lines bottom-up for a JSON object carrying both keys (the wrapper prints
|
|
17
|
-
* it last). Returns null if no parseable, well-shaped object is found.
|
|
18
|
-
*/
|
|
19
|
-
export declare function parseTestRunOutput(stdout: string): ParsedTestRun | null;
|
|
20
|
-
export interface BaselineVerifyDeps {
|
|
21
|
-
dsiloedClient: DSiloedClient;
|
|
22
|
-
workspaceManager: WorkspaceManager;
|
|
23
|
-
runCommand?: CommandRunner;
|
|
24
|
-
}
|
|
25
|
-
export interface BaselineVerifyArgs {
|
|
26
|
-
session: Session;
|
|
27
|
-
base_branch: string;
|
|
28
|
-
test_command: string;
|
|
29
|
-
conversation_id?: number;
|
|
30
|
-
timeout_ms?: number;
|
|
31
|
-
}
|
|
32
|
-
export interface BaselineVerifyResult {
|
|
33
|
-
verdict: 'pass' | 'fail' | 'error';
|
|
34
|
-
message: string;
|
|
35
|
-
engine?: TestResultsResponse;
|
|
36
|
-
head?: ParsedTestRun & {
|
|
37
|
-
branch: string;
|
|
38
|
-
};
|
|
39
|
-
base?: ParsedTestRun & {
|
|
40
|
-
branch: string;
|
|
41
|
-
};
|
|
42
|
-
}
|
|
43
|
-
/**
|
|
44
|
-
* Deterministic, daemon-side baseline-verify runner. NO LLM judgment:
|
|
45
|
-
* 1. Resolve the calling worker's HEAD worktree (its existing workspace).
|
|
46
|
-
* 2. Run `test_command` there, parse {examples, failed_ids}.
|
|
47
|
-
* 3. Create a SECOND worktree for `base_branch`, run + parse there, then
|
|
48
|
-
* discard it (no-merge teardown).
|
|
49
|
-
* 4. POST both structured results to the engine, which computes the verdict.
|
|
50
|
-
*
|
|
51
|
-
* Never throws: any failure returns { verdict: 'error', message }.
|
|
52
|
-
*/
|
|
53
|
-
export declare function runBaselineVerify(deps: BaselineVerifyDeps, args: BaselineVerifyArgs): Promise<BaselineVerifyResult>;
|
|
54
|
-
//# sourceMappingURL=baseline-verify.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"baseline-verify.d.ts","sourceRoot":"","sources":["../../src/core/baseline-verify.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAI5E,eAAO,MAAM,uBAAuB,QAAiB,CAAC;AAmCtD,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAID,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,gBAAgB,CAAC;AAElG,eAAO,MAAM,oBAAoB,EAAE,aAelC,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAuBvE;AAOD,MAAM,WAAW,kBAAkB;IACjC,aAAa,EAAE,aAAa,CAAC;IAC7B,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,UAAU,CAAC,EAAE,aAAa,CAAC;CAC5B;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IACnC,OAAO,EAAE,MAAM,CAAC;IAEhB,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,IAAI,CAAC,EAAE,aAAa,GAAG;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1C,IAAI,CAAC,EAAE,aAAa,GAAG;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3C;AAED;;;;;;;;;GASG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,kBAAkB,EACxB,IAAI,EAAE,kBAAkB,GACvB,OAAO,CAAC,oBAAoB,CAAC,CAyD/B"}
|
|
@@ -1,164 +0,0 @@
|
|
|
1
|
-
import { spawnSync, execFileSync } from 'node:child_process';
|
|
2
|
-
import { existsSync, copyFileSync, readdirSync } from 'node:fs';
|
|
3
|
-
import { join } from 'node:path';
|
|
4
|
-
// Default test-command timeout. The full suite can take ~15 min; allow generous
|
|
5
|
-
// headroom. Configurable per-call via the tool's `timeout_ms` input.
|
|
6
|
-
export const DEFAULT_TEST_TIMEOUT_MS = 30 * 60 * 1000;
|
|
7
|
-
// Fast-forward the local base branch to origin so the base worktree is built from
|
|
8
|
-
// CURRENT base code (stale local base ⇒ wrong baseline AND missing newly-committed
|
|
9
|
-
// helper scripts). `fetch origin <b>:<b>` only updates a fast-forwardable local
|
|
10
|
-
// branch; never throws (offline/diverged is non-fatal — createWorktree's own fetch
|
|
11
|
-
// fallback still runs).
|
|
12
|
-
function fastForwardBaseBranch(repoPath, baseBranch) {
|
|
13
|
-
try {
|
|
14
|
-
execFileSync('git', ['-C', repoPath, 'fetch', 'origin', `${baseBranch}:${baseBranch}`], { stdio: 'pipe' });
|
|
15
|
-
}
|
|
16
|
-
catch {
|
|
17
|
-
try {
|
|
18
|
-
execFileSync('git', ['-C', repoPath, 'fetch', 'origin', baseBranch], { stdio: 'pipe' });
|
|
19
|
-
}
|
|
20
|
-
catch { /* offline */ }
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
// Copy gitignored runtime config the test command needs to boot from the HEAD
|
|
24
|
-
// worktree (which has them) into a freshly-created base worktree (which doesn't).
|
|
25
|
-
// Best-effort + language-agnostic: only copies files that exist; never throws.
|
|
26
|
-
function copyGitignoredConfig(fromDir, toDir) {
|
|
27
|
-
const fixed = ['config/app_environment_variables.rb', 'config/master.key', 'config/credentials.yml.enc'];
|
|
28
|
-
for (const rel of fixed) {
|
|
29
|
-
try {
|
|
30
|
-
const src = join(fromDir, rel);
|
|
31
|
-
if (existsSync(src))
|
|
32
|
-
copyFileSync(src, join(toDir, rel));
|
|
33
|
-
}
|
|
34
|
-
catch { /* best-effort */ }
|
|
35
|
-
}
|
|
36
|
-
// Root-level dotenv files (.env, .env.test, .env.local, …).
|
|
37
|
-
try {
|
|
38
|
-
for (const name of readdirSync(fromDir)) {
|
|
39
|
-
if (!name.startsWith('.env'))
|
|
40
|
-
continue;
|
|
41
|
-
try {
|
|
42
|
-
copyFileSync(join(fromDir, name), join(toDir, name));
|
|
43
|
-
}
|
|
44
|
-
catch { /* best-effort */ }
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
catch { /* best-effort */ }
|
|
48
|
-
}
|
|
49
|
-
export const defaultCommandRunner = (command, cwd, timeoutMs) => {
|
|
50
|
-
const res = spawnSync(command, {
|
|
51
|
-
cwd,
|
|
52
|
-
shell: true,
|
|
53
|
-
encoding: 'utf-8',
|
|
54
|
-
timeout: timeoutMs,
|
|
55
|
-
// Large suites print a lot before the JSON line; lift the default 1MB cap.
|
|
56
|
-
maxBuffer: 64 * 1024 * 1024,
|
|
57
|
-
});
|
|
58
|
-
return {
|
|
59
|
-
stdout: res.stdout ?? '',
|
|
60
|
-
stderr: res.stderr ?? '',
|
|
61
|
-
// spawnSync sets status=null on signal (e.g. timeout) — treat as nonzero.
|
|
62
|
-
exitCode: res.status ?? 1,
|
|
63
|
-
};
|
|
64
|
-
};
|
|
65
|
-
/**
|
|
66
|
-
* Extract the single `{ "examples": <int>, "failed_ids": [...] }` JSON object the
|
|
67
|
-
* test-command wrapper prints to stdout. Tolerant of surrounding suite output:
|
|
68
|
-
* scans lines bottom-up for a JSON object carrying both keys (the wrapper prints
|
|
69
|
-
* it last). Returns null if no parseable, well-shaped object is found.
|
|
70
|
-
*/
|
|
71
|
-
export function parseTestRunOutput(stdout) {
|
|
72
|
-
const lines = stdout.split('\n');
|
|
73
|
-
for (let i = lines.length - 1; i >= 0; i--) {
|
|
74
|
-
const line = lines[i].trim();
|
|
75
|
-
if (!line.startsWith('{') || !line.endsWith('}'))
|
|
76
|
-
continue;
|
|
77
|
-
try {
|
|
78
|
-
const obj = JSON.parse(line);
|
|
79
|
-
if (obj && typeof obj === 'object' &&
|
|
80
|
-
typeof obj.examples === 'number' &&
|
|
81
|
-
Array.isArray(obj.failed_ids)) {
|
|
82
|
-
const o = obj;
|
|
83
|
-
return {
|
|
84
|
-
examples: o.examples,
|
|
85
|
-
failed_ids: o.failed_ids.map((x) => String(x)),
|
|
86
|
-
};
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
catch {
|
|
90
|
-
// Not JSON — keep scanning upward.
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
return null;
|
|
94
|
-
}
|
|
95
|
-
function tail(text, max = 2000) {
|
|
96
|
-
const t = (text || '').trim();
|
|
97
|
-
return t.length > max ? t.slice(-max) : t;
|
|
98
|
-
}
|
|
99
|
-
/**
|
|
100
|
-
* Deterministic, daemon-side baseline-verify runner. NO LLM judgment:
|
|
101
|
-
* 1. Resolve the calling worker's HEAD worktree (its existing workspace).
|
|
102
|
-
* 2. Run `test_command` there, parse {examples, failed_ids}.
|
|
103
|
-
* 3. Create a SECOND worktree for `base_branch`, run + parse there, then
|
|
104
|
-
* discard it (no-merge teardown).
|
|
105
|
-
* 4. POST both structured results to the engine, which computes the verdict.
|
|
106
|
-
*
|
|
107
|
-
* Never throws: any failure returns { verdict: 'error', message }.
|
|
108
|
-
*/
|
|
109
|
-
export async function runBaselineVerify(deps, args) {
|
|
110
|
-
const { dsiloedClient, workspaceManager } = deps;
|
|
111
|
-
const runCommand = deps.runCommand ?? defaultCommandRunner;
|
|
112
|
-
const timeoutMs = args.timeout_ms ?? DEFAULT_TEST_TIMEOUT_MS;
|
|
113
|
-
// --- 1. Resolve the HEAD worktree (the worker's own workspace) ---
|
|
114
|
-
const headWorkspace = workspaceManager.getWorkspace(args.session.sessionId);
|
|
115
|
-
if (!headWorkspace) {
|
|
116
|
-
return {
|
|
117
|
-
verdict: 'error',
|
|
118
|
-
message: 'No workspace (worktree) found for this session. The worker must run inside an isolated worktree before baseline-verify.',
|
|
119
|
-
};
|
|
120
|
-
}
|
|
121
|
-
const headDir = headWorkspace.worktreePath;
|
|
122
|
-
const headBranch = headWorkspace.branch;
|
|
123
|
-
const baseBranch = args.base_branch;
|
|
124
|
-
// --- 2. Run the suite on HEAD ---
|
|
125
|
-
let head;
|
|
126
|
-
try {
|
|
127
|
-
const headRun = runCommand(args.test_command, headDir, timeoutMs);
|
|
128
|
-
const parsed = parseTestRunOutput(headRun.stdout);
|
|
129
|
-
if (!parsed) {
|
|
130
|
-
// Nonzero AND no parseable JSON → genuine failure to produce evidence.
|
|
131
|
-
// (A nonzero exit WITH valid JSON is normal: failing specs make the runner
|
|
132
|
-
// exit nonzero but it still prints the result line.)
|
|
133
|
-
return {
|
|
134
|
-
verdict: 'error',
|
|
135
|
-
message: `HEAD test command produced no parseable {examples, failed_ids} JSON (exit ${headRun.exitCode}). stderr tail: ${tail(headRun.stderr)}`,
|
|
136
|
-
};
|
|
137
|
-
}
|
|
138
|
-
head = parsed;
|
|
139
|
-
}
|
|
140
|
-
catch (err) {
|
|
141
|
-
return { verdict: 'error', message: `HEAD test run threw: ${err instanceof Error ? err.message : String(err)}` };
|
|
142
|
-
}
|
|
143
|
-
// --- 3. POST head-only structured results to the engine ---
|
|
144
|
-
// A GREEN base branch reduces the gate to "head must be green", so we run the
|
|
145
|
-
// suite on HEAD only and skip a base worktree entirely — that second worktree
|
|
146
|
-
// (with its own test-DB + gitignored-config setup) was the fragile, error-prone
|
|
147
|
-
// part. test_command runs the suite IN DOCKER (see verify_json.sh), so the host's
|
|
148
|
-
// ruby/PATH doesn't matter. The engine passes when head.failed_ids is empty.
|
|
149
|
-
try {
|
|
150
|
-
const conversationId = args.conversation_id ?? args.session.conversationId;
|
|
151
|
-
const engine = await dsiloedClient.reportTestResults({
|
|
152
|
-
conversation_id: conversationId,
|
|
153
|
-
command: args.test_command,
|
|
154
|
-
head: { branch: headBranch, examples: head.examples, failed_ids: head.failed_ids },
|
|
155
|
-
});
|
|
156
|
-
const summary = `head: ${head.failed_ids.length} failed (${head.examples} examples) → verdict: ${engine.verdict}` +
|
|
157
|
-
(engine.message ? ` — ${engine.message}` : '');
|
|
158
|
-
return { verdict: engine.verdict, message: summary, engine, head: { branch: headBranch, ...head } };
|
|
159
|
-
}
|
|
160
|
-
catch (err) {
|
|
161
|
-
return { verdict: 'error', message: `Failed to report test results to engine: ${err instanceof Error ? err.message : String(err)}` };
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
//# sourceMappingURL=baseline-verify.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"baseline-verify.js","sourceRoot":"","sources":["../../src/core/baseline-verify.ts"],"names":[],"mappings":"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"}
|