UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

91 lines (90 loc) • 5.06 kB
import { a as getNodeSqliteKysely, c as prepareSqliteQuerySync, n as createSqliteQueryCache } from "./kysely-sync-K7ftY-g4.mjs"; import { n as getAdmittedSqliteSchemaFacts } from "./sqlite-schema-facts-CG0Tk84j.mjs"; import { t as SqliteSchemaMismatchError } from "./sqlite-schema-issues-Cd5MmsG2.mjs"; import { a as tableHasColumn, i as tableExists } from "./openclaw-state-db-schema-helpers-BlZefrPy.mjs"; import "./openclaw-state-db-contract-Cm9fKF2T.mjs"; import { a as readSqliteUserVersion, n as createNewerSqliteSchemaVersionError } from "./sqlite-user-version-ZJ4dPMsi.mjs"; import { r as normalizeOpenClawStateSchemaReadError } from "./openclaw-state-db-schema-migration-required-BpllCelk.mjs"; import { a as collectSqliteSchemaIssues } from "./sqlite-schema-contract-BTxZz0OV.mjs"; //#region src/state/openclaw-state-db-schema-version.ts const CONTENT_VERSION_KEY = "state.schema.contentVersion"; const contentVersionQuery = createSqliteQueryCache((db) => prepareSqliteQuerySync(db, () => getNodeSqliteKysely(db).selectFrom("config_machine_state").select("value_json").where("state_key", "=", CONTENT_VERSION_KEY))); /** Content and its marker commit together, even while older readers retain their version floor. */ function readStateSchemaContentVersion(db) { return readContentVersion(db, getAdmittedSqliteSchemaFacts(db)?.userVersion ?? readSqliteUserVersion(db)); } function readContentVersion(db, published) { if (!tableExists(db, "config_machine_state")) return published; const row = contentVersionQuery(db)().rows[0]; if (!row) return published; let contentVersion; try { contentVersion = JSON.parse(row.value_json); } catch (cause) { throw new SqliteSchemaMismatchError(`Invalid shared state schema content version in ${CONTENT_VERSION_KEY}.`, { cause }); } if (typeof contentVersion !== "number" || !Number.isSafeInteger(contentVersion) || contentVersion < 0) throw new SqliteSchemaMismatchError(`Invalid shared state schema content version in ${CONTENT_VERSION_KEY}.`); return Math.max(published, contentVersion); } /** Cold migration planning checks physical content; admission still uses the recorded version. */ function readStateSchemaMigrationVersion(db) { const version = readStateSchemaContentVersion(db); if (version !== 16) return version; const reviewWorkspace = tableHasColumn(db, "skill_workshop_collection_reviews", "workspace_dir"); const proposalWorkspace = tableHasColumn(db, "skill_workshop_proposals", "workspace_dir"); const releasedClaim = tableHasColumn(db, "skill_workshop_proposals", "claim_released_time"); if (!reviewWorkspace && !proposalWorkspace && !releasedClaim) return version; const missingAttribution = reviewWorkspace && !proposalWorkspace; const issues = collectSqliteSchemaIssues(db, ` CREATE TABLE skill_workshop_collection_reviews ( review_id TEXT NOT NULL PRIMARY KEY, ${reviewWorkspace ? "workspace_dir" : "owner_agent_id"} TEXT NOT NULL, backup_id TEXT NOT NULL, create_time INTEGER NOT NULL, kept_names_json TEXT NOT NULL, written_names_json TEXT NOT NULL, dropped_json TEXT NOT NULL ) STRICT; CREATE TABLE skill_workshop_proposals ( proposal_id TEXT NOT NULL PRIMARY KEY, record_json TEXT NOT NULL, owner_agent_id TEXT, ${proposalWorkspace ? "workspace_dir TEXT NOT NULL," : ""} kind TEXT NOT NULL CHECK (kind IN ('create', 'update')), status TEXT NOT NULL CHECK (status IN ('pending', 'applied', 'rejected', 'quarantined', 'stale')), created_at TEXT NOT NULL, updated_at TEXT NOT NULL, draft_hash TEXT NOT NULL, origin_agent_id TEXT, origin_session_key TEXT, origin_run_id TEXT, origin_message_id TEXT, applied_at TEXT, rejected_at TEXT, quarantined_at TEXT, stale_at TEXT, status_reason TEXT ${releasedClaim ? ", claim_released_time INTEGER" : ""} ) STRICT; `, { allowedMissingTables: ["skill_workshop_collection_reviews"], allowedColumnDefinitions: { "skill_workshop_collection_reviews.workspace_dir": ["workspace_dir TEXT NOT NULL DEFAULT ''"], "skill_workshop_proposals.workspace_dir": ["workspace_dir TEXT NOT NULL DEFAULT ''"] } }); if (!missingAttribution && issues.length === 0) return 15; throw new SqliteSchemaMismatchError("Unrecognized Skill Workshop ownership schema; cannot apply the schema 16 migration."); } function assertSupportedStateSchemaVersion(db, pathname) { try { const userVersion = getAdmittedSqliteSchemaFacts(db)?.userVersion ?? readSqliteUserVersion(db); const contentVersion = userVersion > 20 ? userVersion : readStateSchemaContentVersion(db); if (contentVersion > 20) throw createNewerSqliteSchemaVersionError("OpenClaw state database", pathname, contentVersion, 20); return userVersion; } catch (error) { throw normalizeOpenClawStateSchemaReadError(error, pathname); } } //#endregion export { readStateSchemaMigrationVersion as i, assertSupportedStateSchemaVersion as n, readStateSchemaContentVersion as r, CONTENT_VERSION_KEY as t };