@every-env/cli
Version:
Multi-agent orchestrator for AI-powered development workflows
67 lines • 2.6 kB
JavaScript
import { promises as fs } from 'fs';
import { join } from 'path';
const STATE_DIR = '.every-env';
const STATE_FILE = 'workflow-state.json';
export class StatePersistence {
statePath;
saveTimeout = null;
constructor(projectRoot = process.cwd()) {
this.statePath = join(projectRoot, STATE_DIR, STATE_FILE);
}
async ensureStateDir() {
const dir = join(process.cwd(), STATE_DIR);
try {
await fs.mkdir(dir, { recursive: true });
}
catch (error) {
// Directory may already exist
}
}
async loadState() {
try {
await this.ensureStateDir();
const data = await fs.readFile(this.statePath, 'utf-8');
const serialized = JSON.parse(data);
// Convert dates back from strings
const state = {
...serialized,
tasks: {
plan: serialized.tasks.plan.map(t => ({ ...t, createdAt: new Date(t.createdAt) })),
delegate: serialized.tasks.delegate.map(t => ({ ...t, createdAt: new Date(t.createdAt) })),
assess: serialized.tasks.assess.map(t => ({ ...t, createdAt: new Date(t.createdAt) })),
codify: serialized.tasks.codify.map(t => ({ ...t, createdAt: new Date(t.createdAt) }))
}
};
return state;
}
catch (error) {
// File doesn't exist or is invalid
return null;
}
}
async saveState(state) {
await this.ensureStateDir();
// Convert dates to strings for serialization
const serialized = {
...state,
tasks: {
plan: state.tasks.plan.map(t => ({ ...t, createdAt: t.createdAt.toISOString() })),
delegate: state.tasks.delegate.map(t => ({ ...t, createdAt: t.createdAt.toISOString() })),
assess: state.tasks.assess.map(t => ({ ...t, createdAt: t.createdAt.toISOString() })),
codify: state.tasks.codify.map(t => ({ ...t, createdAt: t.createdAt.toISOString() }))
}
};
await fs.writeFile(this.statePath, JSON.stringify(serialized, null, 2));
}
saveStateDebounced(state, delay = 500) {
if (this.saveTimeout) {
clearTimeout(this.saveTimeout);
}
this.saveTimeout = setTimeout(() => {
this.saveState(state).catch(error => {
console.error('Error saving state:', error);
});
}, delay);
}
}
//# sourceMappingURL=persistence.js.map