@sema-agent/core
Version:
Stateless, task-oriented AI agent core
34 lines (33 loc) • 1.74 kB
JavaScript
import { classifierNoRulingAskMessage, classifierUnavailableDenyMessage } from "./auto-mode.js";
import { attest } from "./tool-policy.js";
export function classifierUnavailableDispositionOf(route) {
return route === "none" ? "denied" : "asked";
}
const routeOfSeat = (seat) => (seat?.route === "live_approver" || seat?.route === "durable_park" ? seat.route : "none");
export function classifierNoRulingArm(args) {
const { ask, req, cause } = args;
const route = routeOfSeat(args.seat);
const seated = route !== "none";
if (!args.aborted) {
try {
args.seat?.onUnavailable?.({ toolName: req.toolName, toolCallId: req.toolCallId, cause, route });
}
catch {
}
}
if (seated)
return { kind: "asked", ask: { ...ask, message: classifierNoRulingAskMessage(ask.message ?? `approval required for "${req.toolName}"`, cause), requiresRealApproval: true, classifierNoRuling: cause } };
if (cause === "parse_error")
return { kind: "counted" };
const deny = { action: "deny", message: classifierUnavailableDenyMessage(req.toolName, cause, args.attribution), decisionReason: "classifier" };
return { kind: "denied", deny: attest(deny, req, { classifierCause: "unavailable" }) };
}
export function settleNoRulingAsk(opts) {
const { ask, resolved } = opts;
if (!opts.mintedHere || ask.action !== "ask" || ask.classifierNoRuling === undefined || ask.denialLimitFallback !== undefined)
return undefined;
if (resolved.action !== "deny" || resolved.settlement?.kind !== "policy_refused")
return undefined;
const tracked = opts.tracker?.recordBlock();
return tracked?.limitReached === true ? tracked.fallback : undefined;
}