sovereign-mamba / src /config.ts
SNAPKITTYWEST's picture
Add sovereign-mamba source: Modelfile, kernel Prolog gates, sovereign_crypto Rust, Lean4, corpus policy
0427fad verified
Raw
History Blame Contribute Delete
2.58 kB
import { readFileSync, existsSync } from "node:fs";
import { resolve } from "node:path";
export type HarnessConfig = {
mode: "local" | "browser";
model: {
provider: "ollama";
baseUrl: string;
model: string;
temperature: number;
seed: number;
};
persona: {
executorMode: boolean;
emojiCode: boolean;
suppressClarificationDrag: boolean;
};
tools: Record<string, boolean>;
security: {
bashRequiresApproval: boolean;
curlRequiresApproval: boolean;
allowWrite: boolean;
workspaceOnly: boolean;
};
receipts: {
enabled: boolean;
dir: string;
hash: "sha256" | "blake3";
};
};
const DEFAULT_CONFIG: HarnessConfig = {
mode: "local",
model: {
provider: "ollama",
baseUrl: "http://127.0.0.1:11434",
model: "snapkitty-nemotron",
temperature: 0,
seed: 42
},
persona: {
executorMode: true,
emojiCode: true,
suppressClarificationDrag: true
},
tools: {
lean4: true,
prolog: true,
tavily: false,
google: false,
curl: false,
bash: false
},
security: {
bashRequiresApproval: true,
curlRequiresApproval: true,
allowWrite: false,
workspaceOnly: true
},
receipts: {
enabled: true,
dir: "./receipts",
hash: "sha256"
}
};
function deepMerge<T>(base: T, patch: Partial<T>): T {
if (!patch || typeof patch !== "object") return base;
const out = { ...base } as Record<string, unknown>;
for (const [key, value] of Object.entries(patch as Record<string, unknown>)) {
if (value && typeof value === "object" && !Array.isArray(value) && typeof out[key] === "object" && out[key] !== null) {
out[key] = deepMerge(out[key] as Record<string, unknown>, value as Record<string, unknown>);
} else if (value !== undefined) {
out[key] = value;
}
}
return out as T;
}
export function loadHarnessConfig(configPath = "harness.config.json"): HarnessConfig {
const absolute = resolve(configPath);
const fileConfig = existsSync(absolute)
? JSON.parse(readFileSync(absolute, "utf8")) as Partial<HarnessConfig>
: {};
const merged = deepMerge(DEFAULT_CONFIG, fileConfig);
merged.model.baseUrl = process.env.OLLAMA_BASE_URL ?? merged.model.baseUrl;
merged.model.model = process.env.OLLAMA_MODEL ?? merged.model.model;
merged.model.temperature = Number(process.env.OLLAMA_TEMPERATURE ?? merged.model.temperature);
merged.model.seed = Number(process.env.OLLAMA_SEED ?? merged.model.seed);
if (process.env.RECEIPTS_DIR) merged.receipts.dir = process.env.RECEIPTS_DIR;
return merged;
}