gm-plugkit 2.0.1264 → 2.0.1266
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/bootstrap.js +6 -2
- package/package.json +1 -1
- package/plugkit-wasm-wrapper.js +60 -3
package/bootstrap.js
CHANGED
|
@@ -205,6 +205,7 @@ async function extractNpmPackageWasm(destPath, version) {
|
|
|
205
205
|
|
|
206
206
|
const cmd = resolveWindowsExe('npm');
|
|
207
207
|
const args = ['install', '--no-audit', '--no-fund', '--no-save', NPM_PACKAGE + '@' + version];
|
|
208
|
+
const isCmdShim = process.platform === 'win32' && /\.(cmd|bat)$/i.test(cmd);
|
|
208
209
|
|
|
209
210
|
const result = spawnSync(cmd, args, {
|
|
210
211
|
cwd: tempDir,
|
|
@@ -212,8 +213,7 @@ async function extractNpmPackageWasm(destPath, version) {
|
|
|
212
213
|
timeout: ATTEMPT_TIMEOUT_MS,
|
|
213
214
|
encoding: 'utf8',
|
|
214
215
|
windowsHide: true,
|
|
215
|
-
|
|
216
|
-
// package install, so no conhost flash during the extract step.
|
|
216
|
+
...(isCmdShim ? { shell: true } : {}),
|
|
217
217
|
...(process.platform === 'win32' ? { creationFlags: 0x08000000 } : {}),
|
|
218
218
|
});
|
|
219
219
|
|
|
@@ -305,6 +305,10 @@ async function extractNpmPackageWithRetry(destPath, version) {
|
|
|
305
305
|
log(`npm binary unresolvable (ENOENT); skipping retries, falling back`);
|
|
306
306
|
throw err;
|
|
307
307
|
}
|
|
308
|
+
if (err && (err.code === 'EINVAL' || /EINVAL/.test(String(err.message || '')))) {
|
|
309
|
+
log(`spawn EINVAL on npm shim; skipping retries, falling back`);
|
|
310
|
+
throw err;
|
|
311
|
+
}
|
|
308
312
|
if (attempt < MAX_ATTEMPTS) {
|
|
309
313
|
const wait = BACKOFF_MS[attempt - 1] || 120000;
|
|
310
314
|
log(`backing off ${wait}ms`);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "gm-plugkit",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.1266",
|
|
4
4
|
"description": "Bootstrap and daemon-spawn tool for gm plugkit binary. Downloads the correct platform binary, verifies SHA256, and starts the spool watcher daemon. Includes plugkit-wasm-wrapper for WASM-based spool watching.",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"bin": {
|
package/plugkit-wasm-wrapper.js
CHANGED
|
@@ -42,6 +42,7 @@ function emitShutdownReason(reason, err) {
|
|
|
42
42
|
version: typeof PLUGKIT_VERSION !== 'undefined' ? PLUGKIT_VERSION : null,
|
|
43
43
|
};
|
|
44
44
|
fs.writeFileSync(path.join(spoolDir, '.shutdown-reason.json'), JSON.stringify(body, null, 2));
|
|
45
|
+
try { fs.unlinkSync(path.join(spoolDir, '.boot-active.json')); } catch (_) {}
|
|
45
46
|
} catch (_) {}
|
|
46
47
|
}
|
|
47
48
|
|
|
@@ -1497,6 +1498,47 @@ async function runSpoolWatcher(instance, spoolDir) {
|
|
|
1497
1498
|
acquireLock();
|
|
1498
1499
|
setInterval(refreshLock, 5000);
|
|
1499
1500
|
|
|
1501
|
+
const BOOT_ACTIVE_PATH = path.join(spoolDir, '.boot-active.json');
|
|
1502
|
+
const SHUTDOWN_REASON_PATH_EARLY = path.join(spoolDir, '.shutdown-reason.json');
|
|
1503
|
+
try {
|
|
1504
|
+
let priorBoot = null;
|
|
1505
|
+
let priorShutdownForAbort = null;
|
|
1506
|
+
try { priorBoot = JSON.parse(fs.readFileSync(BOOT_ACTIVE_PATH, 'utf-8')); } catch (_) {}
|
|
1507
|
+
try { priorShutdownForAbort = JSON.parse(fs.readFileSync(SHUTDOWN_REASON_PATH_EARLY, 'utf-8')); } catch (_) {}
|
|
1508
|
+
if (priorBoot && Number.isFinite(priorBoot.ts) && priorBoot.pid !== process.pid) {
|
|
1509
|
+
const ageMs = Date.now() - priorBoot.ts;
|
|
1510
|
+
const shutdownIsNewer = priorShutdownForAbort && Number.isFinite(priorShutdownForAbort.ts) && priorShutdownForAbort.ts >= priorBoot.ts;
|
|
1511
|
+
if (ageMs > 30_000 && !shutdownIsNewer) {
|
|
1512
|
+
logEvent('plugkit', 'watcher.silent-abort', {
|
|
1513
|
+
prior_pid: priorBoot.pid,
|
|
1514
|
+
prior_ts: priorBoot.ts,
|
|
1515
|
+
prior_sha: priorBoot.wrapper_sha || null,
|
|
1516
|
+
prior_version: priorBoot.version || null,
|
|
1517
|
+
detected_at: Date.now(),
|
|
1518
|
+
age_ms: ageMs,
|
|
1519
|
+
shutdown_reason_present: !!priorShutdownForAbort,
|
|
1520
|
+
shutdown_reason_ts: priorShutdownForAbort ? priorShutdownForAbort.ts : null,
|
|
1521
|
+
});
|
|
1522
|
+
try { console.error(`[plugkit-wasm] SILENT ABORT detected: prior watcher pid=${priorBoot.pid} sha=${priorBoot.wrapper_sha} died without writing .shutdown-reason.json (age=${ageMs}ms)`); } catch (_) {}
|
|
1523
|
+
}
|
|
1524
|
+
}
|
|
1525
|
+
} catch (_) {}
|
|
1526
|
+
function writeBootActive() {
|
|
1527
|
+
try {
|
|
1528
|
+
const _v = readInstanceVersion(instance);
|
|
1529
|
+
fs.writeFileSync(BOOT_ACTIVE_PATH, JSON.stringify({
|
|
1530
|
+
pid: process.pid,
|
|
1531
|
+
ts: Date.now(),
|
|
1532
|
+
wrapper_sha: _ownWrapperSha12 || null,
|
|
1533
|
+
version: _v || null,
|
|
1534
|
+
}));
|
|
1535
|
+
} catch (_) {}
|
|
1536
|
+
}
|
|
1537
|
+
function clearBootActive() {
|
|
1538
|
+
try { fs.unlinkSync(BOOT_ACTIVE_PATH); } catch (_) {}
|
|
1539
|
+
}
|
|
1540
|
+
writeBootActive();
|
|
1541
|
+
|
|
1500
1542
|
const PEER_REGISTRY_PATH = path.join(os.homedir(), '.claude', 'gm-tools', 'peer-registry.json');
|
|
1501
1543
|
function registerSelfAsPeer() {
|
|
1502
1544
|
try {
|
|
@@ -1593,6 +1635,7 @@ async function runSpoolWatcher(instance, spoolDir) {
|
|
|
1593
1635
|
} catch (_) {}
|
|
1594
1636
|
|
|
1595
1637
|
try { fs.unlinkSync(STATUS_PATH_FOR_TEARDOWN); } catch (_) {}
|
|
1638
|
+
try { clearBootActive(); } catch (_) {}
|
|
1596
1639
|
try { releaseLock(); } catch (_) {}
|
|
1597
1640
|
process.exit(0);
|
|
1598
1641
|
}
|
|
@@ -1624,6 +1667,7 @@ async function runSpoolWatcher(instance, spoolDir) {
|
|
|
1624
1667
|
} catch (_) {}
|
|
1625
1668
|
try { releaseLock(); } catch (_) {}
|
|
1626
1669
|
try { fs.unlinkSync(STATUS_PATH_FOR_TEARDOWN); } catch (_) {}
|
|
1670
|
+
try { clearBootActive(); } catch (_) {}
|
|
1627
1671
|
process.exit(0);
|
|
1628
1672
|
} catch (e) {
|
|
1629
1673
|
console.error(`[version-drift-check] error: ${e.message}`);
|
|
@@ -1659,6 +1703,7 @@ async function runSpoolWatcher(instance, spoolDir) {
|
|
|
1659
1703
|
} catch (_) {}
|
|
1660
1704
|
try { releaseLock(); } catch (_) {}
|
|
1661
1705
|
try { fs.unlinkSync(STATUS_PATH_FOR_TEARDOWN); } catch (_) {}
|
|
1706
|
+
try { clearBootActive(); } catch (_) {}
|
|
1662
1707
|
process.exit(0);
|
|
1663
1708
|
} catch (e) {
|
|
1664
1709
|
console.error(`[wrapper-drift-check] error: ${e.message}`);
|
|
@@ -1690,9 +1735,21 @@ async function runSpoolWatcher(instance, spoolDir) {
|
|
|
1690
1735
|
}
|
|
1691
1736
|
}, IDLE_CHECK_MS);
|
|
1692
1737
|
|
|
1693
|
-
|
|
1694
|
-
|
|
1695
|
-
|
|
1738
|
+
function handleSignalShutdown(sig) {
|
|
1739
|
+
try {
|
|
1740
|
+
fs.writeFileSync(SHUTDOWN_REASON_PATH, JSON.stringify({
|
|
1741
|
+
reason: sig.toLowerCase(),
|
|
1742
|
+
ts: Date.now(),
|
|
1743
|
+
pid: process.pid,
|
|
1744
|
+
}));
|
|
1745
|
+
} catch (_) {}
|
|
1746
|
+
try { clearBootActive(); } catch (_) {}
|
|
1747
|
+
try { releaseLock(); } catch (_) {}
|
|
1748
|
+
process.exit(0);
|
|
1749
|
+
}
|
|
1750
|
+
process.on('SIGINT', () => handleSignalShutdown('SIGINT'));
|
|
1751
|
+
process.on('SIGTERM', () => handleSignalShutdown('SIGTERM'));
|
|
1752
|
+
process.on('exit', () => { try { clearBootActive(); } catch (_) {} releaseLock(); });
|
|
1696
1753
|
|
|
1697
1754
|
try {
|
|
1698
1755
|
const wrapperDst = path.join(os.homedir(), '.claude', 'gm-tools', 'plugkit-wasm-wrapper.js');
|