openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
63 lines (62 loc) • 2.93 kB
JavaScript
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 };