mirror of
https://github.com/affaan-m/ECC.git
synced 2026-10-14 20:25:26 +02:00
40 lines
1.6 KiB
JavaScript
40 lines
1.6 KiB
JavaScript
'use strict';
|
|
const fs = require('fs');
|
|
const path = require('path');
|
|
const [root, role, action] = process.argv.slice(2);
|
|
const aliasesPath = path.join(root, '.claude', 'session-aliases.json');
|
|
const pause = new Int32Array(new SharedArrayBuffer(4));
|
|
const mark = name => fs.writeFileSync(path.join(root, name), '');
|
|
const readFileSync = fs.readFileSync;
|
|
const linkSync = fs.linkSync;
|
|
let paused = false;
|
|
// Announce a lock attempt OR a captured read; the parent needs no scheduling guess.
|
|
fs.linkSync = function (source, target) {
|
|
if (target === aliasesPath + '.ecc.lock') mark(role + '.attempt');
|
|
return linkSync.apply(this, arguments);
|
|
};
|
|
fs.readFileSync = function (file) {
|
|
const result = readFileSync.apply(this, arguments);
|
|
if (file === aliasesPath && !paused) {
|
|
paused = true;
|
|
mark(role + '.attempt');
|
|
mark(role + '.read');
|
|
const deadline = Date.now() + 15000;
|
|
while (!fs.existsSync(path.join(root, role + '.release'))) {
|
|
if (Date.now() > deadline) throw new Error('Read barrier timed out');
|
|
Atomics.wait(pause, 0, 0, 10);
|
|
}
|
|
}
|
|
return result;
|
|
};
|
|
const aliases = require('../../../scripts/lib/session-aliases');
|
|
const actions = {
|
|
set: () => aliases.setAlias('beta', '/beta'),
|
|
delete: () => aliases.deleteAlias('existing'),
|
|
rename: () => aliases.renameAlias('existing', 'renamed'),
|
|
title: () => aliases.updateAliasTitle('existing', 'Updated'),
|
|
cleanup: () => aliases.cleanupAliases(session => session !== '/existing'),
|
|
};
|
|
const result = role === 'alpha' ? aliases.setAlias('alpha', '/alpha') : actions[action]();
|
|
process.stdout.write(JSON.stringify(result));
|