UNPKG

@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
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 };