New

docx-editor 1.x has shipped. Vue support, i18n, agents. Read the migration guide →

API Referencev1.0.2

@eigenpal/docx-editor-core/headless

Headless aggregate for Node.js scripts, CLI tools, and server-side processing. Same surface as the default `.` entry, named to make the "no DOM" intent explicit. Prefer the smaller subpaths (`./docx`, `./agent`, `./utils`, etc.) for new code — they tree-shake better.

Functions(98)

fn

attemptSelectiveSave

packages/core/src/core.ts:38

Attempt a selective save — patch only changed paragraphs in document.xml. Also updates comments, headers/footers, and core properties so that all document parts stay in sync even when only paragraphs are patched.

Returns the saved ArrayBuffer, or null if selective save is not possible (caller should fall back to full repack).

declare function attemptSelectiveSave(doc: Document, originalBuffer: ArrayBuffer, options: SelectiveSaveOptions): Promise<ArrayBuffer | null>;

Blend two colors together

declare function blendColors(color1: ColorValue | undefined | null, color2: ColorValue | undefined | null, ratio: number, theme: Theme | null | undefined): string;

Build extended selection context with additional details

declare function buildExtendedSelectionContext(doc: Document, range: Range, options?: SelectionContextOptions): ExtendedSelectionContext;
fn

buildPatchedDocumentXml

packages/core/src/core.ts:39

Build a patched document.xml by splicing new paragraph XML into the original at the correct offsets. Only changed paragraphs are replaced; everything else is preserved byte-for-byte.

Returns null if any step fails.

declare function buildPatchedDocumentXml(originalXml: string, serializedXml: string, changedIds: Set<string>): string | null;

Build selection context for AI operations

declare function buildSelectionContext(doc: Document, range: Range, options?: SelectionContextOptions): SelectionContext;
fn

buildSelectionContextFromContext

Build selection context for AI operations

declare function buildSelectionContext$1(doc: Document, range: Range, options?: SelectionContextOptions$1): SelectionContext;

Check if two colors are equal

declare function colorsEqual(color1: ColorValue | undefined | null, color2: ColorValue | undefined | null, theme: Theme | null | undefined): boolean;

Compare two positions Returns: -1 if a b, 0 if equal, 1 if a b

declare function comparePositions(a: Position, b: Position): -1 | 0 | 1;

Count characters in text

declare function countCharacters(text: string, includeSpaces?: boolean): number;

Count words in text

declare function countWords(text: string): number;

Create a DocumentAgent from a DOCX buffer

declare function createAgent(buffer: ArrayBuffer): Promise<DocumentAgent>;

Create a DocumentAgent from a parsed Document

declare function createAgentFromDocument(document: Document): DocumentAgent;

Create a collapsed range (cursor) at a position

declare function createCollapsedRange(position: Position): Range;

Create a command with generated ID

declare function createCommand<T extends AgentCommand>(command: Omit<T, 'id'>): T;

Create a document with a single paragraph containing the given text

declare function createDocumentWithText(text: string, options?: Omit<CreateEmptyDocumentOptions, 'initialText'>): Document;

Create a new DOCX from a Document (without requiring original buffer)

declare function createDocx(doc: Document): Promise<ArrayBuffer>;

Create an empty document with a single paragraph

declare function createEmptyDocument(options?: CreateEmptyDocumentOptions): Document;
```ts
// Create a blank document
const doc = createEmptyDocument();

// Create with custom margins
const doc = createEmptyDocument({
  marginTop: 720,  // 0.5 inch
  marginBottom: 720,
});

// Create with initial text
const doc = createEmptyDocument({
  initialText: 'Hello, World!'
});
```

Create a plugin registration helper with options pre-configured

declare function createPluginRegistrar(options: PluginOptions): (plugin: CorePlugin) => PluginRegistrationResult;

Create a range from two positions

declare function createRange(start: Position, end: Position): Range;

Create a ColorValue from RGB hex

declare function createRgbColor(hex: string): ColorValue;

Create a template processor with preset options

declare function createTemplateProcessor(defaultOptions?: ProcessTemplateOptions): (buffer: ArrayBuffer, variables: Record<string, string>) => ArrayBuffer;

Create a ColorValue from theme color reference

declare function createThemeColor(themeColor: ThemeColorSlot, tint?: number, shade?: number): ColorValue;

Darken a color by a percentage

declare function darkenColor(color: ColorValue | undefined | null, theme: Theme | null | undefined, percent: number): string;

Detect all template variables in a document

declare function detectVariables(doc: Document): string[];

Detect variables with detailed information

declare function detectVariablesDetailed(doc: Document): VariableDetectionResult;

Detect variables in document body

declare function detectVariablesInBody(body: DocumentBody): string[];

Detect variables in a paragraph

declare function detectVariablesInParagraph(paragraph: Paragraph): string[];

Check if document has any template variables

declare function documentHasVariables(doc: Document): boolean;

Convert EMUs to pixels (at 96 DPI)

1 inch = 914400 EMUs = 96 pixels Returns 0 for null/undefined/NaN inputs.

declare function emuToPixels(emu: number | undefined | null): number;

Convert EMUs to twips

declare function emuToTwips(emu: number): number;

Execute an agent command on a document Returns a new document with the command applied (immutable)

Dispatch order: 1. Try plugin handlers first (allows plugins to override built-in commands) 2. Fall back to built-in handlers

declare function executeCommand(doc: Document, command: AgentCommand): Document;

Execute multiple commands in sequence

declare function executeCommands(doc: Document, commands: AgentCommand[]): Document;

Extract variable names from text

declare function extractVariablesFromText(text: string): string[];

Format a pixel value as CSS string

declare function formatPx(px: number): string;

Format a variable name with braces (standard docxtemplater syntax)

declare function formatVariable(name: string): string;

Get action description

declare function getActionDescription(action: AIAction): string;

Get action label

declare function getActionLabel(action: AIAction): string;

Build agent context from a document

declare function getAgentContext(doc: Document, options?: AgentContextOptions): AgentContext;

Get block index for a paragraph index

declare function getBlockIndexForParagraph(body: DocumentBody, paragraphIndex: number): number;

Get character count from document body

declare function getBodyCharacterCount(body: DocumentBody): number;

Get plain text from document body

declare function getBodyText(body: DocumentBody): string;

Get word count from document body

declare function getBodyWordCount(body: DocumentBody): number;

Get contrasting text color for a background

declare function getContrastingColor(backgroundColor: ColorValue | undefined | null, theme: Theme | null | undefined): string;

Get a simple document summary for quick context

declare function getDocumentSummary(doc: Document): string;

Get formatting at a specific position in a paragraph

declare function getFormattingAtPosition(paragraph: Paragraph, offset: number): Partial<TextFormatting>;

Get hyperlink at position

declare function getHyperlinkAtPosition(paragraph: Paragraph, offset: number): Hyperlink | undefined;

Get plain text from a hyperlink

declare function getHyperlinkText(hyperlink: Hyperlink): string;

Check if all required variables have values

declare function getMissingVariables(tags: string[], variables: Record<string, string>): string[];

Get paragraph at index from document body

declare function getParagraphAtIndex(body: DocumentBody, index: number): Paragraph | undefined;

Get all paragraphs from document body

declare function getParagraphs(body: DocumentBody): Paragraph[];

Get plain text from a paragraph

declare function getParagraphText(paragraph: Paragraph): string;

Get plain text from a run

declare function getRunText(run: Run): string;

Get formatting summary for a selection

declare function getSelectionFormattingSummary(doc: Document, range: Range): FormattingSummary;

Get plain text from a table

declare function getTableText(table: Table): string;

Get all template tags in a document without processing

declare function getTemplateTags(buffer: ArrayBuffer): string[];

Get text after a position

declare function getTextAfter(paragraphs: Paragraph[], position: Position, maxChars: number): string;

Get text before a position

declare function getTextBefore(paragraphs: Paragraph[], position: Position, maxChars: number): string;

Convert half-points to pixels (at 96 DPI)

Half-points are commonly used for font sizes in OOXML (w:sz).

declare function halfPointsToPixels(halfPoints: number): number;

Check if document body has images

declare function hasImages(body: DocumentBody): boolean;

Check if document body has tables

declare function hasTables(body: DocumentBody): boolean;

Check if text contains template variables

declare function hasTemplateVariables(text: string): boolean;

Check if a color is effectively black

declare function isBlack(color: ColorValue | undefined | null, theme: Theme | null | undefined): boolean;

Check if style ID represents a heading

declare function isHeadingStyle(styleId?: string): boolean;

Check if a position is within a range

declare function isPositionInRange(position: Position, range: Range): boolean;

Check if a variable name is valid

declare function isValidVariableName(name: string): boolean;

Check if a color is effectively white

declare function isWhite(color: ColorValue | undefined | null, theme: Theme | null | undefined): boolean;

Check if a schema is Zod-like

declare function isZodSchema(schema: unknown): schema is ZodSchemaLike;

Lighten a color by a percentage

declare function lightenColor(color: ColorValue | undefined | null, theme: Theme | null | undefined, percent: number): string;

Parse a color string (various formats) to ColorValue

declare function parseColorString(colorString: string | undefined): ColorValue | undefined;

Parse a DOCX file into a complete Document model

declare function parseDocx(input: DocxInput, options?: ParseOptions): Promise<Document>;

Parse heading level from style ID

declare function parseHeadingLevel(styleId?: string): number | undefined;

Parse a variable string to get the name

declare function parseVariable(variable: string): string | null;

Convert pixels to EMUs. EMU coordinates in OOXML are integer-typed (xs:long); rounding here keeps floating-point drift (e.g. 52 px → 495299.99999999994) out of the document.

declare function pixelsToEmu(px: number): number;

Convert pixels to twips

declare function pixelsToTwips(px: number): number;

Convert points to pixels (at 96 DPI)

1 inch = 72 points = 96 pixels → 1 point = 96/72 pixels = 4/3 pixels

declare function pointsToPixels(points: number): number;

Preview what the document will look like after processing Returns the document text with variables replaced (for preview purposes)

declare function previewTemplate(buffer: ArrayBuffer, variables: Record<string, string>): string;

Process a DOCX template with variable substitution

declare function processTemplate(buffer: ArrayBuffer, variables: Record<string, string>, options?: ProcessTemplateOptions): ArrayBuffer;

Process template with conditional sections Supports #if, #unless, #each loops

declare function processTemplateAdvanced(buffer: ArrayBuffer, data: Record<string, unknown>, options?: ProcessTemplateOptions): ArrayBuffer;

Process template and return as Blob

declare function processTemplateAsBlob(buffer: ArrayBuffer, variables: Record<string, string>, options?: ProcessTemplateOptions): Blob;

Process template with detailed result

declare function processTemplateDetailed(buffer: ArrayBuffer, variables: Record<string, string>, options?: ProcessTemplateOptions): ProcessTemplateResult;

Register multiple plugins at once

declare function registerPlugins(plugins: CorePlugin[], options?: PluginOptions): PluginRegistrationResult[];

Replace all variables in text with a placeholder

declare function removeVariables(text: string, placeholder?: string): string;

Repack a Document into a valid DOCX file

declare function repackDocx(doc: Document, options?: RepackOptions): Promise<ArrayBuffer>;

Replace variables in text with values

declare function replaceVariables(text: string, values: Record<string, string>): string;

Resolve a ColorValue to a CSS color string

declare function resolveColor(color: ColorValue | undefined | null, theme: Theme | null | undefined, defaultColor?: string): string;

Resolve a highlight color name to CSS

declare function resolveHighlightColor(highlight: string | undefined): string;

Resolve a shading fill or pattern color to CSS

declare function resolveShadingColor(color: ColorValue | undefined | null, theme: Theme | null | undefined): string;

Sanitize a variable name

declare function sanitizeVariableName(name: string): string;

Serialize a DocumentBody to document.xml body content

declare function serializeDocumentBody(body: DocumentBody): string;
fn

serializeDocx

Serialize a complete Document to valid document.xml

declare function serializeDocument(doc: Document): string;

Serialize section properties (w:sectPr)

declare function serializeSectionProperties(props: SectionProperties | undefined): string;

Convert twips to EMUs

declare function twipsToEmu(twips: number): number;

Convert twips to pixels (at 96 DPI)

1 inch = 1440 twips = 96 pixels → 1 twip = 96/1440 pixels = 1/15 pixels

declare function twipsToPixels(twips: number): number;
fn

updateMultipleFiles

packages/core/src/core.ts:37

Update multiple files in a DOCX buffer

declare function updateMultipleFiles(originalBuffer: ArrayBuffer, updates: Map<string, string | ArrayBuffer>, options?: RepackOptions): Promise<ArrayBuffer>;
fn

validatePatchSafety

packages/core/src/core.ts:39

Validate that a selective patch can be safely applied.

Checks: - All changed paraIds exist in original XML (exactly once) - All changed paraIds exist in serialized XML (exactly once) - Paragraph count matches between original and serialized

declare function validatePatchSafety(originalXml: string, serializedXml: string, changedIds: Set<string>): PatchValidationResult;

Validate that a document is a valid docxtemplater template

declare function validateTemplate(buffer: ArrayBuffer): {
    valid: boolean;
    errors: TemplateError[];
    tags: string[];
};

Classes(2)

DocumentAgent provides a fluent API for document manipulation

declare class DocumentAgent
```ts
const agent = new DocumentAgent(buffer);

// Read operations
const text = agent.getText();
const wordCount = agent.getWordCount();
const variables = agent.getVariables();

// Write operations (returns new agent)
const newAgent = agent
  .insertText({ paragraphIndex: 0, offset: 0 }, 'Hello ', { formatting: { bold: true } })
  .applyStyle({ paragraphIndex: 0, offset: 0 }, { paragraphIndex: 0, offset: 5 }, 'Heading1');

// Export
const newBuffer = await newAgent.toBuffer();
```
MemberTypeSummary
(constructor)Create a new DocumentAgent
applyFormattingApply text formatting to a range
applyParagraphFormattingApply paragraph formatting
applyStyleApply a named style to a paragraph
applyVariablesApply all pending template variables
clearPendingVariablesClear pending variables
deleteRangeDelete text in a range
executeCommandsExecute multiple commands in sequence
fromBufferCreate a DocumentAgent from a DOCX buffer (async)
fromDocumentCreate a DocumentAgent from a Document object
getAgentContextGet document context for AI agents
getCharacterCountGet character count
getDocumentGet the underlying document
getFormattedTextGet formatted text segments
getPageCountGet approximate page count
getParagraphCountGet paragraph count
getPendingVariablesGet pending variable values
getStylesGet available styles from the document
getTableCountGet table count
getTextGet plain text content of the document
getVariablesGet detected template variables
getWordCountGet word count
insertImageInsert an image at a position
insertParagraphBreakInsert a paragraph break
insertTableInsert a table at a position
insertTextInsert text at a position
mergeParagraphsMerge consecutive paragraphs
replaceRangeReplace text in a range
setVariableSet a template variable value
setVariablesSet multiple template variables
toBlobExport document to Blob
toBufferExport document to DOCX ArrayBuffer

Plugin Registry - manages core plugins

declare class PluginRegistry
```ts
import { pluginRegistry, docxtemplaterPlugin } from '@eigenpal/docx-editor/core-plugins';

// Register plugins
pluginRegistry.register(docxtemplaterPlugin);

// Get all MCP tools for MCP server
const tools = pluginRegistry.getMcpTools();

// Get command handler for executor
const handler = pluginRegistry.getCommandHandler('insertTemplateVariable');
```
MemberTypeSummary
addEventListenerAdd an event listener
clearClear all registered plugins
getGet a registered plugin by ID
getAllGet all registered plugins
getCommandHandlerGet a command handler for a command type
getCommandTypesGet all registered command types
getDebugInfoGet registry state for debugging
getMcpToolGet an MCP tool by name
getMcpToolsGet all MCP tools from all registered plugins
getMcpToolsForPluginGet MCP tools from a specific plugin
hasCheck if a plugin is registered
hasCommandHandlerCheck if a command type has a handler
registerRegister a plugin
removeEventListenerRemove an event listener
sizenumberGet number of registered plugins
unregisterUnregister a plugin

Interfaces(81)

Document context for AI agents

interface AgentContext
MemberTypeSummary
availableStylesStyleInfo[]Available styles
characterCountnumberTotal character count
hasImagesbooleanHas images
hasTablesbooleanHas tables
language?stringDocument language
outlineParagraphOutline[]Content outline (first N chars per paragraph)
paragraphCountnumberTotal paragraph count
sectionsSectionInfo[]Document sections info
variableCountnumberVariable count
variablesstring[]Detected template variables
wordCountnumberTotal word count (approximate)
interface

AgentContextOptions

packages/core/src/agent/context.ts:41

Options for building agent context

interface AgentContextOptions
MemberTypeSummary
includeFormatting?booleanInclude detailed formatting info (default: false)
includeTableContent?booleanInclude table content in context (default: false)
maxOutlineParagraphs?numberMaximum paragraphs to include in outline (default: 50)
outlineMaxChars?numberMaximum characters per paragraph in outline (default: 100)

Response from an agent action

interface AgentResponse
MemberTypeSummary
commands?AgentCommand[]Commands to execute
error?stringError message if failed
metadata?Record<string, unknown>Metadata about the response
newContent?AgentContent[]New formatted content
newText?stringNew text to insert (for rewrite/expand/etc.)
successbooleanSuccess status
warnings?string[]Warning messages

AI action request

interface AIActionRequest
MemberTypeSummary
actionAIActionAction type
contextSelectionContextSelection context
customPrompt?stringCustom prompt (for 'custom' action)
options?Record<string, unknown>Additional options
targetLanguage?stringTarget language (for 'translate' action)

Apply a named style to a paragraph

interface ApplyStyleCommand extends BaseCommand
MemberTypeSummary
paragraphIndexnumberParagraph index
styleIdstringStyle ID to apply
type'applyStyle'
interface

ApplyVariablesCommand

packages/core/src/types/agentApi.ts:284

Apply all template variables

interface ApplyVariablesCommand extends BaseCommand
MemberTypeSummary
type'applyVariables'
valuesRecord<string, string>Variable values

Result of command execution

interface CommandResult
MemberTypeSummary
documentDocumentThe modified document
error?stringError message if failed
metadata?Record<string, unknown>Metadata about the operation
successbooleanWhether the command succeeded
interface

Comment_2

A comment from `comments.xml` — the top-level entity for review comments and replies. `id` matches the inline `CommentRangeStart` / `CommentRangeEnd` markers that anchor it inside a paragraph; `parentId` threads replies under their parent; `done` reflects Word's "Resolve" state (`w15:done`).

interface Comment
MemberTypeSummary
authorstringAuthor name
contentParagraph[]Comment content (paragraphs)
date?stringDate
done?booleanWhether the comment is resolved/done
idnumberComment ID (matches commentRangeStart/End)
initials?stringAuthor initials
parentId?numberParent comment ID (for replies)

Comment range end marker in paragraph content

interface CommentRangeEnd
MemberTypeSummary
idnumber
type'commentRangeEnd'

Comment range start marker in paragraph content

interface CommentRangeStart
MemberTypeSummary
idnumber
type'commentRangeStart'
interface

ContextSelectionOptions

Options for building selection context

interface SelectionContextOptions$1
MemberTypeSummary
contextChars?numberCharacters of context before/after selection (default: 200)
includeSuggestions?booleanInclude suggested actions (default: true)

Core plugin interface - headless, works in Node.js

Plugins can: - Register command handlers that DocumentAgent dispatches to - Declare MCP tools that the MCP server exposes to AI clients - Have optional initialization logic - Declare dependencies on other plugins

interface CorePlugin
MemberTypeSummary
commandHandlers?Record<string, CommandHandler>Command handlers this plugin provides. DocumentAgent dispatches commands to these handlers.
dependencies?string[]Dependencies on other plugins (by ID). The registry ensures dependencies are loaded first.
description?stringPlugin description
destroy?() => void | Promise<void>Optional cleanup when plugin is unregistered.
idstringUnique plugin identifier
initialize?() => void | Promise<void>Optional setup when plugin is registered. Called once during plugin registration.
mcpTools?McpToolDefinition[]MCP tools this plugin exposes. MCP server collects these from all plugins.
namestringHuman-readable plugin name
version?stringPlugin version (semver)
interface

CreateEmptyDocumentOptions

packages/core/src/utils/createDocument.ts:220

Options for creating an empty document

interface CreateEmptyDocumentOptions
MemberTypeSummary
initialText?stringInitial text content (default: empty string)
marginBottom?numberBottom margin in twips (default: 1440 = 1 inch)
marginLeft?numberLeft margin in twips (default: 1440 = 1 inch)
marginRight?numberRight margin in twips (default: 1440 = 1 inch)
marginTop?numberTop margin in twips (default: 1440 = 1 inch)
orientation?'portrait' | 'landscape'Page orientation (default: 'portrait')
pageHeight?numberPage height in twips (default: 15840 = 11 inches)
pageWidth?numberPage width in twips (default: 12240 = 8.5 inches)

Delete text in a range

interface DeleteTextCommand extends BaseCommand
MemberTypeSummary
rangeRangeRange to delete
type'deleteText'

Deletion wrapper (w:del) — runs deleted by tracked changes

interface Deletion
MemberTypeSummary
content(Run | Hyperlink)[]Deleted content
infoTrackedChangeInfoTracked change metadata
type'deletion'
interface

Document_2

Top-level parsed DOCX document — the result of `parseDocx(buffer)`.

Wraps the unzipped DOCX package (`document.xml`, `styles.xml`, etc.), the original buffer for round-trip saves, and any template variables / parse warnings detected during ingestion.

interface Document
```ts
import { parseDocx } from '@eigenpal/docx-editor-core/headless';
const doc = await parseDocx(buffer);
console.log(doc.package.document.content.length);
```
MemberTypeSummary
originalBuffer?ArrayBufferOriginal DOCX buffer. Kept for round-trip saves that preserve untouched parts.
packageDocxPackageParsed DOCX package — body, styles, numbering, theme, media, headers/footers.
templateVariables?string[]Detected docxtemplater variables (e.g. `{name}`, `{address}`). Populated when the document is recognized as a template.
warnings?string[]Non-fatal parser diagnostics — malformed parts, unsupported features, fallbacks.

Document body (`w:body`) — the editable content of the document.

Contains the ordered block content (paragraphs and tables), the section layout chain derived from inline `sectPr` markers, the final `sectPr`, and any document-level comments. This is what most edit operations mutate; headers/footers/styles live elsewhere in the package.

interface DocumentBody
MemberTypeSummary
comments?Comment[]Comments from comments.xml
contentBlockContent[]All content (paragraphs, tables)
finalSectionProperties?SectionPropertiesFinal section properties (from body's sectPr)
sections?Section[]Sections (derived from sectPr in paragraphs and final sectPr)

Complete DOCX package structure

interface DocxPackage
MemberTypeSummary
documentDocumentBodyDocument body
endnotes?Endnote[]Endnotes
fontTable?FontTableFont table
footers?Map<string, HeaderFooter>Footers by relationship ID
footnotes?Footnote[]Footnotes
headers?Map<string, HeaderFooter>Headers by relationship ID
media?Map<string, MediaFile>Media files
numbering?NumberingDefinitionsNumbering definitions
properties?{ title?: string; subject?: string; creator?: string; keywords?: string; description?: string; lastModifiedBy?: string; revision?: number; created?: Date; modified?: Date; }Document properties
relationships?RelationshipMapDocument relationships
styles?StyleDefinitionsStyle definitions
theme?ThemeTheme

Endnote (w:endnote)

interface Endnote
MemberTypeSummary
content(Paragraph | Table)[]Content. Per ECMA-376 §17.11.4 endnotes can hold the same blocks as the body — paragraphs and tables. See note on `Footnote.content`.
idnumberEndnote ID
noteType?'normal' | 'separator' | 'continuationSeparator' | 'continuationNotice'Special endnote type
type'endnote'
interface

ExtendedSelectionContext

packages/core/src/agent/selectionContext.ts:50

Extended selection context with additional details

interface ExtendedSelectionContext extends SelectionContext
MemberTypeSummary
characterCount?numberSelection character count
contentType?'prose' | 'list' | 'heading' | 'table' | 'mixed'Content type hints
detectedLanguage?stringLanguage detection hint
documentSummary?stringDocument summary for additional context
isMultiParagraph?booleanIs selection multi-paragraph
paragraphIndices?number[]Selected paragraph indices
wordCount?numberSelection word count

Footnote (w:footnote)

interface Footnote
MemberTypeSummary
content(Paragraph | Table)[]Content. Per ECMA-376 §17.11.10 footnotes can hold the same blocks as the body — paragraphs and tables. The parser previously only collected w:p children which silently dropped any w:tbl inside a footnote; widened to match HeaderFooter / TableCell shape so the body pipeline (toProseDoc → toFlowBlocks) can render them uniformly.
idnumberFootnote ID
noteType?'normal' | 'separator' | 'continuationSeparator' | 'continuationNotice'Special footnote type
type'footnote'
interface

FormatParagraphCommand

packages/core/src/types/agentApi.ts:164

Apply paragraph formatting

interface FormatParagraphCommand extends BaseCommand
MemberTypeSummary
formattingPartial<ParagraphFormatting>Formatting to apply
paragraphIndexnumberParagraph index
type'formatParagraph'

Formatted text segment

interface FormattedTextSegment
MemberTypeSummary
formatting?TextFormattingApplied formatting
hyperlinkUrl?stringHyperlink URL if applicable
textstringText content

Apply formatting to a range

interface FormatTextCommand extends BaseCommand
MemberTypeSummary
formattingPartial<TextFormatting>Formatting to apply
rangeRangeRange to format
type'formatText'

Selection formatting summary

interface FormattingSummary
MemberTypeSummary
allFormattingPartial<TextFormatting>[]All formatting found
isConsistentbooleanIs formatting consistent across selection
predominantPartial<TextFormatting>Predominant formatting
interface

Image_2

Embedded image (`w:drawing` with an inline or anchored picture). Carries the relationship-id pointer to the binary in `word/media/`, its resolved data URL (`src`), display dimensions, optional crop / transform / wrap behaviors, and anchor positioning for floating images.

See ECMA-376 §20.4 (DrawingML wordprocessingDrawing).

interface Image
MemberTypeSummary
allowOverlap?boolean`wp:anchor allowOverlap` — when true (default), anchored objects may overlap; when false, Word repositions them to avoid collisions. We don't currently reposition; we round-trip the flag so saving preserves the author's intent.
alt?stringAlt text for accessibility
crop?ImageCropSource-image crop (fractional, OOXML `a:srcRect`).
decorative?booleanWhether this is a decorative image
effects?{ brightness?: number; contrast?: number; saturation?: number; }Image effects
filename?stringOriginal filename
hlinkHref?stringHyperlink URL for clickable image
id?stringUnique ID
layoutInCell?boolean`wp:anchor layoutInCell` — when true (default), an anchored image inside a table cell is constrained to the cell. When false, the image escapes the cell into the page area. Round-tripped on save.
mimeType?stringImage MIME type
opacity?numberOpacity in [0, 1] (OOXML `a:alphaModFix amt`). Undefined = fully opaque.
originalSize?ImageSizeOriginal size before any transforms
outline?ShapeOutlineImage outline/border
padding?ImagePaddingPadding around image
position?ImagePositionPosition for floating images
rIdstringRelationship ID for the image data
sizeImageSizeImage size
src?stringResolved image data (base64 or blob URL)
title?stringTitle/description
transform?ImageTransformImage transformations
type'image'
wrapImageWrapWrap settings
interface

InsertHyperlinkCommand

packages/core/src/types/agentApi.ts:220

Insert a hyperlink at a range

interface InsertHyperlinkCommand extends BaseCommand
MemberTypeSummary
displayText?stringDisplay text (replaces range text if provided)
rangeRangeRange to make into a hyperlink
tooltip?stringTooltip
type'insertHyperlink'
urlstringURL of the hyperlink
interface

InsertHyperlinkOptions

packages/core/src/agent/DocumentAgent.ts:81

Options for inserting hyperlink

interface InsertHyperlinkOptions
MemberTypeSummary
displayText?stringDisplay text (overrides selected text)
tooltip?stringTooltip on hover

Insert an image at a position

interface InsertImageCommand extends BaseCommand
MemberTypeSummary
alt?stringAlt text
height?numberImage height in pixels
positionPositionPosition to insert at
srcstringImage source (base64 or URL)
type'insertImage'
width?numberImage width in pixels

Options for inserting image

interface InsertImageOptions
MemberTypeSummary
alt?stringAlt text for accessibility
height?numberImage height in pixels
width?numberImage width in pixels

Insertion wrapper (w:ins) — runs inserted by tracked changes

interface Insertion
MemberTypeSummary
content(Run | Hyperlink)[]Inserted content
infoTrackedChangeInfoTracked change metadata
type'insertion'

Insert a table at a position

interface InsertTableCommand extends BaseCommand
MemberTypeSummary
columnsnumberNumber of columns
data?string[][]Optional table data
hasHeader?booleanOptional header row
positionPositionPosition to insert at
rowsnumberNumber of rows
type'insertTable'

Options for inserting table

interface InsertTableOptions
MemberTypeSummary
data?string[][]Table data (2D array of strings)
hasHeader?booleanWhether first row is a header

Insert text at a position

interface InsertTextCommand extends BaseCommand
MemberTypeSummary
formatting?TextFormattingOptional formatting for the inserted text
positionPositionPosition to insert at
textstringText to insert
type'insertText'

Options for inserting text

interface InsertTextOptions
MemberTypeSummary
formatting?TextFormattingText formatting

JSON Schema definition (subset)

interface JsonSchema
MemberTypeSummary
$ref?string
additionalProperties?boolean | JsonSchema
allOf?JsonSchema[]
anyOf?JsonSchema[]
default?unknown
description?string
enum?unknown[]
format?string
items?JsonSchema
maximum?number
maxLength?number
minimum?number
minLength?number
oneOf?JsonSchema[]
pattern?string
properties?Record<string, JsonSchema>
required?string[]
type?string | string[]

One indentation level of an abstract numbering definition (`w:lvl`). Carries the number format, the marker template (`lvlText` — e.g. `"%1.%2."`), the level's paragraph properties (indent, hanging) and character properties (font, size, color for the marker itself).

`ilvl` ranges 0-8 in standard Word documents.

interface ListLevel
MemberTypeSummary
ilvlnumberLevel index (0-8)
isLgl?booleanIs legal numbering style
legacy?{ legacy?: boolean; legacySpace?: number; legacyIndent?: number; }Legacy settings
lvlJc?'left' | 'center' | 'right'Justification
lvlRestart?numberRestart numbering from higher level
lvlTextstringLevel text (e.g., "%1." or "•")
numFmtNumberFormatNumber format
pPr?ParagraphFormattingParagraph properties for this level
rPr?TextFormattingRun properties for the number/bullet
start?numberStarting number
suffix?LevelSuffixSuffix after number

A loaded document in the session

interface LoadedDocument
MemberTypeSummary
buffer?ArrayBufferOriginal buffer (for repacking)
documentDocumentParsed document
idstringDocument ID
lastModifiednumberLast modified timestamp
source?stringSource filename or path

MCP session state

Maintains state across tool calls within a session.

interface McpSession
MemberTypeSummary
dataMap<string, unknown>Custom session data
documentsMap<string, LoadedDocument>Loaded documents by ID
idstringSession ID

MCP tool annotations

interface McpToolAnnotations
MemberTypeSummary
category?stringTool category for organization
complexity?'low' | 'medium' | 'high'Estimated cost/complexity
examples?McpToolExample[]Example usage
readOnly?booleanWhether this tool modifies the document

Context passed to MCP tool handlers

interface McpToolContext
MemberTypeSummary
document?DocumentCurrent document (if loaded)
documentBuffer?ArrayBufferDocument buffer (if loaded)
log(message: string, data?: unknown) => voidLogger for debugging
sessionMcpSessionSession state

MCP tool definition

Describes a tool that can be called by AI clients through the MCP server.

interface McpToolDefinition
MemberTypeSummary
annotations?McpToolAnnotationsOptional annotations for the tool
descriptionstringHuman-readable description for AI
handlerMcpToolHandlerHandler function for the tool. Receives validated input and returns a result.
inputSchemaJsonSchema | ZodSchemaLikeJSON Schema for tool input validation. Can be a Zod schema or plain JSON Schema object.
namestringTool name (used in MCP protocol)

MCP tool result

interface McpToolResult
MemberTypeSummary
contentMcpToolContent[]Result content
isError?booleanWhether this is an error result

Move-from wrapper (w:moveFrom) — content moved away from this position

interface MoveFrom
MemberTypeSummary
content(Run | Hyperlink)[]Moved content
infoTrackedChangeInfoTracked change metadata
type'moveFrom'

Move-to wrapper (w:moveTo) — content moved into this position

interface MoveTo
MemberTypeSummary
content(Run | Hyperlink)[]Moved content
infoTrackedChangeInfoTracked change metadata
type'moveTo'
interface

NumberingDefinitions

packages/core/src/types/lists.ts:205

Top-level numbering data from `numbering.xml` — the set of abstract templates and the per-document `NumberingInstance`s that reference them. Paragraphs reference a `numId` (instance), not an `abstractNumId` directly.

interface NumberingDefinitions
MemberTypeSummary
abstractNumsAbstractNumbering[]Abstract numbering definitions
numsNumberingInstance[]Numbering instances

Paragraph (`w:p`) — the primary block-level container in a Word document.

Every paragraph carries direct formatting (`formatting`), tracked property changes (`propertyChanges`), inline content (`content`), and optional list rendering / section break metadata. `paraId` is Word's stable identifier (`w14:paraId`) and is what `EditorBridge` and the agent toolkit use to address paragraphs.

See ECMA-376 §17.3.1.

interface Paragraph
MemberTypeSummary
contentParagraphContent[]Paragraph content
formatting?ParagraphFormattingParagraph formatting
listRendering?ListRenderingComputed list rendering (if this is a list item)
paraId?stringUnique paragraph ID
propertyChanges?ParagraphPropertyChange[]Paragraph-level tracked property changes (w:pPrChange)
renderedPageBreakBefore?booleanWord's cached layout says this paragraph started on a new rendered page.
sectionProperties?SectionPropertiesSection properties (if this paragraph ends a section)
textId?stringText ID
type'paragraph'

Paragraph context for selection

interface ParagraphContext
MemberTypeSummary
fullTextstringFull paragraph text
indexnumberParagraph index
style?stringParagraph style
wordCountnumberWord count

Paragraph-level formatting (`w:pPr`) — alignment, indentation, spacing (before/after, line height), pagination flags (keepNext, keepLines, pageBreakBefore, widowControl), tabs, borders, shading, numbering reference, style reference, and frame/anchored-text properties.

Most fields mirror their ECMA-376 element names (see §17.3.1). Inheritance: direct formatting beats the linked style which beats document defaults.

interface ParagraphFormatting
MemberTypeSummary
afterAutospacing?booleanAuto space after (w:spacing/w:afterAutospacing)
alignment?ParagraphAlignmentParagraph alignment (w:jc)
beforeAutospacing?booleanAuto space before (w:spacing/w:beforeAutospacing)
bidi?booleanText direction (w:bidi)
borders?{ top?: BorderSpec; bottom?: BorderSpec; left?: BorderSpec; right?: BorderSpec; between?: BorderSpec; bar?: BorderSpec; }Paragraph borders (w:pBdr)
contextualSpacing?booleanContextual spacing — suppress space between paragraphs of the same style (w:contextualSpacing)
frame?{ width?: number; height?: number; hAnchor?: 'text' | 'margin' | 'page'; vAnchor?: 'text' | 'margin' | 'page'; x?: number; y?: number; xAlign?: 'left' | 'center' | 'right' | 'inside' | 'outside'; yAlign?: 'top' | 'center' | 'bottom' | 'inside' | 'outside' | 'inline'; wrap?: 'around' | 'auto' | 'none' | 'notBeside' | 'through' | 'tight'; }Text frame properties (w:framePr)
hangingIndent?booleanWhether first line is hanging indent
indentFirstLine?numberFirst line indent in twips - positive for indent, negative for hanging (w:ind/w:firstLine or w:hanging)
indentLeft?numberLeft indent in twips (w:ind/w:left)
indentRight?numberRight indent in twips (w:ind/w:right)
keepLines?booleanKeep lines together (w:keepLines)
keepNext?booleanKeep with next paragraph (w:keepNext)
lineSpacing?numberLine spacing value (w:spacing/w:line)
lineSpacingRule?LineSpacingRuleLine spacing rule (w:spacing/w:lineRule)
numPr?{ numId?: number; ilvl?: number; }Numbering properties (w:numPr)
outlineLevel?numberOutline level 0-9 (w:outlineLvl)
pageBreakBefore?booleanPage break before (w:pageBreakBefore)
runProperties?TextFormattingRun properties to apply to all runs (w:rPr)
shading?ShadingPropertiesParagraph shading (w:shd)
spaceAfter?numberSpacing after in twips (w:spacing/w:after)
spaceBefore?numberSpacing before in twips (w:spacing/w:before)
spacingExplicit?SpacingExplicitPer-side flags marking which `<w:spacing>` attrs came from this paragraph's own pPr (vs inherited). Word collapses style-inherited spacing on empty paragraphs but honors the explicit values.
styleId?stringParagraph style ID (w:pStyle)
suppressAutoHyphens?booleanSuppress auto hyphens (w:suppressAutoHyphens)
suppressLineNumbers?booleanSuppress line numbers (w:suppressLineNumbers)
tabs?TabStop[]Custom tab stops (w:tabs)
widowControl?booleanWidow/orphan control (w:widowControl)

Paragraph outline for context

interface ParagraphOutline
MemberTypeSummary
headingLevel?numberHeading level (1-9)
indexnumberParagraph index
isEmpty?booleanIs empty paragraph
isHeading?booleanIs heading
isListItem?booleanIs list item
previewstringFirst N characters
style?stringParagraph style

Extended command type for plugins

Plugins can define custom command types beyond the built-in AgentCommand types.

interface PluginCommand
MemberTypeSummary
(member-0)Additional command-specific data
id?stringUnique command ID (for undo tracking)
position?PositionPosition for positional commands
range?RangeRange for range-based commands
typestringCommand type identifier

Plugin configuration options

interface PluginOptions
MemberTypeSummary
config?Record<string, unknown>Custom configuration
debug?booleanEnable debug logging
interface

PluginRegistrationResult

packages/core/src/core-plugins/types.ts:369

Result of plugin registration

interface PluginRegistrationResult
MemberTypeSummary
error?stringError message (if failed)
plugin?CorePluginRegistered plugin (if successful)
successbooleanWhether registration succeeded
warnings?string[]Warning messages
interface

Position_2

Position within a document

interface Position
MemberTypeSummary
contentIndex?numberOptional: Content index within paragraph (run, hyperlink, etc.)
offsetnumberOffset within the paragraph in characters
paragraphIndexnumberIndex of the paragraph (0-indexed)
sectionIndex?numberOptional: Section index

Options for template processing

interface ProcessTemplateOptions
MemberTypeSummary
delimiters?{ start?: string; end?: string; }Delimiter settings
linebreaks?booleanLine breaks: keep raw n or convert to w:br
nullGetter?'keep' | 'empty' | 'error'How to handle undefined variables
parser?(tag: string) => { get: (scope: Record<string, unknown>) => unknown; }Custom parser for variable names

Result of template processing

interface ProcessTemplateResult
MemberTypeSummary
bufferArrayBufferThe processed document buffer
replacedVariablesstring[]Variables that were found and replaced
unreplacedVariablesstring[]Variables that were not replaced (no value provided)
warningsstring[]Any warnings during processing
interface

Range_2

Range within a document

interface Range
MemberTypeSummary
collapsed?booleanWhether the range is collapsed (cursor position)
endPositionEnd position
startPositionStart position

Relationship entry

interface Relationship
MemberTypeSummary
idstringRelationship ID (e.g., "rId1")
targetstringTarget path or URL
targetMode?'External' | 'Internal'Target mode
typeRelationshipTypeRelationship type URI

Replace text in a range

interface ReplaceTextCommand extends BaseCommand
MemberTypeSummary
formatting?TextFormattingOptional formatting for the new text
rangeRangeRange to replace
textstringReplacement text
type'replaceText'

A run (`w:r`) — a contiguous span of inline content sharing one set of character properties (bold, italic, font, color, etc.). Runs are the atomic unit of character formatting; toggling bold on a selection that spans different formatting creates new runs.

See ECMA-376 §17.3.2.

interface Run
```ts
const run: Run = {
  type: 'run',
  formatting: { bold: true },
  content: [{ type: 'text', text: 'Hello' }],
};
```
MemberTypeSummary
contentRunContent[]Run content (text, tabs, breaks, etc.)
formatting?TextFormattingText formatting properties
propertyChanges?RunPropertyChange[]Run-level tracked property changes (w:rPrChange)
type'run'

Section information

interface SectionInfo
MemberTypeSummary
hasFooter?booleanHas footer
hasHeader?booleanHas header
indexnumberSection index
isLandscape?booleanIs landscape
pageSize?{ width: number; height: number; }Page size
paragraphCountnumberNumber of paragraphs

Section properties (`w:sectPr`) — page geometry, margins, columns, header/footer references, and page numbering for one section of the document. Sections are introduced by inline `sectPr` markers on the terminating paragraph (`Paragraph.sectionProperties`) and the body's final `sectPr`.

All distance units are twips (1/20 of a point) on the wire. The layout engine converts to pixels.

See ECMA-376 §17.6.

interface SectionProperties
MemberTypeSummary
background?{ color?: ColorValue; themeColor?: ThemeColorSlot; themeTint?: string; themeShade?: string; }Page background
bidi?booleanRight-to-left section
columnCount?numberNumber of columns
columns?Column[]Individual column definitions
columnSpace?numberSpace between columns in twips
docGrid?{ type?: 'default' | 'lines' | 'linesAndChars' | 'snapToChars'; linePitch?: number; charSpace?: number; }Document grid
endnotePr?EndnotePropertiesEndnote properties for this section
equalWidth?booleanEqual width columns
evenAndOddHeaders?booleanDifferent odd/even page headers/footers
footerDistance?numberFooter distance from bottom in twips
footerReferences?FooterReference[]Footer references
footnotePr?FootnotePropertiesFootnote properties for this section
gutter?numberGutter margin in twips
headerDistance?numberHeader distance from top in twips
headerReferences?HeaderReference[]Header references
lineNumbers?{ start?: number; countBy?: number; distance?: number; restart?: LineNumberRestart; }Line numbering settings
marginBottom?numberBottom margin in twips
marginLeft?numberLeft margin in twips
marginRight?numberRight margin in twips
marginTop?numberTop margin in twips
orientation?PageOrientationPage orientation
pageBorders?{ top?: BorderSpec; bottom?: BorderSpec; left?: BorderSpec; right?: BorderSpec; display?: 'allPages' | 'firstPage' | 'notFirstPage'; offsetFrom?: 'page' | 'text'; zOrder?: 'front' | 'back'; }Page borders
pageHeight?numberPage height in twips
pageWidth?numberPage width in twips
paperSrcFirst?numberFirst page paper source
paperSrcOther?numberOther pages paper source
sectionStart?SectionStartSection start type
separator?booleanSeparator line between columns
titlePg?booleanDifferent first page header/footer
verticalAlign?VerticalAlignVertical alignment of text

Context about the current selection

interface SelectionContext
MemberTypeSummary
formattingPartial<TextFormatting>Current formatting of selection
inTable?booleanIs selection within a table
paragraphParagraphContextParagraph containing selection
paragraphFormattingPartial<ParagraphFormatting>Current paragraph formatting
rangeRangeSelection range
selectedTextstringSelected text
suggestedActions?SuggestedAction[]Suggested actions based on selection
textAfterstringText after selection (context)
textBeforestringText before selection (context)
interface

SelectionContextOptions

packages/core/src/agent/context.ts:55

Options for building selection context

interface SelectionContextOptions
MemberTypeSummary
contextCharsAfter?numberCharacters of context after selection (default: 200)
contextCharsBefore?numberCharacters of context before selection (default: 200)
includeDocumentSummary?booleanInclude document summary (default: true)
includeSuggestions?booleanInclude suggested actions (default: true)
maxSuggestions?numberMaximum suggested actions (default: 8)

Set template variable value

interface SetVariableCommand extends BaseCommand
MemberTypeSummary
namestringVariable name
type'setVariable'
valuestringVariable value

Style definition from `styles.xml` — a named, reusable bundle of paragraph and/or character formatting. Word's "Heading 1", "Normal", "Title", and "List Bullet" are styles; user-defined styles look the same. `basedOn` chains styles for inheritance; `link` pairs a paragraph style with a matching character style.

See ECMA-376 §17.7.4.

interface Style
MemberTypeSummary
basedOn?stringBased on style ID
default?booleanIs default style
hidden?booleanHidden from UI
name?stringDisplay name
next?stringNext style after Enter (for paragraph styles)
personal?booleanPersonal style (custom)
pPr?ParagraphFormattingParagraph properties (for paragraph/table styles)
qFormat?booleanQuick format in gallery
rPr?TextFormattingRun properties
semiHidden?booleanSemi-hidden from UI
styleIdstringStyle ID
tblPr?TableFormattingTable properties (for table styles)
tblStylePr?Array<{ type: 'band1Horz' | 'band1Vert' | 'band2Horz' | 'band2Vert' | 'firstCol' | 'firstRow' | 'lastCol' | 'lastRow' | 'neCell' | 'nwCell' | 'seCell' | 'swCell'; pPr?: ParagraphFormatting; rPr?: TextFormatting; tblPr?: TableFormatting; trPr?: TableRowFormatting; tcPr?: TableCellFormatting; }>Conditional table style parts
tcPr?TableCellFormattingTable cell properties
trPr?TableRowFormattingTable row properties
typeStyleTypeStyle type
uiPriority?numberUI sort priority
unhideWhenUsed?booleanUnhide when used

Style definitions from styles.xml

interface StyleDefinitions
MemberTypeSummary
docDefaults?DocDefaultsDocument defaults
latentStyles?{ defLockedState?: boolean; defUIPriority?: number; defSemiHidden?: boolean; defUnhideWhenUsed?: boolean; defQFormat?: boolean; count?: number; }Latent styles
stylesStyle[]Style definitions

Style information for context

interface StyleInfo
MemberTypeSummary
builtIn?booleanIs built-in style
idstringStyle ID
namestringDisplay name
type'paragraph' | 'character' | 'table'Style type

Suggested action for context menu

interface SuggestedAction
MemberTypeSummary
description?stringDescription
icon?stringIcon name
idstringAction ID
labelstringDisplay label
priority?numberPriority (higher = more prominent)

Table (`w:tbl`) — a block-level grid of rows × cells. Tables carry their own formatting layer (borders, shading, alignment, indent, floating placement) and an explicit column-width grid in twips. Tables can nest arbitrarily through `TableCell.content`.

See ECMA-376 §17.4.

interface Table
MemberTypeSummary
columnWidths?number[]Column widths in twips
formatting?TableFormattingTable formatting
propertyChanges?TablePropertyChange[]Table-level tracked property changes (w:tblPrChange)
rowsTableRow[]Table rows
type'table'

Table cell (`w:tc`). Holds nested block content (paragraphs and nested tables), cell-level formatting (borders, shading, vertical merge), tracked property changes, and tracked structural changes for cell insert/delete/merge operations.

interface TableCell
MemberTypeSummary
content(Paragraph | Table)[]Cell content (paragraphs, tables, etc.)
formatting?TableCellFormattingCell formatting
propertyChanges?TableCellPropertyChange[]Cell-level tracked property changes (w:tcPrChange)
structuralChange?TableStructuralChangeInfoTracked structural changes (cell insert/delete/merge)
type'tableCell'

Table row (`w:tr`) — an ordered list of `TableCell` plus row-level formatting (height, repeated header, cantSplit) and tracked changes for inserts/deletes.

interface TableRow
MemberTypeSummary
cellsTableCell[]Cells in this row
formatting?TableRowFormattingRow formatting
propertyChanges?TableRowPropertyChange[]Row-level tracked property changes (w:trPrChange)
structuralChange?TableStructuralChangeInfoTracked structural changes (row insert/delete)
type'tableRow'

Error details from template processing

interface TemplateError
MemberTypeSummary
messagestringError message
originalError?ErrorOriginal error
type'parse' | 'render' | 'undefined' | 'unknown'Error type
variable?stringVariable name that caused the error (if applicable)

Plain text run content (`w:t`). `preserveSpace` mirrors the `xml:space="preserve"` attribute and matters for runs that begin or end with whitespace — without it, Word collapses leading/trailing spaces.

interface TextContent
MemberTypeSummary
preserveSpace?booleanPreserve whitespace (xml:space="preserve")
textstringThe text string
type'text'

Character-level formatting (`w:rPr`) — the full set of run properties Word supports: weight, slant, font, size, color, highlight, underline, strikethrough, vertical position, language, complex-script variants, spacing/kerning, emphasis marks, and more.

Most fields mirror their ECMA-376 element names (see §17.3.2). Missing keys inherit from the run's paragraph style → linked style → document defaults chain.

interface TextFormatting
MemberTypeSummary
allCaps?booleanAll caps (w:caps)
bold?booleanBold (w:b)
boldCs?booleanBold complex script (w:bCs)
color?ColorValueText color (w:color)
cs?booleanComplex script formatting (w:cs)
doubleStrike?booleanDouble strikethrough (w:dstrike)
effect?TextEffectText effect animation (w:effect)
emboss?booleanEmboss effect (w:emboss)
emphasisMark?EmphasisMarkEmphasis mark (w:em)
fontFamily?{ ascii?: string; hAnsi?: string; eastAsia?: string; cs?: string; asciiTheme?: 'majorAscii' | 'majorHAnsi' | 'majorEastAsia' | 'majorBidi' | 'minorAscii' | 'minorHAnsi' | 'minorEastAsia' | 'minorBidi'; hAnsiTheme?: string; eastAsiaTheme?: string; csTheme?: string; }Font family (w:rFonts)
fontSize?numberFont size in half-points (w:sz) - e.g., 24 = 12pt
fontSizeCs?numberFont size complex script (w:szCs)
hidden?booleanHidden text (w:vanish)
highlight?'black' | 'blue' | 'cyan' | 'darkBlue' | 'darkCyan' | 'darkGray' | 'darkGreen' | 'darkMagenta' | 'darkRed' | 'darkYellow' | 'green' | 'lightGray' | 'magenta' | 'none' | 'red' | 'white' | 'yellow'Highlight/background color (w:highlight)
imprint?booleanImprint/engrave effect (w:imprint)
italic?booleanItalic (w:i)
italicCs?booleanItalic complex script (w:iCs)
kerning?numberKerning threshold in half-points (w:kern)
outline?booleanOutline effect (w:outline)
position?numberRaised/lowered text position in half-points (w:position)
rtl?booleanRight-to-left text (w:rtl)
scale?numberHorizontal text scale percentage (w:w)
shading?ShadingPropertiesCharacter shading (w:shd)
shadow?booleanShadow effect (w:shadow)
smallCaps?booleanSmall caps (w:smallCaps)
spacing?numberCharacter spacing in twips (w:spacing)
strike?booleanStrikethrough (w:strike)
styleId?stringCharacter style ID (w:rStyle)
underline?{ style: UnderlineStyle; color?: ColorValue; }Underline style and color (w:u)
vertAlign?'baseline' | 'superscript' | 'subscript'Superscript/subscript (w:vertAlign)

Theme (from theme1.xml)

interface Theme
MemberTypeSummary
colorScheme?ThemeColorSchemeColor scheme
fontScheme?ThemeFontSchemeFont scheme
formatScheme?{ name?: string; }Format scheme (fills, lines, effects) - simplified
name?stringTheme name

Tracked change metadata (w:ins, w:del attributes)

interface TrackedChangeInfo
MemberTypeSummary
authorstringAuthor who made the change
date?stringDate of the change
idnumberRevision ID

Result of variable detection

interface VariableDetectionResult
MemberTypeSummary
byLocation{ body: string[]; headers: string[]; footers: string[]; footnotes: string[]; endnotes: string[]; textBoxes: string[]; }Variables by location
occurrencesVariableOccurrence[]Variable occurrences with positions
totalOccurrencesnumberTotal count of variable occurrences
variablesstring[]Unique variable names sorted alphabetically

A single variable occurrence with location info

interface VariableOccurrence
MemberTypeSummary
location'body' | 'header' | 'footer' | 'footnote' | 'endnote' | 'textBox'Location type
namestringVariable name (without braces)
paragraphIndex?numberParagraph index within location
sectionIndex?numberSection index (for headers/footers)

Zod-like schema interface for compatibility

interface ZodSchemaLike
MemberTypeSummary
_def?unknown
parse?(data: unknown) => unknown
safeParse?(data: unknown) => { success: boolean; data?: unknown; error?: unknown; }

Type aliases(11)

Union of all command types

type AgentCommand = InsertTextCommand | ReplaceTextCommand | DeleteTextCommand | FormatTextCommand | FormatParagraphCommand | ApplyStyleCommand | InsertTableCommand | InsertImageCommand | InsertHyperlinkCommand | RemoveHyperlinkCommand | InsertParagraphBreakCommand | MergeParagraphsCommand | SplitParagraphCommand | SetVariableCommand | ApplyVariablesCommand;

AI action types for context menu

type AIAction = 'askAI' | 'rewrite' | 'expand' | 'summarize' | 'translate' | 'explain' | 'fixGrammar' | 'makeFormal' | 'makeCasual' | 'custom';

Block-level content types

type BlockContent = Paragraph | Table | BlockSdt;

Command handler function type

Receives a document and a command, returns a modified document. Must be pure/immutable - always return a new document.

type CommandHandler = (doc: Document, command: PluginCommand) => Document;

MCP tool content types

type McpToolContent = {
    type: 'text';
    text: string;
} | {
    type: 'image';
    data: string;
    mimeType: string;
} | {
    type: 'resource';
    uri: string;
    mimeType?: string;
    text?: string;
};

MCP tool handler function

type McpToolHandler = (input: unknown, context: McpToolContext) => Promise<McpToolResult> | McpToolResult;

Inline content that can appear inside a paragraph. Covers runs (text), hyperlinks, bookmarks, fields, structured document tags, comment range markers, tracked-change wrappers, and math equations. Every node in this union carries a `type` discriminator so consumers can narrow at runtime.

type ParagraphContent = Run | Hyperlink | BookmarkStart | BookmarkEnd | SimpleField | ComplexField | InlineSdt | CommentRangeStart | CommentRangeEnd | Insertion | Deletion | MoveFrom | MoveTo | MoveFromRangeStart | MoveFromRangeEnd | MoveToRangeStart | MoveToRangeEnd | MathEquation;

Plugin lifecycle events

type PluginEvent = {
    type: 'registered';
    plugin: CorePlugin;
} | {
    type: 'unregistered';
    pluginId: string;
} | {
    type: 'error';
    pluginId: string;
    error: Error;
};

Plugin event listener

type PluginEventListener = (event: PluginEvent) => void;

All possible run content types

type RunContent = TextContent | TabContent | BreakContent | SymbolContent | NoteReferenceContent | FieldCharContent | InstrTextContent | SoftHyphenContent | NoBreakHyphenContent | DrawingContent | ShapeContent;

Run-level tracked wrappers represented in WordprocessingML.

type TrackedRunChange = Insertion | Deletion | MoveFrom | MoveTo;

Variables(3)

Default AI actions for context menu

DEFAULT_AI_ACTIONS: AIAction[]

Global plugin registry instance

Use this for registering plugins and accessing their capabilities.

pluginRegistry: PluginRegistry

eigenpal/docx-editor-core/headless

Headless aggregate for Node.js scripts, CLI tools, and server-side processing. Same surface as the default `.` entry, named to make the "no DOM" intent explicit. Prefer the smaller subpaths (`./docx`, `./agent`, `./utils`, etc.) for new code — they tree-shake better.

VERSION = "0.0.2"
```ts
import { DocumentAgent, parseDocx, pluginRegistry } from '@eigenpal/docx-editor-core/headless';
import { docxtemplaterPlugin } from '@eigenpal/docx-editor-core/core-plugins';

// Register plugins
pluginRegistry.register(docxtemplaterPlugin);

// Load and manipulate document
const buffer = fs.readFileSync('template.docx');
const agent = await DocumentAgent.fromBuffer(buffer);

// Get document info
console.log('Word count:', agent.getWordCount());
console.log('Variables:', agent.getVariables());

// Edit document
const newAgent = agent
  .insertText({ paragraphIndex: 0, offset: 0 }, 'Hello ')
  .applyStyle(0, 'Heading1');

// Apply template variables
const finalAgent = await newAgent.applyVariables({
  customer_name: 'Jane Doe',
  date: '2024-02-15',
});

// Export
const output = await finalAgent.toBuffer();
fs.writeFileSync('output.docx', Buffer.from(output));
```