@sema-agent/core
Version:
Stateless, task-oriented AI agent core
53 lines (52 loc) • 2.67 kB
JavaScript
import { createSubagentWorktreeHelper } from "../../agents/subagent.js";
import { SubagentRetainLedger } from "../../agents/retain-ledger.js";
import { SkillGrantTable } from "../skill-grant.js";
import { forwardSafely } from "./forward-sink.js";
import { createEditedFilesLedger } from "./edited-files-ledger.js";
export function forwardsSubagentEvents(spec) {
return spec.forwardSubagentEvents === true;
}
export function drainForwardedFramesBeforeDone() {
return new Promise((resolve) => setImmediate(resolve));
}
export function prepareRunRefs(input) {
const { spec, internals, executionEnv, taskRootFinal } = input;
const { note: noteFileEdited, snapshot: editedFilesSnapshot } = createEditedFilesLedger();
const harnessRef = {};
const toolProgressRef = {};
const skillGrants = new SkillGrantTable();
const sinkWired = internals?.onForwardEvent !== undefined;
const forwardEvent = sinkWired
? (e) => {
if (e.type === "task_progress")
forwardSafely(internals, e);
else if (spec.forwardSubagentEvents === true &&
(e.type === "text_delta" || e.type === "text_end" || e.type === "reasoning_delta" || e.type === "tool_start" || e.type === "tool_progress" || e.type === "tool_end")) {
forwardSafely(internals, e);
}
}
: undefined;
const reviewRequestRef = {};
const requestReview = (opts) => {
if (reviewRequestRef.pending === undefined) {
reviewRequestRef.pending = opts?.reason !== undefined ? { reason: opts.reason } : {};
}
};
const stopRequestedRef = { current: false };
const requestStopAfterTurn = () => {
stopRequestedRef.current = true;
harnessRef.current?.requestStopAfterTurn();
};
let permissionModeSeat;
const bindPermissionModeSeat = (seat) => {
permissionModeSeat = seat;
};
const enterPlanMode = async () => {
if (permissionModeSeat === undefined)
throw new Error("enterPlanMode: the leg's permission-mode seat is not bound yet");
await permissionModeSeat.steer("plan");
};
const subagentRetain = spec.retainSubagentSessions ? new SubagentRetainLedger(spec.retainSubagentSessions) : undefined;
const worktreeIsolation = spec.handsReadOnly !== true ? createSubagentWorktreeHelper(executionEnv, taskRootFinal) : undefined;
return { noteFileEdited, editedFilesSnapshot, harnessRef, toolProgressRef, skillGrants, forwardEvent, reviewRequestRef, requestReview, stopRequestedRef, requestStopAfterTurn, bindPermissionModeSeat, enterPlanMode, subagentRetain, worktreeIsolation };
}