trellis
Version:
Agentic State Engine — event-sourced causal graph with branching, decision traces, and realtime sync for AI-native applications
99 lines (97 loc) • 2.39 kB
JavaScript
// src/server/vm-config.ts
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
import { join } from "path";
import { homedir } from "os";
function getVmDir() {
return join(homedir(), ".trellis");
}
function getVmPath() {
return join(getVmDir(), "vm.json");
}
function loadVmConfig() {
const vmPath = getVmPath();
if (!existsSync(vmPath)) {
return {
activeSprite: null,
sprites: {}
};
}
try {
const raw = readFileSync(vmPath, "utf-8");
return JSON.parse(raw);
} catch {
return {
activeSprite: null,
sprites: {}
};
}
}
function saveVmConfig(config) {
const dir = getVmDir();
if (!existsSync(dir)) {
mkdirSync(dir, { recursive: true });
}
writeFileSync(getVmPath(), JSON.stringify(config, null, 2));
}
function getActiveSprite() {
const config = loadVmConfig();
return config.activeSprite;
}
function setActiveSprite(spriteName) {
const config = loadVmConfig();
if (!config.sprites[spriteName]) {
config.sprites[spriteName] = {
name: spriteName,
createdAt: (/* @__PURE__ */ new Date()).toISOString(),
url: `https://${spriteName}.sprites.app`,
hasTrellis: false
};
}
config.activeSprite = spriteName;
saveVmConfig(config);
}
function trackSprite(spriteName, opts = {}) {
const config = loadVmConfig();
const existing = config.sprites[spriteName] ?? {
name: spriteName,
createdAt: (/* @__PURE__ */ new Date()).toISOString(),
url: `https://${spriteName}.sprites.app`,
hasTrellis: false
};
config.sprites[spriteName] = {
...existing,
...opts,
url: opts.url ?? existing.url,
hasTrellis: opts.hasTrellis ?? existing.hasTrellis
};
if (!config.activeSprite) {
config.activeSprite = spriteName;
}
saveVmConfig(config);
}
function untrackSprite(spriteName) {
const config = loadVmConfig();
delete config.sprites[spriteName];
if (config.activeSprite === spriteName) {
config.activeSprite = null;
}
saveVmConfig(config);
}
function isSpriteTracked(spriteName) {
const config = loadVmConfig();
return !!config.sprites[spriteName];
}
function getSprite(spriteName) {
const config = loadVmConfig();
return config.sprites[spriteName] ?? null;
}
export {
loadVmConfig,
saveVmConfig,
getActiveSprite,
setActiveSprite,
trackSprite,
untrackSprite,
isSpriteTracked,
getSprite
};