@sema-agent/core
Version:
Stateless, task-oriented AI agent core
99 lines (98 loc) • 4.17 kB
JavaScript
import { composePostureFrames, owedPostureRow, postureStandingOf } from "../auto-mode-directive.js";
import { PRESENT_PLAN_TOOL_NAME } from "../present-plan-tool.js";
import { mintSystemReminder } from "../reminder-mint.js";
import { thrownText } from "../thrown-value.js";
import { rosterEntryNamed } from "../tool-roster.js";
import { sanitizeUntrustedText } from "../untrusted-text.js";
import { gitRestateOption } from "./git-leg-delivery.js";
import { attachmentEnvelopeTags } from "./turn-attachments.js";
export function postureFactsOf(prepared) {
return {
mode: prepared.approvalPosture.mode,
askEffective: prepared.approvalPosture.askEffective,
exitToolMounted: rosterEntryNamed(prepared.toolRoster, PRESENT_PLAN_TOOL_NAME) !== undefined,
isChildLeg: prepared.hookIdentity.isDelegatedChild,
};
}
export async function owedPostureText(prepared, ask) {
const facts = postureFactsOf(prepared);
const owed = owedPostureRow(facts) ?? null;
const ref = prepared.postureFrameRef;
if (ask === "on_change" && ref.composedFor === owed && owed?.cadence === undefined)
return undefined;
let messages = [];
let read = true;
try {
messages = (await prepared.session.buildContext()).messages;
}
catch {
read = false;
}
ref.composedFor = read ? owed : undefined;
const frames = composePostureFrames(facts, postureStandingOf(messages, prepared.reminderMark));
if (frames.length === 0)
return undefined;
const text = frames.map((frame) => mintSystemReminder(frame, prepared.reminderMark)).join("\n");
ref.protectedText = text;
return text;
}
export function postureRestateOption(prepared) {
if (owedPostureRow(postureFactsOf(prepared)) === undefined)
return {};
return {
postureRestate: () => appendOwedPosture(prepared, "always"),
};
}
export async function appendOwedPosture(prepared, ask) {
const ref = prepared.postureFrameRef;
const text = await owedPostureText(prepared, ask);
if (text === undefined) {
if (ref.composedFor !== undefined)
ref.unwritten = undefined;
return;
}
const unwritten = () => {
ref.composedFor = undefined;
ref.unwritten = text;
};
if (prepared.batchHaltRef.current !== undefined)
return unwritten();
try {
await prepared.session.appendMessage({ role: "user", content: [{ type: "text", text }], timestamp: Date.now(), engineMinted: true });
ref.unwritten = undefined;
}
catch (err) {
unwritten();
try {
ref.report?.(new Error(`permission posture frames could not be written to the transcript (stated on the next request's view only; the next boundary writes them): ${thrownText(err)}`));
}
catch {
}
}
}
export function mintOutputStyleReminder(prepared) {
return prepared.outputStyleFrame === undefined ? undefined : mintSystemReminder(sanitizeUntrustedText(prepared.outputStyleFrame, attachmentEnvelopeTags("output_style")), prepared.reminderMark);
}
async function appendOutputStyleRestate(prepared) {
const text = mintOutputStyleReminder(prepared);
if (text === undefined)
return;
try {
await prepared.session.appendMessage({ role: "user", content: [{ type: "text", text }], timestamp: Date.now(), engineMinted: true });
}
catch (err) {
try {
prepared.postureFrameRef.report?.(new Error(`the output style frame could not be written to the transcript (the next boundary a queued input continues asks again): ${thrownText(err)}`));
}
catch {
}
}
}
export function appendBoundaryFrames(prepared, turnHadToolCalls) {
const styleOwed = prepared.outputStyleFrame !== undefined && !turnHadToolCalls && prepared.harness.pendingInjectionCount() > 0;
const posture = appendOwedPosture(prepared, "on_change");
return styleOwed ? posture.then(() => appendOutputStyleRestate(prepared)) : posture;
}
export function compactionRestateOptions(prepared) {
return { ...gitRestateOption(prepared), ...postureRestateOption(prepared) };
}