Files
everything-claude-code/scripts/lib/session-adapters/dmux-tmux.js

79 lines
1.9 KiB
JavaScript

'use strict';
const fs = require('fs');
const path = require('path');
const { collectSessionSnapshot } = require('../orchestration-session');
const { normalizeDmuxSnapshot } = require('./canonical-session');
function isPlanFileTarget(target, cwd) {
if (typeof target !== 'string' || target.length === 0) {
return false;
}
const absoluteTarget = path.resolve(cwd, target);
return fs.existsSync(absoluteTarget)
&& fs.statSync(absoluteTarget).isFile()
&& path.extname(absoluteTarget) === '.json';
}
function isSessionNameTarget(target, cwd) {
if (typeof target !== 'string' || target.length === 0) {
return false;
}
const coordinationDir = path.resolve(cwd, '.claude', 'orchestration', target);
return fs.existsSync(coordinationDir) && fs.statSync(coordinationDir).isDirectory();
}
function buildSourceTarget(target, cwd) {
if (isPlanFileTarget(target, cwd)) {
return {
type: 'plan',
value: path.resolve(cwd, target)
};
}
return {
type: 'session',
value: target
};
}
function createDmuxTmuxAdapter(options = {}) {
const collectSessionSnapshotImpl = options.collectSessionSnapshotImpl || collectSessionSnapshot;
return {
id: 'dmux-tmux',
canOpen(target, context = {}) {
if (context.adapterId && context.adapterId !== 'dmux-tmux') {
return false;
}
if (context.adapterId === 'dmux-tmux') {
return true;
}
const cwd = context.cwd || process.cwd();
return isPlanFileTarget(target, cwd) || isSessionNameTarget(target, cwd);
},
open(target, context = {}) {
const cwd = context.cwd || process.cwd();
return {
adapterId: 'dmux-tmux',
getSnapshot() {
const snapshot = collectSessionSnapshotImpl(target, cwd);
return normalizeDmuxSnapshot(snapshot, buildSourceTarget(target, cwd));
}
};
}
};
}
module.exports = {
createDmuxTmuxAdapter,
isPlanFileTarget,
isSessionNameTarget
};