← Files ForgeMindARCHIVED FILE

src/forge/store.mjs

3.17 KB · Oct 3, 2026 · 06:33 UTC

↓ Download file

import { access, readFile, readdir } from 'node:fs/promises';
import path from 'node:path';

import { loadConfig } from '../config.mjs';
import { ForgeMindError } from '../errors.mjs';
import { writeJsonAtomic } from '../io.mjs';
import { assertContained, resolveWorkspace } from '../paths.mjs';
import { redactValue } from '../redact.mjs';
import { sealRecord, verifyRecord } from './integrity.mjs';

const AREA_PATTERN = /^[a-z0-9][a-z0-9-]*(?:\/[a-z0-9][a-z0-9-]*)*$/;
const ID_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/;

export async function saveForgeRecord({ workspace, area, record }) {
  const root = await resolveWorkspace(workspace);
  validateArea(area);
  if (!ID_PATTERN.test(String(record?.id ?? ''))) throw new ForgeMindError('FM_FORGE_ID_INVALID', 'Forge record ID is missing or invalid.');
  const config = await loadConfig(root);
  const redacted = redactValue(record, config.redaction);
  const sealed = sealRecord({ ...redacted.value, redaction: { matches: redacted.matches, types: redacted.types } });
  const directory = forgeArea(root, area);
  const target = assertContained(directory, path.join(directory, `${sealed.id}.json`));
  await writeJsonAtomic(target, sealed);
  return { schemaVersion: 1, status: 'saved', record: sealed, path: target };
}

export async function loadForgeRecord({ workspace, area, reference }) {
  const root = await resolveWorkspace(workspace);
  validateArea(area);
  const directory = forgeArea(root, area);
  let target;
  if (ID_PATTERN.test(String(reference ?? ''))) target = path.join(directory, `${reference}.json`);
  else target = path.resolve(root, String(reference ?? ''));
  target = assertContained(directory, target);
  let record;
  try { record = JSON.parse(await readFile(target, 'utf8')); }
  catch (error) { throw new ForgeMindError('FM_FORGE_RECORD_NOT_FOUND', `Forge record could not be loaded: ${reference}`, { cause: error }); }
  if (verifyRecord(record).status !== 'valid') throw new ForgeMindError('FM_FORGE_RECORD_TAMPERED', `Forge record digest is invalid: ${reference}`);
  return record;
}

export async function listForgeRecords({ workspace, area }) {
  const root = await resolveWorkspace(workspace);
  validateArea(area);
  const directory = forgeArea(root, area);
  try {
    const files = (await readdir(directory)).filter((file) => file.endsWith('.json')).sort();
    return Promise.all(files.map(async (file) => loadForgeRecord({ workspace: root, area, reference: file.slice(0, -5) })));
  } catch (error) {
    if (error.code === 'ENOENT') return [];
    throw error;
  }
}

export function forgeArea(workspace, area) {
  validateArea(area);
  const base = assertContained(workspace, path.join(workspace, '.codex-orchestrator', 'forge'));
  return assertContained(base, path.join(base, ...area.split('/')));
}

export async function forgeRecordExists({ workspace, area, id }) {
  try { await access(path.join(forgeArea(path.resolve(workspace), area), `${id}.json`)); return true; }
  catch { return false; }
}

function validateArea(area) {
  if (!AREA_PATTERN.test(String(area ?? ''))) throw new ForgeMindError('FM_FORGE_AREA_INVALID', `Invalid Forge storage area: ${area}`);
}

SHA-256: cc0258486052b21f13b241fdf1430f70b5482c788141b6e9fc348caeba9c3029