@sema-agent/core
Version:
Stateless, task-oriented AI agent core
61 lines (60 loc) • 2.49 kB
JavaScript
import { SEMA_DEFAULT_CATALOG } from "./catalog/index.js";
import { composeCatalog, layoutSystemBlocks } from "./composer.js";
import { ABSENT_THIS_RUN } from "./overlay.js";
function supersededLine(s) {
return s.supersededBy === ABSENT_THIS_RUN
? `prompt overlay "${s.id}" (${s.source}, ${s.by}) on "${s.target}" changed nothing: what it names is not in this run (the selector chose no variant of its target, or of the catalog message it takes its text from; or the lower entry it drops was never added — its own condition left it out, or the layer that added it is not in force)`
: `prompt overlay "${s.id}" (${s.source}, ${s.by}) on "${s.target}" is superseded by "${s.supersededBy}", applied after it (source order task < center < deploy; within a source, declaration order)`;
}
export function assemblePrompt(inputs) {
const onWarn = (message) => {
try {
inputs.onWarn?.(message, "prompt-constitution");
}
catch {
}
};
const plan = {
catalog: SEMA_DEFAULT_CATALOG,
...(inputs.host !== undefined ? { host: inputs.host } : {}),
...(inputs.binding !== undefined ? { binding: inputs.binding } : {}),
overlays: [...inputs.taskOverlays, ...inputs.centerOverlays, ...inputs.deployOverlays],
};
const toolNames = inputs.tools.map((t) => t.name);
const renderInputs = (date) => ({
facts: inputs.facts,
toolNames,
...(inputs.workspaceFolder !== undefined ? { workspaceFolder: inputs.workspaceFolder } : {}),
mcpInstructionsBlock: inputs.mcpInstructionsBlock,
environmentBlock: inputs.buildEnvBlock(date),
memoryBlock: inputs.memoryBlock,
modelGuidance: inputs.modelGuidance,
});
let last = composeCatalog(plan, renderInputs(inputs.date));
const named = new Set();
for (const s of last.superseded) {
if (named.has(s.id))
continue;
named.add(s.id);
onWarn(supersededLine(s));
}
return {
renderWithDate: (d) => {
last = composeCatalog(plan, renderInputs(d));
return last.text;
},
get systemPrompt() {
return last.text;
},
get blocks() {
return last.blocks;
},
get sections() {
return last.sections;
},
get systemBlocks() {
return layoutSystemBlocks(last);
},
superseded: last.superseded,
};
}