@agentics.org/sparc2
Version:
SPARC 2.0 - Autonomous Vector Coding Agent + MCP. SPARC 2.0, vectorized AI code analysis, is an intelligent coding agent framework built to automate and streamline software development. It combines secure execution environments, and version control into a
160 lines (143 loc) • 4.05 kB
text/typescript
/**
* Configuration module for SPARC 2.0
* Handles loading and validation of TOML configuration and environment variables.
*/
import { parse } from "https://deno.land/std@0.215.0/toml/mod.ts";
import { load } from "https://deno.land/std@0.215.0/dotenv/mod.ts";
/**
* SPARC 2.0 configuration interface
*/
export interface SPARCConfig {
execution: {
mode: "automatic" | "semi" | "manual" | "custom";
diff_mode: "file" | "function";
processing: "parallel" | "sequential" | "concurrent" | "swarm";
};
logging: {
enable: boolean;
vector_logging: boolean;
};
rollback: {
checkpoint_enabled: boolean;
temporal_rollback: boolean;
};
models: {
reasoning: string;
instruct: string;
};
}
/**
* Environment configuration interface
*/
export interface EnvConfig {
OPENAI_API_KEY: string;
GITHUB_TOKEN: string;
GITHUB_ORG: string;
EDGE_FUNCTION_URL: string;
E2B_API_KEY: string;
VECTOR_DB_URL: string;
}
/**
* Load and validate TOML configuration
* @param configPath Path to TOML config file
* @returns Validated SPARCConfig object
* @throws Error if config is invalid
*/
export async function loadConfig(configPath: string): Promise<SPARCConfig> {
const tomlContent = await Deno.readTextFile(configPath);
const rawConfig = parse(tomlContent) as {
execution?: {
mode?: string;
diff_mode?: string;
processing?: string;
};
logging?: {
enable?: boolean;
vector_logging?: boolean;
};
rollback?: {
checkpoint_enabled?: boolean;
temporal_rollback?: boolean;
};
models?: {
reasoning?: string;
instruct?: string;
};
};
// Validate required sections exist
if (!rawConfig.execution || !rawConfig.logging || !rawConfig.rollback || !rawConfig.models) {
throw new Error("Missing required configuration sections");
}
// Validate execution mode
if (!["automatic", "semi", "manual", "custom"].includes(rawConfig.execution.mode || "")) {
throw new Error("Invalid execution mode");
}
// Validate diff mode
if (!["file", "function"].includes(rawConfig.execution.diff_mode || "")) {
throw new Error("Invalid diff mode");
}
// Validate processing mode
if (
!["parallel", "sequential", "concurrent", "swarm"].includes(
rawConfig.execution.processing || "",
)
) {
throw new Error("Invalid processing mode");
}
// Cast validated config
const config: SPARCConfig = {
execution: {
mode: rawConfig.execution.mode as "automatic" | "semi" | "manual" | "custom",
diff_mode: rawConfig.execution.diff_mode as "file" | "function",
processing: rawConfig.execution.processing as
| "parallel"
| "sequential"
| "concurrent"
| "swarm",
},
logging: {
enable: Boolean(rawConfig.logging.enable),
vector_logging: Boolean(rawConfig.logging.vector_logging),
},
rollback: {
checkpoint_enabled: Boolean(rawConfig.rollback.checkpoint_enabled),
temporal_rollback: Boolean(rawConfig.rollback.temporal_rollback),
},
models: {
reasoning: String(rawConfig.models.reasoning || ""),
instruct: String(rawConfig.models.instruct || ""),
},
};
return config;
}
/**
* Load and validate environment variables
* @returns Validated EnvConfig object
* @throws Error if required variables are missing
*/
export async function loadEnvConfig(): Promise<EnvConfig> {
// Load .env file if it exists
await load();
const requiredVars = [
"OPENAI_API_KEY",
"GITHUB_TOKEN",
"GITHUB_ORG",
"EDGE_FUNCTION_URL",
"E2B_API_KEY",
"VECTOR_DB_URL",
] as const;
const config = {} as EnvConfig;
const missing: string[] = [];
for (const varName of requiredVars) {
const value = Deno.env.get(varName);
if (!value) {
missing.push(varName);
} else {
config[varName] = value;
}
}
if (missing.length > 0) {
throw new Error(`Missing required environment variables: ${missing.join(", ")}`);
}
return config;
}