UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

63 lines (62 loc) 3.43 kB
import { c as isRecord } from "./record-coerce-DItp3I4t.js"; import { a as sha256Hex } from "./crypto-digest-C4hqTb_e.js"; import { a as updateConfigMachineState, r as readConfigMachineState } from "./config-machine-state-BCereLZr.js"; import path from "node:path"; //#region src/state/local-onboarding-state.ts function stateKey(configPath) { return `onboarding.local.${sha256Hex(path.resolve(configPath))}`; } function normalizeState(value, configPath) { if (!isRecord(value) || value.version !== 1 || value.status !== "pending" && value.status !== "completed" || typeof value.runId !== "string" || !value.runId || value.configPath !== path.resolve(configPath) || typeof value.workspace !== "string" || !value.workspace || typeof value.securityAcknowledgedAt !== "string" || !value.securityAcknowledgedAt.trim() || typeof value.startedAtMs !== "number" || !Number.isFinite(value.startedAtMs) || value.status === "completed" && (typeof value.completedAtMs !== "number" || !Number.isFinite(value.completedAtMs))) return; return value; } function readLocalOnboardingState(configPath, database = {}) { return normalizeState(readConfigMachineState(stateKey(configPath), database), configPath); } /** A replaced config at the same path must never inherit another installation's receipt. */ function readLocalOnboardingStateForConfig(configPath, config, database = {}) { const securityAcknowledgedAt = config.wizard?.securityAcknowledgedAt?.trim(); if (!securityAcknowledgedAt) return; const state = readLocalOnboardingState(configPath, database); return state?.securityAcknowledgedAt === securityAcknowledgedAt ? state : void 0; } /** Begin exactly at inference's commit boundary so failed probes create no recovery state. */ function beginLocalOnboarding(params) { const securityAcknowledgedAt = params.securityAcknowledgedAt.trim(); if (!securityAcknowledgedAt) throw new Error("Local onboarding requires its persisted security acknowledgement."); const pending = { version: 1, status: "pending", runId: params.runId, configPath: path.resolve(params.configPath), workspace: path.resolve(params.workspace), securityAcknowledgedAt, startedAtMs: params.nowMs ?? Date.now() }; return updateConfigMachineState(stateKey(params.configPath), (value) => { const current = normalizeState(value, params.configPath); if (current && (!params.replace || current.runId !== params.expectedRunId)) return current; return pending; }, params.database); } /** Complete only the owning run; a stale operation cannot close its replacement. */ function completeLocalOnboarding(params) { const current = readLocalOnboardingState(params.configPath, params.database); if (current?.runId !== params.runId) return false; if (current.status === "completed") return true; let completed = false; updateConfigMachineState(stateKey(params.configPath), (value) => { const latest = normalizeState(value, params.configPath); if (!latest) throw new Error("Local onboarding state became invalid before completion."); if (latest.runId !== params.runId) return latest; completed = true; return latest.status === "completed" ? latest : { ...latest, status: "completed", completedAtMs: params.nowMs ?? Date.now() }; }, params.database); return completed; } //#endregion export { readLocalOnboardingStateForConfig as i, completeLocalOnboarding as n, readLocalOnboardingState as r, beginLocalOnboarding as t };