diff --git a/apps/loopover-ui/src/lib/ams-env-reference.ts b/apps/loopover-ui/src/lib/ams-env-reference.ts index 97c6441a7d..19bcfa5344 100644 --- a/apps/loopover-ui/src/lib/ams-env-reference.ts +++ b/apps/loopover-ui/src/lib/ams-env-reference.ts @@ -59,7 +59,7 @@ export const AMS_ENV_REFERENCE_ROWS: MinerEnvReferenceRow[] = [ { name: "LOOPOVER_MINER_GOVERNOR_LEDGER_DB", firstReference: "lib/governor-ledger.js", - defaultValue: "", + defaultValue: null, }, { name: "LOOPOVER_MINER_GOVERNOR_STATE_DB", @@ -84,7 +84,7 @@ export const AMS_ENV_REFERENCE_ROWS: MinerEnvReferenceRow[] = [ { name: "LOOPOVER_MINER_PLAN_STORE_DB", firstReference: "lib/plan-store.js", - defaultValue: "", + defaultValue: null, }, { name: "LOOPOVER_MINER_POLICY_DOC_CACHE_DB", @@ -104,7 +104,7 @@ export const AMS_ENV_REFERENCE_ROWS: MinerEnvReferenceRow[] = [ { name: "LOOPOVER_MINER_PREDICTION_LEDGER_DB", firstReference: "lib/prediction-ledger.js", - defaultValue: "", + defaultValue: null, }, { name: "LOOPOVER_MINER_RANKED_CANDIDATES_DB", @@ -175,16 +175,16 @@ export const AMS_ENV_REFERENCE_MARKDOWN = [ "| `LOOPOVER_MINER_CONTRIBUTION_PROFILE_CACHE_DB` | `lib/contribution-profile-cache.js` | (none) |", '| `LOOPOVER_MINER_DENY_HOOK_SYNTHESIS_DB` | `lib/deny-hook-synthesis.js` | `""` |', "| `LOOPOVER_MINER_EVENT_LEDGER_DB` | `lib/event-ledger.js` | (none) |", - '| `LOOPOVER_MINER_GOVERNOR_LEDGER_DB` | `lib/governor-ledger.js` | `""` |', + "| `LOOPOVER_MINER_GOVERNOR_LEDGER_DB` | `lib/governor-ledger.js` | (none) |", "| `LOOPOVER_MINER_GOVERNOR_STATE_DB` | `lib/governor-state.js` | (none) |", '| `LOOPOVER_MINER_LOG_LEVEL` | `lib/logger.js` | `""` |', '| `LOOPOVER_MINER_NO_UPDATE_CHECK` | `lib/update-check.js` | `""` |', '| `LOOPOVER_MINER_ORB_EXPORT_DB` | `lib/orb-export.js` | `""` |', - '| `LOOPOVER_MINER_PLAN_STORE_DB` | `lib/plan-store.js` | `""` |', + "| `LOOPOVER_MINER_PLAN_STORE_DB` | `lib/plan-store.js` | (none) |", "| `LOOPOVER_MINER_POLICY_DOC_CACHE_DB` | `lib/policy-doc-cache.js` | (none) |", "| `LOOPOVER_MINER_POLICY_VERDICT_CACHE_DB` | `lib/policy-verdict-cache.js` | (none) |", "| `LOOPOVER_MINER_PORTFOLIO_QUEUE_DB` | `lib/portfolio-queue.js` | (none) |", - '| `LOOPOVER_MINER_PREDICTION_LEDGER_DB` | `lib/prediction-ledger.js` | `""` |', + "| `LOOPOVER_MINER_PREDICTION_LEDGER_DB` | `lib/prediction-ledger.js` | (none) |", "| `LOOPOVER_MINER_RANKED_CANDIDATES_DB` | `lib/ranked-candidates.js` | (none) |", "| `LOOPOVER_MINER_REPLAY_SNAPSHOT_DB` | `lib/replay-snapshot.js` | (none) |", '| `LOOPOVER_MINER_REPO_CLONE_DIR` | `lib/repo-clone.js` | `""` |', diff --git a/packages/loopover-miner/docs/env-reference.md b/packages/loopover-miner/docs/env-reference.md index 756223797c..d4429998e1 100644 --- a/packages/loopover-miner/docs/env-reference.md +++ b/packages/loopover-miner/docs/env-reference.md @@ -14,16 +14,16 @@ Generated by `npm run miner:env-reference`. Do not edit manually. | `LOOPOVER_MINER_CONTRIBUTION_PROFILE_CACHE_DB` | `lib/contribution-profile-cache.js` | (none) | | `LOOPOVER_MINER_DENY_HOOK_SYNTHESIS_DB` | `lib/deny-hook-synthesis.js` | `""` | | `LOOPOVER_MINER_EVENT_LEDGER_DB` | `lib/event-ledger.js` | (none) | -| `LOOPOVER_MINER_GOVERNOR_LEDGER_DB` | `lib/governor-ledger.js` | `""` | +| `LOOPOVER_MINER_GOVERNOR_LEDGER_DB` | `lib/governor-ledger.js` | (none) | | `LOOPOVER_MINER_GOVERNOR_STATE_DB` | `lib/governor-state.js` | (none) | | `LOOPOVER_MINER_LOG_LEVEL` | `lib/logger.js` | `""` | | `LOOPOVER_MINER_NO_UPDATE_CHECK` | `lib/update-check.js` | `""` | | `LOOPOVER_MINER_ORB_EXPORT_DB` | `lib/orb-export.js` | `""` | -| `LOOPOVER_MINER_PLAN_STORE_DB` | `lib/plan-store.js` | `""` | +| `LOOPOVER_MINER_PLAN_STORE_DB` | `lib/plan-store.js` | (none) | | `LOOPOVER_MINER_POLICY_DOC_CACHE_DB` | `lib/policy-doc-cache.js` | (none) | | `LOOPOVER_MINER_POLICY_VERDICT_CACHE_DB` | `lib/policy-verdict-cache.js` | (none) | | `LOOPOVER_MINER_PORTFOLIO_QUEUE_DB` | `lib/portfolio-queue.js` | (none) | -| `LOOPOVER_MINER_PREDICTION_LEDGER_DB` | `lib/prediction-ledger.js` | `""` | +| `LOOPOVER_MINER_PREDICTION_LEDGER_DB` | `lib/prediction-ledger.js` | (none) | | `LOOPOVER_MINER_RANKED_CANDIDATES_DB` | `lib/ranked-candidates.js` | (none) | | `LOOPOVER_MINER_REPLAY_SNAPSHOT_DB` | `lib/replay-snapshot.js` | (none) | | `LOOPOVER_MINER_REPO_CLONE_DIR` | `lib/repo-clone.js` | `""` | diff --git a/packages/loopover-miner/lib/governor-ledger.js b/packages/loopover-miner/lib/governor-ledger.js index fd7570b2a3..25528ebbcf 100644 --- a/packages/loopover-miner/lib/governor-ledger.js +++ b/packages/loopover-miner/lib/governor-ledger.js @@ -1,7 +1,5 @@ -import { homedir } from "node:os"; -import { join } from "node:path"; import { normalizeGovernorLedgerEvent } from "@loopover/engine"; -import { openLocalStoreDb } from "./local-store.js"; +import { normalizeLocalStoreDbPath, openLocalStoreDb, resolveLocalStoreDbPath } from "./local-store.js"; import { applySchemaMigrations } from "./schema-version.js"; import { GOVERNOR_LEDGER_PURGE_SPEC, @@ -22,26 +20,11 @@ const defaultDbFileName = "governor-ledger.sqlite3"; let defaultGovernorLedger = null; export function resolveGovernorLedgerDbPath(env = process.env) { - const explicitPath = typeof env.LOOPOVER_MINER_GOVERNOR_LEDGER_DB === "string" - ? env.LOOPOVER_MINER_GOVERNOR_LEDGER_DB.trim() - : ""; - if (explicitPath) return explicitPath; - - const explicitConfigDir = typeof env.LOOPOVER_MINER_CONFIG_DIR === "string" - ? env.LOOPOVER_MINER_CONFIG_DIR.trim() - : ""; - if (explicitConfigDir) return join(explicitConfigDir, defaultDbFileName); - - const configHome = typeof env.XDG_CONFIG_HOME === "string" && env.XDG_CONFIG_HOME.trim() - ? env.XDG_CONFIG_HOME.trim() - : join(homedir(), ".config"); - return join(configHome, "loopover-miner", defaultDbFileName); + return resolveLocalStoreDbPath(defaultDbFileName, "LOOPOVER_MINER_GOVERNOR_LEDGER_DB", env); } function normalizeDbPath(dbPath) { - const path = (dbPath ?? resolveGovernorLedgerDbPath()).trim(); - if (!path) throw new Error("invalid_governor_ledger_db_path"); - return path; + return normalizeLocalStoreDbPath(dbPath, resolveGovernorLedgerDbPath(), "invalid_governor_ledger_db_path"); } function normalizeOptionalRepoFullName(repoFullName) { diff --git a/packages/loopover-miner/lib/plan-store.js b/packages/loopover-miner/lib/plan-store.js index a289648d05..01274d8844 100644 --- a/packages/loopover-miner/lib/plan-store.js +++ b/packages/loopover-miner/lib/plan-store.js @@ -1,6 +1,4 @@ -import { homedir } from "node:os"; -import { join } from "node:path"; -import { openLocalStoreDb } from "./local-store.js"; +import { normalizeLocalStoreDbPath, openLocalStoreDb, resolveLocalStoreDbPath } from "./local-store.js"; import { applySchemaMigrations } from "./schema-version.js"; // Local SQLite persistence for the stateless MCP plan DAG (#2318). `loopover_build_plan`/`plan_status`/ @@ -20,26 +18,11 @@ const defaultDbFileName = "plan-store.sqlite3"; let defaultPlanStore = null; export function resolvePlanStoreDbPath(env = process.env) { - const explicitPath = typeof env.LOOPOVER_MINER_PLAN_STORE_DB === "string" - ? env.LOOPOVER_MINER_PLAN_STORE_DB.trim() - : ""; - if (explicitPath) return explicitPath; - - const explicitConfigDir = typeof env.LOOPOVER_MINER_CONFIG_DIR === "string" - ? env.LOOPOVER_MINER_CONFIG_DIR.trim() - : ""; - if (explicitConfigDir) return join(explicitConfigDir, defaultDbFileName); - - const configHome = typeof env.XDG_CONFIG_HOME === "string" && env.XDG_CONFIG_HOME.trim() - ? env.XDG_CONFIG_HOME.trim() - : join(homedir(), ".config"); - return join(configHome, "loopover-miner", defaultDbFileName); + return resolveLocalStoreDbPath(defaultDbFileName, "LOOPOVER_MINER_PLAN_STORE_DB", env); } function normalizeDbPath(dbPath) { - const raw = dbPath ?? resolvePlanStoreDbPath(); - if (typeof raw !== "string" || !raw.trim()) throw new Error("invalid_plan_store_db_path"); - return raw.trim(); + return normalizeLocalStoreDbPath(dbPath, resolvePlanStoreDbPath(), "invalid_plan_store_db_path"); } function normalizePlanId(planId) { diff --git a/packages/loopover-miner/lib/prediction-ledger.js b/packages/loopover-miner/lib/prediction-ledger.js index b27b63f09f..cdba896920 100644 --- a/packages/loopover-miner/lib/prediction-ledger.js +++ b/packages/loopover-miner/lib/prediction-ledger.js @@ -1,6 +1,4 @@ -import { homedir } from "node:os"; -import { join } from "node:path"; -import { openLocalStoreDb } from "./local-store.js"; +import { normalizeLocalStoreDbPath, openLocalStoreDb, resolveLocalStoreDbPath } from "./local-store.js"; import { applySchemaMigrations } from "./schema-version.js"; import { PREDICTION_LEDGER_PURGE_SPEC, @@ -24,26 +22,11 @@ const defaultDbFileName = "prediction-ledger.sqlite3"; let defaultPredictionLedger = null; export function resolvePredictionLedgerDbPath(env = process.env) { - const explicitPath = typeof env.LOOPOVER_MINER_PREDICTION_LEDGER_DB === "string" - ? env.LOOPOVER_MINER_PREDICTION_LEDGER_DB.trim() - : ""; - if (explicitPath) return explicitPath; - - const explicitConfigDir = typeof env.LOOPOVER_MINER_CONFIG_DIR === "string" - ? env.LOOPOVER_MINER_CONFIG_DIR.trim() - : ""; - if (explicitConfigDir) return join(explicitConfigDir, defaultDbFileName); - - const configHome = typeof env.XDG_CONFIG_HOME === "string" && env.XDG_CONFIG_HOME.trim() - ? env.XDG_CONFIG_HOME.trim() - : join(homedir(), ".config"); - return join(configHome, "loopover-miner", defaultDbFileName); + return resolveLocalStoreDbPath(defaultDbFileName, "LOOPOVER_MINER_PREDICTION_LEDGER_DB", env); } function normalizeDbPath(dbPath) { - const path = (dbPath ?? resolvePredictionLedgerDbPath()).trim(); - if (!path) throw new Error("invalid_prediction_ledger_db_path"); - return path; + return normalizeLocalStoreDbPath(dbPath, resolvePredictionLedgerDbPath(), "invalid_prediction_ledger_db_path"); } function normalizeRepoFullName(repoFullName) {