labgate 0.5.31 → 0.5.33
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/README.md +50 -2
- package/dist/cli.js +533 -0
- package/dist/cli.js.map +1 -1
- package/dist/lib/config.d.ts +11 -0
- package/dist/lib/config.js +45 -4
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/container.d.ts +3 -3
- package/dist/lib/container.js +144 -12
- package/dist/lib/container.js.map +1 -1
- package/dist/lib/display-mcp.d.ts +10 -0
- package/dist/lib/display-mcp.js +160 -0
- package/dist/lib/display-mcp.js.map +1 -0
- package/dist/lib/display-store.d.ts +24 -0
- package/dist/lib/display-store.js +150 -0
- package/dist/lib/display-store.js.map +1 -0
- package/dist/lib/explorer-autopilot.d.ts +16 -0
- package/dist/lib/explorer-autopilot.js +573 -0
- package/dist/lib/explorer-autopilot.js.map +1 -0
- package/dist/lib/explorer-claude.d.ts +16 -0
- package/dist/lib/explorer-claude.js +361 -0
- package/dist/lib/explorer-claude.js.map +1 -0
- package/dist/lib/explorer-compare.d.ts +9 -0
- package/dist/lib/explorer-compare.js +190 -0
- package/dist/lib/explorer-compare.js.map +1 -0
- package/dist/lib/explorer-eval.d.ts +23 -0
- package/dist/lib/explorer-eval.js +161 -0
- package/dist/lib/explorer-eval.js.map +1 -0
- package/dist/lib/explorer-gc.d.ts +11 -0
- package/dist/lib/explorer-gc.js +304 -0
- package/dist/lib/explorer-gc.js.map +1 -0
- package/dist/lib/explorer-git.d.ts +14 -0
- package/dist/lib/explorer-git.js +136 -0
- package/dist/lib/explorer-git.js.map +1 -0
- package/dist/lib/explorer-lock.d.ts +5 -0
- package/dist/lib/explorer-lock.js +100 -0
- package/dist/lib/explorer-lock.js.map +1 -0
- package/dist/lib/explorer-mcp.d.ts +11 -0
- package/dist/lib/explorer-mcp.js +611 -0
- package/dist/lib/explorer-mcp.js.map +1 -0
- package/dist/lib/explorer-retention.d.ts +4 -0
- package/dist/lib/explorer-retention.js +58 -0
- package/dist/lib/explorer-retention.js.map +1 -0
- package/dist/lib/explorer-store.d.ts +77 -0
- package/dist/lib/explorer-store.js +950 -0
- package/dist/lib/explorer-store.js.map +1 -0
- package/dist/lib/explorer-types.d.ts +161 -0
- package/dist/lib/explorer-types.js +3 -0
- package/dist/lib/explorer-types.js.map +1 -0
- package/dist/lib/explorer.d.ts +31 -0
- package/dist/lib/explorer.js +247 -0
- package/dist/lib/explorer.js.map +1 -0
- package/dist/lib/results-store.js +37 -3
- package/dist/lib/results-store.js.map +1 -1
- package/dist/lib/test/integration-harness.js +1 -1
- package/dist/lib/test/integration-harness.js.map +1 -1
- package/dist/lib/ui.html +5115 -2052
- package/dist/lib/ui.js +906 -39
- package/dist/lib/ui.js.map +1 -1
- package/dist/lib/web-terminal.js +4 -3
- package/dist/lib/web-terminal.js.map +1 -1
- package/dist/mcp-bundles/dataset-mcp.bundle.mjs +0 -8
- package/dist/mcp-bundles/display-mcp.bundle.mjs +30209 -0
- package/dist/mcp-bundles/explorer-mcp.bundle.mjs +40036 -0
- package/dist/mcp-bundles/results-mcp.bundle.mjs +30 -4
- package/package.json +3 -2
- package/templates/tsp-lab/API_CONTRACT.md +20 -0
- package/templates/tsp-lab/EVAL.md +20 -0
- package/templates/tsp-lab/PROBLEM.md +18 -0
- package/templates/tsp-lab/data/generate_instances.py +51 -0
- package/templates/tsp-lab/data/instances.jsonl +12 -0
- package/templates/tsp-lab/eval.py +148 -0
- package/templates/tsp-lab/solver.py +88 -0
- package/templates/tsp-lab/stub-patches/enable_two_opt.patch +14 -0
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.acquireExperimentLock = acquireExperimentLock;
|
|
4
|
+
const fs_1 = require("fs");
|
|
5
|
+
const path_1 = require("path");
|
|
6
|
+
const config_js_1 = require("./config.js");
|
|
7
|
+
function parseLockPid(raw) {
|
|
8
|
+
const firstLine = raw.split(/\r?\n/, 1)[0] || '';
|
|
9
|
+
const pid = Number(firstLine.trim());
|
|
10
|
+
if (!Number.isFinite(pid) || pid <= 0)
|
|
11
|
+
return null;
|
|
12
|
+
return Math.floor(pid);
|
|
13
|
+
}
|
|
14
|
+
function isProcessAlive(pid) {
|
|
15
|
+
try {
|
|
16
|
+
process.kill(pid, 0);
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
catch (err) {
|
|
20
|
+
if (err?.code === 'ESRCH')
|
|
21
|
+
return false;
|
|
22
|
+
if (err?.code === 'EPERM')
|
|
23
|
+
return true;
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function clearStaleLockIfPossible(lockPath) {
|
|
28
|
+
try {
|
|
29
|
+
const raw = (0, fs_1.readFileSync)(lockPath, 'utf-8');
|
|
30
|
+
const pid = parseLockPid(raw);
|
|
31
|
+
if (pid !== null && isProcessAlive(pid)) {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
(0, fs_1.unlinkSync)(lockPath);
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
catch (err) {
|
|
38
|
+
if (err?.code === 'ENOENT')
|
|
39
|
+
return true;
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
function acquireExperimentLock(experimentId, lockName = 'autopilot.lock') {
|
|
44
|
+
const lockDir = (0, config_js_1.getExplorerLockDir)(experimentId);
|
|
45
|
+
(0, fs_1.mkdirSync)(lockDir, { recursive: true, mode: 0o700 });
|
|
46
|
+
const lockPath = (0, path_1.join)(lockDir, lockName);
|
|
47
|
+
let fd = null;
|
|
48
|
+
for (let attempt = 0; attempt < 2; attempt++) {
|
|
49
|
+
try {
|
|
50
|
+
fd = (0, fs_1.openSync)(lockPath, 'wx', 0o600);
|
|
51
|
+
break;
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
if (err?.code !== 'EEXIST')
|
|
55
|
+
throw err;
|
|
56
|
+
const recovered = attempt === 0 && clearStaleLockIfPossible(lockPath);
|
|
57
|
+
if (!recovered)
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
if (fd === null) {
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
try {
|
|
65
|
+
(0, fs_1.writeFileSync)(fd, `${process.pid}\n`, { encoding: 'utf-8' });
|
|
66
|
+
}
|
|
67
|
+
catch (err) {
|
|
68
|
+
try {
|
|
69
|
+
(0, fs_1.closeSync)(fd);
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
// Best effort.
|
|
73
|
+
}
|
|
74
|
+
try {
|
|
75
|
+
(0, fs_1.unlinkSync)(lockPath);
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
// Best effort.
|
|
79
|
+
}
|
|
80
|
+
throw err;
|
|
81
|
+
}
|
|
82
|
+
return {
|
|
83
|
+
lockPath,
|
|
84
|
+
release: () => {
|
|
85
|
+
try {
|
|
86
|
+
(0, fs_1.closeSync)(fd);
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
// Best effort.
|
|
90
|
+
}
|
|
91
|
+
try {
|
|
92
|
+
(0, fs_1.unlinkSync)(lockPath);
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
// Best effort.
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=explorer-lock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"explorer-lock.js","sourceRoot":"","sources":["../../src/lib/explorer-lock.ts"],"names":[],"mappings":";;AA0CA,sDAmDC;AA7FD,2BAA6F;AAC7F,+BAA4B;AAC5B,2CAAiD;AAOjD,SAAS,YAAY,CAAC,GAAW;IAC/B,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACjD,MAAM,GAAG,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;IACrC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACnD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC;AAED,SAAS,cAAc,CAAC,GAAW;IACjC,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,IAAI,GAAG,EAAE,IAAI,KAAK,OAAO;YAAE,OAAO,KAAK,CAAC;QACxC,IAAI,GAAG,EAAE,IAAI,KAAK,OAAO;YAAE,OAAO,IAAI,CAAC;QACvC,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,wBAAwB,CAAC,QAAgB;IAChD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAA,iBAAY,EAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC5C,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,GAAG,KAAK,IAAI,IAAI,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;YACxC,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAA,eAAU,EAAC,QAAQ,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,IAAI,GAAG,EAAE,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QACxC,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAgB,qBAAqB,CAAC,YAAoB,EAAE,QAAQ,GAAG,gBAAgB;IACrF,MAAM,OAAO,GAAG,IAAA,8BAAkB,EAAC,YAAY,CAAC,CAAC;IACjD,IAAA,cAAS,EAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACrD,MAAM,QAAQ,GAAG,IAAA,WAAI,EAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAEzC,IAAI,EAAE,GAAkB,IAAI,CAAC;IAC7B,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC;QAC7C,IAAI,CAAC;YACH,EAAE,GAAG,IAAA,aAAQ,EAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;YACrC,MAAM;QACR,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,IAAI,GAAG,EAAE,IAAI,KAAK,QAAQ;gBAAE,MAAM,GAAG,CAAC;YACtC,MAAM,SAAS,GAAG,OAAO,KAAK,CAAC,IAAI,wBAAwB,CAAC,QAAQ,CAAC,CAAC;YACtE,IAAI,CAAC,SAAS;gBAAE,OAAO,IAAI,CAAC;QAC9B,CAAC;IACH,CAAC;IACD,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,IAAA,kBAAa,EAAC,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,IAAI,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;IAC/D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC;YACH,IAAA,cAAS,EAAC,EAAE,CAAC,CAAC;QAChB,CAAC;QAAC,MAAM,CAAC;YACP,eAAe;QACjB,CAAC;QACD,IAAI,CAAC;YACH,IAAA,eAAU,EAAC,QAAQ,CAAC,CAAC;QACvB,CAAC;QAAC,MAAM,CAAC;YACP,eAAe;QACjB,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;IAED,OAAO;QACL,QAAQ;QACR,OAAO,EAAE,GAAG,EAAE;YACZ,IAAI,CAAC;gBACH,IAAA,cAAS,EAAC,EAAE,CAAC,CAAC;YAChB,CAAC;YAAC,MAAM,CAAC;gBACP,eAAe;YACjB,CAAC;YACD,IAAI,CAAC;gBACH,IAAA,eAAU,EAAC,QAAQ,CAAC,CAAC;YACvB,CAAC;YAAC,MAAM,CAAC;gBACP,eAAe;YACjB,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LabGate Explorer MCP Server
|
|
3
|
+
*
|
|
4
|
+
* Experiment orchestration primitives for Solution Explorer:
|
|
5
|
+
* - experiment lifecycle
|
|
6
|
+
* - git/worktree helpers
|
|
7
|
+
* - eval execution
|
|
8
|
+
* - run/tree/leaderboard queries
|
|
9
|
+
* - manual run step execution
|
|
10
|
+
*/
|
|
11
|
+
export declare function main(args?: string[]): Promise<void>;
|