@sema-agent/core
Version:
Stateless, task-oriented AI agent core
869 lines (868 loc) • 47.2 kB
JavaScript
import { mailboxCrossProcessMountVerdict } from "../core/mailbox-store.js";
import { decodeEngineFrame, ENGINE_FRAME_CODEC_VERSION, renderTaskNotificationXml, taskNotificationDedupKey } from "../core/task-notification.js";
import { createFrameSettlement, toolResultReceiptKey } from "../core/frame-settlement.js";
import { PRINCIPAL_INBOX_HANDLE } from "./cross-session-ref.js";
import { isGateMintedRecord, principalInboxConsumerOf } from "./org-delivery-gate.js";
import { deliverEngineNotice } from "../core/types.js";
import { buildCrossSessionEnvelope, CrossSessionCodecError, encodePeerAddress } from "./cross-session-envelope.js";
import { judgeCrossSessionInbound, principalInboundLayers, resolveCrossSessionInboundSetting } from "./cross-session-judge.js";
import { judgePeerAdmission, peerAxisToken, resolvePeerLaneConfig } from "./peer-admission.js";
import { isPeerSessionId, PEER_SESSION_ID_GRAMMAR, peerSessionBoxHandle } from "./peer-directory.js";
import { inlineUntrusted } from "../core/untrusted-text.js";
import { createListAgentsTool, LIST_AGENTS_TOOL_ALIAS, LIST_AGENTS_TOOL_NAME } from "./list-agents-tool.js";
import { foldPermissionModeClass } from "./cross-session-judge.js";
import { peerHeldQueueFor } from "./peer-held-queue.js";
import { peerIdleMachineFor } from "./peer-idle.js";
import { describePeerIdleSubscription, isPeerDeliveryReceiptState, isPeerIdleNoticeKind, peerIdleNoticeLabel, renderCrossSessionDeliveryNotice, renderCrossSessionDroppedNotice, renderCrossSessionIdleNotice, resolveCrossSessionDialogExpiry } from "./peer-notices.js";
import { routePeerDeliveryReceipt, routePeerDroppedReceipt, routePeerIdleNotice } from "./peer-notice-route.js";
import { thrownText } from "../core/thrown-value.js";
export const PEER_DRAIN_LEASE_TTL_MS = 5 * 60_000;
export const PEER_SESSION_ID_UNGRAMMATICAL_CODE = "peer.session_id_ungrammatical";
export const PRINCIPAL_INBOX_UNMINTED_CAUSE = "not_minted_by_delivery_gate";
export function terminalsDrainPrincipalInbox(deps) {
return principalInboxConsumerOf(deps).kind === "terminals";
}
export function judgePeerLaneMount(deps, sessionId) {
if (deps.peerDirectory === undefined)
return undefined;
if (deps.mailboxStore === undefined) {
return { ok: false, code: "mailbox.cross_process_unsafe", reason: "RunnerDeps.peerDirectory is wired but RunnerDeps.mailboxStore is not — the cross-session lane parks messages in the recipient's durable session box and has no store to park them in" };
}
const store = mailboxCrossProcessMountVerdict(deps.mailboxStore);
if (!store.ok)
return store;
if (sessionId !== undefined && !isPeerSessionId(sessionId)) {
return {
ok: false,
code: PEER_SESSION_ID_UNGRAMMATICAL_CODE,
reason: `this run's session id ${JSON.stringify(inlineUntrusted(sessionId, 96))} is outside the peer address grammar ${PEER_SESSION_ID_GRAMMAR} — it has no session box to drain and no address a peer could send to (mint session ids the grammar accepts to use the lane)`,
};
}
return { ok: true };
}
export function judgeSessionBoxDrain(deps, leg) {
const mailbox = deps.mailboxStore;
if (mailbox === undefined || leg.isDelegatedChild)
return undefined;
if (!mailboxCrossProcessMountVerdict(mailbox).ok || !isPeerSessionId(leg.sessionId))
return undefined;
return {
mailbox,
scope: leg.scope,
handle: peerSessionBoxHandle(leg.sessionId),
sessionId: leg.sessionId,
...(deps.sessionBoxEngineFrames === true ? { engineFrames: true } : {}),
onError: (e) => deps.onError?.(e, { phase: "degraded", sessionId: leg.sessionId, classification: "session-box-park" }),
};
}
export const PEER_RESUPPLY_CAP = 1;
export function createPeerSessionDrain(opts) {
const { mailbox, sessionId, runId, scope } = opts;
const storedSessionAddress = (fromSession) => fromSession !== undefined && isPeerSessionId(fromSession) ? peerSessionBoxHandle(fromSession) : undefined;
const drainOwner = `drain:${runId}`;
const recipientKey = peerAxisToken(scope, "s", sessionId);
const ttl = opts.leaseTtlMs ?? PEER_DRAIN_LEASE_TTL_MS;
const TERMINAL_DISPOSITIONS = new Set(["committed", "resupply_exhausted", "terminal"]);
const isTerminalDisposition = (d) => d !== undefined && TERMINAL_DISPOSITIONS.has(d.kind);
const clockOpt = opts.clock !== undefined ? { clock: opts.clock } : {};
const mintLane = (kind) => {
const boxHandle = kind === "session" ? peerSessionBoxHandle(sessionId) : PRINCIPAL_INBOX_HANDLE;
return {
kind,
boxHandle,
label: kind === "session" ? "this session's box" : "this principal's inbox",
ledger: new Map(),
ackedUpTo: undefined,
disclosedHeld: new Set(),
held: peerHeldQueueFor(scope, sessionId, kind === "session" ? clockOpt : { ...clockOpt, box: boxHandle }),
};
};
const lanes = opts.principalInbox === true ? [mintLane("session"), mintLane("principal")] : [mintLane("session")];
const sessionLane = lanes[0];
const boxHandle = sessionLane.boxHandle;
const seam = opts.settlement ?? createFrameSettlement();
let inFlight = Promise.resolve();
let noticeRound = 0;
let currentRound;
const idleMachine = peerIdleMachineFor(scope, sessionId, clockOpt);
const disclose = (lane, disposition, cause, m, heldNote) => deliverEngineNotice(opts.onNotice, {
code: "peer.inbound_disposition",
message: `cross-session message seq ${m.seq} in ${lane.label} was ${disposition === "held"
? `HELD${heldNote !== undefined ? ` (${heldNote})` : lane.kind === "session" ? " (it entered this session's held queue and STAYS IN THE BOX \u2014 the box is that queue's durable seat, so it is not acked until it settles; it is re-judged at every boundary, released or refused with a receipt to the sender, and expires with a receipt under dialogExpiry)" : " (it entered this session's held queue for the principal inbox and STAYS IN THE BOX until it settles; it is re-judged at every boundary. The sender is another principal: no receipt reaches it from here \u2014 the delivery gate's receipt is its record)"}`
: disposition === "refused"
? "refused by this session's crossSessionInbound setting"
: disposition === "resupply_exhausted"
? "settled WITHOUT being read: its frame was summarized away by a compaction, re-supplied once, and summarized away again \u2014 the engine has stopped handing it over. The sender was not told; reply-worthy content is GONE from this session's context"
: disposition === "notice_unrouted"
? "settled WITHOUT delivery (a notice-kind record the notice face cannot render)"
: disposition === "notice_user_only"
? "surfaced to the user only (a notice whose sender this session's parity would hold; the model did not read it)"
: "refused by the inbound admission gate"}: ${cause}`,
detail: { disposition, cause, seq: m.seq, box: lane.boxHandle, ...(m.peerMeta?.fromSession !== undefined ? { fromSession: m.peerMeta.fromSession } : {}), sessionId, runId },
});
const readFacts = () => {
const layers = opts.settingLayers() ?? {};
return { setting: resolveCrossSessionInboundSetting(layers), principalSetting: resolveCrossSessionInboundSetting(principalInboundLayers(layers)), selfModeClass: opts.selfModeClass() };
};
const judgeMeta = (facts, meta) => meta?.fromScope !== undefined
? judgeCrossSessionInbound({ setting: facts.principalSetting, selfModeClass: facts.selfModeClass, sender: { fromScope: meta.fromScope } })
: judgeCrossSessionInbound({ setting: facts.setting, selfModeClass: facts.selfModeClass, sender: { ...(meta?.fromMode !== undefined ? { fromMode: meta.fromMode } : {}), selfSent: meta?.fromSession !== undefined && meta.fromSession.toLowerCase() === sessionId.toLowerCase() } });
const route = () => ({
mailbox,
scope,
self: { sessionId, ...(opts.selfName?.() !== undefined ? { name: opts.selfName() } : {}), modeClass: opts.selfModeClass },
...(opts.onError !== undefined ? { onError: opts.onError } : {}),
});
const buildPeerMessagePayload = (lane, m) => {
const { boxHandle } = lane;
const meta = m.peerMeta;
const fields = {
from: encodePeerAddress(storedSessionAddress(meta?.fromSession) ?? (m.from ?? "unknown")),
...(meta?.fromSession !== undefined ? { fromSession: meta.fromSession } : {}),
...(m.from !== undefined ? { fromName: m.from } : {}),
...(meta?.fromMode !== undefined ? { fromMode: meta.fromMode } : {}),
...(meta?.fromScope !== undefined ? { fromScope: meta.fromScope } : {}),
};
buildCrossSessionEnvelope(fields, m.content);
return {
task_id: boxHandle,
task_type: "background_agent",
status: "event",
summary: `cross-session message from ${m.from ?? fields.from}`,
result: m.content,
seq: m.seq,
peer: { hopChain: m.hopChain !== undefined ? [...m.hopChain] : [] },
crossSessionMessage: { ...fields, body: m.content },
_sema_provenance: { kind: "cross_session_message", from: fields.from, taskId: boxHandle, seq: m.seq, ...(meta !== undefined ? { peerMeta: { ...meta } } : {}) },
};
};
const buildNoticePayload = (m, kind, text) => ({
task_id: boxHandle,
task_type: "background_agent",
status: "event",
summary: kind === "delivery_notice" ? "cross-session delivery notice" : "cross-session idle notice",
result: text,
seq: m.seq,
crossSessionNotice: { kind, text },
_sema_provenance: { kind: "cross_session_notice", from: encodePeerAddress(storedSessionAddress(m.peerMeta?.fromSession) ?? (m.from ?? "unknown")), taskId: boxHandle, seq: m.seq, ...(m.peerMeta !== undefined ? { peerMeta: { ...m.peerMeta } } : {}) },
});
const receiptAddress = (lane, entry) => (lane.kind === "session" ? entry.peerMeta?.fromSession : undefined);
const receipt = (lane) => (entry, state) => {
const to = receiptAddress(lane, entry);
if (to === undefined)
return;
if (state === "dropped")
void routePeerDroppedReceipt(route(), to, entry.seq);
else
void routePeerDeliveryReceipt(route(), to, state, entry.seq);
};
const heldSink = (lane, live) => ({
judge: (entry) => judgeMeta(readFacts(), entry.peerMeta),
...(live
? {
inject: (entry) => {
if (currentRound === undefined)
return "deferred";
const payload = buildPeerMessagePayload(lane, entry);
if (currentRound.deliver(payload, "next") === "deferred")
return "deferred";
noteDelivered(lane, entry.seq, 1, payload, currentRound.carrier);
return undefined;
},
}
: {}),
receipt: receipt(lane),
onHeld: (entry, count, cause, reannounce) => {
if (!reannounce && lane.disclosedHeld.has(entry.seq))
return;
lane.disclosedHeld.add(entry.seq);
disclose(lane, "held", cause, entry, reannounce ? `still held; its cause moved to ${cause} (${count} held)` : undefined);
},
onSettled: (entry, settlement, reason, count) => {
if (entry.box === lane.boxHandle && settlement !== "delivered")
lane.ledger.set(entry.seq, { kind: "terminal", why: `held_${settlement}` });
const replyTo = receiptAddress(lane, entry);
deliverEngineNotice(opts.onNotice, {
code: "peer.held_settled",
message: `held cross-session message seq ${entry.seq} left this session's held queue: ${settlement} (${reason}); ${count} still held${settlement === "expired" && reason === "evicted" ? " — the held queue was full, so the oldest entry was expired to make room" : ""}. The sender ${replyTo !== undefined ? "was sent a receipt" : "has no reply address and was not told"}.`,
detail: { settlement, reason, seq: entry.seq, box: lane.boxHandle, ...(entry.peerMeta?.fromSession !== undefined ? { fromSession: entry.peerMeta.fromSession } : {}), heldCount: count, sessionId, runId },
});
},
});
let dialogExpiryMs = resolveCrossSessionDialogExpiry(undefined).ms;
let dialogExpiryAnnounced = false;
const bindHeld = (lane, live) => {
try {
const resolved = resolveCrossSessionDialogExpiry(opts.dialogExpiry?.());
dialogExpiryMs = resolved.ms;
if (resolved.invalid && !dialogExpiryAnnounced) {
dialogExpiryAnnounced = true;
opts.onError?.(new Error(`crossSessionDialogExpiry holds a value outside its vocabulary (60s|5m|10m|never); the default ${resolved.value} is in force for held cross-session messages`), { phase: "degraded", sessionId, classification: "peer-dialog-expiry" });
}
}
catch (e) {
opts.onError?.(e, { phase: "degraded", sessionId, classification: "peer-dialog-expiry" });
}
lane.held.configure({ sink: heldSink(lane, live), dialogExpiryMs });
};
for (const lane of lanes)
bindHeld(lane, true);
idleMachine.target.configure({
notify: (sub, notice) => void routePeerIdleNotice(route(), sub.requester, notice),
judge: (sub) => judgeMeta(readFacts(), { ...(sub.fromMode !== undefined ? { fromMode: sub.fromMode } : {}), ...(sub.selfSent ? { fromSession: sessionId } : {}) }),
heldCount: () => lanes.reduce((n, lane) => n + lane.held.size(), 0),
...(opts.lastTurnText !== undefined ? { lastTurnText: opts.lastTurnText } : {}),
});
idleMachine.requester.configure({
expired: (o) => void routePeerIdleNotice(route(), sessionId, { kind: "expired", label: o.label }),
});
const adoptHeldDecisions = (lane) => {
const decided = lane.held.decisions();
if (decided.size === 0)
return;
for (const [seq, settlement] of decided) {
if (lane.ackedUpTo !== undefined && seq <= lane.ackedUpTo)
continue;
const mine = lane.ledger.get(seq);
if (mine !== undefined && mine.kind !== "held")
continue;
lane.ledger.set(seq, { kind: "terminal", why: `held_${settlement}` });
}
};
const reconcileHeld = (lane, lease) => {
lane.held.reconcile(new Set(lease.messages.map((m) => m.seq)));
let queued;
for (const [seq, d] of lane.ledger) {
if (d.kind !== "held")
continue;
queued ??= new Set(lane.held.list().filter((e) => e.box === lane.boxHandle).map((e) => e.seq));
if (!queued.has(seq))
lane.ledger.delete(seq);
}
};
const wantsCompactionEffects = () => {
for (const lane of lanes)
for (const d of lane.ledger.values())
if (d.kind === "delivered" || d.kind === "committed")
return true;
return false;
};
const noteDelivered = (lane, seq, attempt, payload, carrier) => {
const own = taskNotificationDedupKey(payload);
const key = carrier === undefined ? own : `${carrier}|${own}`;
lane.ledger.set(seq, { kind: "delivered", attempt, key, payload });
currentRound?.tally(lane, attempt);
if (carrier === undefined && payload._sema_provenance?.peerMeta?.fromScope !== undefined) {
try {
opts.markExternalContent?.(`a letter from another principal (cross-principal message seq ${seq} in ${lane.boxHandle}) was delivered into this session`);
}
catch (e) {
opts.onError?.(e, { phase: "degraded", sessionId, classification: "peer-external-mark" });
}
}
seam.awaiting.set(key, carrier === undefined ? { carrier: own } : { carrier, frameText: renderTaskNotificationXml(payload) });
};
const deriveAckPrefix = (lane, messages) => {
let prefix;
for (const m of messages) {
if (lane.ackedUpTo !== undefined && m.seq <= lane.ackedUpTo)
continue;
if (!isTerminalDisposition(lane.ledger.get(m.seq)))
break;
prefix = m.seq;
}
return prefix;
};
const settleLocally = () => {
const landed = seam.compactions.splice(0);
for (const lane of lanes)
settleLaneLocally(lane, landed);
};
const settleLaneLocally = (lane, landed) => {
const { ledger, boxHandle } = lane;
adoptHeldDecisions(lane);
const hostWithheldSeqs = [];
if (seam.receipts.size > 0 || seam.withheld.size > 0 || seam.hostWithheld.size > 0) {
for (const [seq, d] of ledger) {
if (d.kind !== "delivered")
continue;
if (seam.hostWithheld.delete(d.key)) {
ledger.set(seq, { kind: "terminal", why: "host_withheld" });
hostWithheldSeqs.push(seq);
continue;
}
if (seam.withheld.delete(d.key)) {
if (d.attempt > 1)
ledger.set(seq, { kind: "invalidated", attempt: d.attempt - 1, payload: d.payload });
else
ledger.delete(seq);
continue;
}
const entryId = seam.receipts.get(d.key);
if (entryId === undefined)
continue;
seam.receipts.delete(d.key);
ledger.set(seq, { kind: "committed", attempt: d.attempt, key: d.key, entryId, payload: d.payload });
}
}
if (hostWithheldSeqs.length > 0) {
opts.onError?.(new Error(`${hostWithheldSeqs.length} cross-session message frame(s) (seq ${hostWithheldSeqs.join(", ")}) could not be found in this session's ReadInbox result as a postToolUse hook rewrote it (removed, truncated or reshaped beyond whitespace) — settled as the host's decision: they leave ${boxHandle} and are not handed over again`), { phase: "degraded", sessionId, classification: "peer-inbox-host-withheld" });
}
for (const effect of landed) {
for (const [seq, d] of ledger) {
if (d.kind !== "committed")
continue;
if (effect.summarizedEntryIds === "unknown" || effect.summarizedEntryIds.has(d.entryId)) {
ledger.set(seq, { kind: "invalidated", attempt: d.attempt, payload: d.payload });
}
}
}
for (const [seq, d] of ledger) {
if (d.kind === "invalidated" && d.attempt > PEER_RESUPPLY_CAP) {
const meta = d.payload._sema_provenance?.peerMeta;
disclose(lane, "resupply_exhausted", `attempt ${d.attempt} of ${PEER_RESUPPLY_CAP + 1} was summarized away too`, { seq, ...(meta !== undefined ? { peerMeta: meta } : {}) });
ledger.set(seq, { kind: "resupply_exhausted" });
}
}
};
const ackSettledPrefix = async (lane, lease) => {
const { held, ledger, boxHandle } = lane;
const decided = held.decisions();
if (decided.size > 0) {
const live = new Set(lease.messages.map((m) => m.seq));
held.forgetDecisions([...decided.keys()].filter((seq) => !live.has(seq)));
}
const prefix = deriveAckPrefix(lane, lease.messages);
if (prefix !== undefined && (lane.ackedUpTo === undefined || prefix > lane.ackedUpTo)) {
try {
const result = await mailbox.ack(scope, boxHandle, drainOwner, prefix);
if (result.acked) {
lane.ackedUpTo = prefix;
const gone = [];
for (const seq of [...ledger.keys()]) {
if (seq > prefix)
continue;
gone.push(seq);
ledger.delete(seq);
}
held.forgetDecisions(gone);
}
else {
opts.onError?.(new Error(`the ${lane.kind === "session" ? "session box" : "principal inbox"} ${boxHandle} refused this leg's ack up to seq ${prefix}: the drain lease is no longer held by ${drainOwner} (it expired and another cycle claimed it). The records stay parked and the lease holder re-serves them.`), { phase: "degraded", sessionId, classification: "peer-box-ack" });
}
}
catch (e) {
opts.onError?.(e, { phase: "degraded", sessionId, classification: "peer-box-ack" });
}
}
};
const settleNoticeRecord = (facts, m, meta) => {
const notice = meta.notice;
const kind = meta.kind;
const stateFits = notice !== undefined && (kind === "idle_notice" ? isPeerIdleNoticeKind(notice.state) : isPeerDeliveryReceiptState(notice.state));
if (!stateFits) {
disclose(sessionLane, "notice_unrouted", `kind=${kind}${notice === undefined ? " without a typed notice" : ` with state=${inlineUntrusted(notice.state, 32)}`}`, m);
currentRound.dispose(sessionLane, m.seq, `notice_unrouted:${kind}`);
return;
}
let text;
if (kind === "idle_notice") {
const idleKind = notice.state;
const from = meta.fromSession;
const selfAuthored = from !== undefined && from.toLowerCase() === sessionId.toLowerCase();
const settled = from !== undefined && !selfAuthored ? idleMachine.requester.settle(from, idleKind) : { cleared: 0 };
const label = (notice.target !== undefined ? peerIdleNoticeLabel(notice.target) : undefined) ?? settled.label ?? peerIdleNoticeLabel(m.from ?? storedSessionAddress(from) ?? "") ?? "(unnamed session)";
text = renderCrossSessionIdleNotice({ kind: idleKind, label, ...(notice.finishedAt !== undefined ? { finishedAt: notice.finishedAt } : {}), ...(notice.detail !== undefined ? { detail: peerIdleNoticeLabel(notice.detail) ?? "" } : {}) });
}
else {
const state = notice.state;
const recipients = [notice.recipient ?? m.from ?? ""];
text = state === "dropped" ? renderCrossSessionDroppedNotice(1, recipients, [notice.dropReason]) : renderCrossSessionDeliveryNotice(state, 1, recipients);
}
const judged = judgeMeta(facts, meta);
if (judged.verdict === "refuse") {
disclose(sessionLane, "refused", `${judged.cause} (a ${kind})`, m);
}
else if (judged.verdict === "hold") {
disclose(sessionLane, "notice_user_only", `${judged.cause}: ${text}`, m);
}
else {
currentRound.batch.push({ lane: sessionLane, payload: buildNoticePayload(m, kind, text), priority: "next", urgent: false, seq: m.seq, attempt: 1 });
return;
}
currentRound.dispose(sessionLane, m.seq, judged.verdict === "refuse" ? "refused" : "notice_user_only");
};
const settleSubscription = (facts, m, meta) => {
const requester = meta.fromSession;
if (requester === undefined) {
disclose(sessionLane, "notice_unrouted", "kind=idle_subscription without a reply address (fromSession)", m);
currentRound.dispose(sessionLane, m.seq, "subscription_unaddressed");
return;
}
const sub = { requester, ...(m.from !== undefined ? { requesterName: m.from } : {}), ...(meta.fromMode !== undefined ? { fromMode: meta.fromMode } : {}), selfSent: requester.toLowerCase() === sessionId.toLowerCase(), requestedAt: m.sentAt };
const announce = (outcome, live) => deliverEngineNotice(opts.onNotice, {
code: "peer.idle_subscription",
message: outcome === "recorded" || outcome === "refreshed" ? `${describePeerIdleSubscription(encodePeerAddress(peerSessionBoxHandle(requester)))} (${outcome}; ${live} live)` : `A peer session at ${encodePeerAddress(peerSessionBoxHandle(requester))} asked to be told when this session is next idle and was answered "unavailable": ${outcome === "full" ? "this session's subscription table is full" : `this session's crossSessionInbound setting is "refuse"`}.`,
detail: { outcome, fromSession: requester, live, seq: m.seq, box: boxHandle, sessionId, runId },
});
if (facts.setting.value === "refuse") {
void routePeerIdleNotice(route(), requester, { kind: "unavailable" });
announce("refused", idleMachine.target.size());
currentRound.dispose(sessionLane, m.seq, "subscription_refused");
return;
}
const outcome = idleMachine.target.subscribe(sub);
if (outcome === "full")
void routePeerIdleNotice(route(), requester, { kind: "unavailable" });
announce(outcome, idleMachine.target.size());
currentRound.dispose(sessionLane, m.seq, `subscription_${outcome}`);
};
const countWaiting = (lane, lease) => {
if (lease === null)
return { pending: 0, urgent: 0 };
const waiting = lease.messages.filter((m) => {
if (lane.ackedUpTo !== undefined && m.seq <= lane.ackedUpTo)
return false;
const d = lane.ledger.get(m.seq);
return d === undefined || d.kind === "invalidated";
});
return { pending: waiting.length, urgent: waiting.filter((m) => m.peerMeta?.urgent === true).length };
};
let warmedUp = opts.warmup === undefined;
class DrainRound {
limit;
out;
carrier;
charBudget;
injected = 0;
tallies = new Map();
tally(lane, attempt) {
const t = this.tallies.get(lane) ?? { fresh: 0, resupplied: 0 };
if (attempt > 1)
t.resupplied += 1;
else
t.fresh += 1;
this.tallies.set(lane, t);
}
deliveredIn(lane) {
return this.tallies.get(lane) ?? { fresh: 0, resupplied: 0 };
}
dispose(lane, seq, why) {
lane.ledger.set(seq, { kind: "terminal", why });
}
batch = [];
chars = 0;
constructor(limit, out, carrier, charBudget) {
this.limit = limit;
this.out = out;
this.carrier = carrier;
this.charBudget = charBudget;
}
get spent() {
return this.injected + this.batch.length >= this.limit;
}
deliver(payload, priority) {
if (this.spent)
return "deferred";
if (this.out !== undefined) {
if (this.charBudget !== undefined) {
const size = renderTaskNotificationXml(payload).length;
if (this.out.length > 0 && this.chars + size > this.charBudget)
return "deferred";
this.chars += size;
}
this.out.push(payload);
}
else
opts.inject(payload, { priority });
this.injected += 1;
return undefined;
}
}
const drainRound = async (round, pass) => {
if (!warmedUp) {
warmedUp = true;
try {
await opts.warmup();
}
catch {
}
}
const claims = [];
for (const lane of lanes) {
try {
claims.push({ lane, lease: await mailbox.claimLease(scope, lane.boxHandle, drainOwner, ttl) });
}
catch (e) {
opts.onError?.(e, { phase: "degraded", sessionId, classification: "peer-box-claim" });
}
}
if (claims.length === 0)
return { pending: 0, urgent: 0 };
const waitingAcross = () => claims.reduce((sum, { lane, lease }) => {
const c = countWaiting(lane, lease);
return { pending: sum.pending + c.pending, urgent: sum.urgent + c.urgent };
}, { pending: 0, urgent: 0 });
if (pass.settle)
settleLocally();
if (pass.settle)
for (const { lane, lease } of claims)
if (lease !== null)
await ackSettledPrefix(lane, lease);
if (!pass.deliver)
return waitingAcross();
let facts;
let admissionConfig;
try {
facts = readFacts();
admissionConfig = resolvePeerLaneConfig(opts.lane, opts.onNotice);
}
catch (e) {
opts.onError?.(e, { phase: "degraded", sessionId, classification: "peer-box-settings" });
return { pending: 0, urgent: 0 };
}
currentRound = round;
try {
idleMachine.target.sweep();
const leased = claims.filter((c) => c.lease !== null);
if (leased.length === 0)
return { pending: 0, urgent: 0 };
for (const { lane, lease } of leased) {
bindHeld(lane, true);
reconcileHeld(lane, lease);
lane.held.rejudge();
}
try {
for (const { lane, lease } of leased) {
const { ledger, disclosedHeld, held, boxHandle } = lane;
const ackedUpTo = lane.ackedUpTo;
for (const m of lease.messages) {
const prior = ledger.get(m.seq);
if (prior === undefined || prior.kind !== "invalidated")
continue;
if (round.spent)
break;
const attempt = prior.attempt + 1;
round.batch.push({ lane, payload: { ...prior.payload, attempt, resupplied: true }, priority: "next", urgent: false, seq: m.seq, attempt });
}
adoptHeldDecisions(lane);
for (const m of lease.messages) {
if (ackedUpTo !== undefined && m.seq <= ackedUpTo)
continue;
if (ledger.has(m.seq))
continue;
if (round.spent)
break;
const meta = m.peerMeta;
if (lane.kind === "principal" && !isGateMintedRecord(meta)) {
disclose(lane, "admission_refused", PRINCIPAL_INBOX_UNMINTED_CAUSE, m);
round.dispose(lane, m.seq, `admission_refused:${PRINCIPAL_INBOX_UNMINTED_CAUSE}`);
continue;
}
if (m.hopChain !== undefined) {
const verdict = judgePeerAdmission(scope, recipientKey, { senderKey: meta?.senderKey, body: m.content, prospectiveChain: m.hopChain, ownTokens: opts.ownTokens(), seq: m.seq }, admissionConfig, undefined, "drain");
if (!verdict.ok) {
if (verdict.reason === "rate_limited") {
if (!disclosedHeld.has(m.seq)) {
disclosedHeld.add(m.seq);
disclose(lane, "held", verdict.reason, m, "it stays in the box; the inbound admission bucket is empty and it is re-judged at a later boundary once the bucket refills");
}
break;
}
disclose(lane, "admission_refused", verdict.reason, m);
round.dispose(lane, m.seq, `admission_refused:${verdict.reason}`);
continue;
}
}
if (meta?.kind === "idle_subscription") {
settleSubscription(facts, m, meta);
continue;
}
if (meta?.kind === "idle_notice" || meta?.kind === "delivery_notice") {
settleNoticeRecord(facts, m, meta);
continue;
}
if (meta?.kind === "engine_frame") {
const decoded = decodeEngineFrame(m.content);
if (!decoded.ok && decoded.reason === "newer") {
opts.onError?.(new Error(`engine_frame record seq ${m.seq} in ${boxHandle} carries codec version ${decoded.codecVersion}; this engine reads up to ${ENGINE_FRAME_CODEC_VERSION} — the box stops at that record until an engine that reads it drains the session`), { phase: "degraded", sessionId, classification: "peer-box-engine-frame" });
break;
}
if (!decoded.ok) {
disclose(lane, "notice_unrouted", `kind=engine_frame (${decoded.detail})`, m);
round.dispose(lane, m.seq, `engine_frame_malformed:${decoded.detail}`);
continue;
}
round.batch.push({ lane, payload: decoded.payload, priority: decoded.priority, urgent: false, seq: m.seq, attempt: 1 });
continue;
}
const sameTree = meta?.fromRoot !== undefined && meta.fromRoot.toLowerCase() === sessionId.toLowerCase();
if (!sameTree) {
const judged = judgeMeta(facts, meta);
if (judged.verdict === "refuse") {
disclose(lane, "refused", judged.cause, m);
round.dispose(lane, m.seq, `refused:${judged.cause}`);
continue;
}
if (judged.verdict === "hold") {
held.hold({ seq: m.seq, box: boxHandle, content: m.content, ...(m.from !== undefined ? { from: m.from } : {}), sentAt: m.sentAt, ...(m.hopChain !== undefined ? { hopChain: [...m.hopChain] } : {}), ...(meta !== undefined ? { peerMeta: { ...meta } } : {}), cause: judged.cause });
if (!ledger.has(m.seq))
ledger.set(m.seq, { kind: "held" });
continue;
}
}
let payload;
try {
payload = buildPeerMessagePayload(lane, m);
}
catch (e) {
disclose(lane, "refused", `record fields cannot be rendered canonically (${e instanceof CrossSessionCodecError ? e.code : thrownText(e)})`, m);
round.dispose(lane, m.seq, "uncanonical_fields");
continue;
}
round.batch.push({ lane, payload, priority: "next", urgent: meta?.urgent === true, seq: m.seq, attempt: 1 });
}
}
}
finally {
const ordered = round.batch.splice(0).sort((a, b) => Number(b.urgent) - Number(a.urgent));
for (const item of ordered) {
try {
if (round.deliver(item.payload, item.priority) === "deferred")
continue;
}
catch (e) {
opts.onError?.(e, { phase: "degraded", sessionId, classification: "peer-box-inject" });
break;
}
noteDelivered(item.lane, item.seq, item.attempt, item.payload, round.carrier);
}
}
for (const { lane, lease } of leased) {
const counts = countWaiting(lane, lease);
if (counts.pending === 0 || round.out !== undefined)
continue;
const { boxHandle } = lane;
const delivered = round.deliveredIn(lane);
noticeRound += 1;
try {
opts.inject({
task_id: `inbox:${boxHandle}`,
task_type: "background_agent",
status: "event",
seq: noticeRound,
summary: `inbox notice: ${counts.pending} cross-session message(s) waiting`,
inboxNotice: { pending: counts.pending, delivered: delivered.fresh, ...(delivered.resupplied > 0 ? { resupplied: delivered.resupplied } : {}), ...(counts.urgent > 0 ? { urgent: counts.urgent } : {}), box: boxHandle },
_sema_provenance: { kind: "inbox_notice", from: boxHandle, taskId: `inbox:${boxHandle}`, seq: noticeRound },
}, { priority: "next" });
}
catch (e) {
opts.onError?.(e, { phase: "degraded", sessionId, classification: "peer-box-inject" });
}
}
return waitingAcross();
}
finally {
currentRound = undefined;
}
};
const boundPass = (pass) => async () => {
await drainRound(new DrainRound(resolvePeerLaneConfig(opts.lane, opts.onNotice).maxMessagesPerRound, undefined), pass);
};
const serialize = (once) => {
inFlight = inFlight.then(once, once);
return inFlight;
};
const drain = () => serialize(boundPass({ settle: true, deliver: true }));
const boundaryRound = (o) => serialize(boundPass({ settle: true, deliver: o.continues }));
const pull = (limit, toolCallId, charBudget) => {
const out = [];
const bound = limit !== undefined && Number.isInteger(limit) && limit > 0 ? limit : resolvePeerLaneConfig(opts.lane, opts.onNotice).maxMessagesPerRound;
let counts = { pending: 0, urgent: 0 };
const once = async () => {
counts = await drainRound(new DrainRound(bound, out, toolCallId !== undefined ? toolResultReceiptKey(toolCallId) : undefined, charBudget), { settle: false, deliver: true });
};
const settled = inFlight.then(once, once);
inFlight = settled;
return settled.then(() => ({ delivered: out, pending: counts.pending, urgent: counts.urgent }));
};
const finishOnce = async () => {
const claimed = [];
for (const lane of lanes) {
try {
claimed.push({ lane, lease: await mailbox.claimLease(scope, lane.boxHandle, drainOwner, ttl) });
}
catch (e) {
opts.onError?.(e, { phase: "degraded", sessionId, classification: "peer-box-claim" });
}
}
if (claimed.length > 0) {
try {
settleLocally();
for (const { lane, lease } of claimed)
if (lease !== null)
await ackSettledPrefix(lane, lease);
}
catch (e) {
opts.onError?.(e, { phase: "degraded", sessionId, classification: "peer-box-claim" });
}
}
for (const lane of lanes) {
lane.held.detachLeg();
try {
await mailbox.releaseLease(scope, lane.boxHandle, drainOwner);
}
catch {
}
}
};
const finish = () => {
inFlight = inFlight.then(finishOnce, finishOnce);
return inFlight;
};
return {
drain,
boundaryRound,
pull,
isBoxBacked: (payload) => {
const p = payload;
if (p === null || typeof p !== "object" || typeof p.task_id !== "string" || typeof p.status !== "string")
return false;
const key = taskNotificationDedupKey(p);
for (const lane of lanes)
for (const d of lane.ledger.values())
if (d.kind === "delivered" && d.key === key)
return true;
return false;
},
finish,
wantsCompactionEffects,
busy: () => idleMachine.target.busy(),
idle: (finishedAt) => idleMachine.target.idle(finishedAt),
held: sessionLane.held,
...(lanes[1] !== undefined ? { principalHeld: lanes[1].held } : {}),
idleMachine,
};
}
function peerModeClassOf(refs) {
return refs.askEffective !== undefined ? foldPermissionModeClass(refs.permissionMode?.(), refs.askEffective) : "unknown";
}
export function announcePeerLaneMount(deps, leg) {
const verdict = judgePeerLaneMount(deps, leg.sessionId);
if (verdict === undefined)
return false;
if (verdict.ok)
return true;
deliverEngineNotice(deps.onNotice, {
code: "config.peer_lane_unmounted",
message: `Cross-session lane NOT mounted for this run: ${verdict.reason}. ListAgents is not mounted and peer-session addresses refuse with that reason${verdict.code === PEER_SESSION_ID_UNGRAMMATICAL_CODE ? "." : "; wire a mailbox store that declares crossProcessSafe: true (the bundled FileMailboxStore does)."}`,
detail: { reason: verdict.reason, code: verdict.code, mailboxWired: deps.mailboxStore !== undefined, sessionId: leg.sessionId, runId: leg.runId },
});
return false;
}
export function peerLaneSendMessageSeats(args) {
return {
peerDirectory: args.peerDirectory,
...(args.listingMounted !== undefined ? { peerListingMounted: args.listingMounted } : {}),
peerSelfSession: {
sessionId: args.sessionId,
scope: args.scope,
...(args.name !== undefined ? { name: args.name } : {}),
modeClass: () => peerModeClassOf(args.refs),
},
};
}
export function listAgentsMountable(face) {
return face.leaves({ name: LIST_AGENTS_TOOL_NAME, aliases: [LIST_AGENTS_TOOL_ALIAS] }) && listAgentsNameFree(face.specTools);
}
function listAgentsNameFree(specTools) {
return !specTools.some((t) => t.name === LIST_AGENTS_TOOL_NAME || t.name === LIST_AGENTS_TOOL_ALIAS || t.aliases?.includes(LIST_AGENTS_TOOL_NAME) || t.aliases?.includes(LIST_AGENTS_TOOL_ALIAS));
}
export function mountListAgents(args) {
if (!listAgentsNameFree(args.specTools))
return undefined;
args.toolEffects.set(LIST_AGENTS_TOOL_NAME, "read");
args.toolEffects.set(LIST_AGENTS_TOOL_ALIAS, "read");
return createListAgentsTool({
...(args.peerDirectory !== undefined ? { peerDirectory: args.peerDirectory } : {}),
...(args.freshWindowMs !== undefined ? { freshWindowMs: args.freshWindowMs } : {}),
self: { sessionId: args.sessionId, scope: args.scope },
registry: args.registry,
access: { owner: args.hostTaskId, scope: args.scope, sessionId: args.sessionId },
...(args.parentTaskId !== undefined ? { parentAccess: { owner: args.parentTaskId, scope: args.scope, ...(args.parentSessionId !== undefined ? { sessionId: args.parentSessionId } : {}) } } : {}),
...(args.roster !== undefined ? { roster: args.roster } : {}),
...(args.continuationTier !== undefined ? { continuationTier: args.continuationTier } : {}),
...(args.readSeats ?? {}),
});
}
export function bindPeerSessionDrain(harness, opts) {
const drain = createPeerSessionDrain(opts);
const round = async () => {
await drain.drain();
return undefined;
};
harness.on("before_agent_start", async () => {
drain.busy();
return round();
});
harness.subscribe((event) => {
if (event.type === "agent_end")
return drain.finish().catch(() => undefined);
if (event.type === "settled") {
const nothingQueued = (event.nextTurnCount ?? 0) === 0 && event.undrainedSteerCount === undefined && event.undrainedFollowUpCount === undefined;
let parked = false;
try {
parked = opts.parked?.() ?? false;
}
catch {
parked = true;
}
if (nothingQueued && !parked)
drain.idle(Date.now());
}
return undefined;
});
return drain;
}
export function bindPeerLaneDrain(harness, args) {
const { deps } = args;
let rowName;
const lookupRowName = async () => {
if (deps.peerDirectory === undefined)
return;
try {
const rows = await deps.peerDirectory.listPeerSessions({ scope: args.scope });
rowName = rows.find((r) => r.sessionId.toLowerCase() === args.sessionId.toLowerCase())?.name;
}
catch {
rowName = undefined;
}
};
const drain = bindPeerSessionDrain(harness, {
mailbox: deps.mailboxStore,
sessionId: args.sessionId,
runId: args.runId,
scope: args.scope,
...(terminalsDrainPrincipalInbox(deps) ? { principalInbox: true } : {}),
inject: args.inject,
...(deps.peerLane !== undefined ? { lane: deps.peerLane } : {}),
ownTokens: args.ownTokens,
settingLayers: () => (typeof deps.crossSessionInbound === "function" ? deps.crossSessionInbound() : deps.crossSessionInbound),
selfModeClass: () => peerModeClassOf(args.refs),
dialogExpiry: () => (typeof deps.crossSessionDialogExpiry === "function" ? deps.crossSessionDialogExpiry() : deps.crossSessionDialogExpiry),
selfName: () => rowName ?? args.selfName?.(),
warmup: lookupRowName,
...(args.settlement !== undefined ? { settlement: args.settlement } : {}),
...(args.parked !== undefined ? { parked: args.parked } : {}),
...(args.lastTurnText !== undefined ? { lastTurnText: args.lastTurnText } : {}),
...(args.markExternalContent !== undefined ? { markExternalContent: args.markExternalContent } : {}),
...(deps.onNotice !== undefined ? { onNotice: deps.onNotice } : {}),
...(deps.onError !== undefined ? { onError: deps.onError } : {}),
});
args.refs.pull = (limit, toolCallId, charBudget) => drain.pull(limit, toolCallId, charBudget);
args.refs.boundaryRound = (o) => drain.boundaryRound(o);
args.refs.isBoxBacked = (payload) => drain.isBoxBacked(payload);
if (args.settlement !== undefined)
args.settlement.wantsEffects = () => drain.wantsCompactionEffects();
return drain;
}