UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

181 lines (180 loc) • 8.44 kB
import { a as executeSqliteQueryTakeFirstSync, o as getNodeSqliteKysely } from "./kysely-sync-DUWzQvCU.mjs"; import { t as coerceRequiredSqliteNumber } from "./sqlite-number-DZt1m75H.mjs"; import { i as decodeClawAgentOwnership, n as parseClawInstallRecordSchemaVersion } from "./provenance-schema-version-CA1gqk1A.mjs"; //#region src/claws/package-extension-provenance.ts const CLAW_PACKAGE_REF_SCHEMA_VERSION = "openclaw.clawPackageRef.v1"; function toPackageRefExtensionSqlParams(extension) { return { extension_id: extension?.id ?? null, extension_format: extension?.format ?? null, extension_detected_format: extension?.detectedFormat ?? null, extension_mapped_json: extension ? JSON.stringify(extension.mapped) : null, extension_unavailable_json: extension ? JSON.stringify(extension.unavailable) : null, extension_adapter_identity: extension?.adapterIdentity ?? null }; } function toPackageRefSqlFields(ref) { return { agent_id: ref.agentId, package_kind: ref.kind, package_source: ref.source, package_ref: ref.ref, package_version: ref.version, package_integrity: ref.integrity, schema_version: ref.schemaVersion, claw_name: ref.clawName, package_status: ref.status, relationship: ref.relationship, origin: ref.origin, independent_owner: ref.independentOwner ? 1 : 0, installed_at_ms: ref.installedAtMs, updated_at_ms: ref.updatedAtMs }; } function parsePackageRefExtension(row) { const values = [ row.extension_id, row.extension_format, row.extension_detected_format, row.extension_mapped_json, row.extension_unavailable_json, row.extension_adapter_identity ]; if (values.every((value) => value === null)) return; if (values.some((value) => value === null)) throw new Error(`Claw package reference ${row.package_kind}:${row.package_ref} has incomplete extension provenance.`); const formats = /* @__PURE__ */ new Set([ "openclaw", "claude", "codex", "cursor" ]); if (!formats.has(row.extension_format) || !formats.has(row.extension_detected_format)) throw new Error(`Claw package reference ${row.package_kind}:${row.package_ref} has unsupported extension format provenance.`); const mapped = JSON.parse(row.extension_mapped_json); const unavailable = JSON.parse(row.extension_unavailable_json); if (!Array.isArray(mapped) || !mapped.every((value) => typeof value === "string") || !Array.isArray(unavailable) || !unavailable.every((value) => typeof value === "string")) throw new Error(`Claw package reference ${row.package_kind}:${row.package_ref} has invalid extension inventory provenance.`); return { id: row.extension_id, format: row.extension_format, detectedFormat: row.extension_detected_format, mapped, unavailable, adapterIdentity: row.extension_adapter_identity }; } function rowToPackageRef(row) { const extension = parsePackageRefExtension(row); return { schemaVersion: CLAW_PACKAGE_REF_SCHEMA_VERSION, agentId: row.agent_id, clawName: row.claw_name, kind: row.package_kind, source: row.package_source, ref: row.package_ref, version: row.package_version, integrity: row.package_integrity, status: row.package_status, relationship: row.relationship, origin: row.origin, independentOwner: coerceRequiredSqliteNumber(row.independent_owner) === 1, ...extension ? { extension } : {}, installedAtMs: coerceRequiredSqliteNumber(row.installed_at_ms), updatedAtMs: coerceRequiredSqliteNumber(row.updated_at_ms) }; } //#endregion //#region src/claws/provenance-bootstrap.ts function clawBootstrapProvenanceFromRow(row) { return row.bootstrap_source_path && row.bootstrap_content_digest ? { bootstrap: { sourcePath: row.bootstrap_source_path, contentDigest: row.bootstrap_content_digest } } : {}; } //#endregion //#region src/claws/provenance-read.kernel.ts function clawInstallRecordFromRow(row) { if (row.source_kind !== "package" && row.source_kind !== "development" || row.integrity_kind !== "artifact" && row.integrity_kind !== "development-snapshot" || row.status !== "pending" && row.status !== "workspace_ready" && row.status !== "config_committed" && row.status !== "complete" && row.status !== "partial") throw new Error("Claw install record has invalid source or status fields."); const ownership = decodeClawAgentOwnership(row.agent_owned_paths_json, row.schema_version); const manifestSchemaVersion = coerceRequiredSqliteNumber(row.manifest_schema_version); if (manifestSchemaVersion !== 1) throw new Error(`Unsupported Claw manifest schema ${manifestSchemaVersion}.`); return { schemaVersion: parseClawInstallRecordSchemaVersion(row.schema_version), claw: { kind: row.source_kind, name: row.claw_name, version: row.claw_version, packageRoot: row.package_root, manifestPath: row.manifest_path, integrityKind: row.integrity_kind, integrity: row.integrity, byteLength: coerceRequiredSqliteNumber(row.source_byte_length) }, manifestSchemaVersion, planIntegrity: row.plan_integrity, agentId: row.agent_id, workspace: row.workspace, agentConfigDigest: row.agent_config_digest, agentOrigin: ownership.origin, agentOwnedPaths: ownership.paths, ...clawBootstrapProvenanceFromRow(row), status: row.status, addedAtMs: coerceRequiredSqliteNumber(row.added_at_ms), updatedAtMs: coerceRequiredSqliteNumber(row.updated_at_ms) }; } function selectClawInstallRow(db, agentId) { return db.prepare(`SELECT agent_id, schema_version, source_kind, claw_name, claw_version, package_root, manifest_path, integrity_kind, integrity, source_byte_length, manifest_schema_version, plan_integrity, workspace, agent_config_digest, agent_owned_paths_json, bootstrap_source_path, bootstrap_content_digest, status, added_at_ms, updated_at_ms FROM claw_installs WHERE agent_id = ?`).get(agentId); } function readClawInstallRecordFromDatabase(db, agentId) { const row = selectClawInstallRow(db, agentId); return row ? clawInstallRecordFromRow(row) : void 0; } function readClawInstallRecordsInDatabase(db) { return db.prepare(`SELECT schema_version, source_kind, claw_name, claw_version, package_root, manifest_path, integrity_kind, integrity, source_byte_length, manifest_schema_version, plan_integrity, agent_id, workspace, agent_config_digest, agent_owned_paths_json, bootstrap_source_path, bootstrap_content_digest, status, added_at_ms, updated_at_ms FROM claw_installs ORDER BY agent_id`).all().map(clawInstallRecordFromRow); } function readClawPackageRefsInDatabase(db, options = {}) { const conditions = []; const params = {}; for (const [column, value] of [ ["agent_id", options.agentId], ["package_kind", options.kind], ["package_source", options.source], ["package_ref", options.ref], ["package_version", options.version], ["package_integrity", options.integrity], ["package_status", options.status] ]) if (value !== void 0) { conditions.push(`${column} = @${column}`); params[column] = value; } const where = conditions.length > 0 ? ` WHERE ${conditions.join(" AND ")}` : ""; return db.prepare(`SELECT schema_version, agent_id, claw_name, package_kind, package_source, package_ref, package_version, package_integrity, package_status, relationship, origin, independent_owner, extension_id, extension_format, extension_detected_format, extension_mapped_json, extension_unavailable_json, extension_adapter_identity, installed_at_ms, updated_at_ms FROM claw_package_refs${where} ORDER BY agent_id, package_kind, package_ref`).all(params).map(rowToPackageRef); } function readClawOrphanWorkspaceInDatabase(db, agentId) { const row = executeSqliteQueryTakeFirstSync(db, getNodeSqliteKysely(db).selectFrom("claw_workspace_files").select(["workspace", "updated_at_ms"]).where("agent_id", "=", agentId).orderBy("target_path").limit(1)); return row ? { workspace: row.workspace, updatedAtMs: coerceRequiredSqliteNumber(row.updated_at_ms) } : void 0; } //#endregion export { readClawPackageRefsInDatabase as a, toPackageRefExtensionSqlParams as c, readClawOrphanWorkspaceInDatabase as i, toPackageRefSqlFields as l, readClawInstallRecordFromDatabase as n, CLAW_PACKAGE_REF_SCHEMA_VERSION as o, readClawInstallRecordsInDatabase as r, rowToPackageRef as s, clawInstallRecordFromRow as t };