64 lines
1.9 KiB
TypeScript
64 lines
1.9 KiB
TypeScript
import fs from "node:fs";
|
|
import path from "node:path";
|
|
|
|
import { DEFAULT_IDENTITY_FILENAME } from "./workspace.js";
|
|
|
|
export type AgentIdentityFile = {
|
|
name?: string;
|
|
emoji?: string;
|
|
theme?: string;
|
|
creature?: string;
|
|
vibe?: string;
|
|
avatar?: string;
|
|
};
|
|
|
|
export function parseIdentityMarkdown(content: string): AgentIdentityFile {
|
|
const identity: AgentIdentityFile = {};
|
|
const lines = content.split(/\r?\n/);
|
|
for (const line of lines) {
|
|
const cleaned = line.trim().replace(/^\s*-\s*/, "");
|
|
const colonIndex = cleaned.indexOf(":");
|
|
if (colonIndex === -1) continue;
|
|
const label = cleaned.slice(0, colonIndex).replace(/[*_]/g, "").trim().toLowerCase();
|
|
const value = cleaned
|
|
.slice(colonIndex + 1)
|
|
.replace(/^[*_]+|[*_]+$/g, "")
|
|
.trim();
|
|
if (!value) continue;
|
|
if (label === "name") identity.name = value;
|
|
if (label === "emoji") identity.emoji = value;
|
|
if (label === "creature") identity.creature = value;
|
|
if (label === "vibe") identity.vibe = value;
|
|
if (label === "theme") identity.theme = value;
|
|
if (label === "avatar") identity.avatar = value;
|
|
}
|
|
return identity;
|
|
}
|
|
|
|
export function identityHasValues(identity: AgentIdentityFile): boolean {
|
|
return Boolean(
|
|
identity.name ||
|
|
identity.emoji ||
|
|
identity.theme ||
|
|
identity.creature ||
|
|
identity.vibe ||
|
|
identity.avatar,
|
|
);
|
|
}
|
|
|
|
export function loadIdentityFromFile(identityPath: string): AgentIdentityFile | null {
|
|
try {
|
|
const content = fs.readFileSync(identityPath, "utf-8");
|
|
const parsed = parseIdentityMarkdown(content);
|
|
if (!identityHasValues(parsed)) return null;
|
|
return parsed;
|
|
} catch {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
export function loadAgentIdentityFromWorkspace(workspace: string): AgentIdentityFile | null {
|
|
const identityPath = path.join(workspace, DEFAULT_IDENTITY_FILENAME);
|
|
return loadIdentityFromFile(identityPath);
|
|
}
|