@agent-deck/cli 1.10.3 → 1.10.5
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/managed/launcher-guard.d.ts +7 -0
- package/dist/managed/launcher-guard.d.ts.map +1 -0
- package/dist/managed/launcher-guard.js +85 -0
- package/dist/managed/launcher-guard.js.map +1 -0
- package/dist/managed/launcher.d.ts.map +1 -1
- package/dist/managed/launcher.js +14 -0
- package/dist/managed/launcher.js.map +1 -1
- package/dist/managed/npm-prefix-install.d.ts.map +1 -1
- package/dist/managed/npm-prefix-install.js +49 -7
- package/dist/managed/npm-prefix-install.js.map +1 -1
- package/dist/managed/paths.d.ts +3 -1
- package/dist/managed/paths.d.ts.map +1 -1
- package/dist/managed/paths.js +8 -2
- package/dist/managed/paths.js.map +1 -1
- package/dist/managed/updater.d.ts.map +1 -1
- package/dist/managed/updater.js +15 -0
- package/dist/managed/updater.js.map +1 -1
- package/dist/managed/verify-install.d.ts +17 -0
- package/dist/managed/verify-install.d.ts.map +1 -0
- package/dist/managed/verify-install.js +65 -0
- package/dist/managed/verify-install.js.map +1 -0
- package/package.json +3 -3
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Standalone CJS run by the ~/.local/bin launcher (never imported from an installed version) when
|
|
3
|
+
* `current` has no `.verified` marker. Prints a loadable version dir; if `current` is broken it
|
|
4
|
+
* falls back to the newest intact version and repoints `current`. Mirrors verify-install.ts.
|
|
5
|
+
*/
|
|
6
|
+
export declare const LAUNCHER_GUARD_JS = "'use strict';\nconst fs = require('fs');\nconst path = require('path');\nconst vm = require('vm');\n\nconst home = process.argv[2];\nconst current = path.join(home, 'current');\nconst versions = path.join(home, 'versions');\nconst WRAP = ['exports', 'require', 'module', '__filename', '__dirname'];\n\nfunction walk(dir, out) {\n for (const e of fs.readdirSync(dir, { withFileTypes: true })) {\n const full = path.join(dir, e.name);\n if (e.isDirectory()) walk(full, out);\n else if (e.isFile() && e.name.endsWith('.js')) out.push(full);\n }\n return out;\n}\n\nfunction intact(dir) {\n try {\n if (fs.existsSync(path.join(dir, '.verified'))) return true;\n const scope = path.join(dir, 'node_modules', '@agent-deck');\n if (!fs.existsSync(path.join(scope, 'cli', 'dist', 'bin.js'))) return false;\n for (const pkg of fs.readdirSync(scope)) {\n const dist = path.join(scope, pkg, 'dist');\n if (!fs.existsSync(dist)) continue;\n for (const file of walk(dist, [])) {\n vm.compileFunction(fs.readFileSync(file, 'utf8').replace(/^#!.*/, ''), WRAP, { filename: file });\n }\n }\n try { fs.writeFileSync(path.join(dir, '.verified'), ''); } catch {}\n return true;\n } catch {\n return false;\n }\n}\n\nfunction cmp(a, b) {\n const pa = a.split(/[^0-9]+/).filter(Boolean).map(Number);\n const pb = b.split(/[^0-9]+/).filter(Boolean).map(Number);\n for (let i = 0; i < Math.max(pa.length, pb.length); i++) {\n const d = (pb[i] || 0) - (pa[i] || 0);\n if (d) return d;\n }\n return 0;\n}\n\nlet real;\ntry { real = fs.realpathSync(current); } catch { real = null; }\nif (real && intact(real)) {\n process.stdout.write(real);\n process.exit(0);\n}\n\nconst candidates = fs.existsSync(versions)\n ? fs.readdirSync(versions, { withFileTypes: true })\n .filter((d) => d.isDirectory() && !d.name.startsWith('.'))\n .map((d) => d.name)\n .sort(cmp)\n : [];\nfor (const name of candidates) {\n const dir = path.join(versions, name);\n if (real && dir === real) continue;\n if (!intact(dir)) continue;\n process.stderr.write('agent-deck: ' + (real ? path.basename(real) : 'current') + ' is broken; falling back to ' + name + '. Run: agent-deck upgrade\\n');\n try {\n const tmp = current + '.tmp-' + process.pid;\n fs.symlinkSync(dir, tmp, 'dir');\n fs.renameSync(tmp, current);\n } catch {}\n process.stdout.write(dir);\n process.exit(0);\n}\nprocess.exit(1);\n";
|
|
7
|
+
//# sourceMappingURL=launcher-guard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launcher-guard.d.ts","sourceRoot":"","sources":["../../src/managed/launcher-guard.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,g6EA2E7B,CAAC"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.LAUNCHER_GUARD_JS = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Standalone CJS run by the ~/.local/bin launcher (never imported from an installed version) when
|
|
6
|
+
* `current` has no `.verified` marker. Prints a loadable version dir; if `current` is broken it
|
|
7
|
+
* falls back to the newest intact version and repoints `current`. Mirrors verify-install.ts.
|
|
8
|
+
*/
|
|
9
|
+
exports.LAUNCHER_GUARD_JS = `'use strict';
|
|
10
|
+
const fs = require('fs');
|
|
11
|
+
const path = require('path');
|
|
12
|
+
const vm = require('vm');
|
|
13
|
+
|
|
14
|
+
const home = process.argv[2];
|
|
15
|
+
const current = path.join(home, 'current');
|
|
16
|
+
const versions = path.join(home, 'versions');
|
|
17
|
+
const WRAP = ['exports', 'require', 'module', '__filename', '__dirname'];
|
|
18
|
+
|
|
19
|
+
function walk(dir, out) {
|
|
20
|
+
for (const e of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
21
|
+
const full = path.join(dir, e.name);
|
|
22
|
+
if (e.isDirectory()) walk(full, out);
|
|
23
|
+
else if (e.isFile() && e.name.endsWith('.js')) out.push(full);
|
|
24
|
+
}
|
|
25
|
+
return out;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function intact(dir) {
|
|
29
|
+
try {
|
|
30
|
+
if (fs.existsSync(path.join(dir, '.verified'))) return true;
|
|
31
|
+
const scope = path.join(dir, 'node_modules', '@agent-deck');
|
|
32
|
+
if (!fs.existsSync(path.join(scope, 'cli', 'dist', 'bin.js'))) return false;
|
|
33
|
+
for (const pkg of fs.readdirSync(scope)) {
|
|
34
|
+
const dist = path.join(scope, pkg, 'dist');
|
|
35
|
+
if (!fs.existsSync(dist)) continue;
|
|
36
|
+
for (const file of walk(dist, [])) {
|
|
37
|
+
vm.compileFunction(fs.readFileSync(file, 'utf8').replace(/^#!.*/, ''), WRAP, { filename: file });
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
try { fs.writeFileSync(path.join(dir, '.verified'), ''); } catch {}
|
|
41
|
+
return true;
|
|
42
|
+
} catch {
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function cmp(a, b) {
|
|
48
|
+
const pa = a.split(/[^0-9]+/).filter(Boolean).map(Number);
|
|
49
|
+
const pb = b.split(/[^0-9]+/).filter(Boolean).map(Number);
|
|
50
|
+
for (let i = 0; i < Math.max(pa.length, pb.length); i++) {
|
|
51
|
+
const d = (pb[i] || 0) - (pa[i] || 0);
|
|
52
|
+
if (d) return d;
|
|
53
|
+
}
|
|
54
|
+
return 0;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
let real;
|
|
58
|
+
try { real = fs.realpathSync(current); } catch { real = null; }
|
|
59
|
+
if (real && intact(real)) {
|
|
60
|
+
process.stdout.write(real);
|
|
61
|
+
process.exit(0);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const candidates = fs.existsSync(versions)
|
|
65
|
+
? fs.readdirSync(versions, { withFileTypes: true })
|
|
66
|
+
.filter((d) => d.isDirectory() && !d.name.startsWith('.'))
|
|
67
|
+
.map((d) => d.name)
|
|
68
|
+
.sort(cmp)
|
|
69
|
+
: [];
|
|
70
|
+
for (const name of candidates) {
|
|
71
|
+
const dir = path.join(versions, name);
|
|
72
|
+
if (real && dir === real) continue;
|
|
73
|
+
if (!intact(dir)) continue;
|
|
74
|
+
process.stderr.write('agent-deck: ' + (real ? path.basename(real) : 'current') + ' is broken; falling back to ' + name + '. Run: agent-deck upgrade\\n');
|
|
75
|
+
try {
|
|
76
|
+
const tmp = current + '.tmp-' + process.pid;
|
|
77
|
+
fs.symlinkSync(dir, tmp, 'dir');
|
|
78
|
+
fs.renameSync(tmp, current);
|
|
79
|
+
} catch {}
|
|
80
|
+
process.stdout.write(dir);
|
|
81
|
+
process.exit(0);
|
|
82
|
+
}
|
|
83
|
+
process.exit(1);
|
|
84
|
+
`;
|
|
85
|
+
//# sourceMappingURL=launcher-guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launcher-guard.js","sourceRoot":"","sources":["../../src/managed/launcher-guard.ts"],"names":[],"mappings":";;;AAAA;;;;GAIG;AACU,QAAA,iBAAiB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2EhC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"launcher.d.ts","sourceRoot":"","sources":["../../src/managed/launcher.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"launcher.d.ts","sourceRoot":"","sources":["../../src/managed/launcher.ts"],"names":[],"mappings":"AA2BA,wBAAgB,qBAAqB,IAAI,IAAI,CAU5C"}
|
package/dist/managed/launcher.js
CHANGED
|
@@ -5,12 +5,23 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.writeLocalBinLauncher = writeLocalBinLauncher;
|
|
7
7
|
const node_fs_1 = __importDefault(require("node:fs"));
|
|
8
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
9
|
+
const launcher_guard_1 = require("./launcher-guard");
|
|
8
10
|
const paths_1 = require("./paths");
|
|
9
11
|
const LAUNCHER_BODY = `#!/usr/bin/env bash
|
|
10
12
|
set -euo pipefail
|
|
11
13
|
HOME_DIR="\${AGENT_DECK_HOME:-$HOME/.agent-deck}"
|
|
12
14
|
CURRENT="$HOME_DIR/current"
|
|
13
15
|
BIN="$CURRENT/node_modules/@agent-deck/cli/dist/bin.js"
|
|
16
|
+
GUARD="$HOME_DIR/bin/launcher-guard.js"
|
|
17
|
+
# A version is trusted once it carries .verified; otherwise check it (and fall back if it is broken).
|
|
18
|
+
if [ ! -f "$CURRENT/.verified" ] && [ -f "$GUARD" ]; then
|
|
19
|
+
if ! DIR="$(node "$GUARD" "$HOME_DIR")"; then
|
|
20
|
+
echo "agent-deck: no loadable managed install under $HOME_DIR/versions. Reinstall: npm install --prefix $HOME_DIR/versions/<version> @agent-deck/cli@<version>, then point $CURRENT at it" >&2
|
|
21
|
+
exit 1
|
|
22
|
+
fi
|
|
23
|
+
BIN="$DIR/node_modules/@agent-deck/cli/dist/bin.js"
|
|
24
|
+
fi
|
|
14
25
|
if [ ! -f "$BIN" ]; then
|
|
15
26
|
echo "agent-deck: managed install broken (missing $BIN). Re-run: agent-deck install" >&2
|
|
16
27
|
exit 1
|
|
@@ -18,6 +29,9 @@ fi
|
|
|
18
29
|
exec node "$BIN" "$@"
|
|
19
30
|
`;
|
|
20
31
|
function writeLocalBinLauncher() {
|
|
32
|
+
const guard = (0, paths_1.launcherGuardPath)();
|
|
33
|
+
node_fs_1.default.mkdirSync(node_path_1.default.dirname(guard), { recursive: true });
|
|
34
|
+
node_fs_1.default.writeFileSync(guard, launcher_guard_1.LAUNCHER_GUARD_JS);
|
|
21
35
|
const dir = (0, paths_1.localBinDir)();
|
|
22
36
|
node_fs_1.default.mkdirSync(dir, { recursive: true });
|
|
23
37
|
const target = (0, paths_1.localBinLauncherPath)();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"launcher.js","sourceRoot":"","sources":["../../src/managed/launcher.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"launcher.js","sourceRoot":"","sources":["../../src/managed/launcher.ts"],"names":[],"mappings":";;;;;AA2BA,sDAUC;AArCD,sDAAyB;AACzB,0DAA6B;AAE7B,qDAAqD;AACrD,mCAA+E;AAE/E,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;;CAmBrB,CAAC;AAEF,SAAgB,qBAAqB;IACnC,MAAM,KAAK,GAAG,IAAA,yBAAiB,GAAE,CAAC;IAClC,iBAAE,CAAC,SAAS,CAAC,mBAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvD,iBAAE,CAAC,aAAa,CAAC,KAAK,EAAE,kCAAiB,CAAC,CAAC;IAE3C,MAAM,GAAG,GAAG,IAAA,mBAAW,GAAE,CAAC;IAC1B,iBAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,IAAA,4BAAoB,GAAE,CAAC;IACtC,iBAAE,CAAC,aAAa,CAAC,MAAM,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACzD,iBAAE,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAC9B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"npm-prefix-install.d.ts","sourceRoot":"","sources":["../../src/managed/npm-prefix-install.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"npm-prefix-install.d.ts","sourceRoot":"","sources":["../../src/managed/npm-prefix-install.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,YAAY,oBAAoB,CAAC;AAE9C,MAAM,MAAM,QAAQ,GAAG,CACrB,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,KACtB,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAiC/C,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,QAAQ,CAAA;CAAO,GACpC,OAAO,CAAC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAgDnE"}
|
|
@@ -7,7 +7,10 @@ exports.PACKAGE_NAME = void 0;
|
|
|
7
7
|
exports.installCliVersionToPrefix = installCliVersionToPrefix;
|
|
8
8
|
const node_child_process_1 = require("node:child_process");
|
|
9
9
|
const node_fs_1 = __importDefault(require("node:fs"));
|
|
10
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
10
11
|
const paths_1 = require("./paths");
|
|
12
|
+
const verify_install_1 = require("./verify-install");
|
|
13
|
+
const STALE_PARTIAL_MS = 60 * 60 * 1000;
|
|
11
14
|
exports.PACKAGE_NAME = '@agent-deck/cli';
|
|
12
15
|
const defaultNpmSpawn = (args, options) => new Promise((resolve) => {
|
|
13
16
|
const child = (0, node_child_process_1.spawn)('npm', args, {
|
|
@@ -22,25 +25,64 @@ const defaultNpmSpawn = (args, options) => new Promise((resolve) => {
|
|
|
22
25
|
child.on('error', (err) => resolve({ code: 1, stderr: err.message }));
|
|
23
26
|
child.on('exit', (code) => resolve({ code: code ?? 1, stderr }));
|
|
24
27
|
});
|
|
28
|
+
function removeStalePartials() {
|
|
29
|
+
for (const entry of node_fs_1.default.readdirSync((0, paths_1.versionsDir)(), { withFileTypes: true })) {
|
|
30
|
+
if (!entry.isDirectory() || !entry.name.startsWith('.partial-')) {
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
const full = node_path_1.default.join((0, paths_1.versionsDir)(), entry.name);
|
|
34
|
+
try {
|
|
35
|
+
if (Date.now() - node_fs_1.default.statSync(full).mtimeMs > STALE_PARTIAL_MS) {
|
|
36
|
+
node_fs_1.default.rmSync(full, { recursive: true, force: true });
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
// raced with another process cleaning up
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
25
44
|
async function installCliVersionToPrefix(version, options = {}) {
|
|
26
45
|
const npmSpawn = options.npmSpawn ?? defaultNpmSpawn;
|
|
27
46
|
const partial = (0, paths_1.partialVersionDir)(version);
|
|
28
47
|
const finalDir = (0, paths_1.versionDir)(version);
|
|
29
48
|
node_fs_1.default.mkdirSync((0, paths_1.versionsDir)(), { recursive: true });
|
|
30
|
-
|
|
49
|
+
removeStalePartials();
|
|
31
50
|
node_fs_1.default.mkdirSync(partial, { recursive: true });
|
|
51
|
+
const fail = (error) => {
|
|
52
|
+
node_fs_1.default.rmSync(partial, { recursive: true, force: true });
|
|
53
|
+
return { ok: false, error };
|
|
54
|
+
};
|
|
32
55
|
const result = await npmSpawn(['install', '--prefix', partial, `${exports.PACKAGE_NAME}@${version}`], {});
|
|
33
56
|
if (result.code !== 0) {
|
|
34
|
-
|
|
35
|
-
return { ok: false, error: result.stderr.trim() || `npm install failed (exit ${result.code})` };
|
|
57
|
+
return fail(result.stderr.trim() || `npm install failed (exit ${result.code})`);
|
|
36
58
|
}
|
|
37
59
|
const entry = (0, paths_1.cliEntryInVersionDir)(partial);
|
|
38
60
|
if (!node_fs_1.default.existsSync(entry)) {
|
|
39
|
-
|
|
40
|
-
|
|
61
|
+
return fail(`Install succeeded but missing CLI entry: ${entry}`);
|
|
62
|
+
}
|
|
63
|
+
const verified = (0, verify_install_1.verifyInstalledVersion)(partial);
|
|
64
|
+
if (!verified.ok) {
|
|
65
|
+
return fail(`Install verification failed (${verified.file}): ${verified.error}`);
|
|
66
|
+
}
|
|
67
|
+
(0, verify_install_1.markVerified)(partial);
|
|
68
|
+
// Another process may have finished the same version first; keep its copy if it is intact.
|
|
69
|
+
if (node_fs_1.default.existsSync(finalDir)) {
|
|
70
|
+
if ((0, verify_install_1.verifyInstalledVersion)(finalDir).ok) {
|
|
71
|
+
node_fs_1.default.rmSync(partial, { recursive: true, force: true });
|
|
72
|
+
return { ok: true, dir: finalDir };
|
|
73
|
+
}
|
|
74
|
+
node_fs_1.default.rmSync(finalDir, { recursive: true, force: true });
|
|
75
|
+
}
|
|
76
|
+
try {
|
|
77
|
+
node_fs_1.default.renameSync(partial, finalDir);
|
|
78
|
+
}
|
|
79
|
+
catch (err) {
|
|
80
|
+
if (node_fs_1.default.existsSync(finalDir) && (0, verify_install_1.verifyInstalledVersion)(finalDir).ok) {
|
|
81
|
+
node_fs_1.default.rmSync(partial, { recursive: true, force: true });
|
|
82
|
+
return { ok: true, dir: finalDir };
|
|
83
|
+
}
|
|
84
|
+
return fail(err instanceof Error ? err.message : String(err));
|
|
41
85
|
}
|
|
42
|
-
node_fs_1.default.rmSync(finalDir, { recursive: true, force: true });
|
|
43
|
-
node_fs_1.default.renameSync(partial, finalDir);
|
|
44
86
|
return { ok: true, dir: finalDir };
|
|
45
87
|
}
|
|
46
88
|
//# sourceMappingURL=npm-prefix-install.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"npm-prefix-install.js","sourceRoot":"","sources":["../../src/managed/npm-prefix-install.ts"],"names":[],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"npm-prefix-install.js","sourceRoot":"","sources":["../../src/managed/npm-prefix-install.ts"],"names":[],"mappings":"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"}
|
package/dist/managed/paths.d.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
export declare function agentDeckHome(): string;
|
|
2
2
|
export declare function versionsDir(): string;
|
|
3
3
|
export declare function versionDir(version: string): string;
|
|
4
|
-
|
|
4
|
+
/** Unique per install attempt so concurrent CLI processes never extract into the same directory. */
|
|
5
|
+
export declare function partialVersionDir(version: string, token?: string): string;
|
|
6
|
+
export declare function launcherGuardPath(): string;
|
|
5
7
|
export declare function currentLinkPath(): string;
|
|
6
8
|
export declare function updateStatePath(): string;
|
|
7
9
|
/** Override with AGENT_DECK_LOCAL_BIN for tests. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/managed/paths.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/managed/paths.ts"],"names":[],"mappings":"AAKA,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,oGAAoG;AACpG,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,SAAqD,GAAG,MAAM,CAErH;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,oDAAoD;AACpD,wBAAgB,WAAW,IAAI,MAAM,CAMpC;AAED,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,wBAAgB,wBAAwB,IAAI,MAAM,GAAG,IAAI,CAUxD"}
|
package/dist/managed/paths.js
CHANGED
|
@@ -7,12 +7,14 @@ exports.agentDeckHome = agentDeckHome;
|
|
|
7
7
|
exports.versionsDir = versionsDir;
|
|
8
8
|
exports.versionDir = versionDir;
|
|
9
9
|
exports.partialVersionDir = partialVersionDir;
|
|
10
|
+
exports.launcherGuardPath = launcherGuardPath;
|
|
10
11
|
exports.currentLinkPath = currentLinkPath;
|
|
11
12
|
exports.updateStatePath = updateStatePath;
|
|
12
13
|
exports.localBinDir = localBinDir;
|
|
13
14
|
exports.localBinLauncherPath = localBinLauncherPath;
|
|
14
15
|
exports.cliEntryInVersionDir = cliEntryInVersionDir;
|
|
15
16
|
exports.resolveCurrentVersionDir = resolveCurrentVersionDir;
|
|
17
|
+
const node_crypto_1 = require("node:crypto");
|
|
16
18
|
const node_fs_1 = __importDefault(require("node:fs"));
|
|
17
19
|
const node_os_1 = __importDefault(require("node:os"));
|
|
18
20
|
const node_path_1 = __importDefault(require("node:path"));
|
|
@@ -25,8 +27,12 @@ function versionsDir() {
|
|
|
25
27
|
function versionDir(version) {
|
|
26
28
|
return node_path_1.default.join(versionsDir(), version);
|
|
27
29
|
}
|
|
28
|
-
|
|
29
|
-
|
|
30
|
+
/** Unique per install attempt so concurrent CLI processes never extract into the same directory. */
|
|
31
|
+
function partialVersionDir(version, token = `${process.pid}-${(0, node_crypto_1.randomBytes)(4).toString('hex')}`) {
|
|
32
|
+
return node_path_1.default.join(versionsDir(), `.partial-${version}-${token}`);
|
|
33
|
+
}
|
|
34
|
+
function launcherGuardPath() {
|
|
35
|
+
return node_path_1.default.join(agentDeckHome(), 'bin', 'launcher-guard.js');
|
|
30
36
|
}
|
|
31
37
|
function currentLinkPath() {
|
|
32
38
|
return node_path_1.default.join(agentDeckHome(), 'current');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/managed/paths.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/managed/paths.ts"],"names":[],"mappings":";;;;;AAKA,sCAEC;AAED,kCAEC;AAED,gCAEC;AAGD,8CAEC;AAED,8CAEC;AAED,0CAEC;AAED,0CAEC;AAGD,kCAMC;AAED,oDAEC;AAED,oDAEC;AAED,4DAUC;AA7DD,6CAA0C;AAC1C,sDAAyB;AACzB,sDAAyB;AACzB,0DAA6B;AAE7B,SAAgB,aAAa;IAC3B,OAAO,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,IAAI,EAAE,IAAI,mBAAI,CAAC,IAAI,CAAC,iBAAE,CAAC,OAAO,EAAE,EAAE,aAAa,CAAC,CAAC;AACvF,CAAC;AAED,SAAgB,WAAW;IACzB,OAAO,mBAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,UAAU,CAAC,CAAC;AAChD,CAAC;AAED,SAAgB,UAAU,CAAC,OAAe;IACxC,OAAO,mBAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,OAAO,CAAC,CAAC;AAC3C,CAAC;AAED,oGAAoG;AACpG,SAAgB,iBAAiB,CAAC,OAAe,EAAE,KAAK,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,IAAA,yBAAW,EAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;IAC3G,OAAO,mBAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,YAAY,OAAO,IAAI,KAAK,EAAE,CAAC,CAAC;AAClE,CAAC;AAED,SAAgB,iBAAiB;IAC/B,OAAO,mBAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,mBAAmB,CAAC,CAAC;AAChE,CAAC;AAED,SAAgB,eAAe;IAC7B,OAAO,mBAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,SAAS,CAAC,CAAC;AAC/C,CAAC;AAED,SAAgB,eAAe;IAC7B,OAAO,mBAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,mBAAmB,CAAC,CAAC;AACzD,CAAC;AAED,oDAAoD;AACpD,SAAgB,WAAW;IACzB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,IAAI,EAAE,CAAC;IAC1D,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,OAAO,mBAAI,CAAC,IAAI,CAAC,iBAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;AAClD,CAAC;AAED,SAAgB,oBAAoB;IAClC,OAAO,mBAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,YAAY,CAAC,CAAC;AAChD,CAAC;AAED,SAAgB,oBAAoB,CAAC,GAAW;IAC9C,OAAO,mBAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;AAChF,CAAC;AAED,SAAgB,wBAAwB;IACtC,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC;IAC/B,IAAI,CAAC;QACH,IAAI,CAAC,iBAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,iBAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"updater.d.ts","sourceRoot":"","sources":["../../src/managed/updater.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"updater.d.ts","sourceRoot":"","sources":["../../src/managed/updater.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AASjE,wBAAgB,qBAAqB,IAAI,OAAO,CAG/C;AAED,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAajE;AAED,wBAAgB,yBAAyB,IAAI,MAAM,GAAG,IAAI,CAMzD;AAED,wBAAgB,2BAA2B,IAAI;IAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAsC1E;AAED,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,MAAM,EACd,OAAO,GAAE;IAAE,cAAc,CAAC,EAAE,OAAO,yBAAyB,CAAA;CAAO,GAClE,OAAO,CAAC,IAAI,CAAC,CA+Bf;AAED,wBAAgB,6BAA6B,CAC3C,OAAO,GAAE;IACP,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC3C,cAAc,CAAC,EAAE,OAAO,yBAAyB,CAAC;CAC9C,GACL,IAAI,CAkCN;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE;IAC/C,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC3C,cAAc,CAAC,EAAE,OAAO,yBAAyB,CAAC;CACnD,GAAG;IAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAO/B"}
|
package/dist/managed/updater.js
CHANGED
|
@@ -18,6 +18,7 @@ const npm_prefix_install_1 = require("./npm-prefix-install");
|
|
|
18
18
|
const paths_1 = require("./paths");
|
|
19
19
|
const semver_1 = require("./semver");
|
|
20
20
|
const update_state_1 = require("./update-state");
|
|
21
|
+
const verify_install_1 = require("./verify-install");
|
|
21
22
|
const CACHE_TTL_MS = 24 * 60 * 60 * 1000;
|
|
22
23
|
const REGISTRY_URL = 'https://registry.npmjs.org/@agent-deck/cli/latest';
|
|
23
24
|
function isAutoupdaterDisabled() {
|
|
@@ -62,6 +63,17 @@ function maybeActivatePendingVersion() {
|
|
|
62
63
|
if (!node_fs_1.default.existsSync((0, paths_1.cliEntryInVersionDir)(dir))) {
|
|
63
64
|
return { activated: null };
|
|
64
65
|
}
|
|
66
|
+
// Never point `current` at a version that cannot load; drop it so the next check re-downloads.
|
|
67
|
+
if (!(0, verify_install_1.verifyInstalledVersion)(dir).ok) {
|
|
68
|
+
node_fs_1.default.rmSync(dir, { recursive: true, force: true });
|
|
69
|
+
(0, update_state_1.writeUpdateState)({
|
|
70
|
+
checkedAt: state?.checkedAt ?? new Date().toISOString(),
|
|
71
|
+
latest: state?.latest ?? pending,
|
|
72
|
+
pendingVersion: null,
|
|
73
|
+
});
|
|
74
|
+
return { activated: null };
|
|
75
|
+
}
|
|
76
|
+
(0, verify_install_1.markVerified)(dir);
|
|
65
77
|
(0, activate_1.activateVersion)(pending);
|
|
66
78
|
(0, update_state_1.writeUpdateState)({
|
|
67
79
|
checkedAt: state?.checkedAt ?? new Date().toISOString(),
|
|
@@ -75,6 +87,9 @@ async function ensurePendingDownload(latest, options = {}) {
|
|
|
75
87
|
return;
|
|
76
88
|
}
|
|
77
89
|
const dir = (0, paths_1.versionDir)(latest);
|
|
90
|
+
if (node_fs_1.default.existsSync((0, paths_1.cliEntryInVersionDir)(dir)) && !(0, verify_install_1.verifyInstalledVersion)(dir).ok) {
|
|
91
|
+
node_fs_1.default.rmSync(dir, { recursive: true, force: true });
|
|
92
|
+
}
|
|
78
93
|
if (node_fs_1.default.existsSync((0, paths_1.cliEntryInVersionDir)(dir))) {
|
|
79
94
|
const prev = (0, update_state_1.readUpdateState)();
|
|
80
95
|
(0, update_state_1.writeUpdateState)({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"updater.js","sourceRoot":"","sources":["../../src/managed/updater.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"updater.js","sourceRoot":"","sources":["../../src/managed/updater.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/** Written once a version dir passes verification; the launcher skips its own check when present. */
|
|
2
|
+
export declare const VERIFIED_MARKER = ".verified";
|
|
3
|
+
export type VerifyResult = {
|
|
4
|
+
ok: true;
|
|
5
|
+
} | {
|
|
6
|
+
ok: false;
|
|
7
|
+
file: string;
|
|
8
|
+
error: string;
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Syntax-checks every built `@agent-deck/*` file in an installed version dir.
|
|
12
|
+
* A truncated file (interrupted or interleaved npm extraction) otherwise crashes the CLI at load
|
|
13
|
+
* time, after the `current` link already points at it.
|
|
14
|
+
*/
|
|
15
|
+
export declare function verifyInstalledVersion(versionDirPath: string): VerifyResult;
|
|
16
|
+
export declare function markVerified(versionDirPath: string): void;
|
|
17
|
+
//# sourceMappingURL=verify-install.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify-install.d.ts","sourceRoot":"","sources":["../../src/managed/verify-install.ts"],"names":[],"mappings":"AAIA,qGAAqG;AACrG,eAAO,MAAM,eAAe,cAAc,CAAC;AAE3C,MAAM,MAAM,YAAY,GAAG;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAerF;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,cAAc,EAAE,MAAM,GAAG,YAAY,CAwB3E;AAED,wBAAgB,YAAY,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAMzD"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.VERIFIED_MARKER = void 0;
|
|
7
|
+
exports.verifyInstalledVersion = verifyInstalledVersion;
|
|
8
|
+
exports.markVerified = markVerified;
|
|
9
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
10
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
11
|
+
const node_vm_1 = __importDefault(require("node:vm"));
|
|
12
|
+
/** Written once a version dir passes verification; the launcher skips its own check when present. */
|
|
13
|
+
exports.VERIFIED_MARKER = '.verified';
|
|
14
|
+
const CJS_WRAPPER_PARAMS = ['exports', 'require', 'module', '__filename', '__dirname'];
|
|
15
|
+
function* walkJsFiles(dir) {
|
|
16
|
+
for (const entry of node_fs_1.default.readdirSync(dir, { withFileTypes: true })) {
|
|
17
|
+
const full = node_path_1.default.join(dir, entry.name);
|
|
18
|
+
if (entry.isDirectory()) {
|
|
19
|
+
yield* walkJsFiles(full);
|
|
20
|
+
}
|
|
21
|
+
else if (entry.isFile() && entry.name.endsWith('.js')) {
|
|
22
|
+
yield full;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Syntax-checks every built `@agent-deck/*` file in an installed version dir.
|
|
28
|
+
* A truncated file (interrupted or interleaved npm extraction) otherwise crashes the CLI at load
|
|
29
|
+
* time, after the `current` link already points at it.
|
|
30
|
+
*/
|
|
31
|
+
function verifyInstalledVersion(versionDirPath) {
|
|
32
|
+
const scope = node_path_1.default.join(versionDirPath, 'node_modules', '@agent-deck');
|
|
33
|
+
let packages;
|
|
34
|
+
try {
|
|
35
|
+
packages = node_fs_1.default.readdirSync(scope, { withFileTypes: true });
|
|
36
|
+
}
|
|
37
|
+
catch (err) {
|
|
38
|
+
return { ok: false, file: scope, error: err instanceof Error ? err.message : String(err) };
|
|
39
|
+
}
|
|
40
|
+
for (const pkg of packages) {
|
|
41
|
+
const distDir = node_path_1.default.join(scope, pkg.name, 'dist');
|
|
42
|
+
if (!node_fs_1.default.existsSync(distDir)) {
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
for (const file of walkJsFiles(distDir)) {
|
|
46
|
+
try {
|
|
47
|
+
const source = node_fs_1.default.readFileSync(file, 'utf8').replace(/^#!.*/, '');
|
|
48
|
+
node_vm_1.default.compileFunction(source, CJS_WRAPPER_PARAMS, { filename: file });
|
|
49
|
+
}
|
|
50
|
+
catch (err) {
|
|
51
|
+
return { ok: false, file, error: err instanceof Error ? err.message : String(err) };
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return { ok: true };
|
|
56
|
+
}
|
|
57
|
+
function markVerified(versionDirPath) {
|
|
58
|
+
try {
|
|
59
|
+
node_fs_1.default.writeFileSync(node_path_1.default.join(versionDirPath, exports.VERIFIED_MARKER), '');
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
// marker is an optimisation; the launcher re-verifies without it
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=verify-install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify-install.js","sourceRoot":"","sources":["../../src/managed/verify-install.ts"],"names":[],"mappings":";;;;;;AA2BA,wDAwBC;AAED,oCAMC;AA3DD,sDAAyB;AACzB,0DAA6B;AAC7B,sDAAyB;AAEzB,qGAAqG;AACxF,QAAA,eAAe,GAAG,WAAW,CAAC;AAI3C,MAAM,kBAAkB,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC;AAEvF,QAAQ,CAAC,CAAC,WAAW,CAAC,GAAW;IAC/B,KAAK,MAAM,KAAK,IAAI,iBAAE,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QACjE,MAAM,IAAI,GAAG,mBAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,KAAK,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;aAAM,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACxD,MAAM,IAAI,CAAC;QACb,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAgB,sBAAsB,CAAC,cAAsB;IAC3D,MAAM,KAAK,GAAG,mBAAI,CAAC,IAAI,CAAC,cAAc,EAAE,cAAc,EAAE,aAAa,CAAC,CAAC;IACvE,IAAI,QAAqB,CAAC;IAC1B,IAAI,CAAC;QACH,QAAQ,GAAG,iBAAE,CAAC,WAAW,CAAC,KAAK,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;IAC7F,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,mBAAI,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACnD,IAAI,CAAC,iBAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5B,SAAS;QACX,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;YACxC,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,iBAAE,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;gBAClE,iBAAE,CAAC,eAAe,CAAC,MAAM,EAAE,kBAAkB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;YACrE,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YACtF,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;AACtB,CAAC;AAED,SAAgB,YAAY,CAAC,cAAsB;IACjD,IAAI,CAAC;QACH,iBAAE,CAAC,aAAa,CAAC,mBAAI,CAAC,IAAI,CAAC,cAAc,EAAE,uBAAe,CAAC,EAAE,EAAE,CAAC,CAAC;IACnE,CAAC;IAAC,MAAM,CAAC;QACP,iEAAiE;IACnE,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agent-deck/cli",
|
|
3
|
-
"version": "1.10.
|
|
3
|
+
"version": "1.10.5",
|
|
4
4
|
"description": "Local MCP proxy — decks of tools, keys, and self-improving playbooks",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"bin": {
|
|
@@ -40,8 +40,8 @@
|
|
|
40
40
|
"prepublishOnly": "node ../../scripts/pre-publish-check.mjs && npm run build"
|
|
41
41
|
},
|
|
42
42
|
"dependencies": {
|
|
43
|
-
"@agent-deck/backend": "^1.10.
|
|
44
|
-
"@agent-deck/shared": "^1.10.
|
|
43
|
+
"@agent-deck/backend": "^1.10.5",
|
|
44
|
+
"@agent-deck/shared": "^1.10.5"
|
|
45
45
|
},
|
|
46
46
|
"devDependencies": {
|
|
47
47
|
"@types/node": "^20.11.5",
|