@stll/folio-agents
Version:
Framework-neutral LLM tool layer over folio's ai-edits engine: function-calling tools so an agent can read and mutate .docx documents through @stll/folio-core.
46 lines (45 loc) • 2.79 kB
JavaScript
import { compareDocxVersions as compareDocxVersions$1, generateRedlineDocx as generateRedlineDocx$1 } from "@stll/folio-core/server";
//#region src/compare.ts
/** Compare two `.docx` buffers using folio-core's version comparison semantics. */
const compareDocxVersions = (base, revised, options = {}) => compareDocxVersions$1(base, revised, options);
/** Generate a reviewed package from two `.docx` buffers. */
const generateRedlineDocx = (base, revised, options = {}) => generateRedlineDocx$1(base, revised, options);
const ELLIPSIS = "…";
const UNCHANGED_EDGE_CHARS = 30;
const truncateUnchangedRun = (text) => {
if (text.length <= 61) return text;
return `${text.slice(0, UNCHANGED_EDGE_CHARS)}${ELLIPSIS}${text.slice(-30)}`;
};
const renderSegment = (segment) => {
switch (segment.type) {
case "equal": return truncateUnchangedRun(segment.text);
case "del": return `[-${segment.text}-]`;
case "ins": return `{+${segment.text}+}`;
default: return "";
}
};
const formatChangeLine = (change) => {
switch (change.type) {
case "added": return `+ [${change.blockId}] added: ${change.text}`;
case "deleted": return `- [${change.blockId}] deleted: ${change.text}`;
case "modified": return `~ [${change.blockId}] modified: ${change.segments.map(renderSegment).join("")}`;
case "formatChanged": return `~ [${change.blockId}] format changed (${change.changedProperties.join(", ")}): ${truncateUnchangedRun(change.text)}`;
case "movedFrom": return `< [${change.blockId}] moved away (move ${change.moveGroupId}): ${truncateUnchangedRun(change.text)}`;
case "movedTo": return `> [${change.blockId}] moved here (move ${change.moveGroupId}): ${truncateUnchangedRun(change.text)}`;
default: return "";
}
};
/** Render a structured version diff as compact, deterministic model input. */
const formatVersionDiffForLLM = (diff) => {
const { added, deleted, modified, formatChanged, moved, metadataChanged, unchanged } = diff.summaryCounts;
const header = `Version diff: ${added} added, ${deleted} deleted, ${modified} modified, ${formatChanged} format-changed, ${moved} moved${metadataChanged > 0 ? `, ${metadataChanged} metadata-changed` : ""}, ${unchanged} unchanged`;
const metadataLines = diff.metadataChanges.map(({ property, baseValue, revisedValue }) => `~ metadata.${property}: ${JSON.stringify(baseValue)} -> ${JSON.stringify(revisedValue)}`);
return [
header,
...diff.privacyReport.appliedTransforms.length === 0 ? [] : [`Privacy transforms: ${diff.privacyReport.appliedTransforms.join(", ")}`, `Removed metadata fields: ${diff.privacyReport.removedMetadataProperties.join(", ") || "none"}`],
...diff.changes.map(formatChangeLine),
...metadataLines
].join("\n");
};
//#endregion
export { compareDocxVersions, formatVersionDiffForLLM, generateRedlineDocx };