UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

63 lines (62 loc) • 2.89 kB
import { l as resolveSessionStorePathCore } from "./paths-CAzSovN1.mjs"; import { h as isSessionWorkAdmissionActive, m as isSessionLifecycleMutationActive } from "./session-lifecycle-admission-CfvRX206.mjs"; import "./session-accessor-BM3Wa1Bx.mjs"; import { a as resolveSessionEntryAccessTarget } from "./session-accessor.entry-BoDZTg0e.mjs"; import { a as prepareSessionWorkerPlacementMutationCheck } from "./session-placement-lifecycle-BqtqNz6X.mjs"; import { t as resolveSessionWorkerPlacementContext } from "./session-worker-placement-context-DWr7ebl0.mjs"; import "./service-q3EuGfAd.mjs"; //#region src/agents/worktrees/owner-protection.ts function createManagedWorktreeOwnerPolicy(cfg, now = Date.now) { const placementChecks = /* @__PURE__ */ new Map(); const state = (ownerKind, ownerId) => { if (ownerKind !== "session") return "other"; try { const target = resolveSessionEntryAccessTarget({ cfg, sessionKey: ownerId }); const entry = target.entry; const scope = resolveSessionStorePathCore(cfg.session?.store, { agentId: target.agentId }); const identities = [ target.canonicalKey, ownerId, entry?.sessionId ]; if (isSessionWorkAdmissionActive(scope, identities) || isSessionLifecycleMutationActive(scope, identities)) return "active"; let placementCheck = placementChecks.get(target.canonicalKey); if (placementCheck && placementCheck.sessionId !== entry?.sessionId) return "active"; if (!placementCheck) { const context = resolveSessionWorkerPlacementContext(); const store = context.workerSessionPlacementService; if (!store?.listForReconcile) return "active"; const related = () => store.listForReconcile(target.canonicalKey).map((placement) => placement.sessionId).toSorted(); const initial = related(); const checks = [.../* @__PURE__ */ new Set([...initial, ...entry?.sessionId ? [entry.sessionId] : []])].map((sessionId) => prepareSessionWorkerPlacementMutationCheck({ context, sessionId })); const assertCurrent = () => { if (JSON.stringify(related()) !== JSON.stringify(initial)) throw new Error("worktree worker placement changed during cleanup"); for (const check of checks) check(); }; placementCheck = { sessionId: entry?.sessionId, assertCurrent }; placementChecks.set(target.canonicalKey, placementCheck); } placementCheck.assertCurrent(); if (!entry || entry.archivedAt !== void 0) return "retired"; const activityAt = Math.max(entry?.lastInteractionAt ?? 0, entry?.updatedAt ?? 0); return activityAt > 0 && now() - activityAt <= 6048e5 ? "active" : "idle"; } catch { return "active"; } }; return { shouldProtectOwner: (kind, id) => state(kind, id) === "active", shouldRemoveOwner: (kind, id) => state(kind, id) === "retired" }; } //#endregion export { createManagedWorktreeOwnerPolicy as t };