UNPKG

@sema-agent/core

Version:

Stateless, task-oriented AI agent core

34 lines (33 loc) • 1.74 kB
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; }