@sema-agent/core
Version:
Stateless, task-oriented AI agent core
110 lines (109 loc) • 4.81 kB
JavaScript
const STANDARD_DEVICES = [
{ spelled: /^\/dev\/null$/ },
{ spelled: /^\/dev\/stdin$/, descriptor: () => 0 },
{ spelled: /^\/dev\/stdout$/, descriptor: () => 1 },
{ spelled: /^\/dev\/stderr$/, descriptor: () => 2 },
{ spelled: /^\/dev\/tty$/ },
{ spelled: /^\/dev\/fd\/(\d+)$/, descriptor: (m) => Number(m[1]) },
{ spelled: /^\/proc\/self\/fd\/([0-2])$/, descriptor: (m) => Number(m[1]) },
];
export function standardDeviceOf(spelled) {
for (const row of STANDARD_DEVICES) {
const match = row.spelled.exec(spelled);
if (match !== null)
return row.descriptor === undefined ? {} : { descriptor: row.descriptor(match) };
}
return undefined;
}
export const GENERATOR_DEVICES = new Set(["/dev/zero", "/dev/random", "/dev/urandom", "/dev/full"]);
export const newLineDescriptors = () => ({ unknown: false, named: false, bound: new Map() });
export function descriptorsBoundBy(r) {
if (r.fd !== undefined)
return [r.fd];
if (r.op === "&>" || r.op === "&>>")
return [1, 2];
return [r.op === "<" || r.op === "<<<" || r.op === "<&" ? 0 : 1];
}
export function bindDescriptors(into, r) {
for (const fd of descriptorsBoundBy(r))
into.bound.set(fd, (into.bound.get(fd) ?? 0) + 1);
}
const NAMED_DESCRIPTOR_WORD = /^\{[A-Za-z_][A-Za-z0-9_]*\}$/;
export const isNamedDescriptorWord = (raw) => NAMED_DESCRIPTOR_WORD.test(raw);
function reboundBy(text, descriptor, self) {
if (text.unknown || (text.named && descriptor >= 3))
return true;
return (text.bound.get(descriptor) ?? 0) - (self.includes(descriptor) ? 1 : 0) > 0;
}
export function standardDeviceUnrebound(spelled, text, self) {
const device = standardDeviceOf(spelled);
return device !== undefined && (device.descriptor === undefined || !reboundBy(text, device.descriptor, self));
}
export const OPENED_PROVENANCES = new Set(["operand", "option_value", "stdin_redirect", "write_redirect_target", "unlisted_word", "traversal_root"]);
export function passesUnasked(candidate) {
return candidate.device === true && (candidate.face !== "write" || candidate.through === true);
}
const SHELL_CODE_VERBS = new Set(["eval", "source", "."]);
function collectDescriptors(plan, into) {
if (plan.unreadable !== undefined)
into.unknown = true;
for (const segment of plan.segments) {
if (segment.declines.length > 0 || segment.unreadProgramText !== undefined)
into.unknown = true;
if (segment.verb !== undefined && SHELL_CODE_VERBS.has(segment.verb.basename) && segment.nested.length === 0)
into.unknown = true;
if (segment.reads.some((c) => c.provenance === "program_path" && c.expands === "unresolvable"))
into.unknown = true;
for (const r of segment.redirects)
bindDescriptors(into, r);
if (segment.argv.some((w) => isNamedDescriptorWord(w.raw)))
into.named = true;
const text = segment.text.replace(/\\\r?\n/g, "");
if (/(?:^|[^<])<<(?!<)/.test(text)) {
if (/\d<<(?!<)/.test(text))
into.unknown = true;
else
into.bound.set(0, (into.bound.get(0) ?? 0) + 1);
}
for (const n of segment.nested)
collectDescriptors(n, into);
}
}
export function descriptorsOfPlan(plan) {
const into = newLineDescriptors();
collectDescriptors(plan, into);
return into;
}
export function markStandardDevices(plan) {
const text = descriptorsOfPlan(plan);
const mark = (c, self) => {
if (c.device === true || c.expands !== false || c.denyOnly === true || c.speculative !== undefined || !OPENED_PROVENANCES.has(c.provenance))
return c;
return standardDeviceUnrebound(c.spelled, text, self) ? { ...c, device: true } : c;
};
const marked = new Map();
const walk = (p) => {
const seen = marked.get(p);
if (seen !== undefined)
return seen;
const out = markedPlan(p);
marked.set(p, out);
return out;
};
const markedPlan = (p) => ({
...p,
segments: p.segments.map((s) => {
const useOf = (c) => {
const r = s.redirects.find((x) => x.target !== undefined && x.target.raw === c.raw && x.target.provenance === c.provenance);
return r === undefined ? [] : descriptorsBoundBy(r);
};
return {
...s,
reads: s.reads.map((c) => mark(c, c.provenance === "stdin_redirect" ? useOf(c) : [])),
redirects: s.redirects.map((r) => (r.target === undefined ? r : { ...r, target: mark(r.target, descriptorsBoundBy(r)) })),
nested: s.nested.map(walk),
};
}),
});
return walk(plan);
}