UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

63 lines (62 loc) 2.93 kB
import { o as resolveSessionStorePathCore } from "./paths-CXdaYWF_.js"; import "./session-accessor-YsytfDtG.js"; import { m as isSessionWorkAdmissionActive, p as isSessionLifecycleMutationActive } from "./session-lifecycle-admission-CS8v45tk.js"; import { a as resolveSessionEntryAccessTarget } from "./session-accessor.entry-CQ2WPpfn.js"; import { n as prepareSessionWorkerPlacementMutationCheck } from "./session-placement-lifecycle-7DQHpaT9.js"; import "./service-B1SvAvxa.js"; import { t as resolveSessionWorkerPlacementContext } from "./session-worker-placement-context-BPME1dHp.js"; //#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().filter((placement) => placement.sessionKey === 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 };