@superdoc/sdk 2.1.0 → 2.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -136
- package/dist/embedded-tools.generated.cjs +1 -1
- package/dist/embedded-tools.generated.js +1 -1
- package/dist/generated/client.d.ts +12 -0
- package/dist/generated/contract.cjs +56 -0
- package/dist/generated/contract.js +56 -0
- package/package.json +6 -6
- package/tools/tools-policy.json +1 -1
- package/tools/__pycache__/__init__.cpython-312.pyc +0 -0
- package/tools/__pycache__/intent_dispatch_generated.cpython-312.pyc +0 -0
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
// Regenerated on every SDK build; a drift test enforces matching contents.
|
|
6
6
|
/** Bundled legacy tool artifacts keyed by file name (fallback when
|
|
7
7
|
* packaged JSON is unreachable, e.g. inside bun-compiled native binaries). */
|
|
8
|
-
//
|
|
8
|
+
// oxfmt-ignore
|
|
9
9
|
const EMBEDDED_TOOLS = {
|
|
10
10
|
"catalog.json": "{\n \"contractVersion\": \"0.1.0\",\n \"generatedAt\": null,\n \"toolCount\": 10,\n \"tools\": [\n {\n \"toolName\": \"superdoc_get_content\",\n \"description\": \"Read document content in various formats. Call this first in any workflow to understand document structure before making edits. Action \\\"blocks\\\" returns structured block data with nodeId, nodeType, textPreview, optional full text when includeText:true, formatting properties (fontFamily, fontSize, color, bold, underline, alignment), and ref handles for immediate use with superdoc_edit or superdoc_format. When you need to evaluate or rewrite existing paragraphs or clauses, prefer action \\\"blocks\\\" with includeText:true so you can identify the correct block and then target it by nodeId. Action \\\"text\\\" and \\\"markdown\\\" return the full document as plain text or Markdown. Action \\\"html\\\" returns HTML. Action \\\"info\\\" returns document metadata: word count, paragraph count, page count, outline, available styles, and capability flags. The \\\"blocks\\\" action supports pagination via \\\"offset\\\" and \\\"limit\\\", and filtering via \\\"nodeTypes\\\". Other actions ignore these parameters. This tool never modifies the document. Do NOT call superdoc_edit or superdoc_format without first reading blocks to get valid refs and formatting reference values.\\n\\nEXAMPLES:\\n 1. {\\\"action\\\":\\\"blocks\\\"}\\n 2. {\\\"action\\\":\\\"blocks\\\",\\\"includeText\\\":true,\\\"offset\\\":0,\\\"limit\\\":20}\\n 3. {\\\"action\\\":\\\"blocks\\\",\\\"offset\\\":0,\\\"limit\\\":20,\\\"nodeTypes\\\":[\\\"heading\\\",\\\"paragraph\\\"]}\\n 4. {\\\"action\\\":\\\"text\\\"}\\n 5. {\\\"action\\\":\\\"info\\\"}\",\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"action\": {\n \"type\": \"string\",\n \"enum\": [\n \"blocks\",\n \"extract\",\n \"html\",\n \"info\",\n \"markdown\",\n \"text\"\n ],\n \"description\": \"The action to perform. One of: blocks, extract, html, info, markdown, text.\"\n },\n \"in\": {\n \"$ref\": \"#/$defs/StoryLocator\",\n \"description\": \"Story scope. Defaults to document body when omitted. Use {kind:'story', storyType:'body'} for body, or other storyType values for headers, footers, footnotes, endnotes.\"\n },\n \"unflattenLists\": {\n \"type\": \"boolean\",\n \"description\": \"When true, flattens nested list structures in output. Default: false. Only for action 'html'. Omit for other actions.\"\n },\n \"offset\": {\n \"type\": \"number\",\n \"minimum\": 0,\n \"description\": \"Number of blocks to skip. Default: 0. Only for action 'blocks'. Omit for other actions.\"\n },\n \"limit\": {\n \"type\": \"number\",\n \"minimum\": 1,\n \"description\": \"Maximum blocks to return. Omit for all blocks. Only for action 'blocks'. Omit for other actions.\"\n },\n \"nodeTypes\": {\n \"type\": \"array\",\n \"items\": {\n \"enum\": [\n \"paragraph\",\n \"heading\",\n \"listItem\",\n \"table\",\n \"tableRow\",\n \"tableCell\",\n \"tableOfContents\",\n \"image\",\n \"sdt\"\n ]\n },\n \"description\": \"Filter by block types (e.g. ['paragraph', 'heading']). Omit for all types. Only for action 'blocks'. Omit for other actions.\"\n },\n \"includeText\": {\n \"type\": \"boolean\",\n \"description\": \"When true, includes the full flattened block text in each block entry. Only for action 'blocks'. Omit for other actions.\"\n }\n },\n \"required\": [\n \"action\"\n ],\n \"additionalProperties\": false\n },\n \"mutates\": false,\n \"operations\": [\n {\n \"operationId\": \"doc.getText\",\n \"intentAction\": \"text\"\n },\n {\n \"operationId\": \"doc.getMarkdown\",\n \"intentAction\": \"markdown\"\n },\n {\n \"operationId\": \"doc.getHtml\",\n \"intentAction\": \"html\"\n },\n {\n \"operationId\": \"doc.info\",\n \"intentAction\": \"info\"\n },\n {\n \"operationId\": \"doc.extract\",\n \"intentAction\": \"extract\"\n },\n {\n \"operationId\": \"doc.blocks.list\",\n \"intentAction\": \"blocks\"\n }\n ]\n },\n {\n \"toolName\": \"superdoc_edit\",\n \"description\": \"The primary tool for inserting content into documents. ALWAYS use action \\\"insert\\\" with type \\\"markdown\\\" to create headings, paragraphs, or any block content: this is faster and creates proper document structure in one call. Do NOT use superdoc_create for headings or paragraphs. The markdown parser creates headings from # markers (# = Heading1, ## = Heading2), bold from **text**, italic from *text*, and numbered/bullet lists. Position markdown inserts with \\\"target\\\" (a BlockNodeAddress like {kind:\\\"block\\\", nodeType, nodeId}) and \\\"placement\\\" (before, after, insideStart, insideEnd). Without a target, content appends at the end of the document. IMPORTANT: After a markdown insert, analyze the document context (what kind of document, how titles and body text are styled) and follow up with ONE superdoc_mutations call to format inserted blocks so they look like they belong. Each format.apply step accepts \\\"inline\\\" (fontFamily, fontSize, bold, underline, color), \\\"alignment\\\", and \\\"scope\\\" in the same step. Use scope: \\\"block\\\" so formatting covers the entire paragraph. Copy the exact property values from the existing get_content blocks (fontFamily, fontSize, color, alignment, bold, underline). Do NOT invent values: use what the blocks show. Also supports replace, delete, and undo/redo. For replace and delete, pass a \\\"ref\\\" from superdoc_search or superdoc_get_content blocks. A search ref covers only the matched substring; a block ref covers the entire block text, so use block refs when rewriting or shortening whole paragraphs. For multi-step redlines or whole-clause rewrites, prefer superdoc_mutations with where:{by:\\\"block\\\", nodeType, nodeId} from superdoc_get_content action \\\"blocks\\\" includeText:true rather than relying on text selectors. Refs expire after any mutation; always re-search before the next edit. For 2+ edits that must succeed or fail atomically, use superdoc_mutations instead. Supports \\\"dryRun\\\" to preview changes and \\\"changeMode: tracked\\\" to record edits as tracked changes (not supported for markdown/html inserts). Do NOT build \\\"target\\\" objects manually when a ref is available; prefer \\\"ref\\\" for simpler, more reliable targeting.\\n\\nEXAMPLES:\\n 1. {\\\"action\\\":\\\"insert\\\",\\\"type\\\":\\\"markdown\\\",\\\"target\\\":{\\\"kind\\\":\\\"block\\\",\\\"nodeType\\\":\\\"paragraph\\\",\\\"nodeId\\\":\\\"<nodeId>\\\"},\\\"placement\\\":\\\"before\\\",\\\"value\\\":\\\"# Executive Summary\\\\n\\\\nThis agreement sets forth the principal terms...\\\"}\\n 2. {\\\"action\\\":\\\"insert\\\",\\\"type\\\":\\\"markdown\\\",\\\"value\\\":\\\"# Section Title\\\\n\\\\nParagraph content here.\\\\n\\\\n# Another Section\\\\n\\\\nMore content with **bold** and *italic*.\\\"}\\n 3. {\\\"action\\\":\\\"replace\\\",\\\"ref\\\":\\\"<handle.ref>\\\",\\\"text\\\":\\\"new text here\\\"}\\n 4. {\\\"action\\\":\\\"delete\\\",\\\"ref\\\":\\\"<handle.ref>\\\"}\\n 5. {\\\"action\\\":\\\"undo\\\"}\",\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"action\": {\n \"type\": \"string\",\n \"enum\": [\n \"delete\",\n \"insert\",\n \"redo\",\n \"replace\",\n \"undo\"\n ],\n \"description\": \"The action to perform. One of: delete, insert, redo, replace, undo.\"\n },\n \"force\": {\n \"type\": \"boolean\",\n \"description\": \"Bypass confirmation checks.\"\n },\n \"changeMode\": {\n \"type\": \"string\",\n \"description\": \"Edit mode: \\\"direct\\\" applies changes immediately, \\\"tracked\\\" records as suggestions.\"\n },\n \"dryRun\": {\n \"type\": \"boolean\",\n \"description\": \"Preview the result without applying changes.\"\n },\n \"target\": {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"$ref\": \"#/$defs/BlockNodeAddress\",\n \"description\": \"Block address for structural insertion: {kind:'block', nodeType:'...', nodeId:'...'}.\"\n },\n {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"selection\",\n \"type\": \"string\"\n },\n \"start\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"text\",\n \"type\": \"string\"\n },\n \"blockId\": {\n \"type\": \"string\"\n },\n \"offset\": {\n \"type\": \"number\"\n },\n \"story\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"body\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"headerFooterSlot\",\n \"type\": \"string\"\n },\n \"section\": {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"section\",\n \"type\": \"string\"\n },\n \"sectionId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"sectionId\"\n ]\n },\n \"headerFooterKind\": {\n \"enum\": [\n \"header\",\n \"footer\"\n ]\n },\n \"variant\": {\n \"enum\": [\n \"default\",\n \"first\",\n \"even\"\n ]\n },\n \"resolution\": {\n \"enum\": [\n \"effective\",\n \"explicit\"\n ]\n },\n \"onWrite\": {\n \"enum\": [\n \"materializeIfInherited\",\n \"editResolvedPart\",\n \"error\"\n ]\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"section\",\n \"headerFooterKind\",\n \"variant\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"headerFooterPart\",\n \"type\": \"string\"\n },\n \"refId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"refId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"footnote\",\n \"type\": \"string\"\n },\n \"noteId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"noteId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"endnote\",\n \"type\": \"string\"\n },\n \"noteId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"noteId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"textbox\",\n \"type\": \"string\"\n },\n \"textboxId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"textboxId\"\n ]\n }\n ],\n \"description\": \"Story scope. Defaults to document body when omitted. Use {kind:'story', storyType:'body'} for body, or other storyType values for headers, footers, footnotes, endnotes.\"\n }\n },\n \"required\": [\n \"kind\",\n \"blockId\",\n \"offset\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"nodeEdge\",\n \"type\": \"string\"\n },\n \"node\": {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"block\",\n \"type\": \"string\"\n },\n \"nodeType\": {\n \"enum\": [\n \"paragraph\",\n \"heading\",\n \"table\",\n \"tableOfContents\",\n \"sdt\",\n \"image\"\n ]\n },\n \"nodeId\": {\n \"type\": \"string\"\n },\n \"story\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"body\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"headerFooterSlot\",\n \"type\": \"string\"\n },\n \"section\": {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"section\",\n \"type\": \"string\"\n },\n \"sectionId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"sectionId\"\n ]\n },\n \"headerFooterKind\": {\n \"enum\": [\n \"header\",\n \"footer\"\n ]\n },\n \"variant\": {\n \"enum\": [\n \"default\",\n \"first\",\n \"even\"\n ]\n },\n \"resolution\": {\n \"enum\": [\n \"effective\",\n \"explicit\"\n ]\n },\n \"onWrite\": {\n \"enum\": [\n \"materializeIfInherited\",\n \"editResolvedPart\",\n \"error\"\n ]\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"section\",\n \"headerFooterKind\",\n \"variant\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"headerFooterPart\",\n \"type\": \"string\"\n },\n \"refId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"refId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"footnote\",\n \"type\": \"string\"\n },\n \"noteId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"noteId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"endnote\",\n \"type\": \"string\"\n },\n \"noteId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"noteId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"textbox\",\n \"type\": \"string\"\n },\n \"textboxId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"textboxId\"\n ]\n }\n ],\n \"description\": \"Story scope. Defaults to document body when omitted. Use {kind:'story', storyType:'body'} for body, or other storyType values for headers, footers, footnotes, endnotes.\"\n }\n },\n \"required\": [\n \"kind\",\n \"nodeType\",\n \"nodeId\"\n ]\n },\n \"edge\": {\n \"enum\": [\n \"before\",\n \"after\"\n ]\n }\n },\n \"required\": [\n \"kind\",\n \"node\",\n \"edge\"\n ]\n }\n ],\n \"description\": \"A point in the document. Use {kind:'text', blockId, offset} for character positions or {kind:'nodeEdge', node:{kind:'block', nodeType, nodeId}, edge:'before'|'after'} for block boundaries.\"\n },\n \"end\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"text\",\n \"type\": \"string\"\n },\n \"blockId\": {\n \"type\": \"string\"\n },\n \"offset\": {\n \"type\": \"number\"\n },\n \"story\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"body\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"headerFooterSlot\",\n \"type\": \"string\"\n },\n \"section\": {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"section\",\n \"type\": \"string\"\n },\n \"sectionId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"sectionId\"\n ]\n },\n \"headerFooterKind\": {\n \"enum\": [\n \"header\",\n \"footer\"\n ]\n },\n \"variant\": {\n \"enum\": [\n \"default\",\n \"first\",\n \"even\"\n ]\n },\n \"resolution\": {\n \"enum\": [\n \"effective\",\n \"explicit\"\n ]\n },\n \"onWrite\": {\n \"enum\": [\n \"materializeIfInherited\",\n \"editResolvedPart\",\n \"error\"\n ]\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"section\",\n \"headerFooterKind\",\n \"variant\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"headerFooterPart\",\n \"type\": \"string\"\n },\n \"refId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"refId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"footnote\",\n \"type\": \"string\"\n },\n \"noteId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"noteId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"endnote\",\n \"type\": \"string\"\n },\n \"noteId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"noteId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"textbox\",\n \"type\": \"string\"\n },\n \"textboxId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"textboxId\"\n ]\n }\n ],\n \"description\": \"Story scope. Defaults to document body when omitted. Use {kind:'story', storyType:'body'} for body, or other storyType values for headers, footers, footnotes, endnotes.\"\n }\n },\n \"required\": [\n \"kind\",\n \"blockId\",\n \"offset\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"nodeEdge\",\n \"type\": \"string\"\n },\n \"node\": {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"block\",\n \"type\": \"string\"\n },\n \"nodeType\": {\n \"enum\": [\n \"paragraph\",\n \"heading\",\n \"table\",\n \"tableOfContents\",\n \"sdt\",\n \"image\"\n ]\n },\n \"nodeId\": {\n \"type\": \"string\"\n },\n \"story\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"body\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"headerFooterSlot\",\n \"type\": \"string\"\n },\n \"section\": {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"section\",\n \"type\": \"string\"\n },\n \"sectionId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"sectionId\"\n ]\n },\n \"headerFooterKind\": {\n \"enum\": [\n \"header\",\n \"footer\"\n ]\n },\n \"variant\": {\n \"enum\": [\n \"default\",\n \"first\",\n \"even\"\n ]\n },\n \"resolution\": {\n \"enum\": [\n \"effective\",\n \"explicit\"\n ]\n },\n \"onWrite\": {\n \"enum\": [\n \"materializeIfInherited\",\n \"editResolvedPart\",\n \"error\"\n ]\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"section\",\n \"headerFooterKind\",\n \"variant\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"headerFooterPart\",\n \"type\": \"string\"\n },\n \"refId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"refId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"footnote\",\n \"type\": \"string\"\n },\n \"noteId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"noteId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"endnote\",\n \"type\": \"string\"\n },\n \"noteId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"noteId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"textbox\",\n \"type\": \"string\"\n },\n \"textboxId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"textboxId\"\n ]\n }\n ],\n \"description\": \"Story scope. Defaults to document body when omitted. Use {kind:'story', storyType:'body'} for body, or other storyType values for headers, footers, footnotes, endnotes.\"\n }\n },\n \"required\": [\n \"kind\",\n \"nodeType\",\n \"nodeId\"\n ]\n },\n \"edge\": {\n \"enum\": [\n \"before\",\n \"after\"\n ]\n }\n },\n \"required\": [\n \"kind\",\n \"node\",\n \"edge\"\n ]\n }\n ],\n \"description\": \"A point in the document. Use {kind:'text', blockId, offset} for character positions or {kind:'nodeEdge', node:{kind:'block', nodeType, nodeId}, edge:'before'|'after'} for block boundaries.\"\n },\n \"story\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"body\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"headerFooterSlot\",\n \"type\": \"string\"\n },\n \"section\": {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"section\",\n \"type\": \"string\"\n },\n \"sectionId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"sectionId\"\n ]\n },\n \"headerFooterKind\": {\n \"enum\": [\n \"header\",\n \"footer\"\n ]\n },\n \"variant\": {\n \"enum\": [\n \"default\",\n \"first\",\n \"even\"\n ]\n },\n \"resolution\": {\n \"enum\": [\n \"effective\",\n \"explicit\"\n ]\n },\n \"onWrite\": {\n \"enum\": [\n \"materializeIfInherited\",\n \"editResolvedPart\",\n \"error\"\n ]\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"section\",\n \"headerFooterKind\",\n \"variant\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"headerFooterPart\",\n \"type\": \"string\"\n },\n \"refId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"refId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"footnote\",\n \"type\": \"string\"\n },\n \"noteId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"noteId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"endnote\",\n \"type\": \"string\"\n },\n \"noteId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"noteId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"textbox\",\n \"type\": \"string\"\n },\n \"textboxId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"textboxId\"\n ]\n }\n ],\n \"description\": \"Story scope. Defaults to document body when omitted. Use {kind:'story', storyType:'body'} for body, or other storyType values for headers, footers, footnotes, endnotes.\"\n },\n \"coordinateSpace\": {\n \"enum\": [\n \"visible\",\n \"tracked\"\n ]\n }\n },\n \"required\": [\n \"kind\",\n \"start\",\n \"end\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"block\",\n \"type\": \"string\"\n },\n \"nodeType\": {\n \"enum\": [\n \"paragraph\",\n \"heading\",\n \"listItem\",\n \"table\",\n \"tableRow\",\n \"tableCell\",\n \"tableOfContents\",\n \"image\",\n \"sdt\"\n ]\n },\n \"nodeId\": {\n \"type\": \"string\"\n },\n \"story\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"body\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"headerFooterSlot\",\n \"type\": \"string\"\n },\n \"section\": {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"section\",\n \"type\": \"string\"\n },\n \"sectionId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"sectionId\"\n ]\n },\n \"headerFooterKind\": {\n \"enum\": [\n \"header\",\n \"footer\"\n ]\n },\n \"variant\": {\n \"enum\": [\n \"default\",\n \"first\",\n \"even\"\n ]\n },\n \"resolution\": {\n \"enum\": [\n \"effective\",\n \"explicit\"\n ]\n },\n \"onWrite\": {\n \"enum\": [\n \"materializeIfInherited\",\n \"editResolvedPart\",\n \"error\"\n ]\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"section\",\n \"headerFooterKind\",\n \"variant\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"headerFooterPart\",\n \"type\": \"string\"\n },\n \"refId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"refId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"footnote\",\n \"type\": \"string\"\n },\n \"noteId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"noteId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"endnote\",\n \"type\": \"string\"\n },\n \"noteId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"noteId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"textbox\",\n \"type\": \"string\"\n },\n \"textboxId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"textboxId\"\n ]\n }\n ],\n \"description\": \"Story scope. Defaults to document body when omitted. Use {kind:'story', storyType:'body'} for body, or other storyType values for headers, footers, footnotes, endnotes.\"\n }\n },\n \"required\": [\n \"kind\",\n \"nodeType\",\n \"nodeId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"selection\",\n \"type\": \"string\"\n },\n \"start\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"text\",\n \"type\": \"string\"\n },\n \"blockId\": {\n \"type\": \"string\"\n },\n \"offset\": {\n \"type\": \"number\"\n },\n \"story\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"body\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"headerFooterSlot\",\n \"type\": \"string\"\n },\n \"section\": {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"section\",\n \"type\": \"string\"\n },\n \"sectionId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"sectionId\"\n ]\n },\n \"headerFooterKind\": {\n \"enum\": [\n \"header\",\n \"footer\"\n ]\n },\n \"variant\": {\n \"enum\": [\n \"default\",\n \"first\",\n \"even\"\n ]\n },\n \"resolution\": {\n \"enum\": [\n \"effective\",\n \"explicit\"\n ]\n },\n \"onWrite\": {\n \"enum\": [\n \"materializeIfInherited\",\n \"editResolvedPart\",\n \"error\"\n ]\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"section\",\n \"headerFooterKind\",\n \"variant\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"headerFooterPart\",\n \"type\": \"string\"\n },\n \"refId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"refId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"footnote\",\n \"type\": \"string\"\n },\n \"noteId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"noteId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"endnote\",\n \"type\": \"string\"\n },\n \"noteId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"noteId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"textbox\",\n \"type\": \"string\"\n },\n \"textboxId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"textboxId\"\n ]\n }\n ],\n \"description\": \"Story scope. Defaults to document body when omitted. Use {kind:'story', storyType:'body'} for body, or other storyType values for headers, footers, footnotes, endnotes.\"\n }\n },\n \"required\": [\n \"kind\",\n \"blockId\",\n \"offset\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"nodeEdge\",\n \"type\": \"string\"\n },\n \"node\": {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"block\",\n \"type\": \"string\"\n },\n \"nodeType\": {\n \"enum\": [\n \"paragraph\",\n \"heading\",\n \"table\",\n \"tableOfContents\",\n \"sdt\",\n \"image\"\n ]\n },\n \"nodeId\": {\n \"type\": \"string\"\n },\n \"story\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"body\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"headerFooterSlot\",\n \"type\": \"string\"\n },\n \"section\": {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"section\",\n \"type\": \"string\"\n },\n \"sectionId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"sectionId\"\n ]\n },\n \"headerFooterKind\": {\n \"enum\": [\n \"header\",\n \"footer\"\n ]\n },\n \"variant\": {\n \"enum\": [\n \"default\",\n \"first\",\n \"even\"\n ]\n },\n \"resolution\": {\n \"enum\": [\n \"effective\",\n \"explicit\"\n ]\n },\n \"onWrite\": {\n \"enum\": [\n \"materializeIfInherited\",\n \"editResolvedPart\",\n \"error\"\n ]\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"section\",\n \"headerFooterKind\",\n \"variant\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"headerFooterPart\",\n \"type\": \"string\"\n },\n \"refId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"refId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"footnote\",\n \"type\": \"string\"\n },\n \"noteId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"noteId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"endnote\",\n \"type\": \"string\"\n },\n \"noteId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"noteId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"textbox\",\n \"type\": \"string\"\n },\n \"textboxId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"textboxId\"\n ]\n }\n ],\n \"description\": \"Story scope. Defaults to document body when omitted. Use {kind:'story', storyType:'body'} for body, or other storyType values for headers, footers, footnotes, endnotes.\"\n }\n },\n \"required\": [\n \"kind\",\n \"nodeType\",\n \"nodeId\"\n ]\n },\n \"edge\": {\n \"enum\": [\n \"before\",\n \"after\"\n ]\n }\n },\n \"required\": [\n \"kind\",\n \"node\",\n \"edge\"\n ]\n }\n ],\n \"description\": \"A point in the document. Use {kind:'text', blockId, offset} for character positions or {kind:'nodeEdge', node:{kind:'block', nodeType, nodeId}, edge:'before'|'after'} for block boundaries.\"\n },\n \"end\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"text\",\n \"type\": \"string\"\n },\n \"blockId\": {\n \"type\": \"string\"\n },\n \"offset\": {\n \"type\": \"number\"\n },\n \"story\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"body\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"headerFooterSlot\",\n \"type\": \"string\"\n },\n \"section\": {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"section\",\n \"type\": \"string\"\n },\n \"sectionId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"sectionId\"\n ]\n },\n \"headerFooterKind\": {\n \"enum\": [\n \"header\",\n \"footer\"\n ]\n },\n \"variant\": {\n \"enum\": [\n \"default\",\n \"first\",\n \"even\"\n ]\n },\n \"resolution\": {\n \"enum\": [\n \"effective\",\n \"explicit\"\n ]\n },\n \"onWrite\": {\n \"enum\": [\n \"materializeIfInherited\",\n \"editResolvedPart\",\n \"error\"\n ]\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"section\",\n \"headerFooterKind\",\n \"variant\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"headerFooterPart\",\n \"type\": \"string\"\n },\n \"refId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"refId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"footnote\",\n \"type\": \"string\"\n },\n \"noteId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"noteId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"endnote\",\n \"type\": \"string\"\n },\n \"noteId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"noteId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"textbox\",\n \"type\": \"string\"\n },\n \"textboxId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"textboxId\"\n ]\n }\n ],\n \"description\": \"Story scope. Defaults to document body when omitted. Use {kind:'story', storyType:'body'} for body, or other storyType values for headers, footers, footnotes, endnotes.\"\n }\n },\n \"required\": [\n \"kind\",\n \"blockId\",\n \"offset\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"nodeEdge\",\n \"type\": \"string\"\n },\n \"node\": {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"block\",\n \"type\": \"string\"\n },\n \"nodeType\": {\n \"enum\": [\n \"paragraph\",\n \"heading\",\n \"table\",\n \"tableOfContents\",\n \"sdt\",\n \"image\"\n ]\n },\n \"nodeId\": {\n \"type\": \"string\"\n },\n \"story\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"body\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"headerFooterSlot\",\n \"type\": \"string\"\n },\n \"section\": {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"section\",\n \"type\": \"string\"\n },\n \"sectionId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"sectionId\"\n ]\n },\n \"headerFooterKind\": {\n \"enum\": [\n \"header\",\n \"footer\"\n ]\n },\n \"variant\": {\n \"enum\": [\n \"default\",\n \"first\",\n \"even\"\n ]\n },\n \"resolution\": {\n \"enum\": [\n \"effective\",\n \"explicit\"\n ]\n },\n \"onWrite\": {\n \"enum\": [\n \"materializeIfInherited\",\n \"editResolvedPart\",\n \"error\"\n ]\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"section\",\n \"headerFooterKind\",\n \"variant\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"headerFooterPart\",\n \"type\": \"string\"\n },\n \"refId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"refId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"footnote\",\n \"type\": \"string\"\n },\n \"noteId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"noteId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"endnote\",\n \"type\": \"string\"\n },\n \"noteId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"noteId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"textbox\",\n \"type\": \"string\"\n },\n \"textboxId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"textboxId\"\n ]\n }\n ],\n \"description\": \"Story scope. Defaults to document body when omitted. Use {kind:'story', storyType:'body'} for body, or other storyType values for headers, footers, footnotes, endnotes.\"\n }\n },\n \"required\": [\n \"kind\",\n \"nodeType\",\n \"nodeId\"\n ]\n },\n \"edge\": {\n \"enum\": [\n \"before\",\n \"after\"\n ]\n }\n },\n \"required\": [\n \"kind\",\n \"node\",\n \"edge\"\n ]\n }\n ],\n \"description\": \"A point in the document. Use {kind:'text', blockId, offset} for character positions or {kind:'nodeEdge', node:{kind:'block', nodeType, nodeId}, edge:'before'|'after'} for block boundaries.\"\n },\n \"story\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"body\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"headerFooterSlot\",\n \"type\": \"string\"\n },\n \"section\": {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"section\",\n \"type\": \"string\"\n },\n \"sectionId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"sectionId\"\n ]\n },\n \"headerFooterKind\": {\n \"enum\": [\n \"header\",\n \"footer\"\n ]\n },\n \"variant\": {\n \"enum\": [\n \"default\",\n \"first\",\n \"even\"\n ]\n },\n \"resolution\": {\n \"enum\": [\n \"effective\",\n \"explicit\"\n ]\n },\n \"onWrite\": {\n \"enum\": [\n \"materializeIfInherited\",\n \"editResolvedPart\",\n \"error\"\n ]\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"section\",\n \"headerFooterKind\",\n \"variant\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"headerFooterPart\",\n \"type\": \"string\"\n },\n \"refId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"refId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"footnote\",\n \"type\": \"string\"\n },\n \"noteId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"noteId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"endnote\",\n \"type\": \"string\"\n },\n \"noteId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"noteId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"textbox\",\n \"type\": \"string\"\n },\n \"textboxId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"textboxId\"\n ]\n }\n ],\n \"description\": \"Story scope. Defaults to document body when omitted. Use {kind:'story', storyType:'body'} for body, or other storyType values for headers, footers, footnotes, endnotes.\"\n },\n \"coordinateSpace\": {\n \"enum\": [\n \"visible\",\n \"tracked\"\n ]\n }\n },\n \"required\": [\n \"kind\",\n \"start\",\n \"end\"\n ]\n }\n ]\n }\n ],\n \"description\": \"Block address for structural insertion: {kind:'block', nodeType:'...', nodeId:'...'}.\"\n },\n {\n \"$ref\": \"#/$defs/SelectionTarget\",\n \"description\": \"Selection target: {kind:'selection', start:{kind:'text', blockId, offset}, end:{kind:'text', blockId, offset}}. Use 'ref' instead when you have a search result handle.\"\n }\n ],\n \"description\": \"Block address for structural insertion: {kind:'block', nodeType:'...', nodeId:'...'}.\"\n },\n \"in\": {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"$ref\": \"#/$defs/StoryLocator\",\n \"description\": \"Story scope. Defaults to document body when omitted. Use {kind:'story', storyType:'body'} for body, or other storyType values for headers, footers, footnotes, endnotes.\"\n },\n {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"body\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"headerFooterSlot\",\n \"type\": \"string\"\n },\n \"section\": {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"section\",\n \"type\": \"string\"\n },\n \"sectionId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"sectionId\"\n ]\n },\n \"headerFooterKind\": {\n \"enum\": [\n \"header\",\n \"footer\"\n ]\n },\n \"variant\": {\n \"enum\": [\n \"default\",\n \"first\",\n \"even\"\n ]\n },\n \"resolution\": {\n \"enum\": [\n \"effective\",\n \"explicit\"\n ]\n },\n \"onWrite\": {\n \"enum\": [\n \"materializeIfInherited\",\n \"editResolvedPart\",\n \"error\"\n ]\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"section\",\n \"headerFooterKind\",\n \"variant\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"headerFooterPart\",\n \"type\": \"string\"\n },\n \"refId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"refId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"footnote\",\n \"type\": \"string\"\n },\n \"noteId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"noteId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"endnote\",\n \"type\": \"string\"\n },\n \"noteId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"noteId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"textbox\",\n \"type\": \"string\"\n },\n \"textboxId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"textboxId\"\n ]\n }\n ],\n \"description\": \"Story scope. Defaults to document body when omitted. Use {kind:'story', storyType:'body'} for body, or other storyType values for headers, footers, footnotes, endnotes.\"\n }\n ],\n \"description\": \"Story scope. Defaults to document body when omitted. Use {kind:'story', storyType:'body'} for body, or other storyType values for headers, footers, footnotes, endnotes.\"\n },\n {\n \"$ref\": \"#/$defs/StoryLocator\",\n \"description\": \"Story scope. Defaults to document body when omitted. Use {kind:'story', storyType:'body'} for body, or other storyType values for headers, footers, footnotes, endnotes.\"\n }\n ],\n \"description\": \"Story scope. Defaults to document body when omitted. Use {kind:'story', storyType:'body'} for body, or other storyType values for headers, footers, footnotes, endnotes.\"\n },\n \"value\": {\n \"type\": \"string\",\n \"description\": \"Text content to insert. Only for action 'insert'. Omit for other actions.\"\n },\n \"type\": {\n \"type\": \"string\",\n \"description\": \"Content format: 'text' (default), 'markdown', or 'html'. Only for action 'insert'. Omit for other actions.\",\n \"enum\": [\n \"text\",\n \"markdown\",\n \"html\"\n ]\n },\n \"ref\": {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"description\": \"Handle ref from superdoc_search result (pass handle.ref value directly). Preferred over building a target object.\"\n },\n {\n \"type\": \"string\",\n \"description\": \"Handle ref string from a superdoc_search result. Pass the handle.ref value directly (e.g. 'text:eyJ...'). Preferred over 'target' for inline formatting.\"\n }\n ],\n \"description\": \"Handle ref from superdoc_search result (pass handle.ref value directly). Preferred over building a target object.\"\n },\n {\n \"type\": \"string\",\n \"description\": \"Handle ref string from a superdoc_search result. Pass the handle.ref value directly (e.g. 'text:eyJ...'). Preferred over 'target' for inline formatting.\"\n }\n ],\n \"description\": \"Handle ref from superdoc_search result (pass handle.ref value directly). Preferred over building a target object.\"\n },\n \"content\": {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"type\": \"object\"\n },\n {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\"\n }\n }\n ],\n \"description\": \"Document fragment to insert (structured content).\"\n },\n {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {}\n },\n {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {}\n }\n }\n ],\n \"description\": \"Document fragment to replace with (structured content).\"\n }\n ],\n \"description\": \"Document fragment to insert (structured content). Only for actions 'insert', 'replace'. Omit for other actions.\"\n },\n \"placement\": {\n \"enum\": [\n \"before\",\n \"after\",\n \"insideStart\",\n \"insideEnd\"\n ],\n \"description\": \"Where to place content relative to target: 'before', 'after', 'insideStart', or 'insideEnd'. Only for action 'insert'. Omit for other actions.\"\n },\n \"nestingPolicy\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"tables\": {\n \"enum\": [\n \"forbid\",\n \"allow\"\n ]\n }\n },\n \"additionalProperties\": false,\n \"description\": \"Controls nesting behavior. tables: 'allow' permits inserting tables inside other tables.\"\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"tables\": {\n \"enum\": [\n \"forbid\",\n \"allow\"\n ]\n }\n },\n \"description\": \"Controls nesting behavior. tables: 'allow' permits inserting tables inside other tables.\"\n }\n ],\n \"description\": \"Controls nesting behavior. tables: 'allow' permits inserting tables inside other tables. Only for actions 'insert', 'replace'. Omit for other actions.\"\n },\n \"text\": {\n \"type\": \"string\",\n \"description\": \"Replacement text content. Only for action 'replace'. Omit for other actions.\"\n },\n \"behavior\": {\n \"$ref\": \"#/$defs/DeleteBehavior\",\n \"description\": \"Delete behavior: 'selection' (default) or 'exact'. Only for action 'delete'. Omit for other actions.\"\n }\n },\n \"required\": [\n \"action\"\n ],\n \"additionalProperties\": false\n },\n \"mutates\": true,\n \"operations\": [\n {\n \"operationId\": \"doc.insert\",\n \"intentAction\": \"insert\",\n \"requiredOneOf\": [\n [\n \"target\",\n \"value\"\n ],\n [\n \"ref\",\n \"value\"\n ],\n [\n \"value\"\n ],\n [\n \"content\"\n ]\n ]\n },\n {\n \"operationId\": \"doc.replace\",\n \"intentAction\": \"replace\",\n \"requiredOneOf\": [\n [\n \"target\",\n \"text\"\n ],\n [\n \"ref\",\n \"text\"\n ],\n [\n \"target\",\n \"content\"\n ],\n [\n \"ref\",\n \"content\"\n ]\n ]\n },\n {\n \"operationId\": \"doc.delete\",\n \"intentAction\": \"delete\",\n \"requiredOneOf\": [\n [\n \"target\"\n ],\n [\n \"ref\"\n ]\n ]\n },\n {\n \"operationId\": \"doc.history.undo\",\n \"intentAction\": \"undo\"\n },\n {\n \"operationId\": \"doc.history.redo\",\n \"intentAction\": \"redo\"\n }\n ]\n },\n {\n \"toolName\": \"superdoc_format\",\n \"description\": \"Change text and paragraph formatting. To format multiple items at once, use superdoc_mutations with format.apply steps instead of calling this tool repeatedly. Use require \\\"all\\\" with a node selector to format every heading or paragraph in one batch. Use this tool for single-item formatting when you have a valid ref or nodeId. Action \\\"inline\\\" applies character formatting (bold, italic, underline, color, fontSize, fontFamily, highlight, strike, vertAlign) to a text range via \\\"ref\\\". Action \\\"set_style\\\" applies a named paragraph style by styleId (get available styles from superdoc_get_content info). Actions \\\"set_alignment\\\", \\\"set_indentation\\\", \\\"set_spacing\\\", \\\"set_direction\\\", and \\\"set_flow_options\\\" change paragraph-level properties and require a block target: {kind:\\\"block\\\", nodeType:\\\"paragraph\\\", nodeId:\\\"<nodeId>\\\"}, NOT a ref. Use \\\"set_flow_options\\\" with pageBreakBefore:true to start a paragraph on a new page. Supports \\\"dryRun\\\" and \\\"changeMode: tracked\\\" for inline formatting. Paragraph-level actions do NOT support tracked changes. Do NOT use a search ref for paragraph-level actions; they require a block target with nodeId. Do NOT use {kind:\\\"block\\\", start:{kind:\\\"nodeEdge\\\",...}} or selection-like structures for paragraph actions. ONLY {kind:\\\"block\\\", nodeType, nodeId} is accepted. Do NOT issue multiple superdoc_format calls in parallel; each call invalidates refs for subsequent calls.\\n\\nEXAMPLES:\\n 1. {\\\"action\\\":\\\"inline\\\",\\\"ref\\\":\\\"<handle.ref>\\\",\\\"inline\\\":{\\\"bold\\\":true}}\\n 2. {\\\"action\\\":\\\"inline\\\",\\\"ref\\\":\\\"<create.ref>\\\",\\\"inline\\\":{\\\"fontFamily\\\":\\\"Calibri\\\",\\\"fontSize\\\":11,\\\"color\\\":\\\"#000000\\\",\\\"bold\\\":false}}\\n 3. {\\\"action\\\":\\\"set_alignment\\\",\\\"target\\\":{\\\"kind\\\":\\\"block\\\",\\\"nodeType\\\":\\\"paragraph\\\",\\\"nodeId\\\":\\\"<nodeId>\\\"},\\\"alignment\\\":\\\"center\\\"}\\n 4. {\\\"action\\\":\\\"set_flow_options\\\",\\\"target\\\":{\\\"kind\\\":\\\"block\\\",\\\"nodeType\\\":\\\"paragraph\\\",\\\"nodeId\\\":\\\"<nodeId>\\\"},\\\"pageBreakBefore\\\":true}\\n 5. {\\\"action\\\":\\\"set_spacing\\\",\\\"target\\\":{\\\"kind\\\":\\\"block\\\",\\\"nodeType\\\":\\\"paragraph\\\",\\\"nodeId\\\":\\\"<nodeId>\\\"},\\\"lineSpacing\\\":{\\\"rule\\\":\\\"auto\\\",\\\"value\\\":1.5}}\",\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"action\": {\n \"type\": \"string\",\n \"enum\": [\n \"inline\",\n \"set_alignment\",\n \"set_direction\",\n \"set_flow_options\",\n \"set_indentation\",\n \"set_spacing\",\n \"set_style\",\n \"set_style_ref\"\n ],\n \"description\": \"The action to perform. One of: inline, set_alignment, set_direction, set_flow_options, set_indentation, set_spacing, set_style, set_style_ref.\"\n },\n \"force\": {\n \"type\": \"boolean\",\n \"description\": \"Bypass confirmation checks.\"\n },\n \"changeMode\": {\n \"type\": \"string\",\n \"description\": \"Edit mode: \\\"direct\\\" applies changes immediately, \\\"tracked\\\" records as suggestions.\"\n },\n \"dryRun\": {\n \"type\": \"boolean\",\n \"description\": \"Preview the result without applying changes.\"\n },\n \"target\": {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"$ref\": \"#/$defs/SelectionTarget\",\n \"description\": \"Selection target: {kind:'selection', start:{kind:'text', blockId, offset}, end:{kind:'text', blockId, offset}}. Use 'ref' instead when you have a search result handle.\"\n },\n {\n \"oneOf\": [\n {\n \"$ref\": \"#/$defs/ParagraphAddress\"\n },\n {\n \"$ref\": \"#/$defs/HeadingAddress\"\n },\n {\n \"$ref\": \"#/$defs/ListItemAddress\"\n }\n ]\n }\n ],\n \"description\": \"Selection target: {kind:'selection', start:{kind:'text', blockId, offset}, end:{kind:'text', blockId, offset}}. Use 'ref' instead when you have a search result handle.\"\n },\n {\n \"oneOf\": [\n {\n \"$ref\": \"#/$defs/ParagraphAddress\"\n },\n {\n \"$ref\": \"#/$defs/HeadingAddress\"\n },\n {\n \"$ref\": \"#/$defs/ListItemAddress\"\n }\n ]\n }\n ],\n \"description\": \"Selection target: {kind:'selection', start:{kind:'text', blockId, offset}, end:{kind:'text', blockId, offset}}. Use 'ref' instead when you have a search result handle.\"\n },\n {\n \"oneOf\": [\n {\n \"$ref\": \"#/$defs/ParagraphAddress\"\n },\n {\n \"$ref\": \"#/$defs/HeadingAddress\"\n },\n {\n \"$ref\": \"#/$defs/ListItemAddress\"\n }\n ]\n }\n ],\n \"description\": \"Selection target: {kind:'selection', start:{kind:'text', blockId, offset}, end:{kind:'text', blockId, offset}}. Use 'ref' instead when you have a search result handle.\"\n },\n {\n \"oneOf\": [\n {\n \"$ref\": \"#/$defs/ParagraphAddress\"\n },\n {\n \"$ref\": \"#/$defs/HeadingAddress\"\n },\n {\n \"$ref\": \"#/$defs/ListItemAddress\"\n }\n ]\n }\n ],\n \"description\": \"Selection target: {kind:'selection', start:{kind:'text', blockId, offset}, end:{kind:'text', blockId, offset}}. Use 'ref' instead when you have a search result handle.\"\n },\n {\n \"oneOf\": [\n {\n \"$ref\": \"#/$defs/ParagraphAddress\"\n },\n {\n \"$ref\": \"#/$defs/HeadingAddress\"\n },\n {\n \"$ref\": \"#/$defs/ListItemAddress\"\n }\n ]\n }\n ],\n \"description\": \"Selection target: {kind:'selection', start:{kind:'text', blockId, offset}, end:{kind:'text', blockId, offset}}. Use 'ref' instead when you have a search result handle.\"\n },\n {\n \"oneOf\": [\n {\n \"$ref\": \"#/$defs/ParagraphAddress\"\n },\n {\n \"$ref\": \"#/$defs/HeadingAddress\"\n },\n {\n \"$ref\": \"#/$defs/ListItemAddress\"\n }\n ]\n }\n ],\n \"description\": \"Selection target: {kind:'selection', start:{kind:'text', blockId, offset}, end:{kind:'text', blockId, offset}}. Use 'ref' instead when you have a search result handle.\"\n },\n {\n \"oneOf\": [\n {\n \"$ref\": \"#/$defs/ParagraphAddress\"\n },\n {\n \"$ref\": \"#/$defs/HeadingAddress\"\n },\n {\n \"$ref\": \"#/$defs/ListItemAddress\"\n }\n ]\n }\n ],\n \"description\": \"Selection target: {kind:'selection', start:{kind:'text', blockId, offset}, end:{kind:'text', blockId, offset}}. Use 'ref' instead when you have a search result handle. Required for actions 'set_style', 'set_style_ref', 'set_alignment', 'set_indentation', 'set_spacing', 'set_flow_options', 'set_direction'.\"\n },\n \"in\": {\n \"$ref\": \"#/$defs/StoryLocator\",\n \"description\": \"Story scope. Defaults to document body when omitted. Use {kind:'story', storyType:'body'} for body, or other storyType values for headers, footers, footnotes, endnotes. Only for action 'inline'. Omit for other actions.\"\n },\n \"inline\": {\n \"type\": \"object\",\n \"properties\": {\n \"bold\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"italic\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"strike\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"underline\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"style\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"color\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"themeColor\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"additionalProperties\": false,\n \"minProperties\": 1\n }\n ]\n },\n \"highlight\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"color\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"fontSize\": {\n \"oneOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"fontFamily\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"letterSpacing\": {\n \"oneOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"vertAlign\": {\n \"oneOf\": [\n {\n \"enum\": [\n \"superscript\",\n \"subscript\",\n \"baseline\"\n ]\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"position\": {\n \"oneOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"dstrike\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"smallCaps\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"caps\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"shading\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"fill\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"color\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"val\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"additionalProperties\": false,\n \"minProperties\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"border\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"val\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"sz\": {\n \"oneOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"color\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"space\": {\n \"oneOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"additionalProperties\": false,\n \"minProperties\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"outline\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"shadow\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"emboss\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"imprint\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"charScale\": {\n \"oneOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"kerning\": {\n \"oneOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"vanish\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"webHidden\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"specVanish\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"rtl\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"cs\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"bCs\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"iCs\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"eastAsianLayout\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"combine\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"combineBrackets\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"vert\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"vertCompress\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"additionalProperties\": false,\n \"minProperties\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"em\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"fitText\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"val\": {\n \"oneOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"id\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"additionalProperties\": false,\n \"minProperties\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"snapToGrid\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"lang\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"val\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"eastAsia\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"bidi\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"additionalProperties\": false,\n \"minProperties\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"oMath\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"rStyle\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"rFonts\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"ascii\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"hAnsi\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"eastAsia\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"cs\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"asciiTheme\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"hAnsiTheme\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"eastAsiaTheme\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"csTheme\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"hint\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"additionalProperties\": false,\n \"minProperties\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"fontSizeCs\": {\n \"oneOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"ligatures\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"numForm\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"numSpacing\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"stylisticSets\": {\n \"oneOf\": [\n {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"number\"\n },\n \"val\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"id\"\n ],\n \"additionalProperties\": false\n },\n \"minItems\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"contextualAlternates\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"additionalProperties\": false,\n \"minProperties\": 1,\n \"description\": \"Inline formatting properties to apply. Set a property to apply it, use null to clear it. Example: {bold: true, italic: true} or {bold: null} to remove bold. Only for action 'inline'. Omit for other actions.\"\n },\n \"ref\": {\n \"type\": \"string\",\n \"description\": \"Handle ref string from a superdoc_search result. Pass the handle.ref value directly (e.g. 'text:eyJ...'). Preferred over 'target' for inline formatting. Only for action 'inline'. Omit for other actions.\"\n },\n \"styleId\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1,\n \"description\": \"Named paragraph style ID (e.g. 'Normal', 'Heading1', 'BodyText'). Use superdoc_search to find a nearby paragraph, then inspect its style to determine the correct styleId.\"\n },\n {\n \"type\": \"string\",\n \"minLength\": 1,\n \"description\": \"Named paragraph style ID (e.g. 'Normal', 'Heading1'). Unlike setStyle, existing run formatting is preserved.\"\n }\n ],\n \"description\": \"Named paragraph style ID (e.g. 'Normal', 'Heading1', 'BodyText'). Use superdoc_search to find a nearby paragraph, then inspect its style to determine the correct styleId. Required for action 'set_style_ref'.\"\n },\n \"role\": {\n \"anyOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"defaultParagraph\",\n \"type\": \"string\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"kind\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"heading\",\n \"type\": \"string\"\n },\n \"level\": {\n \"type\": \"integer\",\n \"minimum\": 1,\n \"maximum\": 9\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"kind\",\n \"level\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"title\",\n \"type\": \"string\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"kind\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"subtitle\",\n \"type\": \"string\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"kind\"\n ]\n }\n ],\n \"description\": \"Semantic built-in style intent, resolved to the document authored style identity. Only for action 'set_style'. Omit for other actions.\"\n },\n \"alignment\": {\n \"enum\": [\n \"left\",\n \"center\",\n \"right\",\n \"justify\"\n ],\n \"description\": \"Visual paragraph alignment. In RTL paragraphs, 'left' stores w:jc='right' and 'right' stores w:jc='left' so Word displays the requested side. Required for action 'set_alignment'.\"\n },\n \"left\": {\n \"type\": \"integer\",\n \"description\": \"Left indentation in twips (1440 = 1 inch). Only for action 'set_indentation'. Omit for other actions.\"\n },\n \"right\": {\n \"type\": \"integer\",\n \"description\": \"Right indentation in twips (1440 = 1 inch). Only for action 'set_indentation'. Omit for other actions.\"\n },\n \"firstLine\": {\n \"type\": \"integer\",\n \"minimum\": 0,\n \"description\": \"First line indent in twips. Cannot be combined with hanging. Only for action 'set_indentation'. Omit for other actions.\"\n },\n \"hanging\": {\n \"type\": \"integer\",\n \"minimum\": 0,\n \"description\": \"Hanging indent in twips. Cannot be combined with firstLine. Only for action 'set_indentation'. Omit for other actions.\"\n },\n \"before\": {\n \"type\": \"integer\",\n \"minimum\": 0,\n \"description\": \"Space before paragraph in twips (20 twips = 1pt). Only for action 'set_spacing'. Omit for other actions.\"\n },\n \"after\": {\n \"type\": \"integer\",\n \"minimum\": 0,\n \"description\": \"Space after paragraph in twips (20 twips = 1pt). Only for action 'set_spacing'. Omit for other actions.\"\n },\n \"line\": {\n \"type\": \"integer\",\n \"minimum\": 1,\n \"description\": \"Line spacing value. Meaning depends on lineRule. Must be provided together with lineRule. Only for action 'set_spacing'. Omit for other actions.\"\n },\n \"lineRule\": {\n \"enum\": [\n \"auto\",\n \"exact\",\n \"atLeast\"\n ],\n \"description\": \"Line spacing rule. Required when 'line' is set. Only for action 'set_spacing'. Omit for other actions.\"\n },\n \"contextualSpacing\": {\n \"type\": \"boolean\",\n \"description\": \"Only for action 'set_flow_options'. Omit for other actions.\"\n },\n \"pageBreakBefore\": {\n \"type\": \"boolean\",\n \"description\": \"Only for action 'set_flow_options'. Omit for other actions.\"\n },\n \"suppressAutoHyphens\": {\n \"type\": \"boolean\",\n \"description\": \"Only for action 'set_flow_options'. Omit for other actions.\"\n },\n \"autoSpaceDE\": {\n \"type\": \"boolean\",\n \"description\": \"Only for action 'set_flow_options'. Omit for other actions.\"\n },\n \"autoSpaceDN\": {\n \"type\": \"boolean\",\n \"description\": \"Only for action 'set_flow_options'. Omit for other actions.\"\n },\n \"adjustRightInd\": {\n \"type\": \"boolean\",\n \"description\": \"Only for action 'set_flow_options'. Omit for other actions.\"\n },\n \"snapToGrid\": {\n \"type\": \"boolean\",\n \"description\": \"Only for action 'set_flow_options'. Omit for other actions.\"\n },\n \"direction\": {\n \"type\": \"string\",\n \"enum\": [\n \"ltr\",\n \"rtl\"\n ],\n \"description\": \"Required for action 'set_direction'.\"\n },\n \"alignmentPolicy\": {\n \"type\": \"string\",\n \"enum\": [\n \"preserve\",\n \"matchDirection\"\n ],\n \"description\": \"Only for action 'set_direction'. Omit for other actions.\"\n }\n },\n \"required\": [\n \"action\"\n ],\n \"additionalProperties\": false\n },\n \"mutates\": true,\n \"operations\": [\n {\n \"operationId\": \"doc.format.apply\",\n \"intentAction\": \"inline\",\n \"requiredOneOf\": [\n [\n \"target\",\n \"inline\"\n ],\n [\n \"ref\",\n \"inline\"\n ]\n ]\n },\n {\n \"operationId\": \"doc.styles.paragraph.setStyle\",\n \"intentAction\": \"set_style\",\n \"required\": [\n \"target\"\n ]\n },\n {\n \"operationId\": \"doc.styles.paragraph.setStyleRef\",\n \"intentAction\": \"set_style_ref\",\n \"required\": [\n \"target\",\n \"styleId\"\n ]\n },\n {\n \"operationId\": \"doc.format.paragraph.setAlignment\",\n \"intentAction\": \"set_alignment\",\n \"required\": [\n \"target\",\n \"alignment\"\n ]\n },\n {\n \"operationId\": \"doc.format.paragraph.setIndentation\",\n \"intentAction\": \"set_indentation\",\n \"required\": [\n \"target\"\n ]\n },\n {\n \"operationId\": \"doc.format.paragraph.setSpacing\",\n \"intentAction\": \"set_spacing\",\n \"required\": [\n \"target\"\n ]\n },\n {\n \"operationId\": \"doc.format.paragraph.setFlowOptions\",\n \"intentAction\": \"set_flow_options\",\n \"required\": [\n \"target\"\n ]\n },\n {\n \"operationId\": \"doc.format.paragraph.setDirection\",\n \"intentAction\": \"set_direction\",\n \"required\": [\n \"target\",\n \"direction\"\n ]\n }\n ]\n },\n {\n \"toolName\": \"superdoc_create\",\n \"description\": \"IMPORTANT: For headings and paragraphs, use superdoc_edit with type \\\"markdown\\\" instead: it is faster, creates proper styles, and handles positioning via target + placement. Only use superdoc_create for tables or when markdown cannot express the content. Creates a single paragraph, heading, or table. Returns nodeId and ref for the created block. After creating, the returned ref is valid for ONE immediate superdoc_format call. For subsequent operations, re-fetch blocks with superdoc_get_content to get fresh refs (refs expire after any mutation). When the user asks for a \\\"heading\\\", use action \\\"heading\\\" with a level (default 1). Use action \\\"paragraph\\\" for regular body text. Position with \\\"at\\\": {kind:\\\"documentEnd\\\"} (default), {kind:\\\"documentStart\\\"}, or {kind:\\\"after\\\"/\\\"before\\\", target:{kind:\\\"block\\\", nodeType, nodeId}} for relative placement. When creating multiple items in sequence, use the previous response nodeId as the next \\\"at\\\" target to maintain correct ordering. Do NOT use newlines in \\\"text\\\" to create multiple paragraphs; call this tool separately for each one.\\n\\nEXAMPLES:\\n 1. {\\\"action\\\":\\\"paragraph\\\",\\\"text\\\":\\\"New paragraph content.\\\",\\\"at\\\":{\\\"kind\\\":\\\"documentEnd\\\"}}\\n 2. {\\\"action\\\":\\\"heading\\\",\\\"text\\\":\\\"Section Title\\\",\\\"level\\\":2,\\\"at\\\":{\\\"kind\\\":\\\"after\\\",\\\"target\\\":{\\\"kind\\\":\\\"block\\\",\\\"nodeType\\\":\\\"paragraph\\\",\\\"nodeId\\\":\\\"<nodeId>\\\"}}}\\n 3. {\\\"action\\\":\\\"paragraph\\\",\\\"text\\\":\\\"Chained item.\\\",\\\"at\\\":{\\\"kind\\\":\\\"after\\\",\\\"target\\\":{\\\"kind\\\":\\\"block\\\",\\\"nodeType\\\":\\\"paragraph\\\",\\\"nodeId\\\":\\\"<previousNodeId>\\\"}}}\\n 4. {\\\"action\\\":\\\"table\\\",\\\"rows\\\":3,\\\"columns\\\":4,\\\"at\\\":{\\\"kind\\\":\\\"documentEnd\\\"}}\",\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"action\": {\n \"type\": \"string\",\n \"enum\": [\n \"heading\",\n \"paragraph\",\n \"table\"\n ],\n \"description\": \"The action to perform. One of: heading, paragraph, table.\"\n },\n \"force\": {\n \"type\": \"boolean\",\n \"description\": \"Bypass confirmation checks.\"\n },\n \"changeMode\": {\n \"type\": \"string\",\n \"description\": \"Edit mode: \\\"direct\\\" applies changes immediately, \\\"tracked\\\" records as suggestions.\"\n },\n \"dryRun\": {\n \"type\": \"boolean\",\n \"description\": \"Preview the result without applying changes.\"\n },\n \"in\": {\n \"$ref\": \"#/$defs/StoryLocator\",\n \"description\": \"Story scope. Defaults to document body when omitted. Use {kind:'story', storyType:'body'} for body, or other storyType values for headers, footers, footnotes, endnotes.\"\n },\n \"at\": {\n \"oneOf\": [\n {\n \"description\": \"Position: {kind:'documentEnd'} to append, {kind:'documentStart'} to prepend, or {kind:'before'|'after', target:{kind:'block', nodeType:'...', nodeId:'...'}} for relative placement.\",\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"documentStart\",\n \"type\": \"string\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"kind\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"documentEnd\",\n \"type\": \"string\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"kind\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"before\",\n \"type\": \"string\"\n },\n \"target\": {\n \"$ref\": \"#/$defs/BlockNodeAddress\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"kind\",\n \"target\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"after\",\n \"type\": \"string\"\n },\n \"target\": {\n \"$ref\": \"#/$defs/BlockNodeAddress\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"kind\",\n \"target\"\n ]\n }\n ]\n },\n {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"documentStart\",\n \"type\": \"string\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"kind\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"documentEnd\",\n \"type\": \"string\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"kind\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"before\",\n \"type\": \"string\"\n },\n \"target\": {\n \"$ref\": \"#/$defs/BlockNodeAddress\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"kind\",\n \"target\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"after\",\n \"type\": \"string\"\n },\n \"target\": {\n \"$ref\": \"#/$defs/BlockNodeAddress\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"kind\",\n \"target\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"before\",\n \"type\": \"string\"\n },\n \"nodeId\": {\n \"type\": \"string\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"kind\",\n \"nodeId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"after\",\n \"type\": \"string\"\n },\n \"nodeId\": {\n \"type\": \"string\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"kind\",\n \"nodeId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"inParagraph\",\n \"type\": \"string\"\n },\n \"target\": {\n \"$ref\": \"#/$defs/BlockNodeAddress\"\n },\n \"offset\": {\n \"type\": \"integer\",\n \"minimum\": 0\n },\n \"coordinateSpace\": {\n \"enum\": [\n \"visible\",\n \"tracked\"\n ]\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"kind\",\n \"target\",\n \"offset\"\n ]\n }\n ]\n }\n ],\n \"description\": \"Position: {kind:'documentEnd'} to append, {kind:'documentStart'} to prepend, or {kind:'before'|'after', target:{kind:'block', nodeType:'...', nodeId:'...'}} for relative placement.\"\n },\n \"text\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"description\": \"Paragraph text content. Each call creates ONE paragraph. For multiple items (e.g. list items), call superdoc_create separately for each item: do NOT use newlines to put multiple items in one paragraph.\"\n },\n {\n \"type\": \"string\",\n \"description\": \"Heading text content.\"\n }\n ],\n \"description\": \"Paragraph text content. Each call creates ONE paragraph. For multiple items (e.g. list items), call superdoc_create separately for each item: do NOT use newlines to put multiple items in one paragraph.\"\n },\n \"input\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"description\": \"Full paragraph input as JSON (alternative to individual text/at params).\"\n },\n {\n \"type\": \"object\",\n \"description\": \"Full heading input as JSON (alternative to individual text/level/at params).\"\n }\n ],\n \"description\": \"Full paragraph input as JSON (alternative to individual text/at params).\"\n },\n \"level\": {\n \"type\": \"integer\",\n \"minimum\": 1,\n \"maximum\": 6,\n \"description\": \"Heading level (1-6). Required for action 'heading'.\"\n },\n \"rows\": {\n \"type\": \"integer\",\n \"minimum\": 1,\n \"description\": \"Required for action 'table'.\"\n },\n \"columns\": {\n \"type\": \"integer\",\n \"minimum\": 1,\n \"description\": \"Required for action 'table'.\"\n }\n },\n \"required\": [\n \"action\"\n ],\n \"additionalProperties\": false\n },\n \"mutates\": true,\n \"operations\": [\n {\n \"operationId\": \"doc.create.paragraph\",\n \"intentAction\": \"paragraph\"\n },\n {\n \"operationId\": \"doc.create.heading\",\n \"intentAction\": \"heading\",\n \"required\": [\n \"level\"\n ]\n },\n {\n \"operationId\": \"doc.create.table\",\n \"intentAction\": \"table\",\n \"required\": [\n \"rows\",\n \"columns\"\n ]\n }\n ]\n },\n {\n \"toolName\": \"superdoc_list\",\n \"description\": \"Create and manipulate bullet and numbered lists. Most actions require a list-item target: {kind:\\\"block\\\", nodeType:\\\"listItem\\\", nodeId:\\\"<id>\\\"}. Exceptions: \\\"create\\\" and \\\"attach\\\" operate on paragraph targets (they turn paragraphs into list items). Find nodeIds via superdoc_get_content({action:\\\"blocks\\\"}): pick listItem blocks for most actions, paragraph blocks for create/attach.\\n\\nCREATE & CONVERT:\\n• \\\"create\\\": make a NEW list from paragraphs. Two modes: mode:\\\"empty\\\" with at:{kind:\\\"block\\\", nodeType:\\\"paragraph\\\", nodeId} converts a single paragraph; mode:\\\"fromParagraphs\\\" with target:{from:{...paragraph block address}, to:{...paragraph block address}} converts a range: ALL paragraphs between from and to become items, so make sure no other content sits between them. Pass a preset (\\\"disc\\\"|\\\"circle\\\"|\\\"square\\\"|\\\"dash\\\" for bullets; \\\"decimal\\\"|\\\"decimalParenthesis\\\"|\\\"lowerLetter\\\"|\\\"lowerLetterParenthesis\\\"|\\\"upperLetter\\\"|\\\"upperLetterParenthesis\\\"|\\\"lowerRoman\\\"|\\\"upperRoman\\\" for ordered) or a custom style. Use \\\"create\\\" to start a fresh list: NOT to extend an existing one (use \\\"attach\\\" for that).\\n• \\\"attach\\\": add paragraphs to an EXISTING list, inheriting its numbering definition. Pass target:{paragraph block address} (or {from, to} range of paragraphs) + attachTo:{kind:\\\"block\\\", nodeType:\\\"listItem\\\", nodeId:\\\"<any item in destination list>\\\"} + optional level:0..8. Use this to extend a list or as the second half of a merge workflow (see \\\"join\\\" below).\\n• \\\"set_type\\\": convert an existing list between ordered and bullet. Pass target:{listItem} + kind:\\\"ordered\\\" or \\\"bullet\\\". Adjacent compatible sequences are merged automatically to preserve continuous numbering.\\n• \\\"detach\\\": convert a list item back to a plain paragraph. Pass target:{listItem}.\\n\\nITEMS & NESTING:\\n• \\\"insert\\\": add a new list item adjacent to an existing item in the same list. Pass target:{listItem} + position:\\\"before\\\"|\\\"after\\\" + optional text. Use this (NOT superdoc_create) to add items to an existing list.\\n• \\\"indent\\\" / \\\"outdent\\\": bump the target item's nesting level by one (0-8 range). Pass target:{listItem}.\\n• \\\"set_level\\\": jump the target item to an explicit level. Pass target:{listItem} + level:0..8.\\n\\nNUMBERING (ordered lists):\\n• \\\"set_value\\\": restart numbering at the target. Pass target:{listItem} + value:<number> (e.g. value:1 to start over) or value:null to clear a previous override. Mid-sequence targets are atomically split off into their own sequence.\\n• \\\"continue_previous\\\": make the target's sequence continue numbering from the nearest compatible previous sequence (same abstract definition). Pass target:{listItem of the sequence you want to renumber}. Fails with NO_COMPATIBLE_PREVIOUS or INCOMPATIBLE_DEFINITIONS if no matching prior sequence exists.\\n\\nSEQUENCE SHAPE (merge / split):\\n• \\\"merge\\\": merge the target's sequence with an adjacent one into one continuous list. Pass target:{listItem} + direction:\\\"withPrevious\\\" or \\\"withNext\\\". Absorbed items adopt the absorbing sequence's numbering definition, and empty paragraphs between the two sequences are removed so numbering flows continuously.\\n• \\\"split\\\": split the target's sequence at the target item into two independent lists. The target and everything after become a new sequence that restarts numbering at 1. Pass target:{listItem}; add restartNumbering:false to keep the count continuing instead of restarting.\\n\\nEXAMPLES:\\n 1. {\\\"action\\\":\\\"create\\\",\\\"mode\\\":\\\"fromParagraphs\\\",\\\"preset\\\":\\\"disc\\\",\\\"target\\\":{\\\"from\\\":{\\\"kind\\\":\\\"block\\\",\\\"nodeType\\\":\\\"paragraph\\\",\\\"nodeId\\\":\\\"<firstId>\\\"},\\\"to\\\":{\\\"kind\\\":\\\"block\\\",\\\"nodeType\\\":\\\"paragraph\\\",\\\"nodeId\\\":\\\"<lastId>\\\"}}}\\n 2. {\\\"action\\\":\\\"set_type\\\",\\\"target\\\":{\\\"kind\\\":\\\"block\\\",\\\"nodeType\\\":\\\"listItem\\\",\\\"nodeId\\\":\\\"<itemId>\\\"},\\\"kind\\\":\\\"ordered\\\"}\\n 3. {\\\"action\\\":\\\"insert\\\",\\\"target\\\":{\\\"kind\\\":\\\"block\\\",\\\"nodeType\\\":\\\"listItem\\\",\\\"nodeId\\\":\\\"<itemId>\\\"},\\\"position\\\":\\\"after\\\",\\\"text\\\":\\\"New list item\\\"}\\n 4. {\\\"action\\\":\\\"indent\\\",\\\"target\\\":{\\\"kind\\\":\\\"block\\\",\\\"nodeType\\\":\\\"listItem\\\",\\\"nodeId\\\":\\\"<itemId>\\\"}}\\n 5. {\\\"action\\\":\\\"merge\\\",\\\"target\\\":{\\\"kind\\\":\\\"block\\\",\\\"nodeType\\\":\\\"listItem\\\",\\\"nodeId\\\":\\\"<itemId>\\\"},\\\"direction\\\":\\\"withPrevious\\\"}\\n 6. {\\\"action\\\":\\\"split\\\",\\\"target\\\":{\\\"kind\\\":\\\"block\\\",\\\"nodeType\\\":\\\"listItem\\\",\\\"nodeId\\\":\\\"<itemId>\\\"}}\\n 7. {\\\"action\\\":\\\"set_value\\\",\\\"target\\\":{\\\"kind\\\":\\\"block\\\",\\\"nodeType\\\":\\\"listItem\\\",\\\"nodeId\\\":\\\"<itemId>\\\"},\\\"value\\\":1}\\n 8. {\\\"action\\\":\\\"continue_previous\\\",\\\"target\\\":{\\\"kind\\\":\\\"block\\\",\\\"nodeType\\\":\\\"listItem\\\",\\\"nodeId\\\":\\\"<itemId>\\\"}}\",\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"action\": {\n \"type\": \"string\",\n \"enum\": [\n \"attach\",\n \"continue_previous\",\n \"create\",\n \"delete\",\n \"detach\",\n \"indent\",\n \"insert\",\n \"merge\",\n \"outdent\",\n \"set_level\",\n \"set_type\",\n \"set_value\",\n \"split\"\n ],\n \"description\": \"The action to perform. One of: attach, continue_previous, create, delete, detach, indent, insert, merge, outdent, set_level, set_type, set_value, split.\"\n },\n \"force\": {\n \"type\": \"boolean\",\n \"description\": \"Bypass confirmation checks.\"\n },\n \"changeMode\": {\n \"type\": \"string\",\n \"description\": \"Edit mode: \\\"direct\\\" applies changes immediately, \\\"tracked\\\" records as suggestions.\"\n },\n \"dryRun\": {\n \"type\": \"boolean\",\n \"description\": \"Preview the result without applying changes.\"\n },\n \"target\": {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"$ref\": \"#/$defs/ListItemAddress\",\n \"description\": \"The target list item. For 'insert': the item to insert relative to. For 'create' with mode 'fromParagraphs': use nodeType 'paragraph' instead. Format: {kind:'block', nodeType:'listItem', nodeId:'<id>'}.\"\n },\n {\n \"$ref\": \"#/$defs/BlockAddressOrRange\",\n \"description\": \"Required when mode is 'fromParagraphs'. Each call converts ONE paragraph into a list item. To make a list with N items, create N separate paragraphs first, then call superdoc_list create for EACH one. Format: {kind:'block', nodeType:'paragraph', nodeId:'<id>'}.\"\n }\n ],\n \"description\": \"The target list item. For 'insert': the item to insert relative to. For 'create' with mode 'fromParagraphs': use nodeType 'paragraph' instead. Format: {kind:'block', nodeType:'listItem', nodeId:'<id>'}.\"\n },\n {\n \"$ref\": \"#/$defs/BlockAddressOrRange\"\n }\n ],\n \"description\": \"The target list item. For 'insert': the item to insert relative to. For 'create' with mode 'fromParagraphs': use nodeType 'paragraph' instead. Format: {kind:'block', nodeType:'listItem', nodeId:'<id>'}.\"\n },\n {\n \"$ref\": \"#/$defs/ListItemAddress\"\n }\n ],\n \"description\": \"The target list item. For 'insert': the item to insert relative to. For 'create' with mode 'fromParagraphs': use nodeType 'paragraph' instead. Format: {kind:'block', nodeType:'listItem', nodeId:'<id>'}.\"\n },\n {\n \"$ref\": \"#/$defs/ListItemAddress\"\n }\n ],\n \"description\": \"The target list item. For 'insert': the item to insert relative to. For 'create' with mode 'fromParagraphs': use nodeType 'paragraph' instead. Format: {kind:'block', nodeType:'listItem', nodeId:'<id>'}.\"\n },\n {\n \"$ref\": \"#/$defs/ListItemAddress\"\n }\n ],\n \"description\": \"The target list item. For 'insert': the item to insert relative to. For 'create' with mode 'fromParagraphs': use nodeType 'paragraph' instead. Format: {kind:'block', nodeType:'listItem', nodeId:'<id>'}.\"\n },\n {\n \"$ref\": \"#/$defs/ListItemAddress\"\n }\n ],\n \"description\": \"The target list item. For 'insert': the item to insert relative to. For 'create' with mode 'fromParagraphs': use nodeType 'paragraph' instead. Format: {kind:'block', nodeType:'listItem', nodeId:'<id>'}.\"\n },\n {\n \"$ref\": \"#/$defs/ListItemAddress\"\n }\n ],\n \"description\": \"The target list item. For 'insert': the item to insert relative to. For 'create' with mode 'fromParagraphs': use nodeType 'paragraph' instead. Format: {kind:'block', nodeType:'listItem', nodeId:'<id>'}.\"\n },\n {\n \"$ref\": \"#/$defs/ListItemAddress\"\n }\n ],\n \"description\": \"The target list item. For 'insert': the item to insert relative to. For 'create' with mode 'fromParagraphs': use nodeType 'paragraph' instead. Format: {kind:'block', nodeType:'listItem', nodeId:'<id>'}.\"\n },\n {\n \"$ref\": \"#/$defs/ListItemAddress\"\n }\n ],\n \"description\": \"The target list item. For 'insert': the item to insert relative to. For 'create' with mode 'fromParagraphs': use nodeType 'paragraph' instead. Format: {kind:'block', nodeType:'listItem', nodeId:'<id>'}.\"\n },\n {\n \"$ref\": \"#/$defs/ListItemAddress\"\n }\n ],\n \"description\": \"The target list item. For 'insert': the item to insert relative to. For 'create' with mode 'fromParagraphs': use nodeType 'paragraph' instead. Format: {kind:'block', nodeType:'listItem', nodeId:'<id>'}.\"\n },\n {\n \"$ref\": \"#/$defs/ListItemAddress\"\n }\n ],\n \"description\": \"The target list item. For 'insert': the item to insert relative to. For 'create' with mode 'fromParagraphs': use nodeType 'paragraph' instead. Format: {kind:'block', nodeType:'listItem', nodeId:'<id>'}.\"\n },\n {\n \"$ref\": \"#/$defs/ListItemAddress\"\n }\n ],\n \"description\": \"The target list item. For 'insert': the item to insert relative to. For 'create' with mode 'fromParagraphs': use nodeType 'paragraph' instead. Format: {kind:'block', nodeType:'listItem', nodeId:'<id>'}. Required for actions 'insert', 'attach', 'detach', 'delete', 'indent', 'outdent', 'merge', 'split', 'set_level', 'set_value', 'continue_previous', 'set_type'.\"\n },\n \"position\": {\n \"enum\": [\n \"before\",\n \"after\"\n ],\n \"description\": \"Required. Insert position relative to target: 'before' or 'after'. Required for action 'insert'.\"\n },\n \"text\": {\n \"type\": \"string\",\n \"description\": \"Text content for the new list item. Only for action 'insert'. Omit for other actions.\"\n },\n \"input\": {\n \"type\": \"object\",\n \"description\": \"Operation input as JSON object.\"\n },\n \"nodeId\": {\n \"type\": \"string\",\n \"description\": \"Node ID of the target list item.\"\n },\n \"mode\": {\n \"enum\": [\n \"empty\",\n \"fromParagraphs\"\n ],\n \"description\": \"Required. 'fromParagraphs' converts existing paragraphs into list items: each paragraph becomes one item, so create one paragraph per item first. 'empty' creates a new empty list at 'at'. Required for action 'create'.\"\n },\n \"at\": {\n \"$ref\": \"#/$defs/BlockAddress\",\n \"description\": \"Required when mode is 'empty'. The paragraph to create the list at. Format: {kind:'block', nodeType:'paragraph', nodeId:'<id>'}. Only for action 'create'. Omit for other actions.\"\n },\n \"kind\": {\n \"enum\": [\n \"ordered\",\n \"bullet\"\n ],\n \"description\": \"List type: 'bullet' for bullet points, 'ordered' for numbered lists. Required for action 'set_type'.\"\n },\n \"level\": {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"type\": \"integer\",\n \"minimum\": 0,\n \"maximum\": 8,\n \"description\": \"List nesting level (0-8). 0 is the top level.\"\n },\n {\n \"type\": \"integer\",\n \"minimum\": 0,\n \"maximum\": 8\n }\n ],\n \"description\": \"List nesting level (0-8). 0 is the top level.\"\n },\n {\n \"type\": \"integer\",\n \"minimum\": 0,\n \"maximum\": 8\n }\n ],\n \"description\": \"List nesting level (0-8). 0 is the top level. Required for action 'set_level'.\"\n },\n \"preset\": {\n \"enum\": [\n \"decimal\",\n \"decimalParenthesis\",\n \"lowerLetter\",\n \"lowerLetterParenthesis\",\n \"upperLetter\",\n \"upperLetterParenthesis\",\n \"lowerRoman\",\n \"upperRoman\",\n \"disc\",\n \"circle\",\n \"square\",\n \"dash\"\n ],\n \"description\": \"Predefined list style preset. Overrides 'kind' with a specific numbering or bullet format. Only for action 'create'. Omit for other actions.\"\n },\n \"style\": {\n \"type\": \"object\",\n \"properties\": {\n \"version\": {\n \"const\": 1,\n \"type\": \"number\"\n },\n \"levels\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"level\": {\n \"type\": \"integer\",\n \"minimum\": 0,\n \"maximum\": 8\n },\n \"numFmt\": {\n \"type\": \"string\"\n },\n \"lvlText\": {\n \"type\": \"string\"\n },\n \"start\": {\n \"type\": \"integer\"\n },\n \"alignment\": {\n \"enum\": [\n \"left\",\n \"center\",\n \"right\"\n ]\n },\n \"indents\": {\n \"type\": \"object\",\n \"properties\": {\n \"left\": {\n \"type\": \"integer\"\n },\n \"hanging\": {\n \"type\": \"integer\"\n },\n \"firstLine\": {\n \"type\": \"integer\"\n }\n },\n \"additionalProperties\": false\n },\n \"trailingCharacter\": {\n \"enum\": [\n \"tab\",\n \"space\",\n \"nothing\"\n ]\n },\n \"markerFont\": {\n \"type\": \"string\"\n },\n \"pictureBulletId\": {\n \"type\": \"integer\"\n },\n \"tabStopAt\": {\n \"type\": [\n \"integer\",\n \"null\"\n ]\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"level\"\n ]\n }\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"version\",\n \"levels\"\n ],\n \"description\": \"Only for action 'create'. Omit for other actions.\"\n },\n \"sequence\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"mode\": {\n \"const\": \"new\",\n \"type\": \"string\"\n },\n \"startAt\": {\n \"type\": \"integer\",\n \"minimum\": 1\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"mode\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"mode\": {\n \"const\": \"continuePrevious\",\n \"type\": \"string\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"mode\"\n ]\n }\n ],\n \"description\": \"Only for action 'create'. Omit for other actions.\"\n },\n \"attachTo\": {\n \"$ref\": \"#/$defs/ListItemAddress\",\n \"description\": \"Required for action 'attach'.\"\n },\n \"direction\": {\n \"enum\": [\n \"withPrevious\",\n \"withNext\"\n ],\n \"description\": \"Required for action 'merge'.\"\n },\n \"restartNumbering\": {\n \"type\": \"boolean\",\n \"description\": \"Only for action 'split'. Omit for other actions.\"\n },\n \"value\": {\n \"type\": [\n \"integer\",\n \"null\"\n ],\n \"description\": \"Required for action 'set_value'.\"\n },\n \"continuity\": {\n \"enum\": [\n \"preserve\",\n \"none\"\n ],\n \"description\": \"Numbering continuity: 'preserve' keeps numbering; 'none' restarts. Only for action 'set_type'. Omit for other actions.\"\n }\n },\n \"required\": [\n \"action\"\n ],\n \"additionalProperties\": false\n },\n \"mutates\": true,\n \"operations\": [\n {\n \"operationId\": \"doc.lists.insert\",\n \"intentAction\": \"insert\",\n \"required\": [\n \"target\",\n \"position\"\n ]\n },\n {\n \"operationId\": \"doc.lists.create\",\n \"intentAction\": \"create\",\n \"required\": [\n \"mode\"\n ]\n },\n {\n \"operationId\": \"doc.lists.attach\",\n \"intentAction\": \"attach\",\n \"required\": [\n \"target\",\n \"attachTo\"\n ]\n },\n {\n \"operationId\": \"doc.lists.detach\",\n \"intentAction\": \"detach\",\n \"required\": [\n \"target\"\n ]\n },\n {\n \"operationId\": \"doc.lists.delete\",\n \"intentAction\": \"delete\",\n \"required\": [\n \"target\"\n ]\n },\n {\n \"operationId\": \"doc.lists.indent\",\n \"intentAction\": \"indent\",\n \"required\": [\n \"target\"\n ]\n },\n {\n \"operationId\": \"doc.lists.outdent\",\n \"intentAction\": \"outdent\",\n \"required\": [\n \"target\"\n ]\n },\n {\n \"operationId\": \"doc.lists.merge\",\n \"intentAction\": \"merge\",\n \"required\": [\n \"target\",\n \"direction\"\n ]\n },\n {\n \"operationId\": \"doc.lists.split\",\n \"intentAction\": \"split\",\n \"required\": [\n \"target\"\n ]\n },\n {\n \"operationId\": \"doc.lists.setLevel\",\n \"intentAction\": \"set_level\",\n \"required\": [\n \"target\",\n \"level\"\n ]\n },\n {\n \"operationId\": \"doc.lists.setValue\",\n \"intentAction\": \"set_value\",\n \"required\": [\n \"target\",\n \"value\"\n ]\n },\n {\n \"operationId\": \"doc.lists.continuePrevious\",\n \"intentAction\": \"continue_previous\",\n \"required\": [\n \"target\"\n ]\n },\n {\n \"operationId\": \"doc.lists.setType\",\n \"intentAction\": \"set_type\",\n \"required\": [\n \"target\",\n \"kind\"\n ]\n }\n ]\n },\n {\n \"toolName\": \"superdoc_comment\",\n \"description\": \"Manage document comment threads: create, read, update, and delete. To create a comment, first use superdoc_search to find the target text, then pass action \\\"create\\\" with the comment text and a target built from items[0].blocks. For a single-block match use {kind:\\\"text\\\", blockId: items[0].blocks[0].blockId, range: items[0].blocks[0].range}. For a cross-block match use {kind:\\\"text\\\", segments: items[0].blocks.map(b => ({blockId: b.blockId, range: b.range}))}. Do NOT use items[0].highlightRange (snippet-relative, not block-relative) or items[0].target (a SelectionTarget, not accepted by comments.create). For threaded replies, pass \\\"parentId\\\" with the parent comment ID. Action \\\"list\\\" returns all comments with optional pagination (limit, offset) and filtering (includeResolved:true to include resolved). Action \\\"get\\\" retrieves a single comment by ID. Action \\\"update\\\" changes comment text, re-anchors the thread, changes status to \\\"resolved\\\", or toggles the legacy `sdcom:internal` flag for v1 compatibility. Action \\\"delete\\\" removes a comment or reply by ID. Do NOT pass \\\"ref\\\", \\\"id\\\", or \\\"parentId\\\" when creating a new top-level comment; \\\"action\\\", \\\"text\\\", and \\\"target\\\" are required, while commentId (the v1 compatibility alias for externalId), externalId, author fields, and metadata are optional correlation fields.\\n\\nEXAMPLES:\\n 1. {\\\"action\\\":\\\"create\\\",\\\"text\\\":\\\"Please review this section.\\\",\\\"target\\\":{\\\"kind\\\":\\\"text\\\",\\\"blockId\\\":\\\"<blockId>\\\",\\\"range\\\":{\\\"start\\\":5,\\\"end\\\":25}}}\\n 2. {\\\"action\\\":\\\"list\\\",\\\"limit\\\":20,\\\"offset\\\":0}\\n 3. {\\\"action\\\":\\\"update\\\",\\\"id\\\":\\\"<commentId>\\\",\\\"status\\\":\\\"resolved\\\"}\\n 4. {\\\"action\\\":\\\"delete\\\",\\\"id\\\":\\\"<commentId>\\\"}\",\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"action\": {\n \"type\": \"string\",\n \"enum\": [\n \"create\",\n \"delete\",\n \"get\",\n \"list\",\n \"update\"\n ],\n \"description\": \"The action to perform. One of: create, delete, get, list, update.\"\n },\n \"force\": {\n \"type\": \"boolean\",\n \"description\": \"Bypass confirmation checks.\"\n },\n \"changeMode\": {\n \"type\": \"string\",\n \"description\": \"Edit mode: \\\"direct\\\" applies changes immediately, \\\"tracked\\\" records as suggestions.\"\n },\n \"text\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"description\": \"Comment text content.\"\n },\n {\n \"type\": \"string\",\n \"description\": \"Updated comment text.\"\n }\n ],\n \"description\": \"Comment text content. Required for action 'create'.\"\n },\n \"target\": {\n \"oneOf\": [\n {\n \"description\": \"Text range to anchor the comment. Accepts either a single-block TextAddress {kind:'text', blockId, range}, a multi-segment TextTarget {kind:'text', segments:[{blockId, range}, ...]} for selections that span blocks, a SelectionTarget {kind:'selection', start, end} returned by query.match, a TextSearchCommentTarget {text, story?}, or a TrackedChangeCommentTarget ({kind:'trackedChange', trackedChangeId, side?} or {trackedChangeId, side?}) that names a logical tracked-change id as a convenience anchor .\",\n \"oneOf\": [\n {\n \"$ref\": \"#/$defs/TextAddress\"\n },\n {\n \"$ref\": \"#/$defs/TextTarget\"\n },\n {\n \"$ref\": \"#/$defs/SelectionTarget\"\n },\n {\n \"$ref\": \"#/$defs/CommentTrackedChangeTarget\"\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"text\": {\n \"type\": \"string\",\n \"description\": \"Text to find and anchor the comment to. The adapter resolves the first body/story match.\"\n },\n \"story\": {\n \"$ref\": \"#/$defs/StoryLocator\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"text\"\n ]\n }\n ]\n },\n {\n \"oneOf\": [\n {\n \"$ref\": \"#/$defs/TextAddress\"\n },\n {\n \"$ref\": \"#/$defs/SelectionTarget\"\n },\n {\n \"$ref\": \"#/$defs/CommentTrackedChangeTarget\"\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"text\": {\n \"type\": \"string\",\n \"description\": \"Text to find and anchor the comment to. The adapter resolves the first body/story match.\"\n },\n \"story\": {\n \"$ref\": \"#/$defs/StoryLocator\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"text\"\n ]\n }\n ],\n \"description\": \"New anchor for the comment. Accepts a plain TextAddress, a SelectionTarget {kind:'selection', start, end}, a TextSearchCommentTarget {text, story?}, or a TrackedChangeCommentTarget, with or without kind, that names a logical tracked-change id as a convenience re-anchor target .\"\n }\n ],\n \"description\": \"Text range to anchor the comment. Accepts either a single-block TextAddress {kind:'text', blockId, range}, a multi-segment TextTarget {kind:'text', segments:[{blockId, range}, ...]} for selections that span blocks, a SelectionTarget {kind:'selection', start, end} returned by query.match, a TextSearchCommentTarget {text, story?}, or a TrackedChangeCommentTarget ({kind:'trackedChange', trackedChangeId, side?} or {trackedChangeId, side?}) that names a logical tracked-change id as a convenience anchor . Only for actions 'create', 'update'. Omit for other actions.\"\n },\n \"trackedChangeId\": {\n \"type\": \"string\",\n \"description\": \"Compatibility shorthand for target: { trackedChangeId }. Used only when target is omitted. Only for action 'create'. Omit for other actions.\"\n },\n \"side\": {\n \"enum\": [\n \"inserted\",\n \"deleted\",\n \"source\",\n \"destination\"\n ],\n \"description\": \"Optional side for the top-level trackedChangeId shorthand. Only for action 'create'. Omit for other actions.\"\n },\n \"story\": {\n \"$ref\": \"#/$defs/StoryLocator\",\n \"description\": \"Optional story for the top-level trackedChangeId shorthand. Only for action 'create'. Omit for other actions.\"\n },\n \"parentId\": {\n \"type\": \"string\",\n \"description\": \"Parent comment ID for creating a threaded reply. Only for action 'create'. Omit for other actions.\"\n },\n \"commentId\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"maxLength\": 1024,\n \"description\": \"Compatibility alias for externalId, matching the caller-supplied commentId accepted by the v1 editor. V2 still generates a separate Word-compatible commentId. Only for action 'create'. Omit for other actions.\"\n },\n \"externalId\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"maxLength\": 1024,\n \"description\": \"Caller-owned durable, document-unique integration id. Kept separate from the generated Word-compatible commentId. Only for action 'create'. Omit for other actions.\"\n },\n \"author\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"description\": \"Author display name. Defaults to the configured session author. Only for action 'create'. Omit for other actions.\"\n },\n \"authorId\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"description\": \"Stable caller-owned author id. Only for action 'create'. Omit for other actions.\"\n },\n \"authorEmail\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"description\": \"Caller-owned author email. Only for action 'create'. Omit for other actions.\"\n },\n \"authorImage\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"description\": \"Caller-owned author image URL. Only for action 'create'. Omit for other actions.\"\n },\n \"metadata\": {\n \"type\": \"object\",\n \"additionalProperties\": true,\n \"description\": \"Caller-owned JSON metadata persisted with the comment. Only for action 'create'. Omit for other actions.\"\n },\n \"id\": {\n \"type\": \"string\",\n \"description\": \"Required for actions 'delete', 'get'.\"\n },\n \"status\": {\n \"enum\": [\n \"resolved\",\n \"active\"\n ],\n \"description\": \"Set comment status. Use 'resolved' to resolve a comment, or 'active' to reopen a previously resolved comment (lifecycle inverse). Only for action 'update'. Omit for other actions.\"\n },\n \"isInternal\": {\n \"type\": \"boolean\",\n \"description\": \"Legacy v1/document-api compatibility field. V2 adapters set or clear the target comment `sdcom:internal` attribute and preserve the field in the schema so v1 callers keep their input shape. Only for action 'update'. Omit for other actions.\"\n },\n \"includeResolved\": {\n \"type\": \"boolean\",\n \"description\": \"When true, includes resolved comments in results. Default: false. Only for action 'list'. Omit for other actions.\"\n },\n \"limit\": {\n \"type\": \"integer\",\n \"description\": \"Maximum number of comments to return. Only for action 'list'. Omit for other actions.\"\n },\n \"offset\": {\n \"type\": \"integer\",\n \"description\": \"Number of comments to skip for pagination. Only for action 'list'. Omit for other actions.\"\n }\n },\n \"required\": [\n \"action\"\n ],\n \"additionalProperties\": false\n },\n \"mutates\": true,\n \"operations\": [\n {\n \"operationId\": \"doc.comments.create\",\n \"intentAction\": \"create\",\n \"required\": [\n \"text\"\n ]\n },\n {\n \"operationId\": \"doc.comments.patch\",\n \"intentAction\": \"update\"\n },\n {\n \"operationId\": \"doc.comments.delete\",\n \"intentAction\": \"delete\",\n \"required\": [\n \"id\"\n ]\n },\n {\n \"operationId\": \"doc.comments.get\",\n \"intentAction\": \"get\",\n \"required\": [\n \"id\"\n ]\n },\n {\n \"operationId\": \"doc.comments.list\",\n \"intentAction\": \"list\"\n }\n ]\n },\n {\n \"toolName\": \"superdoc_track_changes\",\n \"description\": \"Review and resolve tracked changes (insertions, deletions, replacements, format changes) in the document. Action \\\"list\\\" returns all tracked changes with optional filtering by type (insert, delete, replacement, format) and pagination (limit, offset). Each change includes an ID, type, author, timestamp, and content preview. Action \\\"decide\\\" accepts or rejects changes. Pass decision:\\\"accept\\\" to apply the change permanently, or decision:\\\"reject\\\" to discard it. Target a single change with {id:\\\"<changeId>\\\"}, several whole changes atomically with {kind:\\\"ids\\\", ids:[...]}, a partial selection with {kind:\\\"range\\\", range:{...}}, or all changes at once with {scope:\\\"all\\\"} (optionally plus story). Do NOT use this tool unless the document has tracked changes. Use superdoc_get_content info to check the tracked change count first.\\n\\nEXAMPLES:\\n 1. {\\\"action\\\":\\\"list\\\"}\\n 2. {\\\"action\\\":\\\"list\\\",\\\"type\\\":\\\"insertion\\\",\\\"limit\\\":10}\\n 3. {\\\"action\\\":\\\"list\\\",\\\"type\\\":\\\"replacement\\\",\\\"limit\\\":10}\\n 4. {\\\"action\\\":\\\"decide\\\",\\\"decision\\\":\\\"accept\\\",\\\"target\\\":{\\\"id\\\":\\\"<changeId>\\\"}}\\n 5. {\\\"action\\\":\\\"decide\\\",\\\"decision\\\":\\\"accept\\\",\\\"target\\\":{\\\"kind\\\":\\\"ids\\\",\\\"ids\\\":[\\\"<changeId1>\\\",\\\"<changeId2>\\\"]}}\\n 6. {\\\"action\\\":\\\"decide\\\",\\\"decision\\\":\\\"reject\\\",\\\"target\\\":{\\\"kind\\\":\\\"range\\\",\\\"range\\\":{\\\"kind\\\":\\\"text\\\",\\\"segments\\\":[{\\\"blockId\\\":\\\"<blockId>\\\",\\\"range\\\":{\\\"start\\\":0,\\\"end\\\":5}}]}}}\\n 7. {\\\"action\\\":\\\"decide\\\",\\\"decision\\\":\\\"reject\\\",\\\"target\\\":{\\\"scope\\\":\\\"all\\\"}}\",\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"action\": {\n \"type\": \"string\",\n \"enum\": [\n \"decide\",\n \"list\"\n ],\n \"description\": \"The action to perform. One of: decide, list.\"\n },\n \"limit\": {\n \"type\": \"integer\",\n \"description\": \"Maximum number of tracked changes to return. Only for action 'list'. Omit for other actions.\"\n },\n \"offset\": {\n \"type\": \"integer\",\n \"description\": \"Number of tracked changes to skip for pagination. Only for action 'list'. Omit for other actions.\"\n },\n \"type\": {\n \"enum\": [\n \"insertion\",\n \"deletion\",\n \"replacement\",\n \"formatting\",\n \"move\",\n \"structural\",\n \"insert\",\n \"delete\",\n \"format\"\n ],\n \"description\": \"Filter by change type. Canonical values: 'insertion', 'deletion', 'replacement', 'formatting', 'move', 'structural'. Legacy aliases 'insert', 'delete', and 'format' remain accepted during migration. Only for action 'list'. Omit for other actions.\"\n },\n \"in\": {\n \"oneOf\": [\n {\n \"$ref\": \"#/$defs/StoryLocator\"\n },\n {\n \"const\": \"all\",\n \"type\": \"string\"\n }\n ],\n \"description\": \"Story scope. Omit for body only, pass a StoryLocator for a single story, or 'all' for body + every revision-capable non-body story. Only for action 'list'. Omit for other actions.\"\n },\n \"force\": {\n \"type\": \"boolean\",\n \"description\": \"Bypass confirmation checks. Only for action 'decide'. Omit for other actions.\"\n },\n \"changeMode\": {\n \"type\": \"string\",\n \"description\": \"Edit mode: \\\"direct\\\" applies changes immediately, \\\"tracked\\\" records as suggestions. Only for action 'decide'. Omit for other actions.\"\n },\n \"decision\": {\n \"enum\": [\n \"accept\",\n \"reject\"\n ],\n \"description\": \"Required for action 'decide'.\"\n },\n \"expectedRevision\": {\n \"type\": \"string\",\n \"description\": \"Backward-compatible alias for options.expectedRevision. Explicit mutation options take precedence when both are supplied. Only for action 'decide'. Omit for other actions.\"\n },\n \"target\": {\n \"description\": \"Decision target. Canonical shapes: { kind: 'id', id, story? } (one whole logical tracked change), { kind: 'ids', ids } (several whole logical tracked changes in one atomic history unit), { kind: 'range', range: TextTarget, coordinateSpace?, overlap?, side?, story?, part? } or { kind: 'range', range: { anchor, relativeStart, relativeEnd }, overlap?, side?, story?, part? } (resolves only the selected overlap; may split fragments), { kind: 'all' } (every active tracked change). Legacy { id, story? } / { id, range: { kind: 'partial', start, end } } / { scope: 'all' } shapes are accepted and transparently promoted to canonical targets. Required for action 'decide'.\",\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"id\",\n \"type\": \"string\"\n },\n \"id\": {\n \"type\": \"string\"\n },\n \"story\": {\n \"$ref\": \"#/$defs/StoryLocator\"\n },\n \"side\": {\n \"enum\": [\n \"insert\",\n \"inserted\",\n \"delete\",\n \"deleted\"\n ]\n },\n \"moveRole\": {\n \"enum\": [\n \"pair\",\n \"source\",\n \"destination\"\n ],\n \"description\": \"Optional move pairing assertion. 'pair' requires the resolved tracked change to be a paired move; 'source' / 'destination' further narrow to a specific half. When the assertion does not hold the decide adapter fails closed.\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"kind\",\n \"id\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"ids\",\n \"type\": \"string\"\n },\n \"ids\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"minItems\": 1,\n \"description\": \"Logical tracked-change ids resolved atomically in one decision and history unit.\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"kind\",\n \"ids\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"range\",\n \"type\": \"string\"\n },\n \"range\": {\n \"$ref\": \"#/$defs/TextTarget\"\n },\n \"coordinateSpace\": {\n \"enum\": [\n \"visible\",\n \"tracked\"\n ],\n \"description\": \"Coordinate space of the TextTarget offsets. Omitted preserves legacy tracked-space behavior.\"\n },\n \"overlap\": {\n \"type\": \"string\",\n \"description\": \"Optional logical overlap selector for callers that already resolved an ambiguous overlap surface. Adapter-owned interpretation.\"\n },\n \"side\": {\n \"enum\": [\n \"insert\",\n \"inserted\",\n \"delete\",\n \"deleted\",\n \"source\",\n \"destination\"\n ],\n \"description\": \"Optional revision side for paired replacement or move targets.\"\n },\n \"story\": {\n \"$ref\": \"#/$defs/StoryLocator\",\n \"description\": \"Optional story containing the range target.\"\n },\n \"part\": {\n \"type\": \"string\",\n \"description\": \"Compatibility alias used by older range callers; interpretation is adapter-owned.\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"kind\",\n \"range\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"range\",\n \"type\": \"string\"\n },\n \"range\": {\n \"type\": \"object\",\n \"properties\": {\n \"anchor\": {\n \"type\": \"string\"\n },\n \"relativeStart\": {\n \"type\": \"integer\",\n \"minimum\": 0\n },\n \"relativeEnd\": {\n \"type\": \"integer\",\n \"minimum\": 0\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"anchor\",\n \"relativeStart\",\n \"relativeEnd\"\n ]\n },\n \"overlap\": {\n \"type\": \"string\",\n \"description\": \"Optional logical overlap selector for callers that already resolved an ambiguous overlap surface. Adapter-owned interpretation.\"\n },\n \"side\": {\n \"enum\": [\n \"insert\",\n \"inserted\",\n \"delete\",\n \"deleted\",\n \"source\",\n \"destination\"\n ],\n \"description\": \"Optional revision side for paired replacement or move targets.\"\n },\n \"story\": {\n \"$ref\": \"#/$defs/StoryLocator\",\n \"description\": \"Optional story containing the range target.\"\n },\n \"part\": {\n \"type\": \"string\",\n \"description\": \"Compatibility alias used by older range callers; interpretation is adapter-owned.\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"kind\",\n \"range\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"range\",\n \"type\": \"string\"\n },\n \"anchor\": {\n \"type\": \"string\"\n },\n \"relativeStart\": {\n \"type\": \"integer\",\n \"minimum\": 0\n },\n \"relativeEnd\": {\n \"type\": \"integer\",\n \"minimum\": 0\n },\n \"overlap\": {\n \"type\": \"string\",\n \"description\": \"Optional logical overlap selector for callers that already resolved an ambiguous overlap surface. Adapter-owned interpretation.\"\n },\n \"side\": {\n \"enum\": [\n \"insert\",\n \"inserted\",\n \"delete\",\n \"deleted\",\n \"source\",\n \"destination\"\n ],\n \"description\": \"Optional revision side for paired replacement or move targets.\"\n },\n \"story\": {\n \"$ref\": \"#/$defs/StoryLocator\",\n \"description\": \"Optional story containing the range target.\"\n },\n \"part\": {\n \"type\": \"string\",\n \"description\": \"Compatibility alias used by older range callers; interpretation is adapter-owned.\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"kind\",\n \"anchor\",\n \"relativeStart\",\n \"relativeEnd\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"all\",\n \"type\": \"string\"\n },\n \"story\": {\n \"oneOf\": [\n {\n \"$ref\": \"#/$defs/StoryLocator\"\n },\n {\n \"const\": \"all\",\n \"type\": \"string\"\n }\n ],\n \"description\": \"Optional explicit bulk filter. Omit or pass 'all' to target every revision-capable story, or pass a StoryLocator to scope the decision to one story.\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"kind\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"story\": {\n \"$ref\": \"#/$defs/StoryLocator\"\n },\n \"moveRole\": {\n \"enum\": [\n \"pair\",\n \"source\",\n \"destination\"\n ],\n \"description\": \"Optional move pairing assertion. 'pair' requires the resolved tracked change to be a paired move; 'source' / 'destination' further narrow to a specific half. When the assertion does not hold the decide adapter fails closed.\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"id\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"range\": {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"partial\",\n \"type\": \"string\"\n },\n \"start\": {\n \"type\": \"integer\",\n \"minimum\": 0\n },\n \"end\": {\n \"type\": \"integer\",\n \"minimum\": 0\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"kind\",\n \"start\",\n \"end\"\n ]\n },\n \"story\": {\n \"$ref\": \"#/$defs/StoryLocator\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"id\",\n \"range\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"scope\": {\n \"enum\": [\n \"all\"\n ]\n },\n \"story\": {\n \"oneOf\": [\n {\n \"$ref\": \"#/$defs/StoryLocator\"\n },\n {\n \"const\": \"all\",\n \"type\": \"string\"\n }\n ],\n \"description\": \"Optional explicit bulk filter. Omit or pass 'all' to target every revision-capable story, or pass a StoryLocator to scope the decision to one story.\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"scope\"\n ]\n }\n ]\n }\n },\n \"required\": [\n \"action\"\n ],\n \"additionalProperties\": false\n },\n \"mutates\": true,\n \"operations\": [\n {\n \"operationId\": \"doc.trackChanges.list\",\n \"intentAction\": \"list\"\n },\n {\n \"operationId\": \"doc.trackChanges.decide\",\n \"intentAction\": \"decide\",\n \"required\": [\n \"decision\",\n \"target\"\n ]\n }\n ]\n },\n {\n \"toolName\": \"superdoc_search\",\n \"description\": \"Find text patterns or nodes in the document and get ref handles for targeting edits and formatting. Refs expire after any mutation that changes the document. Re-search before the next edit when using individual tools (superdoc_edit, superdoc_format). Within a superdoc_mutations batch, selectors in \\\"where\\\" clauses resolve automatically at compile time; no manual re-searching needed between steps. Text search returns handle.ref covering only the matched substring. Node search finds blocks by type (paragraph, heading, table, listItem, etc.). The \\\"require\\\" parameter controls match cardinality: \\\"first\\\" returns one match, \\\"all\\\" returns every match, \\\"exactlyOne\\\" fails if not exactly one match. Supports scoping via \\\"within\\\" to search inside a single block. Patterns are plain text by default; pass select.mode: \\\"regex\\\" for regular-expression search (g/gi semantics, 1024-char cap, no wholeWord, capture groups returned on matches). Invalid or unsafe patterns fail with INVALID_INPUT. Do NOT use markdown formatting markers (#, **, etc.) in search patterns. Do NOT use this tool when you already have a ref from superdoc_get_content blocks or superdoc_create; use that ref directly.\\n\\nEXAMPLES:\\n 1. {\\\"select\\\":{\\\"type\\\":\\\"text\\\",\\\"pattern\\\":\\\"Introduction\\\"},\\\"require\\\":\\\"first\\\"}\\n 2. {\\\"select\\\":{\\\"type\\\":\\\"text\\\",\\\"pattern\\\":\\\"total amount\\\"},\\\"require\\\":\\\"all\\\"}\\n 3. {\\\"select\\\":{\\\"type\\\":\\\"node\\\",\\\"nodeType\\\":\\\"heading\\\"},\\\"require\\\":\\\"all\\\"}\\n 4. {\\\"select\\\":{\\\"type\\\":\\\"text\\\",\\\"pattern\\\":\\\"contract\\\"},\\\"within\\\":{\\\"kind\\\":\\\"block\\\",\\\"nodeType\\\":\\\"paragraph\\\",\\\"nodeId\\\":\\\"abc123\\\"},\\\"require\\\":\\\"first\\\"}\",\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"in\": {\n \"$ref\": \"#/$defs/StoryLocator\",\n \"description\": \"Story scope. Defaults to document body when omitted. Use {kind:'story', storyType:'body'} for body, or other storyType values for headers, footers, footnotes, endnotes.\"\n },\n \"select\": {\n \"description\": \"Search selector. Use {type:'text', pattern:'...'} for text search or {type:'node', nodeType:'paragraph'|'heading'|...} for node search.\",\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"const\": \"text\",\n \"description\": \"Must be 'text' for text pattern search.\",\n \"type\": \"string\"\n },\n \"pattern\": {\n \"type\": \"string\",\n \"description\": \"Text to match. In regex mode, patterns are validated for syntax, maximum length, and safety before execution.\"\n },\n \"mode\": {\n \"enum\": [\n \"contains\",\n \"regex\"\n ],\n \"description\": \"Match mode: 'contains' (literal substring, recommended for literal text) or 'regex' (validated regular expression).\"\n },\n \"caseSensitive\": {\n \"type\": \"boolean\",\n \"description\": \"Case-sensitive matching. Default: false.\"\n },\n \"wholeWord\": {\n \"type\": \"boolean\",\n \"description\": \"Require word-boundary matches. Default: false.\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"type\",\n \"pattern\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"const\": \"node\",\n \"description\": \"Must be 'node' for node type search.\",\n \"type\": \"string\"\n },\n \"nodeType\": {\n \"enum\": [\n \"paragraph\",\n \"heading\",\n \"listItem\",\n \"table\",\n \"tableRow\",\n \"tableCell\",\n \"tableOfContents\",\n \"image\",\n \"sdt\",\n \"run\",\n \"bookmark\",\n \"comment\",\n \"hyperlink\",\n \"footnoteRef\",\n \"endnoteRef\",\n \"crossRef\",\n \"indexEntry\",\n \"citation\",\n \"authorityEntry\",\n \"sequenceField\",\n \"tab\",\n \"lineBreak\"\n ],\n \"description\": \"Block type to match (paragraph, heading, table, listItem, etc.).\"\n },\n \"kind\": {\n \"enum\": [\n \"block\",\n \"inline\"\n ],\n \"description\": \"Filter: 'block' or 'inline'.\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"type\"\n ]\n }\n ]\n },\n \"within\": {\n \"$ref\": \"#/$defs/BlockNodeAddress\",\n \"description\": \"Limit search scope to within a specific block: {kind:'block', nodeType:'...', nodeId:'...'}.\"\n },\n \"require\": {\n \"enum\": [\n \"any\",\n \"first\",\n \"exactlyOne\",\n \"all\"\n ],\n \"description\": \"Match cardinality: 'any' (all matches), 'first' (only first), 'exactlyOne' (fail if != 1), 'all' (fail if 0).\"\n },\n \"mode\": {\n \"enum\": [\n \"strict\",\n \"candidates\"\n ],\n \"description\": \"Search mode: 'strict' (default, exact matching) or 'candidates' (returns scored potential matches).\"\n },\n \"includeNodes\": {\n \"type\": \"boolean\",\n \"description\": \"When true, includes full node data in results. Default: false.\"\n },\n \"limit\": {\n \"type\": \"integer\",\n \"minimum\": 1,\n \"description\": \"Maximum number of matches to return.\"\n },\n \"offset\": {\n \"type\": \"integer\",\n \"minimum\": 0,\n \"description\": \"Number of matches to skip for pagination.\"\n }\n },\n \"required\": [\n \"select\"\n ],\n \"additionalProperties\": false\n },\n \"mutates\": false,\n \"operations\": [\n {\n \"operationId\": \"doc.query.match\",\n \"intentAction\": \"match\",\n \"required\": [\n \"select\"\n ]\n }\n ]\n },\n {\n \"toolName\": \"superdoc_mutations\",\n \"description\": \"All steps succeed or all fail; no partial application. Execute multiple operations atomically in one batch. Use this for any workflow needing 2+ changes. Supported step types: text (text.rewrite, text.insert, text.delete), format (format.apply), create (create.heading, create.paragraph, create.table), assert. Each step has an id, an op, a \\\"where\\\" clause for targeting ({by:\\\"select\\\", select:{...}, require:\\\"first\\\"|\\\"exactlyOne\\\"|\\\"all\\\"} or {by:\\\"ref\\\", ref:\\\"...\\\"} or {by:\\\"block\\\", nodeType:\\\"paragraph\\\", nodeId:\\\"...\\\"}), and \\\"args\\\" with operation-specific parameters. Use {by:\\\"block\\\", nodeType, nodeId} when you want to rewrite, delete, format, or anchor against a whole known block from superdoc_get_content action \\\"blocks\\\" without relying on text matching. For full-paragraph or full-clause rewrites, first call superdoc_get_content with action:\\\"blocks\\\" and includeText:true, then rewrite the matching block by nodeId. Use {by:\\\"select\\\"} only for substring edits, discovery, or insertion relative to a sentence fragment; do NOT use a shortened text selector to replace an entire known block. For create steps, \\\"where\\\" targets an existing anchor block and args.position (\\\"before\\\" or \\\"after\\\") controls placement. Sequential creates targeting the same anchor maintain correct order via internal position mapping. For format.apply with require \\\"all\\\", use a node selector to format every heading or paragraph at once: {by:\\\"select\\\", select:{type:\\\"node\\\", nodeType:\\\"heading\\\"}, require:\\\"all\\\"}. Selectors resolve at compile time (before execution). This means format.apply steps CANNOT target content created by earlier create steps in the same batch. Split creates and formatting into separate batches: first a mutations call with creates, then a mutations call with format.apply. Action \\\"preview\\\" dry-runs the plan. Action \\\"apply\\\" executes it. If a selector matches nothing, the failure reports the step id plus selector details so you can retry with a shorter or more distinctive anchor. Do NOT create two steps that target overlapping text in the same block; combine them into a single text.rewrite step.\\n\\nEXAMPLES:\\n 1. {\\\"action\\\":\\\"apply\\\",\\\"atomic\\\":true,\\\"changeMode\\\":\\\"direct\\\",\\\"steps\\\":[{\\\"id\\\":\\\"s1\\\",\\\"op\\\":\\\"text.rewrite\\\",\\\"where\\\":{\\\"by\\\":\\\"select\\\",\\\"select\\\":{\\\"type\\\":\\\"text\\\",\\\"pattern\\\":\\\"old term\\\"},\\\"require\\\":\\\"all\\\"},\\\"args\\\":{\\\"replacement\\\":{\\\"text\\\":\\\"new term\\\"}}},{\\\"id\\\":\\\"s2\\\",\\\"op\\\":\\\"text.delete\\\",\\\"where\\\":{\\\"by\\\":\\\"select\\\",\\\"select\\\":{\\\"type\\\":\\\"text\\\",\\\"pattern\\\":\\\" (deprecated)\\\"},\\\"require\\\":\\\"all\\\"},\\\"args\\\":{}}]}\\n 2. {\\\"action\\\":\\\"apply\\\",\\\"steps\\\":[{\\\"id\\\":\\\"r1\\\",\\\"op\\\":\\\"text.rewrite\\\",\\\"where\\\":{\\\"by\\\":\\\"block\\\",\\\"nodeType\\\":\\\"paragraph\\\",\\\"nodeId\\\":\\\"<nodeId>\\\"},\\\"args\\\":{\\\"replacement\\\":{\\\"text\\\":\\\"Updated clause text.\\\"}}},{\\\"id\\\":\\\"f1\\\",\\\"op\\\":\\\"format.apply\\\",\\\"where\\\":{\\\"by\\\":\\\"select\\\",\\\"select\\\":{\\\"type\\\":\\\"node\\\",\\\"nodeType\\\":\\\"heading\\\"},\\\"require\\\":\\\"all\\\"},\\\"args\\\":{\\\"inline\\\":{\\\"color\\\":\\\"#FF0000\\\"}}},{\\\"id\\\":\\\"f2\\\",\\\"op\\\":\\\"format.apply\\\",\\\"where\\\":{\\\"by\\\":\\\"select\\\",\\\"select\\\":{\\\"type\\\":\\\"text\\\",\\\"pattern\\\":\\\"Confidential Information\\\"},\\\"require\\\":\\\"all\\\"},\\\"args\\\":{\\\"inline\\\":{\\\"bold\\\":true}}}]}\",\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"action\": {\n \"type\": \"string\",\n \"enum\": [\n \"apply\",\n \"preview\"\n ],\n \"description\": \"The action to perform. One of: apply, preview.\"\n },\n \"in\": {\n \"$ref\": \"#/$defs/StoryLocator\",\n \"description\": \"Story scope. Defaults to document body when omitted. Use {kind:'story', storyType:'body'} for body, or other storyType values for headers, footers, footnotes, endnotes.\"\n },\n \"expectedRevision\": {\n \"type\": \"string\",\n \"description\": \"Document revision for optimistic concurrency. Mutation fails if document was modified since this revision. Only for action 'preview'. Omit for other actions.\"\n },\n \"atomic\": {\n \"const\": true,\n \"type\": \"boolean\",\n \"description\": \"Must be true. All steps execute as one atomic transaction.\"\n },\n \"changeMode\": {\n \"enum\": [\n \"direct\",\n \"tracked\"\n ],\n \"description\": \"Required. Use 'direct' for immediate edits or 'tracked' for suggestions. Must always be provided.\"\n },\n \"steps\": {\n \"type\": \"array\",\n \"items\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"op\": {\n \"const\": \"text.rewrite\",\n \"type\": \"string\"\n },\n \"where\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"by\": {\n \"const\": \"select\",\n \"type\": \"string\"\n },\n \"select\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"const\": \"text\",\n \"description\": \"Must be 'text' for text pattern search.\",\n \"type\": \"string\"\n },\n \"pattern\": {\n \"type\": \"string\",\n \"description\": \"Text to match. In regex mode, patterns are validated for syntax, maximum length, and safety before execution.\"\n },\n \"mode\": {\n \"enum\": [\n \"contains\",\n \"regex\"\n ],\n \"description\": \"Match mode: 'contains' (literal substring, recommended for literal text) or 'regex' (validated regular expression).\"\n },\n \"caseSensitive\": {\n \"type\": \"boolean\",\n \"description\": \"Case-sensitive matching. Default: false.\"\n },\n \"wholeWord\": {\n \"type\": \"boolean\",\n \"description\": \"Require word-boundary matches. Default: false.\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"type\",\n \"pattern\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"const\": \"node\",\n \"description\": \"Must be 'node' for node type search.\",\n \"type\": \"string\"\n },\n \"nodeType\": {\n \"enum\": [\n \"paragraph\",\n \"heading\",\n \"listItem\",\n \"table\",\n \"tableRow\",\n \"tableCell\",\n \"tableOfContents\",\n \"image\",\n \"sdt\",\n \"run\",\n \"bookmark\",\n \"comment\",\n \"hyperlink\",\n \"footnoteRef\",\n \"endnoteRef\",\n \"crossRef\",\n \"indexEntry\",\n \"citation\",\n \"authorityEntry\",\n \"sequenceField\",\n \"tab\",\n \"lineBreak\"\n ],\n \"description\": \"Block type to match (paragraph, heading, table, listItem, etc.).\"\n },\n \"kind\": {\n \"enum\": [\n \"block\",\n \"inline\"\n ],\n \"description\": \"Filter: 'block' or 'inline'.\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"type\"\n ]\n }\n ]\n },\n \"within\": {\n \"$ref\": \"#/$defs/BlockNodeAddress\"\n },\n \"require\": {\n \"enum\": [\n \"first\",\n \"exactlyOne\",\n \"all\"\n ]\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"by\",\n \"select\",\n \"require\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"by\": {\n \"const\": \"ref\",\n \"type\": \"string\"\n },\n \"ref\": {\n \"type\": \"string\"\n },\n \"within\": {\n \"$ref\": \"#/$defs/BlockNodeAddress\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"by\",\n \"ref\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"by\": {\n \"const\": \"target\",\n \"type\": \"string\"\n },\n \"target\": {\n \"$ref\": \"#/$defs/SelectionTarget\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"by\",\n \"target\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"by\": {\n \"const\": \"block\",\n \"type\": \"string\"\n },\n \"nodeType\": {\n \"enum\": [\n \"paragraph\",\n \"heading\",\n \"listItem\",\n \"table\",\n \"tableRow\",\n \"tableCell\",\n \"tableOfContents\",\n \"image\",\n \"sdt\"\n ]\n },\n \"nodeId\": {\n \"type\": \"string\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"by\",\n \"nodeType\",\n \"nodeId\"\n ]\n }\n ]\n },\n \"args\": {\n \"type\": \"object\",\n \"properties\": {\n \"replacement\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"text\": {\n \"type\": \"string\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"text\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"blocks\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"text\": {\n \"type\": \"string\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"text\"\n ]\n }\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"blocks\"\n ]\n }\n ]\n },\n \"style\": {\n \"type\": \"object\",\n \"properties\": {\n \"inline\": {\n \"type\": \"object\",\n \"properties\": {\n \"mode\": {\n \"enum\": [\n \"preserve\",\n \"set\",\n \"clear\",\n \"merge\"\n ],\n \"type\": \"string\"\n },\n \"requireUniform\": {\n \"type\": \"boolean\"\n },\n \"onNonUniform\": {\n \"enum\": [\n \"error\",\n \"useLeadingRun\",\n \"majority\",\n \"union\"\n ]\n },\n \"setMarks\": {\n \"type\": \"object\",\n \"properties\": {\n \"bold\": {\n \"enum\": [\n \"on\",\n \"off\",\n \"clear\"\n ]\n },\n \"italic\": {\n \"enum\": [\n \"on\",\n \"off\",\n \"clear\"\n ]\n },\n \"underline\": {\n \"enum\": [\n \"on\",\n \"off\",\n \"clear\"\n ]\n },\n \"strike\": {\n \"enum\": [\n \"on\",\n \"off\",\n \"clear\"\n ]\n }\n },\n \"additionalProperties\": false\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"mode\"\n ]\n },\n \"paragraph\": {\n \"type\": \"object\",\n \"properties\": {\n \"mode\": {\n \"enum\": [\n \"preserve\",\n \"set\",\n \"clear\"\n ],\n \"type\": \"string\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"mode\"\n ]\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"inline\"\n ]\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"replacement\"\n ]\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"id\",\n \"op\",\n \"where\",\n \"args\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"op\": {\n \"const\": \"text.insert\",\n \"type\": \"string\"\n },\n \"where\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"by\": {\n \"const\": \"select\",\n \"type\": \"string\"\n },\n \"select\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"const\": \"text\",\n \"description\": \"Must be 'text' for text pattern search.\",\n \"type\": \"string\"\n },\n \"pattern\": {\n \"type\": \"string\",\n \"description\": \"Text to match. In regex mode, patterns are validated for syntax, maximum length, and safety before execution.\"\n },\n \"mode\": {\n \"enum\": [\n \"contains\",\n \"regex\"\n ],\n \"description\": \"Match mode: 'contains' (literal substring, recommended for literal text) or 'regex' (validated regular expression).\"\n },\n \"caseSensitive\": {\n \"type\": \"boolean\",\n \"description\": \"Case-sensitive matching. Default: false.\"\n },\n \"wholeWord\": {\n \"type\": \"boolean\",\n \"description\": \"Require word-boundary matches. Default: false.\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"type\",\n \"pattern\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"const\": \"node\",\n \"description\": \"Must be 'node' for node type search.\",\n \"type\": \"string\"\n },\n \"nodeType\": {\n \"enum\": [\n \"paragraph\",\n \"heading\",\n \"listItem\",\n \"table\",\n \"tableRow\",\n \"tableCell\",\n \"tableOfContents\",\n \"image\",\n \"sdt\",\n \"run\",\n \"bookmark\",\n \"comment\",\n \"hyperlink\",\n \"footnoteRef\",\n \"endnoteRef\",\n \"crossRef\",\n \"indexEntry\",\n \"citation\",\n \"authorityEntry\",\n \"sequenceField\",\n \"tab\",\n \"lineBreak\"\n ],\n \"description\": \"Block type to match (paragraph, heading, table, listItem, etc.).\"\n },\n \"kind\": {\n \"enum\": [\n \"block\",\n \"inline\"\n ],\n \"description\": \"Filter: 'block' or 'inline'.\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"type\"\n ]\n }\n ]\n },\n \"within\": {\n \"$ref\": \"#/$defs/BlockNodeAddress\"\n },\n \"require\": {\n \"enum\": [\n \"first\",\n \"exactlyOne\"\n ]\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"by\",\n \"select\",\n \"require\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"by\": {\n \"const\": \"ref\",\n \"type\": \"string\"\n },\n \"ref\": {\n \"type\": \"string\"\n },\n \"within\": {\n \"$ref\": \"#/$defs/BlockNodeAddress\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"by\",\n \"ref\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"by\": {\n \"const\": \"target\",\n \"type\": \"string\"\n },\n \"target\": {\n \"$ref\": \"#/$defs/SelectionTarget\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"by\",\n \"target\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"by\": {\n \"const\": \"block\",\n \"type\": \"string\"\n },\n \"nodeType\": {\n \"enum\": [\n \"paragraph\",\n \"heading\",\n \"listItem\",\n \"table\",\n \"tableRow\",\n \"tableCell\",\n \"tableOfContents\",\n \"image\",\n \"sdt\"\n ]\n },\n \"nodeId\": {\n \"type\": \"string\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"by\",\n \"nodeType\",\n \"nodeId\"\n ]\n }\n ]\n },\n \"args\": {\n \"type\": \"object\",\n \"properties\": {\n \"position\": {\n \"enum\": [\n \"before\",\n \"after\"\n ]\n },\n \"content\": {\n \"type\": \"object\",\n \"properties\": {\n \"text\": {\n \"type\": \"string\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"text\"\n ]\n },\n \"style\": {\n \"type\": \"object\",\n \"properties\": {\n \"inline\": {\n \"type\": \"object\",\n \"properties\": {\n \"mode\": {\n \"enum\": [\n \"inherit\",\n \"set\",\n \"clear\"\n ],\n \"type\": \"string\"\n },\n \"setMarks\": {\n \"type\": \"object\",\n \"properties\": {\n \"bold\": {\n \"enum\": [\n \"on\",\n \"off\",\n \"clear\"\n ]\n },\n \"italic\": {\n \"enum\": [\n \"on\",\n \"off\",\n \"clear\"\n ]\n },\n \"underline\": {\n \"enum\": [\n \"on\",\n \"off\",\n \"clear\"\n ]\n },\n \"strike\": {\n \"enum\": [\n \"on\",\n \"off\",\n \"clear\"\n ]\n }\n },\n \"additionalProperties\": false\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"mode\"\n ]\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"inline\"\n ]\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"position\",\n \"content\"\n ]\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"id\",\n \"op\",\n \"where\",\n \"args\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"op\": {\n \"const\": \"text.delete\",\n \"type\": \"string\"\n },\n \"where\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"by\": {\n \"const\": \"select\",\n \"type\": \"string\"\n },\n \"select\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"const\": \"text\",\n \"description\": \"Must be 'text' for text pattern search.\",\n \"type\": \"string\"\n },\n \"pattern\": {\n \"type\": \"string\",\n \"description\": \"Text to match. In regex mode, patterns are validated for syntax, maximum length, and safety before execution.\"\n },\n \"mode\": {\n \"enum\": [\n \"contains\",\n \"regex\"\n ],\n \"description\": \"Match mode: 'contains' (literal substring, recommended for literal text) or 'regex' (validated regular expression).\"\n },\n \"caseSensitive\": {\n \"type\": \"boolean\",\n \"description\": \"Case-sensitive matching. Default: false.\"\n },\n \"wholeWord\": {\n \"type\": \"boolean\",\n \"description\": \"Require word-boundary matches. Default: false.\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"type\",\n \"pattern\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"const\": \"node\",\n \"description\": \"Must be 'node' for node type search.\",\n \"type\": \"string\"\n },\n \"nodeType\": {\n \"enum\": [\n \"paragraph\",\n \"heading\",\n \"listItem\",\n \"table\",\n \"tableRow\",\n \"tableCell\",\n \"tableOfContents\",\n \"image\",\n \"sdt\",\n \"run\",\n \"bookmark\",\n \"comment\",\n \"hyperlink\",\n \"footnoteRef\",\n \"endnoteRef\",\n \"crossRef\",\n \"indexEntry\",\n \"citation\",\n \"authorityEntry\",\n \"sequenceField\",\n \"tab\",\n \"lineBreak\"\n ],\n \"description\": \"Block type to match (paragraph, heading, table, listItem, etc.).\"\n },\n \"kind\": {\n \"enum\": [\n \"block\",\n \"inline\"\n ],\n \"description\": \"Filter: 'block' or 'inline'.\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"type\"\n ]\n }\n ]\n },\n \"within\": {\n \"$ref\": \"#/$defs/BlockNodeAddress\"\n },\n \"require\": {\n \"enum\": [\n \"first\",\n \"exactlyOne\",\n \"all\"\n ]\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"by\",\n \"select\",\n \"require\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"by\": {\n \"const\": \"ref\",\n \"type\": \"string\"\n },\n \"ref\": {\n \"type\": \"string\"\n },\n \"within\": {\n \"$ref\": \"#/$defs/BlockNodeAddress\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"by\",\n \"ref\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"by\": {\n \"const\": \"target\",\n \"type\": \"string\"\n },\n \"target\": {\n \"$ref\": \"#/$defs/SelectionTarget\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"by\",\n \"target\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"by\": {\n \"const\": \"block\",\n \"type\": \"string\"\n },\n \"nodeType\": {\n \"enum\": [\n \"paragraph\",\n \"heading\",\n \"listItem\",\n \"table\",\n \"tableRow\",\n \"tableCell\",\n \"tableOfContents\",\n \"image\",\n \"sdt\"\n ]\n },\n \"nodeId\": {\n \"type\": \"string\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"by\",\n \"nodeType\",\n \"nodeId\"\n ]\n }\n ]\n },\n \"args\": {\n \"type\": \"object\",\n \"properties\": {\n \"behavior\": {\n \"$ref\": \"#/$defs/DeleteBehavior\"\n }\n },\n \"additionalProperties\": false\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"id\",\n \"op\",\n \"where\",\n \"args\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"op\": {\n \"const\": \"format.apply\",\n \"type\": \"string\"\n },\n \"where\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"by\": {\n \"const\": \"select\",\n \"type\": \"string\"\n },\n \"select\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"const\": \"text\",\n \"description\": \"Must be 'text' for text pattern search.\",\n \"type\": \"string\"\n },\n \"pattern\": {\n \"type\": \"string\",\n \"description\": \"Text to match. In regex mode, patterns are validated for syntax, maximum length, and safety before execution.\"\n },\n \"mode\": {\n \"enum\": [\n \"contains\",\n \"regex\"\n ],\n \"description\": \"Match mode: 'contains' (literal substring, recommended for literal text) or 'regex' (validated regular expression).\"\n },\n \"caseSensitive\": {\n \"type\": \"boolean\",\n \"description\": \"Case-sensitive matching. Default: false.\"\n },\n \"wholeWord\": {\n \"type\": \"boolean\",\n \"description\": \"Require word-boundary matches. Default: false.\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"type\",\n \"pattern\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"const\": \"node\",\n \"description\": \"Must be 'node' for node type search.\",\n \"type\": \"string\"\n },\n \"nodeType\": {\n \"enum\": [\n \"paragraph\",\n \"heading\",\n \"listItem\",\n \"table\",\n \"tableRow\",\n \"tableCell\",\n \"tableOfContents\",\n \"image\",\n \"sdt\",\n \"run\",\n \"bookmark\",\n \"comment\",\n \"hyperlink\",\n \"footnoteRef\",\n \"endnoteRef\",\n \"crossRef\",\n \"indexEntry\",\n \"citation\",\n \"authorityEntry\",\n \"sequenceField\",\n \"tab\",\n \"lineBreak\"\n ],\n \"description\": \"Block type to match (paragraph, heading, table, listItem, etc.).\"\n },\n \"kind\": {\n \"enum\": [\n \"block\",\n \"inline\"\n ],\n \"description\": \"Filter: 'block' or 'inline'.\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"type\"\n ]\n }\n ]\n },\n \"within\": {\n \"$ref\": \"#/$defs/BlockNodeAddress\"\n },\n \"require\": {\n \"enum\": [\n \"first\",\n \"exactlyOne\",\n \"all\"\n ]\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"by\",\n \"select\",\n \"require\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"by\": {\n \"const\": \"ref\",\n \"type\": \"string\"\n },\n \"ref\": {\n \"type\": \"string\"\n },\n \"within\": {\n \"$ref\": \"#/$defs/BlockNodeAddress\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"by\",\n \"ref\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"by\": {\n \"const\": \"target\",\n \"type\": \"string\"\n },\n \"target\": {\n \"$ref\": \"#/$defs/SelectionTarget\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"by\",\n \"target\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"by\": {\n \"const\": \"block\",\n \"type\": \"string\"\n },\n \"nodeType\": {\n \"enum\": [\n \"paragraph\",\n \"heading\",\n \"listItem\",\n \"table\",\n \"tableRow\",\n \"tableCell\",\n \"tableOfContents\",\n \"image\",\n \"sdt\"\n ]\n },\n \"nodeId\": {\n \"type\": \"string\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"by\",\n \"nodeType\",\n \"nodeId\"\n ]\n }\n ]\n },\n \"args\": {\n \"type\": \"object\",\n \"properties\": {\n \"inline\": {\n \"type\": \"object\",\n \"properties\": {\n \"bold\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"italic\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"strike\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"underline\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"style\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"color\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"themeColor\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"additionalProperties\": false,\n \"minProperties\": 1\n }\n ]\n },\n \"highlight\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"color\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"fontSize\": {\n \"oneOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"fontFamily\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"letterSpacing\": {\n \"oneOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"vertAlign\": {\n \"oneOf\": [\n {\n \"enum\": [\n \"superscript\",\n \"subscript\",\n \"baseline\"\n ]\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"position\": {\n \"oneOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"dstrike\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"smallCaps\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"caps\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"shading\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"fill\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"color\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"val\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"additionalProperties\": false,\n \"minProperties\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"border\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"val\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"sz\": {\n \"oneOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"color\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"space\": {\n \"oneOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"additionalProperties\": false,\n \"minProperties\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"outline\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"shadow\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"emboss\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"imprint\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"charScale\": {\n \"oneOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"kerning\": {\n \"oneOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"vanish\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"webHidden\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"specVanish\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"rtl\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"cs\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"bCs\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"iCs\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"eastAsianLayout\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"combine\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"combineBrackets\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"vert\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"vertCompress\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"additionalProperties\": false,\n \"minProperties\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"em\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"fitText\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"val\": {\n \"oneOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"id\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"additionalProperties\": false,\n \"minProperties\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"snapToGrid\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"lang\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"val\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"eastAsia\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"bidi\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"additionalProperties\": false,\n \"minProperties\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"oMath\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"rStyle\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"rFonts\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"ascii\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"hAnsi\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"eastAsia\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"cs\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"asciiTheme\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"hAnsiTheme\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"eastAsiaTheme\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"csTheme\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"hint\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"additionalProperties\": false,\n \"minProperties\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"fontSizeCs\": {\n \"oneOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"ligatures\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"numForm\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"numSpacing\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"stylisticSets\": {\n \"oneOf\": [\n {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"number\"\n },\n \"val\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"id\"\n ],\n \"additionalProperties\": false\n },\n \"minItems\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"contextualAlternates\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"additionalProperties\": false,\n \"minProperties\": 1\n },\n \"alignment\": {\n \"type\": \"string\",\n \"enum\": [\n \"left\",\n \"center\",\n \"right\",\n \"justify\"\n ],\n \"description\": \"Set paragraph alignment on the target block(s). Can be combined with inline formatting in the same step.\"\n },\n \"scope\": {\n \"type\": \"string\",\n \"enum\": [\n \"match\",\n \"block\"\n ],\n \"description\": \"When \\\"block\\\", inline formatting expands to cover the entire parent paragraph(s), not just the matched text. Use \\\"block\\\" after markdown inserts to format whole paragraphs with a short identifying pattern. Default: \\\"match\\\".\"\n }\n },\n \"additionalProperties\": false,\n \"minProperties\": 1\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"id\",\n \"op\",\n \"where\",\n \"args\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"op\": {\n \"const\": \"assert\",\n \"type\": \"string\"\n },\n \"where\": {\n \"type\": \"object\",\n \"properties\": {\n \"by\": {\n \"const\": \"select\",\n \"type\": \"string\"\n },\n \"select\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"const\": \"text\",\n \"description\": \"Must be 'text' for text pattern search.\",\n \"type\": \"string\"\n },\n \"pattern\": {\n \"type\": \"string\",\n \"description\": \"Text to match. In regex mode, patterns are validated for syntax, maximum length, and safety before execution.\"\n },\n \"mode\": {\n \"enum\": [\n \"contains\",\n \"regex\"\n ],\n \"description\": \"Match mode: 'contains' (literal substring, recommended for literal text) or 'regex' (validated regular expression).\"\n },\n \"caseSensitive\": {\n \"type\": \"boolean\",\n \"description\": \"Case-sensitive matching. Default: false.\"\n },\n \"wholeWord\": {\n \"type\": \"boolean\",\n \"description\": \"Require word-boundary matches. Default: false.\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"type\",\n \"pattern\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"const\": \"node\",\n \"description\": \"Must be 'node' for node type search.\",\n \"type\": \"string\"\n },\n \"nodeType\": {\n \"enum\": [\n \"paragraph\",\n \"heading\",\n \"listItem\",\n \"table\",\n \"tableRow\",\n \"tableCell\",\n \"tableOfContents\",\n \"image\",\n \"sdt\",\n \"run\",\n \"bookmark\",\n \"comment\",\n \"hyperlink\",\n \"footnoteRef\",\n \"endnoteRef\",\n \"crossRef\",\n \"indexEntry\",\n \"citation\",\n \"authorityEntry\",\n \"sequenceField\",\n \"tab\",\n \"lineBreak\"\n ],\n \"description\": \"Block type to match (paragraph, heading, table, listItem, etc.).\"\n },\n \"kind\": {\n \"enum\": [\n \"block\",\n \"inline\"\n ],\n \"description\": \"Filter: 'block' or 'inline'.\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"type\"\n ]\n }\n ]\n },\n \"within\": {\n \"$ref\": \"#/$defs/BlockNodeAddress\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"by\",\n \"select\"\n ]\n },\n \"args\": {\n \"type\": \"object\",\n \"properties\": {\n \"expectCount\": {\n \"type\": \"number\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"expectCount\"\n ]\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"id\",\n \"op\",\n \"where\",\n \"args\"\n ]\n }\n ]\n },\n \"description\": \"Ordered array of mutation steps. Each step needs 'op' (text.rewrite, text.insert, text.delete, format.apply, or assert) and a 'where' targeting clause.\"\n },\n \"force\": {\n \"type\": \"boolean\",\n \"description\": \"Bypass confirmation checks. Only for action 'apply'. Omit for other actions.\"\n }\n },\n \"required\": [\n \"action\",\n \"atomic\",\n \"changeMode\",\n \"steps\"\n ],\n \"additionalProperties\": false\n },\n \"mutates\": true,\n \"operations\": [\n {\n \"operationId\": \"doc.mutations.preview\",\n \"intentAction\": \"preview\",\n \"required\": [\n \"atomic\",\n \"changeMode\",\n \"steps\"\n ]\n },\n {\n \"operationId\": \"doc.mutations.apply\",\n \"intentAction\": \"apply\",\n \"required\": [\n \"atomic\",\n \"steps\",\n \"changeMode\"\n ]\n }\n ]\n },\n {\n \"toolName\": \"superdoc_table\",\n \"description\": \"Create and modify table structure, content, and styling. Find table/row/cell nodeIds via superdoc_get_content({action:\\\"blocks\\\"}) or superdoc_search.\\n\\nACTIONS:\\n• Structure: delete, insert_row, delete_row, insert_column, delete_column, merge_cells, unmerge_cells.\\n• Cell content: set_cell_text (text). set_cell (vAlign / wrap / fit / preferred width).\\n• Row / column: set_row (height + rule), set_row_options (repeat-header, allow-break), set_column (widthPt).\\n• Table styling: set_borders, set_shading, set_style_options (headerRow / bandedRows / firstColumn / lastColumn / lastRow / bandedColumns), set_layout (autofit / alignment / direction / preferredWidth), set_options (default cell margins + cell spacing).\\n\\nLOCATORS (the shapes ops accept):\\n• insert_row append shorthand: { nodeId: \\\"<tableId>\\\" } with no rowIndex/position appends at the end. Three other forms: target a row + position, table + rowIndex + position, or any of the above with count:N for multiple.\\n• insert_column shorthand: position:\\\"first\\\"|\\\"last\\\" with no columnIndex. Otherwise columnIndex + position:\\\"left\\\"|\\\"right\\\".\\n• merge_cells: table target + start:{rowIndex, columnIndex} + end:{rowIndex, columnIndex}.\\n• set_cell_text: table target + rowIndex + columnIndex (preferred) OR cell target.\\n• set_cell: cell target only. Does NOT accept table+rowIndex+columnIndex.\\n• set_borders / set_shading: table OR cell target. NOT a row target.\\n\\nCOLOR FORMAT:\\nHex strings accept #RRGGBB, RRGGBB, #RGB, or 3-digit RGB; also \\\"auto\\\"; also null to clear (where supported). Stored canonically as uppercase RRGGBB. Always pass a concrete color when one is implied. Never call set_borders with `auto` for a \\\"make it look [X]\\\" ask.\\n\\nSTYLING (TWO MODES):\\n\\nA. STRUCTURAL CHANGE → re-apply the existing styling.\\n Triggers: insert_row / insert_column / delete_row / delete_column / merge_cells / unmerge_cells. (NOT set_cell_text or set_cell: those don't disturb borders/shading.)\\n Recipe: read the current borders/shading/cnf flags via superdoc_get_content({action:\\\"blocks\\\"}) before the change, then re-apply the SAME values after with set_borders + set_shading + set_style_options. The goal is consistency, not a redesign.\\n Skip on a freshly created table. A new table starts un-styled.\\n\\nB. STYLE-CHANGE REQUEST (\\\"make it look [X]\\\" / \\\"style the whole table\\\") → apply the FULL set with concrete colors.\\n Touch every axis: borders, shading, text alignment, font color/weight, cnf flags, spacing. A single set_borders call without shading and font tweaks always looks half-finished. That's the #1 cause of \\\"no visual change\\\" complaints.\\n Color palette: discover the document's palette by reading superdoc_get_content({action:\\\"blocks\\\"}) and reusing the colors on existing tables/headings. When no palette is obvious, default to corporate blue \\\"1F3864\\\" or dark grey \\\"444444\\\" for accents and \\\"F2F2F2\\\" / \\\"E7E6E6\\\" for banding.\\n Recipe (call ALL of these):\\n 1. set_borders applyTo:\\\"all\\\" with an explicit color and weight.\\n 2. set_shading on the header row cells with the accent color. Add banding on alternate body rows if appropriate.\\n 3. set_style_options { headerRow: true, bandedRows?: true } so cnf regions are recognized.\\n 4. Cell-text alignment via superdoc_format action:\\\"set_alignment\\\". Center the header, left-align body, right-align numeric columns. Paragraph-level: target the paragraph inside each cell.\\n 5. Font color + weight via superdoc_format action:\\\"inline\\\". Header gets a contrasting color (white on dark fill, accent on light fill) plus bold:true.\\n 6. set_options if the user asks for tighter or looser spacing.\\n Steps 4–5 cross to superdoc_format. Use superdoc_mutations to batch many format.apply steps in one call.\\n\\nAFTER set_cell_text, match the new cell to its siblings:\\nset_cell_text writes plain text with the document's default font/size/color and no weight. Always follow up with one superdoc_format inline call copying fontFamily/fontSize/color/bold from a sibling cell (or any non-empty body paragraph if the table is fresh and has no sibling content). If sibling cells show a bold-prefix pattern like \\\"Label: value\\\", replicate it on the new cell via superdoc_search + superdoc_format inline (or one superdoc_mutations batch with format.apply steps).\\n\\nLIST-TO-TABLE:\\n(1) superdoc_create action:\\\"table\\\" with the desired rows/columns. (2) Populate cells with set_cell_text using rowIndex/columnIndex (one call per cell). (3) DELETE THE WHOLE LIST in one call: superdoc_list({action:\\\"delete\\\", target:{kind:\\\"block\\\", nodeType:\\\"listItem\\\", nodeId:\\\"<any-item-id>\\\"}}). The op walks the contiguous list and removes all items.\\nWrong paths for list deletion (all leave bullets/empty paragraphs behind): text.delete, superdoc_edit action:\\\"delete\\\" on text refs, lists.detach, lists.convertToText.\\n\\nEXAMPLES:\\n 1. {\\\"action\\\":\\\"insert_row\\\",\\\"nodeId\\\":\\\"<tableNodeId>\\\"}\\n 2. {\\\"action\\\":\\\"insert_column\\\",\\\"nodeId\\\":\\\"<tableNodeId>\\\",\\\"position\\\":\\\"last\\\"}\\n 3. {\\\"action\\\":\\\"merge_cells\\\",\\\"nodeId\\\":\\\"<tableNodeId>\\\",\\\"start\\\":{\\\"rowIndex\\\":0,\\\"columnIndex\\\":0},\\\"end\\\":{\\\"rowIndex\\\":1,\\\"columnIndex\\\":1}}\\n 4. {\\\"action\\\":\\\"set_cell_text\\\",\\\"nodeId\\\":\\\"<tableNodeId>\\\",\\\"rowIndex\\\":0,\\\"columnIndex\\\":0,\\\"text\\\":\\\"Q1 Revenue\\\"}\\n 5. {\\\"action\\\":\\\"set_row\\\",\\\"nodeId\\\":\\\"<tableNodeId>\\\",\\\"rowIndex\\\":0,\\\"heightPt\\\":24,\\\"rule\\\":\\\"atLeast\\\"}\\n 6. {\\\"action\\\":\\\"set_borders\\\",\\\"nodeId\\\":\\\"<tableNodeId>\\\",\\\"mode\\\":\\\"applyTo\\\",\\\"applyTo\\\":\\\"all\\\",\\\"border\\\":{\\\"lineStyle\\\":\\\"single\\\",\\\"lineWeightPt\\\":1,\\\"color\\\":\\\"#000000\\\"}}\\n 7. {\\\"action\\\":\\\"set_shading\\\",\\\"target\\\":{\\\"kind\\\":\\\"block\\\",\\\"nodeType\\\":\\\"tableCell\\\",\\\"nodeId\\\":\\\"<cellNodeId>\\\"},\\\"color\\\":\\\"#E3F2FD\\\"}\\n 8. {\\\"action\\\":\\\"set_style_options\\\",\\\"nodeId\\\":\\\"<tableNodeId>\\\",\\\"styleOptions\\\":{\\\"headerRow\\\":true,\\\"bandedRows\\\":true}}\",\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"action\": {\n \"type\": \"string\",\n \"enum\": [\n \"delete\",\n \"delete_column\",\n \"delete_row\",\n \"insert_column\",\n \"insert_row\",\n \"merge_cells\",\n \"move_row\",\n \"set_borders\",\n \"set_cell\",\n \"set_cell_text\",\n \"set_column\",\n \"set_layout\",\n \"set_options\",\n \"set_row\",\n \"set_row_options\",\n \"set_shading\",\n \"set_style_options\",\n \"unmerge_cells\"\n ],\n \"description\": \"The action to perform. One of: delete, delete_column, delete_row, insert_column, insert_row, merge_cells, move_row, set_borders, set_cell, set_cell_text, set_column, set_layout, set_options, set_row, set_row_options, set_shading, set_style_options, unmerge_cells.\"\n },\n \"force\": {\n \"type\": \"boolean\",\n \"description\": \"Bypass confirmation checks.\"\n },\n \"changeMode\": {\n \"type\": \"string\",\n \"description\": \"Edit mode: \\\"direct\\\" applies changes immediately, \\\"tracked\\\" records as suggestions.\"\n },\n \"dryRun\": {\n \"type\": \"boolean\",\n \"description\": \"Preview the result without applying changes.\"\n },\n \"target\": {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"$ref\": \"#/$defs/TableAddress\"\n },\n {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"$ref\": \"#/$defs/TableRowAddress\"\n },\n {\n \"$ref\": \"#/$defs/TableAddress\"\n }\n ]\n },\n {\n \"$ref\": \"#/$defs/TableAddress\"\n }\n ]\n }\n ]\n },\n {\n \"oneOf\": [\n {\n \"$ref\": \"#/$defs/TableRowAddress\"\n },\n {\n \"$ref\": \"#/$defs/TableAddress\"\n }\n ]\n }\n ]\n },\n {\n \"oneOf\": [\n {\n \"$ref\": \"#/$defs/TableRowAddress\"\n },\n {\n \"$ref\": \"#/$defs/TableAddress\"\n }\n ]\n }\n ]\n },\n {\n \"oneOf\": [\n {\n \"$ref\": \"#/$defs/TableRowAddress\"\n },\n {\n \"$ref\": \"#/$defs/TableAddress\"\n }\n ]\n }\n ]\n },\n {\n \"oneOf\": [\n {\n \"$ref\": \"#/$defs/TableRowAddress\"\n },\n {\n \"$ref\": \"#/$defs/TableAddress\"\n }\n ]\n }\n ]\n },\n {\n \"$ref\": \"#/$defs/TableAddress\"\n }\n ]\n },\n {\n \"$ref\": \"#/$defs/TableAddress\"\n }\n ]\n },\n {\n \"$ref\": \"#/$defs/TableAddress\"\n }\n ]\n },\n {\n \"$ref\": \"#/$defs/TableAddress\"\n }\n ]\n },\n {\n \"oneOf\": [\n {\n \"$ref\": \"#/$defs/TableCellAddress\"\n },\n {\n \"$ref\": \"#/$defs/TableAddress\"\n }\n ]\n }\n ]\n },\n {\n \"$ref\": \"#/$defs/TableCellAddress\"\n }\n ]\n },\n {\n \"oneOf\": [\n {\n \"$ref\": \"#/$defs/TableCellAddress\"\n },\n {\n \"$ref\": \"#/$defs/TableAddress\"\n }\n ]\n }\n ]\n },\n {\n \"$ref\": \"#/$defs/TableOrCellAddress\"\n }\n ]\n },\n {\n \"$ref\": \"#/$defs/BlockNodeAddress\"\n }\n ]\n },\n {\n \"$ref\": \"#/$defs/BlockNodeAddress\"\n }\n ]\n },\n {\n \"$ref\": \"#/$defs/BlockNodeAddress\"\n }\n ],\n \"description\": \"Target address. For inline/set_style: prefer 'ref' from superdoc_search, or use {kind:'selection', start:{kind:'text', blockId, offset}, end:{kind:'text', blockId, offset}}. For paragraph actions (set_alignment, set_indentation, set_spacing, set_direction, set_flow_options): use {kind:'block', nodeType:'paragraph'|'heading'|'listItem', nodeId:'<nodeId from blocks list>'}.\"\n },\n \"nodeId\": {\n \"type\": \"string\"\n },\n \"preferredWidth\": {\n \"type\": \"number\",\n \"description\": \"Only for action 'set_layout'. Omit for other actions.\"\n },\n \"preferredWidthType\": {\n \"enum\": [\n \"dxa\",\n \"auto\",\n \"pct\"\n ],\n \"description\": \"Only for actions 'set_layout', 'set_cell'. Omit for other actions.\"\n },\n \"alignment\": {\n \"enum\": [\n \"left\",\n \"center\",\n \"right\"\n ],\n \"description\": \"Only for action 'set_layout'. Omit for other actions.\"\n },\n \"leftIndentPt\": {\n \"type\": \"number\",\n \"description\": \"Only for action 'set_layout'. Omit for other actions.\"\n },\n \"autoFitMode\": {\n \"enum\": [\n \"fixedWidth\",\n \"fitContents\",\n \"fitWindow\"\n ],\n \"description\": \"Only for action 'set_layout'. Omit for other actions.\"\n },\n \"tableDirection\": {\n \"enum\": [\n \"ltr\",\n \"rtl\"\n ],\n \"description\": \"Only for action 'set_layout'. Omit for other actions.\"\n },\n \"position\": {\n \"enum\": [\n \"above\",\n \"below\",\n \"left\",\n \"right\",\n \"first\",\n \"last\"\n ],\n \"description\": \"Required for action 'insert_column'.\"\n },\n \"count\": {\n \"type\": \"integer\",\n \"minimum\": 1,\n \"description\": \"Only for actions 'insert_row', 'insert_column'. Omit for other actions.\"\n },\n \"rowIndex\": {\n \"type\": \"integer\",\n \"minimum\": 0,\n \"description\": \"Only for actions 'insert_row', 'delete_row', 'move_row', 'set_row', 'set_row_options', 'unmerge_cells', 'set_cell_text'. Omit for other actions.\"\n },\n \"destination\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"first\",\n \"type\": \"string\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"kind\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"last\",\n \"type\": \"string\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"kind\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"before\",\n \"type\": \"string\"\n },\n \"rowIndex\": {\n \"type\": \"integer\",\n \"minimum\": 0\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"kind\",\n \"rowIndex\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"after\",\n \"type\": \"string\"\n },\n \"rowIndex\": {\n \"type\": \"integer\",\n \"minimum\": 0\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"kind\",\n \"rowIndex\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"before\",\n \"type\": \"string\"\n },\n \"target\": {\n \"$ref\": \"#/$defs/TableRowAddress\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"kind\",\n \"target\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"after\",\n \"type\": \"string\"\n },\n \"target\": {\n \"$ref\": \"#/$defs/TableRowAddress\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"kind\",\n \"target\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"before\",\n \"type\": \"string\"\n },\n \"nodeId\": {\n \"type\": \"string\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"kind\",\n \"nodeId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"after\",\n \"type\": \"string\"\n },\n \"nodeId\": {\n \"type\": \"string\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"kind\",\n \"nodeId\"\n ]\n }\n ],\n \"description\": \"Required for action 'move_row'.\"\n },\n \"heightPt\": {\n \"type\": \"number\",\n \"exclusiveMinimum\": 0,\n \"description\": \"Required for action 'set_row'.\"\n },\n \"rule\": {\n \"enum\": [\n \"atLeast\",\n \"exact\",\n \"auto\"\n ],\n \"description\": \"Only for action 'set_row'. Omit for other actions.\"\n },\n \"allowBreakAcrossPages\": {\n \"type\": \"boolean\",\n \"description\": \"Only for action 'set_row_options'. Omit for other actions.\"\n },\n \"repeatHeader\": {\n \"type\": \"boolean\",\n \"description\": \"Only for action 'set_row_options'. Omit for other actions.\"\n },\n \"gridBefore\": {\n \"type\": \"integer\",\n \"minimum\": 0,\n \"description\": \"Only for action 'set_row_options'. Omit for other actions.\"\n },\n \"gridAfter\": {\n \"type\": \"integer\",\n \"minimum\": 0,\n \"description\": \"Only for action 'set_row_options'. Omit for other actions.\"\n },\n \"wBefore\": {\n \"type\": \"object\",\n \"properties\": {\n \"value\": {\n \"type\": \"integer\",\n \"minimum\": 0\n },\n \"type\": {\n \"enum\": [\n \"auto\",\n \"dxa\",\n \"nil\",\n \"pct\"\n ]\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"value\",\n \"type\"\n ],\n \"description\": \"Only for action 'set_row_options'. Omit for other actions.\"\n },\n \"wAfter\": {\n \"type\": \"object\",\n \"properties\": {\n \"value\": {\n \"type\": \"integer\",\n \"minimum\": 0\n },\n \"type\": {\n \"enum\": [\n \"auto\",\n \"dxa\",\n \"nil\",\n \"pct\"\n ]\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"value\",\n \"type\"\n ],\n \"description\": \"Only for action 'set_row_options'. Omit for other actions.\"\n },\n \"columnIndex\": {\n \"type\": \"integer\",\n \"minimum\": 0,\n \"description\": \"Required for actions 'delete_column', 'set_column'.\"\n },\n \"widthPt\": {\n \"type\": \"number\",\n \"exclusiveMinimum\": 0,\n \"description\": \"Required for action 'set_column'.\"\n },\n \"start\": {\n \"type\": \"object\",\n \"properties\": {\n \"rowIndex\": {\n \"type\": \"integer\",\n \"minimum\": 0\n },\n \"columnIndex\": {\n \"type\": \"integer\",\n \"minimum\": 0\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"rowIndex\",\n \"columnIndex\"\n ],\n \"description\": \"Required for action 'merge_cells'.\"\n },\n \"end\": {\n \"type\": \"object\",\n \"properties\": {\n \"rowIndex\": {\n \"type\": \"integer\",\n \"minimum\": 0\n },\n \"columnIndex\": {\n \"type\": \"integer\",\n \"minimum\": 0\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"rowIndex\",\n \"columnIndex\"\n ],\n \"description\": \"Required for action 'merge_cells'.\"\n },\n \"preferredWidthPt\": {\n \"type\": \"number\",\n \"description\": \"Only for action 'set_cell'. Omit for other actions.\"\n },\n \"verticalAlign\": {\n \"enum\": [\n \"top\",\n \"center\",\n \"bottom\"\n ],\n \"description\": \"Only for action 'set_cell'. Omit for other actions.\"\n },\n \"wrapText\": {\n \"type\": \"boolean\",\n \"description\": \"Only for action 'set_cell'. Omit for other actions.\"\n },\n \"fitText\": {\n \"type\": \"boolean\",\n \"description\": \"Only for action 'set_cell'. Omit for other actions.\"\n },\n \"text\": {\n \"type\": \"string\",\n \"description\": \"Required for action 'set_cell_text'.\"\n },\n \"color\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"pattern\": \"^(#?([0-9A-Fa-f]{6}|[0-9A-Fa-f]{3})|auto)$\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"description\": \"Required for action 'set_shading'.\"\n },\n \"styleId\": {\n \"type\": \"string\",\n \"description\": \"Only for action 'set_style_options'. Omit for other actions.\"\n },\n \"styleOptions\": {\n \"type\": \"object\",\n \"properties\": {\n \"headerRow\": {\n \"type\": \"boolean\"\n },\n \"lastRow\": {\n \"type\": \"boolean\"\n },\n \"totalRow\": {\n \"type\": \"boolean\"\n },\n \"firstColumn\": {\n \"type\": \"boolean\"\n },\n \"lastColumn\": {\n \"type\": \"boolean\"\n },\n \"bandedRows\": {\n \"type\": \"boolean\"\n },\n \"bandedColumns\": {\n \"type\": \"boolean\"\n }\n },\n \"additionalProperties\": false,\n \"description\": \"Only for action 'set_style_options'. Omit for other actions.\"\n },\n \"mode\": {\n \"enum\": [\n \"applyTo\",\n \"edges\"\n ],\n \"description\": \"Required for action 'set_borders'.\"\n },\n \"applyTo\": {\n \"enum\": [\n \"all\",\n \"outside\",\n \"inside\",\n \"top\",\n \"bottom\",\n \"left\",\n \"right\",\n \"insideH\",\n \"insideV\"\n ],\n \"description\": \"Only for action 'set_borders'. Omit for other actions.\"\n },\n \"border\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"lineStyle\": {\n \"type\": \"string\"\n },\n \"lineWeightPt\": {\n \"type\": \"number\",\n \"exclusiveMinimum\": 0\n },\n \"color\": {\n \"type\": \"string\",\n \"pattern\": \"^(#?([0-9A-Fa-f]{6}|[0-9A-Fa-f]{3})|auto)$\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"lineStyle\",\n \"lineWeightPt\",\n \"color\"\n ]\n },\n {\n \"type\": \"null\"\n }\n ],\n \"description\": \"Only for action 'set_borders'. Omit for other actions.\"\n },\n \"edges\": {\n \"type\": \"object\",\n \"properties\": {\n \"top\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"lineStyle\": {\n \"type\": \"string\"\n },\n \"lineWeightPt\": {\n \"type\": \"number\",\n \"exclusiveMinimum\": 0\n },\n \"color\": {\n \"type\": \"string\",\n \"pattern\": \"^(#?([0-9A-Fa-f]{6}|[0-9A-Fa-f]{3})|auto)$\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"lineStyle\",\n \"lineWeightPt\",\n \"color\"\n ]\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"bottom\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"lineStyle\": {\n \"type\": \"string\"\n },\n \"lineWeightPt\": {\n \"type\": \"number\",\n \"exclusiveMinimum\": 0\n },\n \"color\": {\n \"type\": \"string\",\n \"pattern\": \"^(#?([0-9A-Fa-f]{6}|[0-9A-Fa-f]{3})|auto)$\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"lineStyle\",\n \"lineWeightPt\",\n \"color\"\n ]\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"left\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"lineStyle\": {\n \"type\": \"string\"\n },\n \"lineWeightPt\": {\n \"type\": \"number\",\n \"exclusiveMinimum\": 0\n },\n \"color\": {\n \"type\": \"string\",\n \"pattern\": \"^(#?([0-9A-Fa-f]{6}|[0-9A-Fa-f]{3})|auto)$\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"lineStyle\",\n \"lineWeightPt\",\n \"color\"\n ]\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"right\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"lineStyle\": {\n \"type\": \"string\"\n },\n \"lineWeightPt\": {\n \"type\": \"number\",\n \"exclusiveMinimum\": 0\n },\n \"color\": {\n \"type\": \"string\",\n \"pattern\": \"^(#?([0-9A-Fa-f]{6}|[0-9A-Fa-f]{3})|auto)$\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"lineStyle\",\n \"lineWeightPt\",\n \"color\"\n ]\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"insideH\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"lineStyle\": {\n \"type\": \"string\"\n },\n \"lineWeightPt\": {\n \"type\": \"number\",\n \"exclusiveMinimum\": 0\n },\n \"color\": {\n \"type\": \"string\",\n \"pattern\": \"^(#?([0-9A-Fa-f]{6}|[0-9A-Fa-f]{3})|auto)$\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"lineStyle\",\n \"lineWeightPt\",\n \"color\"\n ]\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"insideV\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"lineStyle\": {\n \"type\": \"string\"\n },\n \"lineWeightPt\": {\n \"type\": \"number\",\n \"exclusiveMinimum\": 0\n },\n \"color\": {\n \"type\": \"string\",\n \"pattern\": \"^(#?([0-9A-Fa-f]{6}|[0-9A-Fa-f]{3})|auto)$\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"lineStyle\",\n \"lineWeightPt\",\n \"color\"\n ]\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"additionalProperties\": false,\n \"description\": \"Only for action 'set_borders'. Omit for other actions.\"\n },\n \"defaultCellMargins\": {\n \"type\": \"object\",\n \"properties\": {\n \"topPt\": {\n \"type\": \"number\",\n \"minimum\": 0\n },\n \"rightPt\": {\n \"type\": \"number\",\n \"minimum\": 0\n },\n \"bottomPt\": {\n \"type\": \"number\",\n \"minimum\": 0\n },\n \"leftPt\": {\n \"type\": \"number\",\n \"minimum\": 0\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"topPt\",\n \"rightPt\",\n \"bottomPt\",\n \"leftPt\"\n ],\n \"description\": \"Only for action 'set_options'. Omit for other actions.\"\n },\n \"cellSpacingPt\": {\n \"oneOf\": [\n {\n \"type\": \"number\",\n \"minimum\": 0\n },\n {\n \"type\": \"null\"\n }\n ],\n \"description\": \"Only for action 'set_options'. Omit for other actions.\"\n }\n },\n \"required\": [\n \"action\"\n ],\n \"additionalProperties\": false\n },\n \"mutates\": true,\n \"operations\": [\n {\n \"operationId\": \"doc.tables.delete\",\n \"intentAction\": \"delete\",\n \"requiredOneOf\": [\n [\n \"target\"\n ],\n [\n \"nodeId\"\n ]\n ]\n },\n {\n \"operationId\": \"doc.tables.setLayout\",\n \"intentAction\": \"set_layout\",\n \"requiredOneOf\": [\n [\n \"target\"\n ],\n [\n \"nodeId\"\n ]\n ]\n },\n {\n \"operationId\": \"doc.tables.insertRow\",\n \"intentAction\": \"insert_row\",\n \"requiredOneOf\": [\n [\n \"target\",\n \"position\"\n ],\n [\n \"target\",\n \"rowIndex\",\n \"position\"\n ],\n [\n \"nodeId\",\n \"rowIndex\",\n \"position\"\n ],\n [\n \"target\"\n ],\n [\n \"nodeId\"\n ]\n ]\n },\n {\n \"operationId\": \"doc.tables.deleteRow\",\n \"intentAction\": \"delete_row\",\n \"requiredOneOf\": [\n [\n \"target\"\n ],\n [\n \"target\",\n \"rowIndex\"\n ],\n [\n \"nodeId\",\n \"rowIndex\"\n ]\n ]\n },\n {\n \"operationId\": \"doc.tables.moveRow\",\n \"intentAction\": \"move_row\",\n \"requiredOneOf\": [\n [\n \"target\",\n \"destination\"\n ],\n [\n \"target\",\n \"rowIndex\",\n \"destination\"\n ],\n [\n \"nodeId\",\n \"rowIndex\",\n \"destination\"\n ]\n ]\n },\n {\n \"operationId\": \"doc.tables.setRowHeight\",\n \"intentAction\": \"set_row\",\n \"requiredOneOf\": [\n [\n \"target\",\n \"heightPt\"\n ],\n [\n \"target\",\n \"rowIndex\",\n \"heightPt\"\n ],\n [\n \"nodeId\",\n \"rowIndex\",\n \"heightPt\"\n ]\n ]\n },\n {\n \"operationId\": \"doc.tables.setRowOptions\",\n \"intentAction\": \"set_row_options\",\n \"requiredOneOf\": [\n [\n \"target\"\n ],\n [\n \"target\",\n \"rowIndex\"\n ],\n [\n \"nodeId\",\n \"rowIndex\"\n ]\n ]\n },\n {\n \"operationId\": \"doc.tables.insertColumn\",\n \"intentAction\": \"insert_column\",\n \"requiredOneOf\": [\n [\n \"position\",\n \"target\"\n ],\n [\n \"position\",\n \"nodeId\"\n ]\n ]\n },\n {\n \"operationId\": \"doc.tables.deleteColumn\",\n \"intentAction\": \"delete_column\",\n \"requiredOneOf\": [\n [\n \"columnIndex\",\n \"target\"\n ],\n [\n \"columnIndex\",\n \"nodeId\"\n ]\n ]\n },\n {\n \"operationId\": \"doc.tables.setColumnWidth\",\n \"intentAction\": \"set_column\",\n \"requiredOneOf\": [\n [\n \"columnIndex\",\n \"widthPt\",\n \"target\"\n ],\n [\n \"columnIndex\",\n \"widthPt\",\n \"nodeId\"\n ]\n ]\n },\n {\n \"operationId\": \"doc.tables.mergeCells\",\n \"intentAction\": \"merge_cells\",\n \"requiredOneOf\": [\n [\n \"start\",\n \"end\",\n \"target\"\n ],\n [\n \"start\",\n \"end\",\n \"nodeId\"\n ]\n ]\n },\n {\n \"operationId\": \"doc.tables.unmergeCells\",\n \"intentAction\": \"unmerge_cells\",\n \"requiredOneOf\": [\n [\n \"target\"\n ],\n [\n \"nodeId\"\n ],\n [\n \"target\",\n \"rowIndex\",\n \"columnIndex\"\n ],\n [\n \"nodeId\",\n \"rowIndex\",\n \"columnIndex\"\n ]\n ]\n },\n {\n \"operationId\": \"doc.tables.setCellProperties\",\n \"intentAction\": \"set_cell\",\n \"requiredOneOf\": [\n [\n \"target\"\n ],\n [\n \"nodeId\"\n ]\n ]\n },\n {\n \"operationId\": \"doc.tables.setCellText\",\n \"intentAction\": \"set_cell_text\",\n \"requiredOneOf\": [\n [\n \"target\",\n \"text\"\n ],\n [\n \"nodeId\",\n \"text\"\n ],\n [\n \"target\",\n \"rowIndex\",\n \"columnIndex\",\n \"text\"\n ],\n [\n \"nodeId\",\n \"rowIndex\",\n \"columnIndex\",\n \"text\"\n ]\n ]\n },\n {\n \"operationId\": \"doc.tables.setShading\",\n \"intentAction\": \"set_shading\",\n \"requiredOneOf\": [\n [\n \"color\",\n \"target\"\n ],\n [\n \"color\",\n \"nodeId\"\n ]\n ]\n },\n {\n \"operationId\": \"doc.tables.applyStyle\",\n \"intentAction\": \"set_style_options\",\n \"requiredOneOf\": [\n [\n \"target\"\n ],\n [\n \"nodeId\"\n ]\n ]\n },\n {\n \"operationId\": \"doc.tables.setBorders\",\n \"intentAction\": \"set_borders\",\n \"requiredOneOf\": [\n [\n \"mode\",\n \"applyTo\",\n \"border\",\n \"target\"\n ],\n [\n \"mode\",\n \"applyTo\",\n \"border\",\n \"nodeId\"\n ],\n [\n \"mode\",\n \"edges\",\n \"target\"\n ],\n [\n \"mode\",\n \"edges\",\n \"nodeId\"\n ]\n ]\n },\n {\n \"operationId\": \"doc.tables.setTableOptions\",\n \"intentAction\": \"set_options\",\n \"requiredOneOf\": [\n [\n \"target\"\n ],\n [\n \"nodeId\"\n ]\n ]\n }\n ]\n }\n ]\n}\n",
|
|
11
11
|
"tools.openai.json": "{\n \"contractVersion\": \"0.1.0\",\n \"tools\": [\n {\n \"type\": \"function\",\n \"function\": {\n \"name\": \"superdoc_get_content\",\n \"description\": \"Read document content in various formats. Call this first in any workflow to understand document structure before making edits. Action \\\"blocks\\\" returns structured block data with nodeId, nodeType, textPreview, optional full text when includeText:true, formatting properties (fontFamily, fontSize, color, bold, underline, alignment), and ref handles for immediate use with superdoc_edit or superdoc_format. When you need to evaluate or rewrite existing paragraphs or clauses, prefer action \\\"blocks\\\" with includeText:true so you can identify the correct block and then target it by nodeId. Action \\\"text\\\" and \\\"markdown\\\" return the full document as plain text or Markdown. Action \\\"html\\\" returns HTML. Action \\\"info\\\" returns document metadata: word count, paragraph count, page count, outline, available styles, and capability flags. The \\\"blocks\\\" action supports pagination via \\\"offset\\\" and \\\"limit\\\", and filtering via \\\"nodeTypes\\\". Other actions ignore these parameters. This tool never modifies the document. Do NOT call superdoc_edit or superdoc_format without first reading blocks to get valid refs and formatting reference values.\\n\\nEXAMPLES:\\n 1. {\\\"action\\\":\\\"blocks\\\"}\\n 2. {\\\"action\\\":\\\"blocks\\\",\\\"includeText\\\":true,\\\"offset\\\":0,\\\"limit\\\":20}\\n 3. {\\\"action\\\":\\\"blocks\\\",\\\"offset\\\":0,\\\"limit\\\":20,\\\"nodeTypes\\\":[\\\"heading\\\",\\\"paragraph\\\"]}\\n 4. {\\\"action\\\":\\\"text\\\"}\\n 5. {\\\"action\\\":\\\"info\\\"}\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"action\": {\n \"type\": \"string\",\n \"enum\": [\n \"blocks\",\n \"extract\",\n \"html\",\n \"info\",\n \"markdown\",\n \"text\"\n ],\n \"description\": \"The action to perform. One of: blocks, extract, html, info, markdown, text.\"\n },\n \"in\": {\n \"$ref\": \"#/$defs/StoryLocator\",\n \"description\": \"Story scope. Defaults to document body when omitted. Use {kind:'story', storyType:'body'} for body, or other storyType values for headers, footers, footnotes, endnotes.\"\n },\n \"unflattenLists\": {\n \"type\": \"boolean\",\n \"description\": \"When true, flattens nested list structures in output. Default: false. Only for action 'html'. Omit for other actions.\"\n },\n \"offset\": {\n \"type\": \"number\",\n \"minimum\": 0,\n \"description\": \"Number of blocks to skip. Default: 0. Only for action 'blocks'. Omit for other actions.\"\n },\n \"limit\": {\n \"type\": \"number\",\n \"minimum\": 1,\n \"description\": \"Maximum blocks to return. Omit for all blocks. Only for action 'blocks'. Omit for other actions.\"\n },\n \"nodeTypes\": {\n \"type\": \"array\",\n \"items\": {\n \"enum\": [\n \"paragraph\",\n \"heading\",\n \"listItem\",\n \"table\",\n \"tableRow\",\n \"tableCell\",\n \"tableOfContents\",\n \"image\",\n \"sdt\"\n ]\n },\n \"description\": \"Filter by block types (e.g. ['paragraph', 'heading']). Omit for all types. Only for action 'blocks'. Omit for other actions.\"\n },\n \"includeText\": {\n \"type\": \"boolean\",\n \"description\": \"When true, includes the full flattened block text in each block entry. Only for action 'blocks'. Omit for other actions.\"\n }\n },\n \"required\": [\n \"action\"\n ],\n \"additionalProperties\": false\n }\n }\n },\n {\n \"type\": \"function\",\n \"function\": {\n \"name\": \"superdoc_edit\",\n \"description\": \"The primary tool for inserting content into documents. ALWAYS use action \\\"insert\\\" with type \\\"markdown\\\" to create headings, paragraphs, or any block content: this is faster and creates proper document structure in one call. Do NOT use superdoc_create for headings or paragraphs. The markdown parser creates headings from # markers (# = Heading1, ## = Heading2), bold from **text**, italic from *text*, and numbered/bullet lists. Position markdown inserts with \\\"target\\\" (a BlockNodeAddress like {kind:\\\"block\\\", nodeType, nodeId}) and \\\"placement\\\" (before, after, insideStart, insideEnd). Without a target, content appends at the end of the document. IMPORTANT: After a markdown insert, analyze the document context (what kind of document, how titles and body text are styled) and follow up with ONE superdoc_mutations call to format inserted blocks so they look like they belong. Each format.apply step accepts \\\"inline\\\" (fontFamily, fontSize, bold, underline, color), \\\"alignment\\\", and \\\"scope\\\" in the same step. Use scope: \\\"block\\\" so formatting covers the entire paragraph. Copy the exact property values from the existing get_content blocks (fontFamily, fontSize, color, alignment, bold, underline). Do NOT invent values: use what the blocks show. Also supports replace, delete, and undo/redo. For replace and delete, pass a \\\"ref\\\" from superdoc_search or superdoc_get_content blocks. A search ref covers only the matched substring; a block ref covers the entire block text, so use block refs when rewriting or shortening whole paragraphs. For multi-step redlines or whole-clause rewrites, prefer superdoc_mutations with where:{by:\\\"block\\\", nodeType, nodeId} from superdoc_get_content action \\\"blocks\\\" includeText:true rather than relying on text selectors. Refs expire after any mutation; always re-search before the next edit. For 2+ edits that must succeed or fail atomically, use superdoc_mutations instead. Supports \\\"dryRun\\\" to preview changes and \\\"changeMode: tracked\\\" to record edits as tracked changes (not supported for markdown/html inserts). Do NOT build \\\"target\\\" objects manually when a ref is available; prefer \\\"ref\\\" for simpler, more reliable targeting.\\n\\nEXAMPLES:\\n 1. {\\\"action\\\":\\\"insert\\\",\\\"type\\\":\\\"markdown\\\",\\\"target\\\":{\\\"kind\\\":\\\"block\\\",\\\"nodeType\\\":\\\"paragraph\\\",\\\"nodeId\\\":\\\"<nodeId>\\\"},\\\"placement\\\":\\\"before\\\",\\\"value\\\":\\\"# Executive Summary\\\\n\\\\nThis agreement sets forth the principal terms...\\\"}\\n 2. {\\\"action\\\":\\\"insert\\\",\\\"type\\\":\\\"markdown\\\",\\\"value\\\":\\\"# Section Title\\\\n\\\\nParagraph content here.\\\\n\\\\n# Another Section\\\\n\\\\nMore content with **bold** and *italic*.\\\"}\\n 3. {\\\"action\\\":\\\"replace\\\",\\\"ref\\\":\\\"<handle.ref>\\\",\\\"text\\\":\\\"new text here\\\"}\\n 4. {\\\"action\\\":\\\"delete\\\",\\\"ref\\\":\\\"<handle.ref>\\\"}\\n 5. {\\\"action\\\":\\\"undo\\\"}\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"action\": {\n \"type\": \"string\",\n \"enum\": [\n \"delete\",\n \"insert\",\n \"redo\",\n \"replace\",\n \"undo\"\n ],\n \"description\": \"The action to perform. One of: delete, insert, redo, replace, undo.\"\n },\n \"force\": {\n \"type\": \"boolean\",\n \"description\": \"Bypass confirmation checks.\"\n },\n \"changeMode\": {\n \"type\": \"string\",\n \"description\": \"Edit mode: \\\"direct\\\" applies changes immediately, \\\"tracked\\\" records as suggestions.\"\n },\n \"dryRun\": {\n \"type\": \"boolean\",\n \"description\": \"Preview the result without applying changes.\"\n },\n \"target\": {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"$ref\": \"#/$defs/BlockNodeAddress\",\n \"description\": \"Block address for structural insertion: {kind:'block', nodeType:'...', nodeId:'...'}.\"\n },\n {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"selection\",\n \"type\": \"string\"\n },\n \"start\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"text\",\n \"type\": \"string\"\n },\n \"blockId\": {\n \"type\": \"string\"\n },\n \"offset\": {\n \"type\": \"number\"\n },\n \"story\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"body\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"headerFooterSlot\",\n \"type\": \"string\"\n },\n \"section\": {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"section\",\n \"type\": \"string\"\n },\n \"sectionId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"sectionId\"\n ]\n },\n \"headerFooterKind\": {\n \"enum\": [\n \"header\",\n \"footer\"\n ]\n },\n \"variant\": {\n \"enum\": [\n \"default\",\n \"first\",\n \"even\"\n ]\n },\n \"resolution\": {\n \"enum\": [\n \"effective\",\n \"explicit\"\n ]\n },\n \"onWrite\": {\n \"enum\": [\n \"materializeIfInherited\",\n \"editResolvedPart\",\n \"error\"\n ]\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"section\",\n \"headerFooterKind\",\n \"variant\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"headerFooterPart\",\n \"type\": \"string\"\n },\n \"refId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"refId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"footnote\",\n \"type\": \"string\"\n },\n \"noteId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"noteId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"endnote\",\n \"type\": \"string\"\n },\n \"noteId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"noteId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"textbox\",\n \"type\": \"string\"\n },\n \"textboxId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"textboxId\"\n ]\n }\n ],\n \"description\": \"Story scope. Defaults to document body when omitted. Use {kind:'story', storyType:'body'} for body, or other storyType values for headers, footers, footnotes, endnotes.\"\n }\n },\n \"required\": [\n \"kind\",\n \"blockId\",\n \"offset\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"nodeEdge\",\n \"type\": \"string\"\n },\n \"node\": {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"block\",\n \"type\": \"string\"\n },\n \"nodeType\": {\n \"enum\": [\n \"paragraph\",\n \"heading\",\n \"table\",\n \"tableOfContents\",\n \"sdt\",\n \"image\"\n ]\n },\n \"nodeId\": {\n \"type\": \"string\"\n },\n \"story\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"body\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"headerFooterSlot\",\n \"type\": \"string\"\n },\n \"section\": {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"section\",\n \"type\": \"string\"\n },\n \"sectionId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"sectionId\"\n ]\n },\n \"headerFooterKind\": {\n \"enum\": [\n \"header\",\n \"footer\"\n ]\n },\n \"variant\": {\n \"enum\": [\n \"default\",\n \"first\",\n \"even\"\n ]\n },\n \"resolution\": {\n \"enum\": [\n \"effective\",\n \"explicit\"\n ]\n },\n \"onWrite\": {\n \"enum\": [\n \"materializeIfInherited\",\n \"editResolvedPart\",\n \"error\"\n ]\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"section\",\n \"headerFooterKind\",\n \"variant\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"headerFooterPart\",\n \"type\": \"string\"\n },\n \"refId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"refId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"footnote\",\n \"type\": \"string\"\n },\n \"noteId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"noteId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"endnote\",\n \"type\": \"string\"\n },\n \"noteId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"noteId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"textbox\",\n \"type\": \"string\"\n },\n \"textboxId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"textboxId\"\n ]\n }\n ],\n \"description\": \"Story scope. Defaults to document body when omitted. Use {kind:'story', storyType:'body'} for body, or other storyType values for headers, footers, footnotes, endnotes.\"\n }\n },\n \"required\": [\n \"kind\",\n \"nodeType\",\n \"nodeId\"\n ]\n },\n \"edge\": {\n \"enum\": [\n \"before\",\n \"after\"\n ]\n }\n },\n \"required\": [\n \"kind\",\n \"node\",\n \"edge\"\n ]\n }\n ],\n \"description\": \"A point in the document. Use {kind:'text', blockId, offset} for character positions or {kind:'nodeEdge', node:{kind:'block', nodeType, nodeId}, edge:'before'|'after'} for block boundaries.\"\n },\n \"end\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"text\",\n \"type\": \"string\"\n },\n \"blockId\": {\n \"type\": \"string\"\n },\n \"offset\": {\n \"type\": \"number\"\n },\n \"story\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"body\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"headerFooterSlot\",\n \"type\": \"string\"\n },\n \"section\": {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"section\",\n \"type\": \"string\"\n },\n \"sectionId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"sectionId\"\n ]\n },\n \"headerFooterKind\": {\n \"enum\": [\n \"header\",\n \"footer\"\n ]\n },\n \"variant\": {\n \"enum\": [\n \"default\",\n \"first\",\n \"even\"\n ]\n },\n \"resolution\": {\n \"enum\": [\n \"effective\",\n \"explicit\"\n ]\n },\n \"onWrite\": {\n \"enum\": [\n \"materializeIfInherited\",\n \"editResolvedPart\",\n \"error\"\n ]\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"section\",\n \"headerFooterKind\",\n \"variant\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"headerFooterPart\",\n \"type\": \"string\"\n },\n \"refId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"refId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"footnote\",\n \"type\": \"string\"\n },\n \"noteId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"noteId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"endnote\",\n \"type\": \"string\"\n },\n \"noteId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"noteId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"textbox\",\n \"type\": \"string\"\n },\n \"textboxId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"textboxId\"\n ]\n }\n ],\n \"description\": \"Story scope. Defaults to document body when omitted. Use {kind:'story', storyType:'body'} for body, or other storyType values for headers, footers, footnotes, endnotes.\"\n }\n },\n \"required\": [\n \"kind\",\n \"blockId\",\n \"offset\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"nodeEdge\",\n \"type\": \"string\"\n },\n \"node\": {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"block\",\n \"type\": \"string\"\n },\n \"nodeType\": {\n \"enum\": [\n \"paragraph\",\n \"heading\",\n \"table\",\n \"tableOfContents\",\n \"sdt\",\n \"image\"\n ]\n },\n \"nodeId\": {\n \"type\": \"string\"\n },\n \"story\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"body\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"headerFooterSlot\",\n \"type\": \"string\"\n },\n \"section\": {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"section\",\n \"type\": \"string\"\n },\n \"sectionId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"sectionId\"\n ]\n },\n \"headerFooterKind\": {\n \"enum\": [\n \"header\",\n \"footer\"\n ]\n },\n \"variant\": {\n \"enum\": [\n \"default\",\n \"first\",\n \"even\"\n ]\n },\n \"resolution\": {\n \"enum\": [\n \"effective\",\n \"explicit\"\n ]\n },\n \"onWrite\": {\n \"enum\": [\n \"materializeIfInherited\",\n \"editResolvedPart\",\n \"error\"\n ]\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"section\",\n \"headerFooterKind\",\n \"variant\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"headerFooterPart\",\n \"type\": \"string\"\n },\n \"refId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"refId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"footnote\",\n \"type\": \"string\"\n },\n \"noteId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"noteId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"endnote\",\n \"type\": \"string\"\n },\n \"noteId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"noteId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"textbox\",\n \"type\": \"string\"\n },\n \"textboxId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"textboxId\"\n ]\n }\n ],\n \"description\": \"Story scope. Defaults to document body when omitted. Use {kind:'story', storyType:'body'} for body, or other storyType values for headers, footers, footnotes, endnotes.\"\n }\n },\n \"required\": [\n \"kind\",\n \"nodeType\",\n \"nodeId\"\n ]\n },\n \"edge\": {\n \"enum\": [\n \"before\",\n \"after\"\n ]\n }\n },\n \"required\": [\n \"kind\",\n \"node\",\n \"edge\"\n ]\n }\n ],\n \"description\": \"A point in the document. Use {kind:'text', blockId, offset} for character positions or {kind:'nodeEdge', node:{kind:'block', nodeType, nodeId}, edge:'before'|'after'} for block boundaries.\"\n },\n \"story\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"body\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"headerFooterSlot\",\n \"type\": \"string\"\n },\n \"section\": {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"section\",\n \"type\": \"string\"\n },\n \"sectionId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"sectionId\"\n ]\n },\n \"headerFooterKind\": {\n \"enum\": [\n \"header\",\n \"footer\"\n ]\n },\n \"variant\": {\n \"enum\": [\n \"default\",\n \"first\",\n \"even\"\n ]\n },\n \"resolution\": {\n \"enum\": [\n \"effective\",\n \"explicit\"\n ]\n },\n \"onWrite\": {\n \"enum\": [\n \"materializeIfInherited\",\n \"editResolvedPart\",\n \"error\"\n ]\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"section\",\n \"headerFooterKind\",\n \"variant\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"headerFooterPart\",\n \"type\": \"string\"\n },\n \"refId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"refId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"footnote\",\n \"type\": \"string\"\n },\n \"noteId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"noteId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"endnote\",\n \"type\": \"string\"\n },\n \"noteId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"noteId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"textbox\",\n \"type\": \"string\"\n },\n \"textboxId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"textboxId\"\n ]\n }\n ],\n \"description\": \"Story scope. Defaults to document body when omitted. Use {kind:'story', storyType:'body'} for body, or other storyType values for headers, footers, footnotes, endnotes.\"\n },\n \"coordinateSpace\": {\n \"enum\": [\n \"visible\",\n \"tracked\"\n ]\n }\n },\n \"required\": [\n \"kind\",\n \"start\",\n \"end\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"block\",\n \"type\": \"string\"\n },\n \"nodeType\": {\n \"enum\": [\n \"paragraph\",\n \"heading\",\n \"listItem\",\n \"table\",\n \"tableRow\",\n \"tableCell\",\n \"tableOfContents\",\n \"image\",\n \"sdt\"\n ]\n },\n \"nodeId\": {\n \"type\": \"string\"\n },\n \"story\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"body\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"headerFooterSlot\",\n \"type\": \"string\"\n },\n \"section\": {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"section\",\n \"type\": \"string\"\n },\n \"sectionId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"sectionId\"\n ]\n },\n \"headerFooterKind\": {\n \"enum\": [\n \"header\",\n \"footer\"\n ]\n },\n \"variant\": {\n \"enum\": [\n \"default\",\n \"first\",\n \"even\"\n ]\n },\n \"resolution\": {\n \"enum\": [\n \"effective\",\n \"explicit\"\n ]\n },\n \"onWrite\": {\n \"enum\": [\n \"materializeIfInherited\",\n \"editResolvedPart\",\n \"error\"\n ]\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"section\",\n \"headerFooterKind\",\n \"variant\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"headerFooterPart\",\n \"type\": \"string\"\n },\n \"refId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"refId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"footnote\",\n \"type\": \"string\"\n },\n \"noteId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"noteId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"endnote\",\n \"type\": \"string\"\n },\n \"noteId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"noteId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"textbox\",\n \"type\": \"string\"\n },\n \"textboxId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"textboxId\"\n ]\n }\n ],\n \"description\": \"Story scope. Defaults to document body when omitted. Use {kind:'story', storyType:'body'} for body, or other storyType values for headers, footers, footnotes, endnotes.\"\n }\n },\n \"required\": [\n \"kind\",\n \"nodeType\",\n \"nodeId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"selection\",\n \"type\": \"string\"\n },\n \"start\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"text\",\n \"type\": \"string\"\n },\n \"blockId\": {\n \"type\": \"string\"\n },\n \"offset\": {\n \"type\": \"number\"\n },\n \"story\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"body\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"headerFooterSlot\",\n \"type\": \"string\"\n },\n \"section\": {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"section\",\n \"type\": \"string\"\n },\n \"sectionId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"sectionId\"\n ]\n },\n \"headerFooterKind\": {\n \"enum\": [\n \"header\",\n \"footer\"\n ]\n },\n \"variant\": {\n \"enum\": [\n \"default\",\n \"first\",\n \"even\"\n ]\n },\n \"resolution\": {\n \"enum\": [\n \"effective\",\n \"explicit\"\n ]\n },\n \"onWrite\": {\n \"enum\": [\n \"materializeIfInherited\",\n \"editResolvedPart\",\n \"error\"\n ]\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"section\",\n \"headerFooterKind\",\n \"variant\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"headerFooterPart\",\n \"type\": \"string\"\n },\n \"refId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"refId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"footnote\",\n \"type\": \"string\"\n },\n \"noteId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"noteId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"endnote\",\n \"type\": \"string\"\n },\n \"noteId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"noteId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"textbox\",\n \"type\": \"string\"\n },\n \"textboxId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"textboxId\"\n ]\n }\n ],\n \"description\": \"Story scope. Defaults to document body when omitted. Use {kind:'story', storyType:'body'} for body, or other storyType values for headers, footers, footnotes, endnotes.\"\n }\n },\n \"required\": [\n \"kind\",\n \"blockId\",\n \"offset\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"nodeEdge\",\n \"type\": \"string\"\n },\n \"node\": {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"block\",\n \"type\": \"string\"\n },\n \"nodeType\": {\n \"enum\": [\n \"paragraph\",\n \"heading\",\n \"table\",\n \"tableOfContents\",\n \"sdt\",\n \"image\"\n ]\n },\n \"nodeId\": {\n \"type\": \"string\"\n },\n \"story\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"body\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"headerFooterSlot\",\n \"type\": \"string\"\n },\n \"section\": {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"section\",\n \"type\": \"string\"\n },\n \"sectionId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"sectionId\"\n ]\n },\n \"headerFooterKind\": {\n \"enum\": [\n \"header\",\n \"footer\"\n ]\n },\n \"variant\": {\n \"enum\": [\n \"default\",\n \"first\",\n \"even\"\n ]\n },\n \"resolution\": {\n \"enum\": [\n \"effective\",\n \"explicit\"\n ]\n },\n \"onWrite\": {\n \"enum\": [\n \"materializeIfInherited\",\n \"editResolvedPart\",\n \"error\"\n ]\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"section\",\n \"headerFooterKind\",\n \"variant\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"headerFooterPart\",\n \"type\": \"string\"\n },\n \"refId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"refId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"footnote\",\n \"type\": \"string\"\n },\n \"noteId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"noteId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"endnote\",\n \"type\": \"string\"\n },\n \"noteId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"noteId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"textbox\",\n \"type\": \"string\"\n },\n \"textboxId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"textboxId\"\n ]\n }\n ],\n \"description\": \"Story scope. Defaults to document body when omitted. Use {kind:'story', storyType:'body'} for body, or other storyType values for headers, footers, footnotes, endnotes.\"\n }\n },\n \"required\": [\n \"kind\",\n \"nodeType\",\n \"nodeId\"\n ]\n },\n \"edge\": {\n \"enum\": [\n \"before\",\n \"after\"\n ]\n }\n },\n \"required\": [\n \"kind\",\n \"node\",\n \"edge\"\n ]\n }\n ],\n \"description\": \"A point in the document. Use {kind:'text', blockId, offset} for character positions or {kind:'nodeEdge', node:{kind:'block', nodeType, nodeId}, edge:'before'|'after'} for block boundaries.\"\n },\n \"end\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"text\",\n \"type\": \"string\"\n },\n \"blockId\": {\n \"type\": \"string\"\n },\n \"offset\": {\n \"type\": \"number\"\n },\n \"story\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"body\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"headerFooterSlot\",\n \"type\": \"string\"\n },\n \"section\": {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"section\",\n \"type\": \"string\"\n },\n \"sectionId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"sectionId\"\n ]\n },\n \"headerFooterKind\": {\n \"enum\": [\n \"header\",\n \"footer\"\n ]\n },\n \"variant\": {\n \"enum\": [\n \"default\",\n \"first\",\n \"even\"\n ]\n },\n \"resolution\": {\n \"enum\": [\n \"effective\",\n \"explicit\"\n ]\n },\n \"onWrite\": {\n \"enum\": [\n \"materializeIfInherited\",\n \"editResolvedPart\",\n \"error\"\n ]\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"section\",\n \"headerFooterKind\",\n \"variant\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"headerFooterPart\",\n \"type\": \"string\"\n },\n \"refId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"refId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"footnote\",\n \"type\": \"string\"\n },\n \"noteId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"noteId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"endnote\",\n \"type\": \"string\"\n },\n \"noteId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"noteId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"textbox\",\n \"type\": \"string\"\n },\n \"textboxId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"textboxId\"\n ]\n }\n ],\n \"description\": \"Story scope. Defaults to document body when omitted. Use {kind:'story', storyType:'body'} for body, or other storyType values for headers, footers, footnotes, endnotes.\"\n }\n },\n \"required\": [\n \"kind\",\n \"blockId\",\n \"offset\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"nodeEdge\",\n \"type\": \"string\"\n },\n \"node\": {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"block\",\n \"type\": \"string\"\n },\n \"nodeType\": {\n \"enum\": [\n \"paragraph\",\n \"heading\",\n \"table\",\n \"tableOfContents\",\n \"sdt\",\n \"image\"\n ]\n },\n \"nodeId\": {\n \"type\": \"string\"\n },\n \"story\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"body\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"headerFooterSlot\",\n \"type\": \"string\"\n },\n \"section\": {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"section\",\n \"type\": \"string\"\n },\n \"sectionId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"sectionId\"\n ]\n },\n \"headerFooterKind\": {\n \"enum\": [\n \"header\",\n \"footer\"\n ]\n },\n \"variant\": {\n \"enum\": [\n \"default\",\n \"first\",\n \"even\"\n ]\n },\n \"resolution\": {\n \"enum\": [\n \"effective\",\n \"explicit\"\n ]\n },\n \"onWrite\": {\n \"enum\": [\n \"materializeIfInherited\",\n \"editResolvedPart\",\n \"error\"\n ]\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"section\",\n \"headerFooterKind\",\n \"variant\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"headerFooterPart\",\n \"type\": \"string\"\n },\n \"refId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"refId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"footnote\",\n \"type\": \"string\"\n },\n \"noteId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"noteId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"endnote\",\n \"type\": \"string\"\n },\n \"noteId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"noteId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"textbox\",\n \"type\": \"string\"\n },\n \"textboxId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"textboxId\"\n ]\n }\n ],\n \"description\": \"Story scope. Defaults to document body when omitted. Use {kind:'story', storyType:'body'} for body, or other storyType values for headers, footers, footnotes, endnotes.\"\n }\n },\n \"required\": [\n \"kind\",\n \"nodeType\",\n \"nodeId\"\n ]\n },\n \"edge\": {\n \"enum\": [\n \"before\",\n \"after\"\n ]\n }\n },\n \"required\": [\n \"kind\",\n \"node\",\n \"edge\"\n ]\n }\n ],\n \"description\": \"A point in the document. Use {kind:'text', blockId, offset} for character positions or {kind:'nodeEdge', node:{kind:'block', nodeType, nodeId}, edge:'before'|'after'} for block boundaries.\"\n },\n \"story\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"body\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"headerFooterSlot\",\n \"type\": \"string\"\n },\n \"section\": {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"section\",\n \"type\": \"string\"\n },\n \"sectionId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"sectionId\"\n ]\n },\n \"headerFooterKind\": {\n \"enum\": [\n \"header\",\n \"footer\"\n ]\n },\n \"variant\": {\n \"enum\": [\n \"default\",\n \"first\",\n \"even\"\n ]\n },\n \"resolution\": {\n \"enum\": [\n \"effective\",\n \"explicit\"\n ]\n },\n \"onWrite\": {\n \"enum\": [\n \"materializeIfInherited\",\n \"editResolvedPart\",\n \"error\"\n ]\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"section\",\n \"headerFooterKind\",\n \"variant\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"headerFooterPart\",\n \"type\": \"string\"\n },\n \"refId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"refId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"footnote\",\n \"type\": \"string\"\n },\n \"noteId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"noteId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"endnote\",\n \"type\": \"string\"\n },\n \"noteId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"noteId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"textbox\",\n \"type\": \"string\"\n },\n \"textboxId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"textboxId\"\n ]\n }\n ],\n \"description\": \"Story scope. Defaults to document body when omitted. Use {kind:'story', storyType:'body'} for body, or other storyType values for headers, footers, footnotes, endnotes.\"\n },\n \"coordinateSpace\": {\n \"enum\": [\n \"visible\",\n \"tracked\"\n ]\n }\n },\n \"required\": [\n \"kind\",\n \"start\",\n \"end\"\n ]\n }\n ]\n }\n ],\n \"description\": \"Block address for structural insertion: {kind:'block', nodeType:'...', nodeId:'...'}.\"\n },\n {\n \"$ref\": \"#/$defs/SelectionTarget\",\n \"description\": \"Selection target: {kind:'selection', start:{kind:'text', blockId, offset}, end:{kind:'text', blockId, offset}}. Use 'ref' instead when you have a search result handle.\"\n }\n ],\n \"description\": \"Block address for structural insertion: {kind:'block', nodeType:'...', nodeId:'...'}.\"\n },\n \"in\": {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"$ref\": \"#/$defs/StoryLocator\",\n \"description\": \"Story scope. Defaults to document body when omitted. Use {kind:'story', storyType:'body'} for body, or other storyType values for headers, footers, footnotes, endnotes.\"\n },\n {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"body\",\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"headerFooterSlot\",\n \"type\": \"string\"\n },\n \"section\": {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"section\",\n \"type\": \"string\"\n },\n \"sectionId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"sectionId\"\n ]\n },\n \"headerFooterKind\": {\n \"enum\": [\n \"header\",\n \"footer\"\n ]\n },\n \"variant\": {\n \"enum\": [\n \"default\",\n \"first\",\n \"even\"\n ]\n },\n \"resolution\": {\n \"enum\": [\n \"effective\",\n \"explicit\"\n ]\n },\n \"onWrite\": {\n \"enum\": [\n \"materializeIfInherited\",\n \"editResolvedPart\",\n \"error\"\n ]\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"section\",\n \"headerFooterKind\",\n \"variant\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"headerFooterPart\",\n \"type\": \"string\"\n },\n \"refId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"refId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"footnote\",\n \"type\": \"string\"\n },\n \"noteId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"noteId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"endnote\",\n \"type\": \"string\"\n },\n \"noteId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"noteId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"story\",\n \"type\": \"string\"\n },\n \"storyType\": {\n \"const\": \"textbox\",\n \"type\": \"string\"\n },\n \"textboxId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"storyType\",\n \"textboxId\"\n ]\n }\n ],\n \"description\": \"Story scope. Defaults to document body when omitted. Use {kind:'story', storyType:'body'} for body, or other storyType values for headers, footers, footnotes, endnotes.\"\n }\n ],\n \"description\": \"Story scope. Defaults to document body when omitted. Use {kind:'story', storyType:'body'} for body, or other storyType values for headers, footers, footnotes, endnotes.\"\n },\n {\n \"$ref\": \"#/$defs/StoryLocator\",\n \"description\": \"Story scope. Defaults to document body when omitted. Use {kind:'story', storyType:'body'} for body, or other storyType values for headers, footers, footnotes, endnotes.\"\n }\n ],\n \"description\": \"Story scope. Defaults to document body when omitted. Use {kind:'story', storyType:'body'} for body, or other storyType values for headers, footers, footnotes, endnotes.\"\n },\n \"value\": {\n \"type\": \"string\",\n \"description\": \"Text content to insert. Only for action 'insert'. Omit for other actions.\"\n },\n \"type\": {\n \"type\": \"string\",\n \"description\": \"Content format: 'text' (default), 'markdown', or 'html'. Only for action 'insert'. Omit for other actions.\",\n \"enum\": [\n \"text\",\n \"markdown\",\n \"html\"\n ]\n },\n \"ref\": {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"description\": \"Handle ref from superdoc_search result (pass handle.ref value directly). Preferred over building a target object.\"\n },\n {\n \"type\": \"string\",\n \"description\": \"Handle ref string from a superdoc_search result. Pass the handle.ref value directly (e.g. 'text:eyJ...'). Preferred over 'target' for inline formatting.\"\n }\n ],\n \"description\": \"Handle ref from superdoc_search result (pass handle.ref value directly). Preferred over building a target object.\"\n },\n {\n \"type\": \"string\",\n \"description\": \"Handle ref string from a superdoc_search result. Pass the handle.ref value directly (e.g. 'text:eyJ...'). Preferred over 'target' for inline formatting.\"\n }\n ],\n \"description\": \"Handle ref from superdoc_search result (pass handle.ref value directly). Preferred over building a target object.\"\n },\n \"content\": {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"type\": \"object\"\n },\n {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\"\n }\n }\n ],\n \"description\": \"Document fragment to insert (structured content).\"\n },\n {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {}\n },\n {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {}\n }\n }\n ],\n \"description\": \"Document fragment to replace with (structured content).\"\n }\n ],\n \"description\": \"Document fragment to insert (structured content). Only for actions 'insert', 'replace'. Omit for other actions.\"\n },\n \"placement\": {\n \"enum\": [\n \"before\",\n \"after\",\n \"insideStart\",\n \"insideEnd\"\n ],\n \"description\": \"Where to place content relative to target: 'before', 'after', 'insideStart', or 'insideEnd'. Only for action 'insert'. Omit for other actions.\"\n },\n \"nestingPolicy\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"tables\": {\n \"enum\": [\n \"forbid\",\n \"allow\"\n ]\n }\n },\n \"additionalProperties\": false,\n \"description\": \"Controls nesting behavior. tables: 'allow' permits inserting tables inside other tables.\"\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"tables\": {\n \"enum\": [\n \"forbid\",\n \"allow\"\n ]\n }\n },\n \"description\": \"Controls nesting behavior. tables: 'allow' permits inserting tables inside other tables.\"\n }\n ],\n \"description\": \"Controls nesting behavior. tables: 'allow' permits inserting tables inside other tables. Only for actions 'insert', 'replace'. Omit for other actions.\"\n },\n \"text\": {\n \"type\": \"string\",\n \"description\": \"Replacement text content. Only for action 'replace'. Omit for other actions.\"\n },\n \"behavior\": {\n \"$ref\": \"#/$defs/DeleteBehavior\",\n \"description\": \"Delete behavior: 'selection' (default) or 'exact'. Only for action 'delete'. Omit for other actions.\"\n }\n },\n \"required\": [\n \"action\"\n ],\n \"additionalProperties\": false\n }\n }\n },\n {\n \"type\": \"function\",\n \"function\": {\n \"name\": \"superdoc_format\",\n \"description\": \"Change text and paragraph formatting. To format multiple items at once, use superdoc_mutations with format.apply steps instead of calling this tool repeatedly. Use require \\\"all\\\" with a node selector to format every heading or paragraph in one batch. Use this tool for single-item formatting when you have a valid ref or nodeId. Action \\\"inline\\\" applies character formatting (bold, italic, underline, color, fontSize, fontFamily, highlight, strike, vertAlign) to a text range via \\\"ref\\\". Action \\\"set_style\\\" applies a named paragraph style by styleId (get available styles from superdoc_get_content info). Actions \\\"set_alignment\\\", \\\"set_indentation\\\", \\\"set_spacing\\\", \\\"set_direction\\\", and \\\"set_flow_options\\\" change paragraph-level properties and require a block target: {kind:\\\"block\\\", nodeType:\\\"paragraph\\\", nodeId:\\\"<nodeId>\\\"}, NOT a ref. Use \\\"set_flow_options\\\" with pageBreakBefore:true to start a paragraph on a new page. Supports \\\"dryRun\\\" and \\\"changeMode: tracked\\\" for inline formatting. Paragraph-level actions do NOT support tracked changes. Do NOT use a search ref for paragraph-level actions; they require a block target with nodeId. Do NOT use {kind:\\\"block\\\", start:{kind:\\\"nodeEdge\\\",...}} or selection-like structures for paragraph actions. ONLY {kind:\\\"block\\\", nodeType, nodeId} is accepted. Do NOT issue multiple superdoc_format calls in parallel; each call invalidates refs for subsequent calls.\\n\\nEXAMPLES:\\n 1. {\\\"action\\\":\\\"inline\\\",\\\"ref\\\":\\\"<handle.ref>\\\",\\\"inline\\\":{\\\"bold\\\":true}}\\n 2. {\\\"action\\\":\\\"inline\\\",\\\"ref\\\":\\\"<create.ref>\\\",\\\"inline\\\":{\\\"fontFamily\\\":\\\"Calibri\\\",\\\"fontSize\\\":11,\\\"color\\\":\\\"#000000\\\",\\\"bold\\\":false}}\\n 3. {\\\"action\\\":\\\"set_alignment\\\",\\\"target\\\":{\\\"kind\\\":\\\"block\\\",\\\"nodeType\\\":\\\"paragraph\\\",\\\"nodeId\\\":\\\"<nodeId>\\\"},\\\"alignment\\\":\\\"center\\\"}\\n 4. {\\\"action\\\":\\\"set_flow_options\\\",\\\"target\\\":{\\\"kind\\\":\\\"block\\\",\\\"nodeType\\\":\\\"paragraph\\\",\\\"nodeId\\\":\\\"<nodeId>\\\"},\\\"pageBreakBefore\\\":true}\\n 5. {\\\"action\\\":\\\"set_spacing\\\",\\\"target\\\":{\\\"kind\\\":\\\"block\\\",\\\"nodeType\\\":\\\"paragraph\\\",\\\"nodeId\\\":\\\"<nodeId>\\\"},\\\"lineSpacing\\\":{\\\"rule\\\":\\\"auto\\\",\\\"value\\\":1.5}}\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"action\": {\n \"type\": \"string\",\n \"enum\": [\n \"inline\",\n \"set_alignment\",\n \"set_direction\",\n \"set_flow_options\",\n \"set_indentation\",\n \"set_spacing\",\n \"set_style\",\n \"set_style_ref\"\n ],\n \"description\": \"The action to perform. One of: inline, set_alignment, set_direction, set_flow_options, set_indentation, set_spacing, set_style, set_style_ref.\"\n },\n \"force\": {\n \"type\": \"boolean\",\n \"description\": \"Bypass confirmation checks.\"\n },\n \"changeMode\": {\n \"type\": \"string\",\n \"description\": \"Edit mode: \\\"direct\\\" applies changes immediately, \\\"tracked\\\" records as suggestions.\"\n },\n \"dryRun\": {\n \"type\": \"boolean\",\n \"description\": \"Preview the result without applying changes.\"\n },\n \"target\": {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"$ref\": \"#/$defs/SelectionTarget\",\n \"description\": \"Selection target: {kind:'selection', start:{kind:'text', blockId, offset}, end:{kind:'text', blockId, offset}}. Use 'ref' instead when you have a search result handle.\"\n },\n {\n \"oneOf\": [\n {\n \"$ref\": \"#/$defs/ParagraphAddress\"\n },\n {\n \"$ref\": \"#/$defs/HeadingAddress\"\n },\n {\n \"$ref\": \"#/$defs/ListItemAddress\"\n }\n ]\n }\n ],\n \"description\": \"Selection target: {kind:'selection', start:{kind:'text', blockId, offset}, end:{kind:'text', blockId, offset}}. Use 'ref' instead when you have a search result handle.\"\n },\n {\n \"oneOf\": [\n {\n \"$ref\": \"#/$defs/ParagraphAddress\"\n },\n {\n \"$ref\": \"#/$defs/HeadingAddress\"\n },\n {\n \"$ref\": \"#/$defs/ListItemAddress\"\n }\n ]\n }\n ],\n \"description\": \"Selection target: {kind:'selection', start:{kind:'text', blockId, offset}, end:{kind:'text', blockId, offset}}. Use 'ref' instead when you have a search result handle.\"\n },\n {\n \"oneOf\": [\n {\n \"$ref\": \"#/$defs/ParagraphAddress\"\n },\n {\n \"$ref\": \"#/$defs/HeadingAddress\"\n },\n {\n \"$ref\": \"#/$defs/ListItemAddress\"\n }\n ]\n }\n ],\n \"description\": \"Selection target: {kind:'selection', start:{kind:'text', blockId, offset}, end:{kind:'text', blockId, offset}}. Use 'ref' instead when you have a search result handle.\"\n },\n {\n \"oneOf\": [\n {\n \"$ref\": \"#/$defs/ParagraphAddress\"\n },\n {\n \"$ref\": \"#/$defs/HeadingAddress\"\n },\n {\n \"$ref\": \"#/$defs/ListItemAddress\"\n }\n ]\n }\n ],\n \"description\": \"Selection target: {kind:'selection', start:{kind:'text', blockId, offset}, end:{kind:'text', blockId, offset}}. Use 'ref' instead when you have a search result handle.\"\n },\n {\n \"oneOf\": [\n {\n \"$ref\": \"#/$defs/ParagraphAddress\"\n },\n {\n \"$ref\": \"#/$defs/HeadingAddress\"\n },\n {\n \"$ref\": \"#/$defs/ListItemAddress\"\n }\n ]\n }\n ],\n \"description\": \"Selection target: {kind:'selection', start:{kind:'text', blockId, offset}, end:{kind:'text', blockId, offset}}. Use 'ref' instead when you have a search result handle.\"\n },\n {\n \"oneOf\": [\n {\n \"$ref\": \"#/$defs/ParagraphAddress\"\n },\n {\n \"$ref\": \"#/$defs/HeadingAddress\"\n },\n {\n \"$ref\": \"#/$defs/ListItemAddress\"\n }\n ]\n }\n ],\n \"description\": \"Selection target: {kind:'selection', start:{kind:'text', blockId, offset}, end:{kind:'text', blockId, offset}}. Use 'ref' instead when you have a search result handle.\"\n },\n {\n \"oneOf\": [\n {\n \"$ref\": \"#/$defs/ParagraphAddress\"\n },\n {\n \"$ref\": \"#/$defs/HeadingAddress\"\n },\n {\n \"$ref\": \"#/$defs/ListItemAddress\"\n }\n ]\n }\n ],\n \"description\": \"Selection target: {kind:'selection', start:{kind:'text', blockId, offset}, end:{kind:'text', blockId, offset}}. Use 'ref' instead when you have a search result handle. Required for actions 'set_style', 'set_style_ref', 'set_alignment', 'set_indentation', 'set_spacing', 'set_flow_options', 'set_direction'.\"\n },\n \"in\": {\n \"$ref\": \"#/$defs/StoryLocator\",\n \"description\": \"Story scope. Defaults to document body when omitted. Use {kind:'story', storyType:'body'} for body, or other storyType values for headers, footers, footnotes, endnotes. Only for action 'inline'. Omit for other actions.\"\n },\n \"inline\": {\n \"type\": \"object\",\n \"properties\": {\n \"bold\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"italic\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"strike\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"underline\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"style\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"color\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"themeColor\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"additionalProperties\": false,\n \"minProperties\": 1\n }\n ]\n },\n \"highlight\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"color\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"fontSize\": {\n \"oneOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"fontFamily\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"letterSpacing\": {\n \"oneOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"vertAlign\": {\n \"oneOf\": [\n {\n \"enum\": [\n \"superscript\",\n \"subscript\",\n \"baseline\"\n ]\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"position\": {\n \"oneOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"dstrike\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"smallCaps\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"caps\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"shading\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"fill\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"color\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"val\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"additionalProperties\": false,\n \"minProperties\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"border\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"val\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"sz\": {\n \"oneOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"color\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"space\": {\n \"oneOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"additionalProperties\": false,\n \"minProperties\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"outline\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"shadow\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"emboss\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"imprint\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"charScale\": {\n \"oneOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"kerning\": {\n \"oneOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"vanish\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"webHidden\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"specVanish\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"rtl\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"cs\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"bCs\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"iCs\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"eastAsianLayout\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"combine\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"combineBrackets\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"vert\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"vertCompress\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"additionalProperties\": false,\n \"minProperties\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"em\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"fitText\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"val\": {\n \"oneOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"id\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"additionalProperties\": false,\n \"minProperties\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"snapToGrid\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"lang\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"val\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"eastAsia\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"bidi\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"additionalProperties\": false,\n \"minProperties\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"oMath\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"rStyle\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"rFonts\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"ascii\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"hAnsi\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"eastAsia\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"cs\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"asciiTheme\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"hAnsiTheme\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"eastAsiaTheme\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"csTheme\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"hint\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"additionalProperties\": false,\n \"minProperties\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"fontSizeCs\": {\n \"oneOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"ligatures\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"numForm\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"numSpacing\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"stylisticSets\": {\n \"oneOf\": [\n {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"number\"\n },\n \"val\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"id\"\n ],\n \"additionalProperties\": false\n },\n \"minItems\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"contextualAlternates\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"additionalProperties\": false,\n \"minProperties\": 1,\n \"description\": \"Inline formatting properties to apply. Set a property to apply it, use null to clear it. Example: {bold: true, italic: true} or {bold: null} to remove bold. Only for action 'inline'. Omit for other actions.\"\n },\n \"ref\": {\n \"type\": \"string\",\n \"description\": \"Handle ref string from a superdoc_search result. Pass the handle.ref value directly (e.g. 'text:eyJ...'). Preferred over 'target' for inline formatting. Only for action 'inline'. Omit for other actions.\"\n },\n \"styleId\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1,\n \"description\": \"Named paragraph style ID (e.g. 'Normal', 'Heading1', 'BodyText'). Use superdoc_search to find a nearby paragraph, then inspect its style to determine the correct styleId.\"\n },\n {\n \"type\": \"string\",\n \"minLength\": 1,\n \"description\": \"Named paragraph style ID (e.g. 'Normal', 'Heading1'). Unlike setStyle, existing run formatting is preserved.\"\n }\n ],\n \"description\": \"Named paragraph style ID (e.g. 'Normal', 'Heading1', 'BodyText'). Use superdoc_search to find a nearby paragraph, then inspect its style to determine the correct styleId. Required for action 'set_style_ref'.\"\n },\n \"role\": {\n \"anyOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"defaultParagraph\",\n \"type\": \"string\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"kind\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"heading\",\n \"type\": \"string\"\n },\n \"level\": {\n \"type\": \"integer\",\n \"minimum\": 1,\n \"maximum\": 9\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"kind\",\n \"level\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"title\",\n \"type\": \"string\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"kind\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"subtitle\",\n \"type\": \"string\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"kind\"\n ]\n }\n ],\n \"description\": \"Semantic built-in style intent, resolved to the document authored style identity. Only for action 'set_style'. Omit for other actions.\"\n },\n \"alignment\": {\n \"enum\": [\n \"left\",\n \"center\",\n \"right\",\n \"justify\"\n ],\n \"description\": \"Visual paragraph alignment. In RTL paragraphs, 'left' stores w:jc='right' and 'right' stores w:jc='left' so Word displays the requested side. Required for action 'set_alignment'.\"\n },\n \"left\": {\n \"type\": \"integer\",\n \"description\": \"Left indentation in twips (1440 = 1 inch). Only for action 'set_indentation'. Omit for other actions.\"\n },\n \"right\": {\n \"type\": \"integer\",\n \"description\": \"Right indentation in twips (1440 = 1 inch). Only for action 'set_indentation'. Omit for other actions.\"\n },\n \"firstLine\": {\n \"type\": \"integer\",\n \"minimum\": 0,\n \"description\": \"First line indent in twips. Cannot be combined with hanging. Only for action 'set_indentation'. Omit for other actions.\"\n },\n \"hanging\": {\n \"type\": \"integer\",\n \"minimum\": 0,\n \"description\": \"Hanging indent in twips. Cannot be combined with firstLine. Only for action 'set_indentation'. Omit for other actions.\"\n },\n \"before\": {\n \"type\": \"integer\",\n \"minimum\": 0,\n \"description\": \"Space before paragraph in twips (20 twips = 1pt). Only for action 'set_spacing'. Omit for other actions.\"\n },\n \"after\": {\n \"type\": \"integer\",\n \"minimum\": 0,\n \"description\": \"Space after paragraph in twips (20 twips = 1pt). Only for action 'set_spacing'. Omit for other actions.\"\n },\n \"line\": {\n \"type\": \"integer\",\n \"minimum\": 1,\n \"description\": \"Line spacing value. Meaning depends on lineRule. Must be provided together with lineRule. Only for action 'set_spacing'. Omit for other actions.\"\n },\n \"lineRule\": {\n \"enum\": [\n \"auto\",\n \"exact\",\n \"atLeast\"\n ],\n \"description\": \"Line spacing rule. Required when 'line' is set. Only for action 'set_spacing'. Omit for other actions.\"\n },\n \"contextualSpacing\": {\n \"type\": \"boolean\",\n \"description\": \"Only for action 'set_flow_options'. Omit for other actions.\"\n },\n \"pageBreakBefore\": {\n \"type\": \"boolean\",\n \"description\": \"Only for action 'set_flow_options'. Omit for other actions.\"\n },\n \"suppressAutoHyphens\": {\n \"type\": \"boolean\",\n \"description\": \"Only for action 'set_flow_options'. Omit for other actions.\"\n },\n \"autoSpaceDE\": {\n \"type\": \"boolean\",\n \"description\": \"Only for action 'set_flow_options'. Omit for other actions.\"\n },\n \"autoSpaceDN\": {\n \"type\": \"boolean\",\n \"description\": \"Only for action 'set_flow_options'. Omit for other actions.\"\n },\n \"adjustRightInd\": {\n \"type\": \"boolean\",\n \"description\": \"Only for action 'set_flow_options'. Omit for other actions.\"\n },\n \"snapToGrid\": {\n \"type\": \"boolean\",\n \"description\": \"Only for action 'set_flow_options'. Omit for other actions.\"\n },\n \"direction\": {\n \"type\": \"string\",\n \"enum\": [\n \"ltr\",\n \"rtl\"\n ],\n \"description\": \"Required for action 'set_direction'.\"\n },\n \"alignmentPolicy\": {\n \"type\": \"string\",\n \"enum\": [\n \"preserve\",\n \"matchDirection\"\n ],\n \"description\": \"Only for action 'set_direction'. Omit for other actions.\"\n }\n },\n \"required\": [\n \"action\"\n ],\n \"additionalProperties\": false\n }\n }\n },\n {\n \"type\": \"function\",\n \"function\": {\n \"name\": \"superdoc_create\",\n \"description\": \"IMPORTANT: For headings and paragraphs, use superdoc_edit with type \\\"markdown\\\" instead: it is faster, creates proper styles, and handles positioning via target + placement. Only use superdoc_create for tables or when markdown cannot express the content. Creates a single paragraph, heading, or table. Returns nodeId and ref for the created block. After creating, the returned ref is valid for ONE immediate superdoc_format call. For subsequent operations, re-fetch blocks with superdoc_get_content to get fresh refs (refs expire after any mutation). When the user asks for a \\\"heading\\\", use action \\\"heading\\\" with a level (default 1). Use action \\\"paragraph\\\" for regular body text. Position with \\\"at\\\": {kind:\\\"documentEnd\\\"} (default), {kind:\\\"documentStart\\\"}, or {kind:\\\"after\\\"/\\\"before\\\", target:{kind:\\\"block\\\", nodeType, nodeId}} for relative placement. When creating multiple items in sequence, use the previous response nodeId as the next \\\"at\\\" target to maintain correct ordering. Do NOT use newlines in \\\"text\\\" to create multiple paragraphs; call this tool separately for each one.\\n\\nEXAMPLES:\\n 1. {\\\"action\\\":\\\"paragraph\\\",\\\"text\\\":\\\"New paragraph content.\\\",\\\"at\\\":{\\\"kind\\\":\\\"documentEnd\\\"}}\\n 2. {\\\"action\\\":\\\"heading\\\",\\\"text\\\":\\\"Section Title\\\",\\\"level\\\":2,\\\"at\\\":{\\\"kind\\\":\\\"after\\\",\\\"target\\\":{\\\"kind\\\":\\\"block\\\",\\\"nodeType\\\":\\\"paragraph\\\",\\\"nodeId\\\":\\\"<nodeId>\\\"}}}\\n 3. {\\\"action\\\":\\\"paragraph\\\",\\\"text\\\":\\\"Chained item.\\\",\\\"at\\\":{\\\"kind\\\":\\\"after\\\",\\\"target\\\":{\\\"kind\\\":\\\"block\\\",\\\"nodeType\\\":\\\"paragraph\\\",\\\"nodeId\\\":\\\"<previousNodeId>\\\"}}}\\n 4. {\\\"action\\\":\\\"table\\\",\\\"rows\\\":3,\\\"columns\\\":4,\\\"at\\\":{\\\"kind\\\":\\\"documentEnd\\\"}}\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"action\": {\n \"type\": \"string\",\n \"enum\": [\n \"heading\",\n \"paragraph\",\n \"table\"\n ],\n \"description\": \"The action to perform. One of: heading, paragraph, table.\"\n },\n \"force\": {\n \"type\": \"boolean\",\n \"description\": \"Bypass confirmation checks.\"\n },\n \"changeMode\": {\n \"type\": \"string\",\n \"description\": \"Edit mode: \\\"direct\\\" applies changes immediately, \\\"tracked\\\" records as suggestions.\"\n },\n \"dryRun\": {\n \"type\": \"boolean\",\n \"description\": \"Preview the result without applying changes.\"\n },\n \"in\": {\n \"$ref\": \"#/$defs/StoryLocator\",\n \"description\": \"Story scope. Defaults to document body when omitted. Use {kind:'story', storyType:'body'} for body, or other storyType values for headers, footers, footnotes, endnotes.\"\n },\n \"at\": {\n \"oneOf\": [\n {\n \"description\": \"Position: {kind:'documentEnd'} to append, {kind:'documentStart'} to prepend, or {kind:'before'|'after', target:{kind:'block', nodeType:'...', nodeId:'...'}} for relative placement.\",\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"documentStart\",\n \"type\": \"string\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"kind\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"documentEnd\",\n \"type\": \"string\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"kind\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"before\",\n \"type\": \"string\"\n },\n \"target\": {\n \"$ref\": \"#/$defs/BlockNodeAddress\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"kind\",\n \"target\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"after\",\n \"type\": \"string\"\n },\n \"target\": {\n \"$ref\": \"#/$defs/BlockNodeAddress\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"kind\",\n \"target\"\n ]\n }\n ]\n },\n {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"documentStart\",\n \"type\": \"string\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"kind\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"documentEnd\",\n \"type\": \"string\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"kind\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"before\",\n \"type\": \"string\"\n },\n \"target\": {\n \"$ref\": \"#/$defs/BlockNodeAddress\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"kind\",\n \"target\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"after\",\n \"type\": \"string\"\n },\n \"target\": {\n \"$ref\": \"#/$defs/BlockNodeAddress\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"kind\",\n \"target\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"before\",\n \"type\": \"string\"\n },\n \"nodeId\": {\n \"type\": \"string\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"kind\",\n \"nodeId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"after\",\n \"type\": \"string\"\n },\n \"nodeId\": {\n \"type\": \"string\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"kind\",\n \"nodeId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"inParagraph\",\n \"type\": \"string\"\n },\n \"target\": {\n \"$ref\": \"#/$defs/BlockNodeAddress\"\n },\n \"offset\": {\n \"type\": \"integer\",\n \"minimum\": 0\n },\n \"coordinateSpace\": {\n \"enum\": [\n \"visible\",\n \"tracked\"\n ]\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"kind\",\n \"target\",\n \"offset\"\n ]\n }\n ]\n }\n ],\n \"description\": \"Position: {kind:'documentEnd'} to append, {kind:'documentStart'} to prepend, or {kind:'before'|'after', target:{kind:'block', nodeType:'...', nodeId:'...'}} for relative placement.\"\n },\n \"text\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"description\": \"Paragraph text content. Each call creates ONE paragraph. For multiple items (e.g. list items), call superdoc_create separately for each item: do NOT use newlines to put multiple items in one paragraph.\"\n },\n {\n \"type\": \"string\",\n \"description\": \"Heading text content.\"\n }\n ],\n \"description\": \"Paragraph text content. Each call creates ONE paragraph. For multiple items (e.g. list items), call superdoc_create separately for each item: do NOT use newlines to put multiple items in one paragraph.\"\n },\n \"input\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"description\": \"Full paragraph input as JSON (alternative to individual text/at params).\"\n },\n {\n \"type\": \"object\",\n \"description\": \"Full heading input as JSON (alternative to individual text/level/at params).\"\n }\n ],\n \"description\": \"Full paragraph input as JSON (alternative to individual text/at params).\"\n },\n \"level\": {\n \"type\": \"integer\",\n \"minimum\": 1,\n \"maximum\": 6,\n \"description\": \"Heading level (1-6). Required for action 'heading'.\"\n },\n \"rows\": {\n \"type\": \"integer\",\n \"minimum\": 1,\n \"description\": \"Required for action 'table'.\"\n },\n \"columns\": {\n \"type\": \"integer\",\n \"minimum\": 1,\n \"description\": \"Required for action 'table'.\"\n }\n },\n \"required\": [\n \"action\"\n ],\n \"additionalProperties\": false\n }\n }\n },\n {\n \"type\": \"function\",\n \"function\": {\n \"name\": \"superdoc_list\",\n \"description\": \"Create and manipulate bullet and numbered lists. Most actions require a list-item target: {kind:\\\"block\\\", nodeType:\\\"listItem\\\", nodeId:\\\"<id>\\\"}. Exceptions: \\\"create\\\" and \\\"attach\\\" operate on paragraph targets (they turn paragraphs into list items). Find nodeIds via superdoc_get_content({action:\\\"blocks\\\"}): pick listItem blocks for most actions, paragraph blocks for create/attach.\\n\\nCREATE & CONVERT:\\n• \\\"create\\\": make a NEW list from paragraphs. Two modes: mode:\\\"empty\\\" with at:{kind:\\\"block\\\", nodeType:\\\"paragraph\\\", nodeId} converts a single paragraph; mode:\\\"fromParagraphs\\\" with target:{from:{...paragraph block address}, to:{...paragraph block address}} converts a range: ALL paragraphs between from and to become items, so make sure no other content sits between them. Pass a preset (\\\"disc\\\"|\\\"circle\\\"|\\\"square\\\"|\\\"dash\\\" for bullets; \\\"decimal\\\"|\\\"decimalParenthesis\\\"|\\\"lowerLetter\\\"|\\\"lowerLetterParenthesis\\\"|\\\"upperLetter\\\"|\\\"upperLetterParenthesis\\\"|\\\"lowerRoman\\\"|\\\"upperRoman\\\" for ordered) or a custom style. Use \\\"create\\\" to start a fresh list: NOT to extend an existing one (use \\\"attach\\\" for that).\\n• \\\"attach\\\": add paragraphs to an EXISTING list, inheriting its numbering definition. Pass target:{paragraph block address} (or {from, to} range of paragraphs) + attachTo:{kind:\\\"block\\\", nodeType:\\\"listItem\\\", nodeId:\\\"<any item in destination list>\\\"} + optional level:0..8. Use this to extend a list or as the second half of a merge workflow (see \\\"join\\\" below).\\n• \\\"set_type\\\": convert an existing list between ordered and bullet. Pass target:{listItem} + kind:\\\"ordered\\\" or \\\"bullet\\\". Adjacent compatible sequences are merged automatically to preserve continuous numbering.\\n• \\\"detach\\\": convert a list item back to a plain paragraph. Pass target:{listItem}.\\n\\nITEMS & NESTING:\\n• \\\"insert\\\": add a new list item adjacent to an existing item in the same list. Pass target:{listItem} + position:\\\"before\\\"|\\\"after\\\" + optional text. Use this (NOT superdoc_create) to add items to an existing list.\\n• \\\"indent\\\" / \\\"outdent\\\": bump the target item's nesting level by one (0-8 range). Pass target:{listItem}.\\n• \\\"set_level\\\": jump the target item to an explicit level. Pass target:{listItem} + level:0..8.\\n\\nNUMBERING (ordered lists):\\n• \\\"set_value\\\": restart numbering at the target. Pass target:{listItem} + value:<number> (e.g. value:1 to start over) or value:null to clear a previous override. Mid-sequence targets are atomically split off into their own sequence.\\n• \\\"continue_previous\\\": make the target's sequence continue numbering from the nearest compatible previous sequence (same abstract definition). Pass target:{listItem of the sequence you want to renumber}. Fails with NO_COMPATIBLE_PREVIOUS or INCOMPATIBLE_DEFINITIONS if no matching prior sequence exists.\\n\\nSEQUENCE SHAPE (merge / split):\\n• \\\"merge\\\": merge the target's sequence with an adjacent one into one continuous list. Pass target:{listItem} + direction:\\\"withPrevious\\\" or \\\"withNext\\\". Absorbed items adopt the absorbing sequence's numbering definition, and empty paragraphs between the two sequences are removed so numbering flows continuously.\\n• \\\"split\\\": split the target's sequence at the target item into two independent lists. The target and everything after become a new sequence that restarts numbering at 1. Pass target:{listItem}; add restartNumbering:false to keep the count continuing instead of restarting.\\n\\nEXAMPLES:\\n 1. {\\\"action\\\":\\\"create\\\",\\\"mode\\\":\\\"fromParagraphs\\\",\\\"preset\\\":\\\"disc\\\",\\\"target\\\":{\\\"from\\\":{\\\"kind\\\":\\\"block\\\",\\\"nodeType\\\":\\\"paragraph\\\",\\\"nodeId\\\":\\\"<firstId>\\\"},\\\"to\\\":{\\\"kind\\\":\\\"block\\\",\\\"nodeType\\\":\\\"paragraph\\\",\\\"nodeId\\\":\\\"<lastId>\\\"}}}\\n 2. {\\\"action\\\":\\\"set_type\\\",\\\"target\\\":{\\\"kind\\\":\\\"block\\\",\\\"nodeType\\\":\\\"listItem\\\",\\\"nodeId\\\":\\\"<itemId>\\\"},\\\"kind\\\":\\\"ordered\\\"}\\n 3. {\\\"action\\\":\\\"insert\\\",\\\"target\\\":{\\\"kind\\\":\\\"block\\\",\\\"nodeType\\\":\\\"listItem\\\",\\\"nodeId\\\":\\\"<itemId>\\\"},\\\"position\\\":\\\"after\\\",\\\"text\\\":\\\"New list item\\\"}\\n 4. {\\\"action\\\":\\\"indent\\\",\\\"target\\\":{\\\"kind\\\":\\\"block\\\",\\\"nodeType\\\":\\\"listItem\\\",\\\"nodeId\\\":\\\"<itemId>\\\"}}\\n 5. {\\\"action\\\":\\\"merge\\\",\\\"target\\\":{\\\"kind\\\":\\\"block\\\",\\\"nodeType\\\":\\\"listItem\\\",\\\"nodeId\\\":\\\"<itemId>\\\"},\\\"direction\\\":\\\"withPrevious\\\"}\\n 6. {\\\"action\\\":\\\"split\\\",\\\"target\\\":{\\\"kind\\\":\\\"block\\\",\\\"nodeType\\\":\\\"listItem\\\",\\\"nodeId\\\":\\\"<itemId>\\\"}}\\n 7. {\\\"action\\\":\\\"set_value\\\",\\\"target\\\":{\\\"kind\\\":\\\"block\\\",\\\"nodeType\\\":\\\"listItem\\\",\\\"nodeId\\\":\\\"<itemId>\\\"},\\\"value\\\":1}\\n 8. {\\\"action\\\":\\\"continue_previous\\\",\\\"target\\\":{\\\"kind\\\":\\\"block\\\",\\\"nodeType\\\":\\\"listItem\\\",\\\"nodeId\\\":\\\"<itemId>\\\"}}\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"action\": {\n \"type\": \"string\",\n \"enum\": [\n \"attach\",\n \"continue_previous\",\n \"create\",\n \"delete\",\n \"detach\",\n \"indent\",\n \"insert\",\n \"merge\",\n \"outdent\",\n \"set_level\",\n \"set_type\",\n \"set_value\",\n \"split\"\n ],\n \"description\": \"The action to perform. One of: attach, continue_previous, create, delete, detach, indent, insert, merge, outdent, set_level, set_type, set_value, split.\"\n },\n \"force\": {\n \"type\": \"boolean\",\n \"description\": \"Bypass confirmation checks.\"\n },\n \"changeMode\": {\n \"type\": \"string\",\n \"description\": \"Edit mode: \\\"direct\\\" applies changes immediately, \\\"tracked\\\" records as suggestions.\"\n },\n \"dryRun\": {\n \"type\": \"boolean\",\n \"description\": \"Preview the result without applying changes.\"\n },\n \"target\": {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"$ref\": \"#/$defs/ListItemAddress\",\n \"description\": \"The target list item. For 'insert': the item to insert relative to. For 'create' with mode 'fromParagraphs': use nodeType 'paragraph' instead. Format: {kind:'block', nodeType:'listItem', nodeId:'<id>'}.\"\n },\n {\n \"$ref\": \"#/$defs/BlockAddressOrRange\",\n \"description\": \"Required when mode is 'fromParagraphs'. Each call converts ONE paragraph into a list item. To make a list with N items, create N separate paragraphs first, then call superdoc_list create for EACH one. Format: {kind:'block', nodeType:'paragraph', nodeId:'<id>'}.\"\n }\n ],\n \"description\": \"The target list item. For 'insert': the item to insert relative to. For 'create' with mode 'fromParagraphs': use nodeType 'paragraph' instead. Format: {kind:'block', nodeType:'listItem', nodeId:'<id>'}.\"\n },\n {\n \"$ref\": \"#/$defs/BlockAddressOrRange\"\n }\n ],\n \"description\": \"The target list item. For 'insert': the item to insert relative to. For 'create' with mode 'fromParagraphs': use nodeType 'paragraph' instead. Format: {kind:'block', nodeType:'listItem', nodeId:'<id>'}.\"\n },\n {\n \"$ref\": \"#/$defs/ListItemAddress\"\n }\n ],\n \"description\": \"The target list item. For 'insert': the item to insert relative to. For 'create' with mode 'fromParagraphs': use nodeType 'paragraph' instead. Format: {kind:'block', nodeType:'listItem', nodeId:'<id>'}.\"\n },\n {\n \"$ref\": \"#/$defs/ListItemAddress\"\n }\n ],\n \"description\": \"The target list item. For 'insert': the item to insert relative to. For 'create' with mode 'fromParagraphs': use nodeType 'paragraph' instead. Format: {kind:'block', nodeType:'listItem', nodeId:'<id>'}.\"\n },\n {\n \"$ref\": \"#/$defs/ListItemAddress\"\n }\n ],\n \"description\": \"The target list item. For 'insert': the item to insert relative to. For 'create' with mode 'fromParagraphs': use nodeType 'paragraph' instead. Format: {kind:'block', nodeType:'listItem', nodeId:'<id>'}.\"\n },\n {\n \"$ref\": \"#/$defs/ListItemAddress\"\n }\n ],\n \"description\": \"The target list item. For 'insert': the item to insert relative to. For 'create' with mode 'fromParagraphs': use nodeType 'paragraph' instead. Format: {kind:'block', nodeType:'listItem', nodeId:'<id>'}.\"\n },\n {\n \"$ref\": \"#/$defs/ListItemAddress\"\n }\n ],\n \"description\": \"The target list item. For 'insert': the item to insert relative to. For 'create' with mode 'fromParagraphs': use nodeType 'paragraph' instead. Format: {kind:'block', nodeType:'listItem', nodeId:'<id>'}.\"\n },\n {\n \"$ref\": \"#/$defs/ListItemAddress\"\n }\n ],\n \"description\": \"The target list item. For 'insert': the item to insert relative to. For 'create' with mode 'fromParagraphs': use nodeType 'paragraph' instead. Format: {kind:'block', nodeType:'listItem', nodeId:'<id>'}.\"\n },\n {\n \"$ref\": \"#/$defs/ListItemAddress\"\n }\n ],\n \"description\": \"The target list item. For 'insert': the item to insert relative to. For 'create' with mode 'fromParagraphs': use nodeType 'paragraph' instead. Format: {kind:'block', nodeType:'listItem', nodeId:'<id>'}.\"\n },\n {\n \"$ref\": \"#/$defs/ListItemAddress\"\n }\n ],\n \"description\": \"The target list item. For 'insert': the item to insert relative to. For 'create' with mode 'fromParagraphs': use nodeType 'paragraph' instead. Format: {kind:'block', nodeType:'listItem', nodeId:'<id>'}.\"\n },\n {\n \"$ref\": \"#/$defs/ListItemAddress\"\n }\n ],\n \"description\": \"The target list item. For 'insert': the item to insert relative to. For 'create' with mode 'fromParagraphs': use nodeType 'paragraph' instead. Format: {kind:'block', nodeType:'listItem', nodeId:'<id>'}.\"\n },\n {\n \"$ref\": \"#/$defs/ListItemAddress\"\n }\n ],\n \"description\": \"The target list item. For 'insert': the item to insert relative to. For 'create' with mode 'fromParagraphs': use nodeType 'paragraph' instead. Format: {kind:'block', nodeType:'listItem', nodeId:'<id>'}. Required for actions 'insert', 'attach', 'detach', 'delete', 'indent', 'outdent', 'merge', 'split', 'set_level', 'set_value', 'continue_previous', 'set_type'.\"\n },\n \"position\": {\n \"enum\": [\n \"before\",\n \"after\"\n ],\n \"description\": \"Required. Insert position relative to target: 'before' or 'after'. Required for action 'insert'.\"\n },\n \"text\": {\n \"type\": \"string\",\n \"description\": \"Text content for the new list item. Only for action 'insert'. Omit for other actions.\"\n },\n \"input\": {\n \"type\": \"object\",\n \"description\": \"Operation input as JSON object.\"\n },\n \"nodeId\": {\n \"type\": \"string\",\n \"description\": \"Node ID of the target list item.\"\n },\n \"mode\": {\n \"enum\": [\n \"empty\",\n \"fromParagraphs\"\n ],\n \"description\": \"Required. 'fromParagraphs' converts existing paragraphs into list items: each paragraph becomes one item, so create one paragraph per item first. 'empty' creates a new empty list at 'at'. Required for action 'create'.\"\n },\n \"at\": {\n \"$ref\": \"#/$defs/BlockAddress\",\n \"description\": \"Required when mode is 'empty'. The paragraph to create the list at. Format: {kind:'block', nodeType:'paragraph', nodeId:'<id>'}. Only for action 'create'. Omit for other actions.\"\n },\n \"kind\": {\n \"enum\": [\n \"ordered\",\n \"bullet\"\n ],\n \"description\": \"List type: 'bullet' for bullet points, 'ordered' for numbered lists. Required for action 'set_type'.\"\n },\n \"level\": {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"type\": \"integer\",\n \"minimum\": 0,\n \"maximum\": 8,\n \"description\": \"List nesting level (0-8). 0 is the top level.\"\n },\n {\n \"type\": \"integer\",\n \"minimum\": 0,\n \"maximum\": 8\n }\n ],\n \"description\": \"List nesting level (0-8). 0 is the top level.\"\n },\n {\n \"type\": \"integer\",\n \"minimum\": 0,\n \"maximum\": 8\n }\n ],\n \"description\": \"List nesting level (0-8). 0 is the top level. Required for action 'set_level'.\"\n },\n \"preset\": {\n \"enum\": [\n \"decimal\",\n \"decimalParenthesis\",\n \"lowerLetter\",\n \"lowerLetterParenthesis\",\n \"upperLetter\",\n \"upperLetterParenthesis\",\n \"lowerRoman\",\n \"upperRoman\",\n \"disc\",\n \"circle\",\n \"square\",\n \"dash\"\n ],\n \"description\": \"Predefined list style preset. Overrides 'kind' with a specific numbering or bullet format. Only for action 'create'. Omit for other actions.\"\n },\n \"style\": {\n \"type\": \"object\",\n \"properties\": {\n \"version\": {\n \"const\": 1,\n \"type\": \"number\"\n },\n \"levels\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"level\": {\n \"type\": \"integer\",\n \"minimum\": 0,\n \"maximum\": 8\n },\n \"numFmt\": {\n \"type\": \"string\"\n },\n \"lvlText\": {\n \"type\": \"string\"\n },\n \"start\": {\n \"type\": \"integer\"\n },\n \"alignment\": {\n \"enum\": [\n \"left\",\n \"center\",\n \"right\"\n ]\n },\n \"indents\": {\n \"type\": \"object\",\n \"properties\": {\n \"left\": {\n \"type\": \"integer\"\n },\n \"hanging\": {\n \"type\": \"integer\"\n },\n \"firstLine\": {\n \"type\": \"integer\"\n }\n },\n \"additionalProperties\": false\n },\n \"trailingCharacter\": {\n \"enum\": [\n \"tab\",\n \"space\",\n \"nothing\"\n ]\n },\n \"markerFont\": {\n \"type\": \"string\"\n },\n \"pictureBulletId\": {\n \"type\": \"integer\"\n },\n \"tabStopAt\": {\n \"type\": [\n \"integer\",\n \"null\"\n ]\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"level\"\n ]\n }\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"version\",\n \"levels\"\n ],\n \"description\": \"Only for action 'create'. Omit for other actions.\"\n },\n \"sequence\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"mode\": {\n \"const\": \"new\",\n \"type\": \"string\"\n },\n \"startAt\": {\n \"type\": \"integer\",\n \"minimum\": 1\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"mode\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"mode\": {\n \"const\": \"continuePrevious\",\n \"type\": \"string\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"mode\"\n ]\n }\n ],\n \"description\": \"Only for action 'create'. Omit for other actions.\"\n },\n \"attachTo\": {\n \"$ref\": \"#/$defs/ListItemAddress\",\n \"description\": \"Required for action 'attach'.\"\n },\n \"direction\": {\n \"enum\": [\n \"withPrevious\",\n \"withNext\"\n ],\n \"description\": \"Required for action 'merge'.\"\n },\n \"restartNumbering\": {\n \"type\": \"boolean\",\n \"description\": \"Only for action 'split'. Omit for other actions.\"\n },\n \"value\": {\n \"type\": [\n \"integer\",\n \"null\"\n ],\n \"description\": \"Required for action 'set_value'.\"\n },\n \"continuity\": {\n \"enum\": [\n \"preserve\",\n \"none\"\n ],\n \"description\": \"Numbering continuity: 'preserve' keeps numbering; 'none' restarts. Only for action 'set_type'. Omit for other actions.\"\n }\n },\n \"required\": [\n \"action\"\n ],\n \"additionalProperties\": false\n }\n }\n },\n {\n \"type\": \"function\",\n \"function\": {\n \"name\": \"superdoc_comment\",\n \"description\": \"Manage document comment threads: create, read, update, and delete. To create a comment, first use superdoc_search to find the target text, then pass action \\\"create\\\" with the comment text and a target built from items[0].blocks. For a single-block match use {kind:\\\"text\\\", blockId: items[0].blocks[0].blockId, range: items[0].blocks[0].range}. For a cross-block match use {kind:\\\"text\\\", segments: items[0].blocks.map(b => ({blockId: b.blockId, range: b.range}))}. Do NOT use items[0].highlightRange (snippet-relative, not block-relative) or items[0].target (a SelectionTarget, not accepted by comments.create). For threaded replies, pass \\\"parentId\\\" with the parent comment ID. Action \\\"list\\\" returns all comments with optional pagination (limit, offset) and filtering (includeResolved:true to include resolved). Action \\\"get\\\" retrieves a single comment by ID. Action \\\"update\\\" changes comment text, re-anchors the thread, changes status to \\\"resolved\\\", or toggles the legacy `sdcom:internal` flag for v1 compatibility. Action \\\"delete\\\" removes a comment or reply by ID. Do NOT pass \\\"ref\\\", \\\"id\\\", or \\\"parentId\\\" when creating a new top-level comment; \\\"action\\\", \\\"text\\\", and \\\"target\\\" are required, while commentId (the v1 compatibility alias for externalId), externalId, author fields, and metadata are optional correlation fields.\\n\\nEXAMPLES:\\n 1. {\\\"action\\\":\\\"create\\\",\\\"text\\\":\\\"Please review this section.\\\",\\\"target\\\":{\\\"kind\\\":\\\"text\\\",\\\"blockId\\\":\\\"<blockId>\\\",\\\"range\\\":{\\\"start\\\":5,\\\"end\\\":25}}}\\n 2. {\\\"action\\\":\\\"list\\\",\\\"limit\\\":20,\\\"offset\\\":0}\\n 3. {\\\"action\\\":\\\"update\\\",\\\"id\\\":\\\"<commentId>\\\",\\\"status\\\":\\\"resolved\\\"}\\n 4. {\\\"action\\\":\\\"delete\\\",\\\"id\\\":\\\"<commentId>\\\"}\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"action\": {\n \"type\": \"string\",\n \"enum\": [\n \"create\",\n \"delete\",\n \"get\",\n \"list\",\n \"update\"\n ],\n \"description\": \"The action to perform. One of: create, delete, get, list, update.\"\n },\n \"force\": {\n \"type\": \"boolean\",\n \"description\": \"Bypass confirmation checks.\"\n },\n \"changeMode\": {\n \"type\": \"string\",\n \"description\": \"Edit mode: \\\"direct\\\" applies changes immediately, \\\"tracked\\\" records as suggestions.\"\n },\n \"text\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"description\": \"Comment text content.\"\n },\n {\n \"type\": \"string\",\n \"description\": \"Updated comment text.\"\n }\n ],\n \"description\": \"Comment text content. Required for action 'create'.\"\n },\n \"target\": {\n \"oneOf\": [\n {\n \"description\": \"Text range to anchor the comment. Accepts either a single-block TextAddress {kind:'text', blockId, range}, a multi-segment TextTarget {kind:'text', segments:[{blockId, range}, ...]} for selections that span blocks, a SelectionTarget {kind:'selection', start, end} returned by query.match, a TextSearchCommentTarget {text, story?}, or a TrackedChangeCommentTarget ({kind:'trackedChange', trackedChangeId, side?} or {trackedChangeId, side?}) that names a logical tracked-change id as a convenience anchor .\",\n \"oneOf\": [\n {\n \"$ref\": \"#/$defs/TextAddress\"\n },\n {\n \"$ref\": \"#/$defs/TextTarget\"\n },\n {\n \"$ref\": \"#/$defs/SelectionTarget\"\n },\n {\n \"$ref\": \"#/$defs/CommentTrackedChangeTarget\"\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"text\": {\n \"type\": \"string\",\n \"description\": \"Text to find and anchor the comment to. The adapter resolves the first body/story match.\"\n },\n \"story\": {\n \"$ref\": \"#/$defs/StoryLocator\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"text\"\n ]\n }\n ]\n },\n {\n \"oneOf\": [\n {\n \"$ref\": \"#/$defs/TextAddress\"\n },\n {\n \"$ref\": \"#/$defs/SelectionTarget\"\n },\n {\n \"$ref\": \"#/$defs/CommentTrackedChangeTarget\"\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"text\": {\n \"type\": \"string\",\n \"description\": \"Text to find and anchor the comment to. The adapter resolves the first body/story match.\"\n },\n \"story\": {\n \"$ref\": \"#/$defs/StoryLocator\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"text\"\n ]\n }\n ],\n \"description\": \"New anchor for the comment. Accepts a plain TextAddress, a SelectionTarget {kind:'selection', start, end}, a TextSearchCommentTarget {text, story?}, or a TrackedChangeCommentTarget, with or without kind, that names a logical tracked-change id as a convenience re-anchor target .\"\n }\n ],\n \"description\": \"Text range to anchor the comment. Accepts either a single-block TextAddress {kind:'text', blockId, range}, a multi-segment TextTarget {kind:'text', segments:[{blockId, range}, ...]} for selections that span blocks, a SelectionTarget {kind:'selection', start, end} returned by query.match, a TextSearchCommentTarget {text, story?}, or a TrackedChangeCommentTarget ({kind:'trackedChange', trackedChangeId, side?} or {trackedChangeId, side?}) that names a logical tracked-change id as a convenience anchor . Only for actions 'create', 'update'. Omit for other actions.\"\n },\n \"trackedChangeId\": {\n \"type\": \"string\",\n \"description\": \"Compatibility shorthand for target: { trackedChangeId }. Used only when target is omitted. Only for action 'create'. Omit for other actions.\"\n },\n \"side\": {\n \"enum\": [\n \"inserted\",\n \"deleted\",\n \"source\",\n \"destination\"\n ],\n \"description\": \"Optional side for the top-level trackedChangeId shorthand. Only for action 'create'. Omit for other actions.\"\n },\n \"story\": {\n \"$ref\": \"#/$defs/StoryLocator\",\n \"description\": \"Optional story for the top-level trackedChangeId shorthand. Only for action 'create'. Omit for other actions.\"\n },\n \"parentId\": {\n \"type\": \"string\",\n \"description\": \"Parent comment ID for creating a threaded reply. Only for action 'create'. Omit for other actions.\"\n },\n \"commentId\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"maxLength\": 1024,\n \"description\": \"Compatibility alias for externalId, matching the caller-supplied commentId accepted by the v1 editor. V2 still generates a separate Word-compatible commentId. Only for action 'create'. Omit for other actions.\"\n },\n \"externalId\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"maxLength\": 1024,\n \"description\": \"Caller-owned durable, document-unique integration id. Kept separate from the generated Word-compatible commentId. Only for action 'create'. Omit for other actions.\"\n },\n \"author\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"description\": \"Author display name. Defaults to the configured session author. Only for action 'create'. Omit for other actions.\"\n },\n \"authorId\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"description\": \"Stable caller-owned author id. Only for action 'create'. Omit for other actions.\"\n },\n \"authorEmail\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"description\": \"Caller-owned author email. Only for action 'create'. Omit for other actions.\"\n },\n \"authorImage\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"description\": \"Caller-owned author image URL. Only for action 'create'. Omit for other actions.\"\n },\n \"metadata\": {\n \"type\": \"object\",\n \"additionalProperties\": true,\n \"description\": \"Caller-owned JSON metadata persisted with the comment. Only for action 'create'. Omit for other actions.\"\n },\n \"id\": {\n \"type\": \"string\",\n \"description\": \"Required for actions 'delete', 'get'.\"\n },\n \"status\": {\n \"enum\": [\n \"resolved\",\n \"active\"\n ],\n \"description\": \"Set comment status. Use 'resolved' to resolve a comment, or 'active' to reopen a previously resolved comment (lifecycle inverse). Only for action 'update'. Omit for other actions.\"\n },\n \"isInternal\": {\n \"type\": \"boolean\",\n \"description\": \"Legacy v1/document-api compatibility field. V2 adapters set or clear the target comment `sdcom:internal` attribute and preserve the field in the schema so v1 callers keep their input shape. Only for action 'update'. Omit for other actions.\"\n },\n \"includeResolved\": {\n \"type\": \"boolean\",\n \"description\": \"When true, includes resolved comments in results. Default: false. Only for action 'list'. Omit for other actions.\"\n },\n \"limit\": {\n \"type\": \"integer\",\n \"description\": \"Maximum number of comments to return. Only for action 'list'. Omit for other actions.\"\n },\n \"offset\": {\n \"type\": \"integer\",\n \"description\": \"Number of comments to skip for pagination. Only for action 'list'. Omit for other actions.\"\n }\n },\n \"required\": [\n \"action\"\n ],\n \"additionalProperties\": false\n }\n }\n },\n {\n \"type\": \"function\",\n \"function\": {\n \"name\": \"superdoc_track_changes\",\n \"description\": \"Review and resolve tracked changes (insertions, deletions, replacements, format changes) in the document. Action \\\"list\\\" returns all tracked changes with optional filtering by type (insert, delete, replacement, format) and pagination (limit, offset). Each change includes an ID, type, author, timestamp, and content preview. Action \\\"decide\\\" accepts or rejects changes. Pass decision:\\\"accept\\\" to apply the change permanently, or decision:\\\"reject\\\" to discard it. Target a single change with {id:\\\"<changeId>\\\"}, several whole changes atomically with {kind:\\\"ids\\\", ids:[...]}, a partial selection with {kind:\\\"range\\\", range:{...}}, or all changes at once with {scope:\\\"all\\\"} (optionally plus story). Do NOT use this tool unless the document has tracked changes. Use superdoc_get_content info to check the tracked change count first.\\n\\nEXAMPLES:\\n 1. {\\\"action\\\":\\\"list\\\"}\\n 2. {\\\"action\\\":\\\"list\\\",\\\"type\\\":\\\"insertion\\\",\\\"limit\\\":10}\\n 3. {\\\"action\\\":\\\"list\\\",\\\"type\\\":\\\"replacement\\\",\\\"limit\\\":10}\\n 4. {\\\"action\\\":\\\"decide\\\",\\\"decision\\\":\\\"accept\\\",\\\"target\\\":{\\\"id\\\":\\\"<changeId>\\\"}}\\n 5. {\\\"action\\\":\\\"decide\\\",\\\"decision\\\":\\\"accept\\\",\\\"target\\\":{\\\"kind\\\":\\\"ids\\\",\\\"ids\\\":[\\\"<changeId1>\\\",\\\"<changeId2>\\\"]}}\\n 6. {\\\"action\\\":\\\"decide\\\",\\\"decision\\\":\\\"reject\\\",\\\"target\\\":{\\\"kind\\\":\\\"range\\\",\\\"range\\\":{\\\"kind\\\":\\\"text\\\",\\\"segments\\\":[{\\\"blockId\\\":\\\"<blockId>\\\",\\\"range\\\":{\\\"start\\\":0,\\\"end\\\":5}}]}}}\\n 7. {\\\"action\\\":\\\"decide\\\",\\\"decision\\\":\\\"reject\\\",\\\"target\\\":{\\\"scope\\\":\\\"all\\\"}}\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"action\": {\n \"type\": \"string\",\n \"enum\": [\n \"decide\",\n \"list\"\n ],\n \"description\": \"The action to perform. One of: decide, list.\"\n },\n \"limit\": {\n \"type\": \"integer\",\n \"description\": \"Maximum number of tracked changes to return. Only for action 'list'. Omit for other actions.\"\n },\n \"offset\": {\n \"type\": \"integer\",\n \"description\": \"Number of tracked changes to skip for pagination. Only for action 'list'. Omit for other actions.\"\n },\n \"type\": {\n \"enum\": [\n \"insertion\",\n \"deletion\",\n \"replacement\",\n \"formatting\",\n \"move\",\n \"structural\",\n \"insert\",\n \"delete\",\n \"format\"\n ],\n \"description\": \"Filter by change type. Canonical values: 'insertion', 'deletion', 'replacement', 'formatting', 'move', 'structural'. Legacy aliases 'insert', 'delete', and 'format' remain accepted during migration. Only for action 'list'. Omit for other actions.\"\n },\n \"in\": {\n \"oneOf\": [\n {\n \"$ref\": \"#/$defs/StoryLocator\"\n },\n {\n \"const\": \"all\",\n \"type\": \"string\"\n }\n ],\n \"description\": \"Story scope. Omit for body only, pass a StoryLocator for a single story, or 'all' for body + every revision-capable non-body story. Only for action 'list'. Omit for other actions.\"\n },\n \"force\": {\n \"type\": \"boolean\",\n \"description\": \"Bypass confirmation checks. Only for action 'decide'. Omit for other actions.\"\n },\n \"changeMode\": {\n \"type\": \"string\",\n \"description\": \"Edit mode: \\\"direct\\\" applies changes immediately, \\\"tracked\\\" records as suggestions. Only for action 'decide'. Omit for other actions.\"\n },\n \"decision\": {\n \"enum\": [\n \"accept\",\n \"reject\"\n ],\n \"description\": \"Required for action 'decide'.\"\n },\n \"expectedRevision\": {\n \"type\": \"string\",\n \"description\": \"Backward-compatible alias for options.expectedRevision. Explicit mutation options take precedence when both are supplied. Only for action 'decide'. Omit for other actions.\"\n },\n \"target\": {\n \"description\": \"Decision target. Canonical shapes: { kind: 'id', id, story? } (one whole logical tracked change), { kind: 'ids', ids } (several whole logical tracked changes in one atomic history unit), { kind: 'range', range: TextTarget, coordinateSpace?, overlap?, side?, story?, part? } or { kind: 'range', range: { anchor, relativeStart, relativeEnd }, overlap?, side?, story?, part? } (resolves only the selected overlap; may split fragments), { kind: 'all' } (every active tracked change). Legacy { id, story? } / { id, range: { kind: 'partial', start, end } } / { scope: 'all' } shapes are accepted and transparently promoted to canonical targets. Required for action 'decide'.\",\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"id\",\n \"type\": \"string\"\n },\n \"id\": {\n \"type\": \"string\"\n },\n \"story\": {\n \"$ref\": \"#/$defs/StoryLocator\"\n },\n \"side\": {\n \"enum\": [\n \"insert\",\n \"inserted\",\n \"delete\",\n \"deleted\"\n ]\n },\n \"moveRole\": {\n \"enum\": [\n \"pair\",\n \"source\",\n \"destination\"\n ],\n \"description\": \"Optional move pairing assertion. 'pair' requires the resolved tracked change to be a paired move; 'source' / 'destination' further narrow to a specific half. When the assertion does not hold the decide adapter fails closed.\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"kind\",\n \"id\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"ids\",\n \"type\": \"string\"\n },\n \"ids\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"minItems\": 1,\n \"description\": \"Logical tracked-change ids resolved atomically in one decision and history unit.\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"kind\",\n \"ids\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"range\",\n \"type\": \"string\"\n },\n \"range\": {\n \"$ref\": \"#/$defs/TextTarget\"\n },\n \"coordinateSpace\": {\n \"enum\": [\n \"visible\",\n \"tracked\"\n ],\n \"description\": \"Coordinate space of the TextTarget offsets. Omitted preserves legacy tracked-space behavior.\"\n },\n \"overlap\": {\n \"type\": \"string\",\n \"description\": \"Optional logical overlap selector for callers that already resolved an ambiguous overlap surface. Adapter-owned interpretation.\"\n },\n \"side\": {\n \"enum\": [\n \"insert\",\n \"inserted\",\n \"delete\",\n \"deleted\",\n \"source\",\n \"destination\"\n ],\n \"description\": \"Optional revision side for paired replacement or move targets.\"\n },\n \"story\": {\n \"$ref\": \"#/$defs/StoryLocator\",\n \"description\": \"Optional story containing the range target.\"\n },\n \"part\": {\n \"type\": \"string\",\n \"description\": \"Compatibility alias used by older range callers; interpretation is adapter-owned.\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"kind\",\n \"range\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"range\",\n \"type\": \"string\"\n },\n \"range\": {\n \"type\": \"object\",\n \"properties\": {\n \"anchor\": {\n \"type\": \"string\"\n },\n \"relativeStart\": {\n \"type\": \"integer\",\n \"minimum\": 0\n },\n \"relativeEnd\": {\n \"type\": \"integer\",\n \"minimum\": 0\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"anchor\",\n \"relativeStart\",\n \"relativeEnd\"\n ]\n },\n \"overlap\": {\n \"type\": \"string\",\n \"description\": \"Optional logical overlap selector for callers that already resolved an ambiguous overlap surface. Adapter-owned interpretation.\"\n },\n \"side\": {\n \"enum\": [\n \"insert\",\n \"inserted\",\n \"delete\",\n \"deleted\",\n \"source\",\n \"destination\"\n ],\n \"description\": \"Optional revision side for paired replacement or move targets.\"\n },\n \"story\": {\n \"$ref\": \"#/$defs/StoryLocator\",\n \"description\": \"Optional story containing the range target.\"\n },\n \"part\": {\n \"type\": \"string\",\n \"description\": \"Compatibility alias used by older range callers; interpretation is adapter-owned.\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"kind\",\n \"range\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"range\",\n \"type\": \"string\"\n },\n \"anchor\": {\n \"type\": \"string\"\n },\n \"relativeStart\": {\n \"type\": \"integer\",\n \"minimum\": 0\n },\n \"relativeEnd\": {\n \"type\": \"integer\",\n \"minimum\": 0\n },\n \"overlap\": {\n \"type\": \"string\",\n \"description\": \"Optional logical overlap selector for callers that already resolved an ambiguous overlap surface. Adapter-owned interpretation.\"\n },\n \"side\": {\n \"enum\": [\n \"insert\",\n \"inserted\",\n \"delete\",\n \"deleted\",\n \"source\",\n \"destination\"\n ],\n \"description\": \"Optional revision side for paired replacement or move targets.\"\n },\n \"story\": {\n \"$ref\": \"#/$defs/StoryLocator\",\n \"description\": \"Optional story containing the range target.\"\n },\n \"part\": {\n \"type\": \"string\",\n \"description\": \"Compatibility alias used by older range callers; interpretation is adapter-owned.\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"kind\",\n \"anchor\",\n \"relativeStart\",\n \"relativeEnd\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"all\",\n \"type\": \"string\"\n },\n \"story\": {\n \"oneOf\": [\n {\n \"$ref\": \"#/$defs/StoryLocator\"\n },\n {\n \"const\": \"all\",\n \"type\": \"string\"\n }\n ],\n \"description\": \"Optional explicit bulk filter. Omit or pass 'all' to target every revision-capable story, or pass a StoryLocator to scope the decision to one story.\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"kind\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"story\": {\n \"$ref\": \"#/$defs/StoryLocator\"\n },\n \"moveRole\": {\n \"enum\": [\n \"pair\",\n \"source\",\n \"destination\"\n ],\n \"description\": \"Optional move pairing assertion. 'pair' requires the resolved tracked change to be a paired move; 'source' / 'destination' further narrow to a specific half. When the assertion does not hold the decide adapter fails closed.\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"id\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"range\": {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"partial\",\n \"type\": \"string\"\n },\n \"start\": {\n \"type\": \"integer\",\n \"minimum\": 0\n },\n \"end\": {\n \"type\": \"integer\",\n \"minimum\": 0\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"kind\",\n \"start\",\n \"end\"\n ]\n },\n \"story\": {\n \"$ref\": \"#/$defs/StoryLocator\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"id\",\n \"range\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"scope\": {\n \"enum\": [\n \"all\"\n ]\n },\n \"story\": {\n \"oneOf\": [\n {\n \"$ref\": \"#/$defs/StoryLocator\"\n },\n {\n \"const\": \"all\",\n \"type\": \"string\"\n }\n ],\n \"description\": \"Optional explicit bulk filter. Omit or pass 'all' to target every revision-capable story, or pass a StoryLocator to scope the decision to one story.\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"scope\"\n ]\n }\n ]\n }\n },\n \"required\": [\n \"action\"\n ],\n \"additionalProperties\": false\n }\n }\n },\n {\n \"type\": \"function\",\n \"function\": {\n \"name\": \"superdoc_search\",\n \"description\": \"Find text patterns or nodes in the document and get ref handles for targeting edits and formatting. Refs expire after any mutation that changes the document. Re-search before the next edit when using individual tools (superdoc_edit, superdoc_format). Within a superdoc_mutations batch, selectors in \\\"where\\\" clauses resolve automatically at compile time; no manual re-searching needed between steps. Text search returns handle.ref covering only the matched substring. Node search finds blocks by type (paragraph, heading, table, listItem, etc.). The \\\"require\\\" parameter controls match cardinality: \\\"first\\\" returns one match, \\\"all\\\" returns every match, \\\"exactlyOne\\\" fails if not exactly one match. Supports scoping via \\\"within\\\" to search inside a single block. Patterns are plain text by default; pass select.mode: \\\"regex\\\" for regular-expression search (g/gi semantics, 1024-char cap, no wholeWord, capture groups returned on matches). Invalid or unsafe patterns fail with INVALID_INPUT. Do NOT use markdown formatting markers (#, **, etc.) in search patterns. Do NOT use this tool when you already have a ref from superdoc_get_content blocks or superdoc_create; use that ref directly.\\n\\nEXAMPLES:\\n 1. {\\\"select\\\":{\\\"type\\\":\\\"text\\\",\\\"pattern\\\":\\\"Introduction\\\"},\\\"require\\\":\\\"first\\\"}\\n 2. {\\\"select\\\":{\\\"type\\\":\\\"text\\\",\\\"pattern\\\":\\\"total amount\\\"},\\\"require\\\":\\\"all\\\"}\\n 3. {\\\"select\\\":{\\\"type\\\":\\\"node\\\",\\\"nodeType\\\":\\\"heading\\\"},\\\"require\\\":\\\"all\\\"}\\n 4. {\\\"select\\\":{\\\"type\\\":\\\"text\\\",\\\"pattern\\\":\\\"contract\\\"},\\\"within\\\":{\\\"kind\\\":\\\"block\\\",\\\"nodeType\\\":\\\"paragraph\\\",\\\"nodeId\\\":\\\"abc123\\\"},\\\"require\\\":\\\"first\\\"}\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"in\": {\n \"$ref\": \"#/$defs/StoryLocator\",\n \"description\": \"Story scope. Defaults to document body when omitted. Use {kind:'story', storyType:'body'} for body, or other storyType values for headers, footers, footnotes, endnotes.\"\n },\n \"select\": {\n \"description\": \"Search selector. Use {type:'text', pattern:'...'} for text search or {type:'node', nodeType:'paragraph'|'heading'|...} for node search.\",\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"const\": \"text\",\n \"description\": \"Must be 'text' for text pattern search.\",\n \"type\": \"string\"\n },\n \"pattern\": {\n \"type\": \"string\",\n \"description\": \"Text to match. In regex mode, patterns are validated for syntax, maximum length, and safety before execution.\"\n },\n \"mode\": {\n \"enum\": [\n \"contains\",\n \"regex\"\n ],\n \"description\": \"Match mode: 'contains' (literal substring, recommended for literal text) or 'regex' (validated regular expression).\"\n },\n \"caseSensitive\": {\n \"type\": \"boolean\",\n \"description\": \"Case-sensitive matching. Default: false.\"\n },\n \"wholeWord\": {\n \"type\": \"boolean\",\n \"description\": \"Require word-boundary matches. Default: false.\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"type\",\n \"pattern\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"const\": \"node\",\n \"description\": \"Must be 'node' for node type search.\",\n \"type\": \"string\"\n },\n \"nodeType\": {\n \"enum\": [\n \"paragraph\",\n \"heading\",\n \"listItem\",\n \"table\",\n \"tableRow\",\n \"tableCell\",\n \"tableOfContents\",\n \"image\",\n \"sdt\",\n \"run\",\n \"bookmark\",\n \"comment\",\n \"hyperlink\",\n \"footnoteRef\",\n \"endnoteRef\",\n \"crossRef\",\n \"indexEntry\",\n \"citation\",\n \"authorityEntry\",\n \"sequenceField\",\n \"tab\",\n \"lineBreak\"\n ],\n \"description\": \"Block type to match (paragraph, heading, table, listItem, etc.).\"\n },\n \"kind\": {\n \"enum\": [\n \"block\",\n \"inline\"\n ],\n \"description\": \"Filter: 'block' or 'inline'.\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"type\"\n ]\n }\n ]\n },\n \"within\": {\n \"$ref\": \"#/$defs/BlockNodeAddress\",\n \"description\": \"Limit search scope to within a specific block: {kind:'block', nodeType:'...', nodeId:'...'}.\"\n },\n \"require\": {\n \"enum\": [\n \"any\",\n \"first\",\n \"exactlyOne\",\n \"all\"\n ],\n \"description\": \"Match cardinality: 'any' (all matches), 'first' (only first), 'exactlyOne' (fail if != 1), 'all' (fail if 0).\"\n },\n \"mode\": {\n \"enum\": [\n \"strict\",\n \"candidates\"\n ],\n \"description\": \"Search mode: 'strict' (default, exact matching) or 'candidates' (returns scored potential matches).\"\n },\n \"includeNodes\": {\n \"type\": \"boolean\",\n \"description\": \"When true, includes full node data in results. Default: false.\"\n },\n \"limit\": {\n \"type\": \"integer\",\n \"minimum\": 1,\n \"description\": \"Maximum number of matches to return.\"\n },\n \"offset\": {\n \"type\": \"integer\",\n \"minimum\": 0,\n \"description\": \"Number of matches to skip for pagination.\"\n }\n },\n \"required\": [\n \"select\"\n ],\n \"additionalProperties\": false\n }\n }\n },\n {\n \"type\": \"function\",\n \"function\": {\n \"name\": \"superdoc_mutations\",\n \"description\": \"All steps succeed or all fail; no partial application. Execute multiple operations atomically in one batch. Use this for any workflow needing 2+ changes. Supported step types: text (text.rewrite, text.insert, text.delete), format (format.apply), create (create.heading, create.paragraph, create.table), assert. Each step has an id, an op, a \\\"where\\\" clause for targeting ({by:\\\"select\\\", select:{...}, require:\\\"first\\\"|\\\"exactlyOne\\\"|\\\"all\\\"} or {by:\\\"ref\\\", ref:\\\"...\\\"} or {by:\\\"block\\\", nodeType:\\\"paragraph\\\", nodeId:\\\"...\\\"}), and \\\"args\\\" with operation-specific parameters. Use {by:\\\"block\\\", nodeType, nodeId} when you want to rewrite, delete, format, or anchor against a whole known block from superdoc_get_content action \\\"blocks\\\" without relying on text matching. For full-paragraph or full-clause rewrites, first call superdoc_get_content with action:\\\"blocks\\\" and includeText:true, then rewrite the matching block by nodeId. Use {by:\\\"select\\\"} only for substring edits, discovery, or insertion relative to a sentence fragment; do NOT use a shortened text selector to replace an entire known block. For create steps, \\\"where\\\" targets an existing anchor block and args.position (\\\"before\\\" or \\\"after\\\") controls placement. Sequential creates targeting the same anchor maintain correct order via internal position mapping. For format.apply with require \\\"all\\\", use a node selector to format every heading or paragraph at once: {by:\\\"select\\\", select:{type:\\\"node\\\", nodeType:\\\"heading\\\"}, require:\\\"all\\\"}. Selectors resolve at compile time (before execution). This means format.apply steps CANNOT target content created by earlier create steps in the same batch. Split creates and formatting into separate batches: first a mutations call with creates, then a mutations call with format.apply. Action \\\"preview\\\" dry-runs the plan. Action \\\"apply\\\" executes it. If a selector matches nothing, the failure reports the step id plus selector details so you can retry with a shorter or more distinctive anchor. Do NOT create two steps that target overlapping text in the same block; combine them into a single text.rewrite step.\\n\\nEXAMPLES:\\n 1. {\\\"action\\\":\\\"apply\\\",\\\"atomic\\\":true,\\\"changeMode\\\":\\\"direct\\\",\\\"steps\\\":[{\\\"id\\\":\\\"s1\\\",\\\"op\\\":\\\"text.rewrite\\\",\\\"where\\\":{\\\"by\\\":\\\"select\\\",\\\"select\\\":{\\\"type\\\":\\\"text\\\",\\\"pattern\\\":\\\"old term\\\"},\\\"require\\\":\\\"all\\\"},\\\"args\\\":{\\\"replacement\\\":{\\\"text\\\":\\\"new term\\\"}}},{\\\"id\\\":\\\"s2\\\",\\\"op\\\":\\\"text.delete\\\",\\\"where\\\":{\\\"by\\\":\\\"select\\\",\\\"select\\\":{\\\"type\\\":\\\"text\\\",\\\"pattern\\\":\\\" (deprecated)\\\"},\\\"require\\\":\\\"all\\\"},\\\"args\\\":{}}]}\\n 2. {\\\"action\\\":\\\"apply\\\",\\\"steps\\\":[{\\\"id\\\":\\\"r1\\\",\\\"op\\\":\\\"text.rewrite\\\",\\\"where\\\":{\\\"by\\\":\\\"block\\\",\\\"nodeType\\\":\\\"paragraph\\\",\\\"nodeId\\\":\\\"<nodeId>\\\"},\\\"args\\\":{\\\"replacement\\\":{\\\"text\\\":\\\"Updated clause text.\\\"}}},{\\\"id\\\":\\\"f1\\\",\\\"op\\\":\\\"format.apply\\\",\\\"where\\\":{\\\"by\\\":\\\"select\\\",\\\"select\\\":{\\\"type\\\":\\\"node\\\",\\\"nodeType\\\":\\\"heading\\\"},\\\"require\\\":\\\"all\\\"},\\\"args\\\":{\\\"inline\\\":{\\\"color\\\":\\\"#FF0000\\\"}}},{\\\"id\\\":\\\"f2\\\",\\\"op\\\":\\\"format.apply\\\",\\\"where\\\":{\\\"by\\\":\\\"select\\\",\\\"select\\\":{\\\"type\\\":\\\"text\\\",\\\"pattern\\\":\\\"Confidential Information\\\"},\\\"require\\\":\\\"all\\\"},\\\"args\\\":{\\\"inline\\\":{\\\"bold\\\":true}}}]}\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"action\": {\n \"type\": \"string\",\n \"enum\": [\n \"apply\",\n \"preview\"\n ],\n \"description\": \"The action to perform. One of: apply, preview.\"\n },\n \"in\": {\n \"$ref\": \"#/$defs/StoryLocator\",\n \"description\": \"Story scope. Defaults to document body when omitted. Use {kind:'story', storyType:'body'} for body, or other storyType values for headers, footers, footnotes, endnotes.\"\n },\n \"expectedRevision\": {\n \"type\": \"string\",\n \"description\": \"Document revision for optimistic concurrency. Mutation fails if document was modified since this revision. Only for action 'preview'. Omit for other actions.\"\n },\n \"atomic\": {\n \"const\": true,\n \"type\": \"boolean\",\n \"description\": \"Must be true. All steps execute as one atomic transaction.\"\n },\n \"changeMode\": {\n \"enum\": [\n \"direct\",\n \"tracked\"\n ],\n \"description\": \"Required. Use 'direct' for immediate edits or 'tracked' for suggestions. Must always be provided.\"\n },\n \"steps\": {\n \"type\": \"array\",\n \"items\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"op\": {\n \"const\": \"text.rewrite\",\n \"type\": \"string\"\n },\n \"where\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"by\": {\n \"const\": \"select\",\n \"type\": \"string\"\n },\n \"select\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"const\": \"text\",\n \"description\": \"Must be 'text' for text pattern search.\",\n \"type\": \"string\"\n },\n \"pattern\": {\n \"type\": \"string\",\n \"description\": \"Text to match. In regex mode, patterns are validated for syntax, maximum length, and safety before execution.\"\n },\n \"mode\": {\n \"enum\": [\n \"contains\",\n \"regex\"\n ],\n \"description\": \"Match mode: 'contains' (literal substring, recommended for literal text) or 'regex' (validated regular expression).\"\n },\n \"caseSensitive\": {\n \"type\": \"boolean\",\n \"description\": \"Case-sensitive matching. Default: false.\"\n },\n \"wholeWord\": {\n \"type\": \"boolean\",\n \"description\": \"Require word-boundary matches. Default: false.\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"type\",\n \"pattern\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"const\": \"node\",\n \"description\": \"Must be 'node' for node type search.\",\n \"type\": \"string\"\n },\n \"nodeType\": {\n \"enum\": [\n \"paragraph\",\n \"heading\",\n \"listItem\",\n \"table\",\n \"tableRow\",\n \"tableCell\",\n \"tableOfContents\",\n \"image\",\n \"sdt\",\n \"run\",\n \"bookmark\",\n \"comment\",\n \"hyperlink\",\n \"footnoteRef\",\n \"endnoteRef\",\n \"crossRef\",\n \"indexEntry\",\n \"citation\",\n \"authorityEntry\",\n \"sequenceField\",\n \"tab\",\n \"lineBreak\"\n ],\n \"description\": \"Block type to match (paragraph, heading, table, listItem, etc.).\"\n },\n \"kind\": {\n \"enum\": [\n \"block\",\n \"inline\"\n ],\n \"description\": \"Filter: 'block' or 'inline'.\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"type\"\n ]\n }\n ]\n },\n \"within\": {\n \"$ref\": \"#/$defs/BlockNodeAddress\"\n },\n \"require\": {\n \"enum\": [\n \"first\",\n \"exactlyOne\",\n \"all\"\n ]\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"by\",\n \"select\",\n \"require\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"by\": {\n \"const\": \"ref\",\n \"type\": \"string\"\n },\n \"ref\": {\n \"type\": \"string\"\n },\n \"within\": {\n \"$ref\": \"#/$defs/BlockNodeAddress\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"by\",\n \"ref\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"by\": {\n \"const\": \"target\",\n \"type\": \"string\"\n },\n \"target\": {\n \"$ref\": \"#/$defs/SelectionTarget\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"by\",\n \"target\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"by\": {\n \"const\": \"block\",\n \"type\": \"string\"\n },\n \"nodeType\": {\n \"enum\": [\n \"paragraph\",\n \"heading\",\n \"listItem\",\n \"table\",\n \"tableRow\",\n \"tableCell\",\n \"tableOfContents\",\n \"image\",\n \"sdt\"\n ]\n },\n \"nodeId\": {\n \"type\": \"string\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"by\",\n \"nodeType\",\n \"nodeId\"\n ]\n }\n ]\n },\n \"args\": {\n \"type\": \"object\",\n \"properties\": {\n \"replacement\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"text\": {\n \"type\": \"string\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"text\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"blocks\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"text\": {\n \"type\": \"string\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"text\"\n ]\n }\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"blocks\"\n ]\n }\n ]\n },\n \"style\": {\n \"type\": \"object\",\n \"properties\": {\n \"inline\": {\n \"type\": \"object\",\n \"properties\": {\n \"mode\": {\n \"enum\": [\n \"preserve\",\n \"set\",\n \"clear\",\n \"merge\"\n ],\n \"type\": \"string\"\n },\n \"requireUniform\": {\n \"type\": \"boolean\"\n },\n \"onNonUniform\": {\n \"enum\": [\n \"error\",\n \"useLeadingRun\",\n \"majority\",\n \"union\"\n ]\n },\n \"setMarks\": {\n \"type\": \"object\",\n \"properties\": {\n \"bold\": {\n \"enum\": [\n \"on\",\n \"off\",\n \"clear\"\n ]\n },\n \"italic\": {\n \"enum\": [\n \"on\",\n \"off\",\n \"clear\"\n ]\n },\n \"underline\": {\n \"enum\": [\n \"on\",\n \"off\",\n \"clear\"\n ]\n },\n \"strike\": {\n \"enum\": [\n \"on\",\n \"off\",\n \"clear\"\n ]\n }\n },\n \"additionalProperties\": false\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"mode\"\n ]\n },\n \"paragraph\": {\n \"type\": \"object\",\n \"properties\": {\n \"mode\": {\n \"enum\": [\n \"preserve\",\n \"set\",\n \"clear\"\n ],\n \"type\": \"string\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"mode\"\n ]\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"inline\"\n ]\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"replacement\"\n ]\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"id\",\n \"op\",\n \"where\",\n \"args\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"op\": {\n \"const\": \"text.insert\",\n \"type\": \"string\"\n },\n \"where\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"by\": {\n \"const\": \"select\",\n \"type\": \"string\"\n },\n \"select\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"const\": \"text\",\n \"description\": \"Must be 'text' for text pattern search.\",\n \"type\": \"string\"\n },\n \"pattern\": {\n \"type\": \"string\",\n \"description\": \"Text to match. In regex mode, patterns are validated for syntax, maximum length, and safety before execution.\"\n },\n \"mode\": {\n \"enum\": [\n \"contains\",\n \"regex\"\n ],\n \"description\": \"Match mode: 'contains' (literal substring, recommended for literal text) or 'regex' (validated regular expression).\"\n },\n \"caseSensitive\": {\n \"type\": \"boolean\",\n \"description\": \"Case-sensitive matching. Default: false.\"\n },\n \"wholeWord\": {\n \"type\": \"boolean\",\n \"description\": \"Require word-boundary matches. Default: false.\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"type\",\n \"pattern\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"const\": \"node\",\n \"description\": \"Must be 'node' for node type search.\",\n \"type\": \"string\"\n },\n \"nodeType\": {\n \"enum\": [\n \"paragraph\",\n \"heading\",\n \"listItem\",\n \"table\",\n \"tableRow\",\n \"tableCell\",\n \"tableOfContents\",\n \"image\",\n \"sdt\",\n \"run\",\n \"bookmark\",\n \"comment\",\n \"hyperlink\",\n \"footnoteRef\",\n \"endnoteRef\",\n \"crossRef\",\n \"indexEntry\",\n \"citation\",\n \"authorityEntry\",\n \"sequenceField\",\n \"tab\",\n \"lineBreak\"\n ],\n \"description\": \"Block type to match (paragraph, heading, table, listItem, etc.).\"\n },\n \"kind\": {\n \"enum\": [\n \"block\",\n \"inline\"\n ],\n \"description\": \"Filter: 'block' or 'inline'.\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"type\"\n ]\n }\n ]\n },\n \"within\": {\n \"$ref\": \"#/$defs/BlockNodeAddress\"\n },\n \"require\": {\n \"enum\": [\n \"first\",\n \"exactlyOne\"\n ]\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"by\",\n \"select\",\n \"require\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"by\": {\n \"const\": \"ref\",\n \"type\": \"string\"\n },\n \"ref\": {\n \"type\": \"string\"\n },\n \"within\": {\n \"$ref\": \"#/$defs/BlockNodeAddress\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"by\",\n \"ref\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"by\": {\n \"const\": \"target\",\n \"type\": \"string\"\n },\n \"target\": {\n \"$ref\": \"#/$defs/SelectionTarget\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"by\",\n \"target\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"by\": {\n \"const\": \"block\",\n \"type\": \"string\"\n },\n \"nodeType\": {\n \"enum\": [\n \"paragraph\",\n \"heading\",\n \"listItem\",\n \"table\",\n \"tableRow\",\n \"tableCell\",\n \"tableOfContents\",\n \"image\",\n \"sdt\"\n ]\n },\n \"nodeId\": {\n \"type\": \"string\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"by\",\n \"nodeType\",\n \"nodeId\"\n ]\n }\n ]\n },\n \"args\": {\n \"type\": \"object\",\n \"properties\": {\n \"position\": {\n \"enum\": [\n \"before\",\n \"after\"\n ]\n },\n \"content\": {\n \"type\": \"object\",\n \"properties\": {\n \"text\": {\n \"type\": \"string\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"text\"\n ]\n },\n \"style\": {\n \"type\": \"object\",\n \"properties\": {\n \"inline\": {\n \"type\": \"object\",\n \"properties\": {\n \"mode\": {\n \"enum\": [\n \"inherit\",\n \"set\",\n \"clear\"\n ],\n \"type\": \"string\"\n },\n \"setMarks\": {\n \"type\": \"object\",\n \"properties\": {\n \"bold\": {\n \"enum\": [\n \"on\",\n \"off\",\n \"clear\"\n ]\n },\n \"italic\": {\n \"enum\": [\n \"on\",\n \"off\",\n \"clear\"\n ]\n },\n \"underline\": {\n \"enum\": [\n \"on\",\n \"off\",\n \"clear\"\n ]\n },\n \"strike\": {\n \"enum\": [\n \"on\",\n \"off\",\n \"clear\"\n ]\n }\n },\n \"additionalProperties\": false\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"mode\"\n ]\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"inline\"\n ]\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"position\",\n \"content\"\n ]\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"id\",\n \"op\",\n \"where\",\n \"args\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"op\": {\n \"const\": \"text.delete\",\n \"type\": \"string\"\n },\n \"where\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"by\": {\n \"const\": \"select\",\n \"type\": \"string\"\n },\n \"select\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"const\": \"text\",\n \"description\": \"Must be 'text' for text pattern search.\",\n \"type\": \"string\"\n },\n \"pattern\": {\n \"type\": \"string\",\n \"description\": \"Text to match. In regex mode, patterns are validated for syntax, maximum length, and safety before execution.\"\n },\n \"mode\": {\n \"enum\": [\n \"contains\",\n \"regex\"\n ],\n \"description\": \"Match mode: 'contains' (literal substring, recommended for literal text) or 'regex' (validated regular expression).\"\n },\n \"caseSensitive\": {\n \"type\": \"boolean\",\n \"description\": \"Case-sensitive matching. Default: false.\"\n },\n \"wholeWord\": {\n \"type\": \"boolean\",\n \"description\": \"Require word-boundary matches. Default: false.\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"type\",\n \"pattern\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"const\": \"node\",\n \"description\": \"Must be 'node' for node type search.\",\n \"type\": \"string\"\n },\n \"nodeType\": {\n \"enum\": [\n \"paragraph\",\n \"heading\",\n \"listItem\",\n \"table\",\n \"tableRow\",\n \"tableCell\",\n \"tableOfContents\",\n \"image\",\n \"sdt\",\n \"run\",\n \"bookmark\",\n \"comment\",\n \"hyperlink\",\n \"footnoteRef\",\n \"endnoteRef\",\n \"crossRef\",\n \"indexEntry\",\n \"citation\",\n \"authorityEntry\",\n \"sequenceField\",\n \"tab\",\n \"lineBreak\"\n ],\n \"description\": \"Block type to match (paragraph, heading, table, listItem, etc.).\"\n },\n \"kind\": {\n \"enum\": [\n \"block\",\n \"inline\"\n ],\n \"description\": \"Filter: 'block' or 'inline'.\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"type\"\n ]\n }\n ]\n },\n \"within\": {\n \"$ref\": \"#/$defs/BlockNodeAddress\"\n },\n \"require\": {\n \"enum\": [\n \"first\",\n \"exactlyOne\",\n \"all\"\n ]\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"by\",\n \"select\",\n \"require\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"by\": {\n \"const\": \"ref\",\n \"type\": \"string\"\n },\n \"ref\": {\n \"type\": \"string\"\n },\n \"within\": {\n \"$ref\": \"#/$defs/BlockNodeAddress\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"by\",\n \"ref\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"by\": {\n \"const\": \"target\",\n \"type\": \"string\"\n },\n \"target\": {\n \"$ref\": \"#/$defs/SelectionTarget\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"by\",\n \"target\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"by\": {\n \"const\": \"block\",\n \"type\": \"string\"\n },\n \"nodeType\": {\n \"enum\": [\n \"paragraph\",\n \"heading\",\n \"listItem\",\n \"table\",\n \"tableRow\",\n \"tableCell\",\n \"tableOfContents\",\n \"image\",\n \"sdt\"\n ]\n },\n \"nodeId\": {\n \"type\": \"string\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"by\",\n \"nodeType\",\n \"nodeId\"\n ]\n }\n ]\n },\n \"args\": {\n \"type\": \"object\",\n \"properties\": {\n \"behavior\": {\n \"$ref\": \"#/$defs/DeleteBehavior\"\n }\n },\n \"additionalProperties\": false\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"id\",\n \"op\",\n \"where\",\n \"args\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"op\": {\n \"const\": \"format.apply\",\n \"type\": \"string\"\n },\n \"where\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"by\": {\n \"const\": \"select\",\n \"type\": \"string\"\n },\n \"select\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"const\": \"text\",\n \"description\": \"Must be 'text' for text pattern search.\",\n \"type\": \"string\"\n },\n \"pattern\": {\n \"type\": \"string\",\n \"description\": \"Text to match. In regex mode, patterns are validated for syntax, maximum length, and safety before execution.\"\n },\n \"mode\": {\n \"enum\": [\n \"contains\",\n \"regex\"\n ],\n \"description\": \"Match mode: 'contains' (literal substring, recommended for literal text) or 'regex' (validated regular expression).\"\n },\n \"caseSensitive\": {\n \"type\": \"boolean\",\n \"description\": \"Case-sensitive matching. Default: false.\"\n },\n \"wholeWord\": {\n \"type\": \"boolean\",\n \"description\": \"Require word-boundary matches. Default: false.\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"type\",\n \"pattern\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"const\": \"node\",\n \"description\": \"Must be 'node' for node type search.\",\n \"type\": \"string\"\n },\n \"nodeType\": {\n \"enum\": [\n \"paragraph\",\n \"heading\",\n \"listItem\",\n \"table\",\n \"tableRow\",\n \"tableCell\",\n \"tableOfContents\",\n \"image\",\n \"sdt\",\n \"run\",\n \"bookmark\",\n \"comment\",\n \"hyperlink\",\n \"footnoteRef\",\n \"endnoteRef\",\n \"crossRef\",\n \"indexEntry\",\n \"citation\",\n \"authorityEntry\",\n \"sequenceField\",\n \"tab\",\n \"lineBreak\"\n ],\n \"description\": \"Block type to match (paragraph, heading, table, listItem, etc.).\"\n },\n \"kind\": {\n \"enum\": [\n \"block\",\n \"inline\"\n ],\n \"description\": \"Filter: 'block' or 'inline'.\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"type\"\n ]\n }\n ]\n },\n \"within\": {\n \"$ref\": \"#/$defs/BlockNodeAddress\"\n },\n \"require\": {\n \"enum\": [\n \"first\",\n \"exactlyOne\",\n \"all\"\n ]\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"by\",\n \"select\",\n \"require\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"by\": {\n \"const\": \"ref\",\n \"type\": \"string\"\n },\n \"ref\": {\n \"type\": \"string\"\n },\n \"within\": {\n \"$ref\": \"#/$defs/BlockNodeAddress\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"by\",\n \"ref\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"by\": {\n \"const\": \"target\",\n \"type\": \"string\"\n },\n \"target\": {\n \"$ref\": \"#/$defs/SelectionTarget\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"by\",\n \"target\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"by\": {\n \"const\": \"block\",\n \"type\": \"string\"\n },\n \"nodeType\": {\n \"enum\": [\n \"paragraph\",\n \"heading\",\n \"listItem\",\n \"table\",\n \"tableRow\",\n \"tableCell\",\n \"tableOfContents\",\n \"image\",\n \"sdt\"\n ]\n },\n \"nodeId\": {\n \"type\": \"string\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"by\",\n \"nodeType\",\n \"nodeId\"\n ]\n }\n ]\n },\n \"args\": {\n \"type\": \"object\",\n \"properties\": {\n \"inline\": {\n \"type\": \"object\",\n \"properties\": {\n \"bold\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"italic\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"strike\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"underline\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"style\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"color\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"themeColor\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"additionalProperties\": false,\n \"minProperties\": 1\n }\n ]\n },\n \"highlight\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"color\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"fontSize\": {\n \"oneOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"fontFamily\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"letterSpacing\": {\n \"oneOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"vertAlign\": {\n \"oneOf\": [\n {\n \"enum\": [\n \"superscript\",\n \"subscript\",\n \"baseline\"\n ]\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"position\": {\n \"oneOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"dstrike\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"smallCaps\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"caps\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"shading\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"fill\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"color\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"val\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"additionalProperties\": false,\n \"minProperties\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"border\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"val\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"sz\": {\n \"oneOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"color\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"space\": {\n \"oneOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"additionalProperties\": false,\n \"minProperties\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"outline\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"shadow\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"emboss\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"imprint\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"charScale\": {\n \"oneOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"kerning\": {\n \"oneOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"vanish\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"webHidden\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"specVanish\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"rtl\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"cs\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"bCs\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"iCs\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"eastAsianLayout\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"combine\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"combineBrackets\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"vert\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"vertCompress\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"additionalProperties\": false,\n \"minProperties\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"em\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"fitText\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"val\": {\n \"oneOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"id\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"additionalProperties\": false,\n \"minProperties\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"snapToGrid\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"lang\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"val\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"eastAsia\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"bidi\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"additionalProperties\": false,\n \"minProperties\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"oMath\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"rStyle\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"rFonts\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"ascii\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"hAnsi\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"eastAsia\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"cs\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"asciiTheme\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"hAnsiTheme\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"eastAsiaTheme\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"csTheme\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"hint\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"additionalProperties\": false,\n \"minProperties\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"fontSizeCs\": {\n \"oneOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"ligatures\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"numForm\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"numSpacing\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"stylisticSets\": {\n \"oneOf\": [\n {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"number\"\n },\n \"val\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"id\"\n ],\n \"additionalProperties\": false\n },\n \"minItems\": 1\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"contextualAlternates\": {\n \"oneOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"additionalProperties\": false,\n \"minProperties\": 1\n },\n \"alignment\": {\n \"type\": \"string\",\n \"enum\": [\n \"left\",\n \"center\",\n \"right\",\n \"justify\"\n ],\n \"description\": \"Set paragraph alignment on the target block(s). Can be combined with inline formatting in the same step.\"\n },\n \"scope\": {\n \"type\": \"string\",\n \"enum\": [\n \"match\",\n \"block\"\n ],\n \"description\": \"When \\\"block\\\", inline formatting expands to cover the entire parent paragraph(s), not just the matched text. Use \\\"block\\\" after markdown inserts to format whole paragraphs with a short identifying pattern. Default: \\\"match\\\".\"\n }\n },\n \"additionalProperties\": false,\n \"minProperties\": 1\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"id\",\n \"op\",\n \"where\",\n \"args\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"op\": {\n \"const\": \"assert\",\n \"type\": \"string\"\n },\n \"where\": {\n \"type\": \"object\",\n \"properties\": {\n \"by\": {\n \"const\": \"select\",\n \"type\": \"string\"\n },\n \"select\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"const\": \"text\",\n \"description\": \"Must be 'text' for text pattern search.\",\n \"type\": \"string\"\n },\n \"pattern\": {\n \"type\": \"string\",\n \"description\": \"Text to match. In regex mode, patterns are validated for syntax, maximum length, and safety before execution.\"\n },\n \"mode\": {\n \"enum\": [\n \"contains\",\n \"regex\"\n ],\n \"description\": \"Match mode: 'contains' (literal substring, recommended for literal text) or 'regex' (validated regular expression).\"\n },\n \"caseSensitive\": {\n \"type\": \"boolean\",\n \"description\": \"Case-sensitive matching. Default: false.\"\n },\n \"wholeWord\": {\n \"type\": \"boolean\",\n \"description\": \"Require word-boundary matches. Default: false.\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"type\",\n \"pattern\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"const\": \"node\",\n \"description\": \"Must be 'node' for node type search.\",\n \"type\": \"string\"\n },\n \"nodeType\": {\n \"enum\": [\n \"paragraph\",\n \"heading\",\n \"listItem\",\n \"table\",\n \"tableRow\",\n \"tableCell\",\n \"tableOfContents\",\n \"image\",\n \"sdt\",\n \"run\",\n \"bookmark\",\n \"comment\",\n \"hyperlink\",\n \"footnoteRef\",\n \"endnoteRef\",\n \"crossRef\",\n \"indexEntry\",\n \"citation\",\n \"authorityEntry\",\n \"sequenceField\",\n \"tab\",\n \"lineBreak\"\n ],\n \"description\": \"Block type to match (paragraph, heading, table, listItem, etc.).\"\n },\n \"kind\": {\n \"enum\": [\n \"block\",\n \"inline\"\n ],\n \"description\": \"Filter: 'block' or 'inline'.\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"type\"\n ]\n }\n ]\n },\n \"within\": {\n \"$ref\": \"#/$defs/BlockNodeAddress\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"by\",\n \"select\"\n ]\n },\n \"args\": {\n \"type\": \"object\",\n \"properties\": {\n \"expectCount\": {\n \"type\": \"number\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"expectCount\"\n ]\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"id\",\n \"op\",\n \"where\",\n \"args\"\n ]\n }\n ]\n },\n \"description\": \"Ordered array of mutation steps. Each step needs 'op' (text.rewrite, text.insert, text.delete, format.apply, or assert) and a 'where' targeting clause.\"\n },\n \"force\": {\n \"type\": \"boolean\",\n \"description\": \"Bypass confirmation checks. Only for action 'apply'. Omit for other actions.\"\n }\n },\n \"required\": [\n \"action\",\n \"atomic\",\n \"changeMode\",\n \"steps\"\n ],\n \"additionalProperties\": false\n }\n }\n },\n {\n \"type\": \"function\",\n \"function\": {\n \"name\": \"superdoc_table\",\n \"description\": \"Create and modify table structure, content, and styling. Find table/row/cell nodeIds via superdoc_get_content({action:\\\"blocks\\\"}) or superdoc_search.\\n\\nACTIONS:\\n• Structure: delete, insert_row, delete_row, insert_column, delete_column, merge_cells, unmerge_cells.\\n• Cell content: set_cell_text (text). set_cell (vAlign / wrap / fit / preferred width).\\n• Row / column: set_row (height + rule), set_row_options (repeat-header, allow-break), set_column (widthPt).\\n• Table styling: set_borders, set_shading, set_style_options (headerRow / bandedRows / firstColumn / lastColumn / lastRow / bandedColumns), set_layout (autofit / alignment / direction / preferredWidth), set_options (default cell margins + cell spacing).\\n\\nLOCATORS (the shapes ops accept):\\n• insert_row append shorthand: { nodeId: \\\"<tableId>\\\" } with no rowIndex/position appends at the end. Three other forms: target a row + position, table + rowIndex + position, or any of the above with count:N for multiple.\\n• insert_column shorthand: position:\\\"first\\\"|\\\"last\\\" with no columnIndex. Otherwise columnIndex + position:\\\"left\\\"|\\\"right\\\".\\n• merge_cells: table target + start:{rowIndex, columnIndex} + end:{rowIndex, columnIndex}.\\n• set_cell_text: table target + rowIndex + columnIndex (preferred) OR cell target.\\n• set_cell: cell target only. Does NOT accept table+rowIndex+columnIndex.\\n• set_borders / set_shading: table OR cell target. NOT a row target.\\n\\nCOLOR FORMAT:\\nHex strings accept #RRGGBB, RRGGBB, #RGB, or 3-digit RGB; also \\\"auto\\\"; also null to clear (where supported). Stored canonically as uppercase RRGGBB. Always pass a concrete color when one is implied. Never call set_borders with `auto` for a \\\"make it look [X]\\\" ask.\\n\\nSTYLING (TWO MODES):\\n\\nA. STRUCTURAL CHANGE → re-apply the existing styling.\\n Triggers: insert_row / insert_column / delete_row / delete_column / merge_cells / unmerge_cells. (NOT set_cell_text or set_cell: those don't disturb borders/shading.)\\n Recipe: read the current borders/shading/cnf flags via superdoc_get_content({action:\\\"blocks\\\"}) before the change, then re-apply the SAME values after with set_borders + set_shading + set_style_options. The goal is consistency, not a redesign.\\n Skip on a freshly created table. A new table starts un-styled.\\n\\nB. STYLE-CHANGE REQUEST (\\\"make it look [X]\\\" / \\\"style the whole table\\\") → apply the FULL set with concrete colors.\\n Touch every axis: borders, shading, text alignment, font color/weight, cnf flags, spacing. A single set_borders call without shading and font tweaks always looks half-finished. That's the #1 cause of \\\"no visual change\\\" complaints.\\n Color palette: discover the document's palette by reading superdoc_get_content({action:\\\"blocks\\\"}) and reusing the colors on existing tables/headings. When no palette is obvious, default to corporate blue \\\"1F3864\\\" or dark grey \\\"444444\\\" for accents and \\\"F2F2F2\\\" / \\\"E7E6E6\\\" for banding.\\n Recipe (call ALL of these):\\n 1. set_borders applyTo:\\\"all\\\" with an explicit color and weight.\\n 2. set_shading on the header row cells with the accent color. Add banding on alternate body rows if appropriate.\\n 3. set_style_options { headerRow: true, bandedRows?: true } so cnf regions are recognized.\\n 4. Cell-text alignment via superdoc_format action:\\\"set_alignment\\\". Center the header, left-align body, right-align numeric columns. Paragraph-level: target the paragraph inside each cell.\\n 5. Font color + weight via superdoc_format action:\\\"inline\\\". Header gets a contrasting color (white on dark fill, accent on light fill) plus bold:true.\\n 6. set_options if the user asks for tighter or looser spacing.\\n Steps 4–5 cross to superdoc_format. Use superdoc_mutations to batch many format.apply steps in one call.\\n\\nAFTER set_cell_text, match the new cell to its siblings:\\nset_cell_text writes plain text with the document's default font/size/color and no weight. Always follow up with one superdoc_format inline call copying fontFamily/fontSize/color/bold from a sibling cell (or any non-empty body paragraph if the table is fresh and has no sibling content). If sibling cells show a bold-prefix pattern like \\\"Label: value\\\", replicate it on the new cell via superdoc_search + superdoc_format inline (or one superdoc_mutations batch with format.apply steps).\\n\\nLIST-TO-TABLE:\\n(1) superdoc_create action:\\\"table\\\" with the desired rows/columns. (2) Populate cells with set_cell_text using rowIndex/columnIndex (one call per cell). (3) DELETE THE WHOLE LIST in one call: superdoc_list({action:\\\"delete\\\", target:{kind:\\\"block\\\", nodeType:\\\"listItem\\\", nodeId:\\\"<any-item-id>\\\"}}). The op walks the contiguous list and removes all items.\\nWrong paths for list deletion (all leave bullets/empty paragraphs behind): text.delete, superdoc_edit action:\\\"delete\\\" on text refs, lists.detach, lists.convertToText.\\n\\nEXAMPLES:\\n 1. {\\\"action\\\":\\\"insert_row\\\",\\\"nodeId\\\":\\\"<tableNodeId>\\\"}\\n 2. {\\\"action\\\":\\\"insert_column\\\",\\\"nodeId\\\":\\\"<tableNodeId>\\\",\\\"position\\\":\\\"last\\\"}\\n 3. {\\\"action\\\":\\\"merge_cells\\\",\\\"nodeId\\\":\\\"<tableNodeId>\\\",\\\"start\\\":{\\\"rowIndex\\\":0,\\\"columnIndex\\\":0},\\\"end\\\":{\\\"rowIndex\\\":1,\\\"columnIndex\\\":1}}\\n 4. {\\\"action\\\":\\\"set_cell_text\\\",\\\"nodeId\\\":\\\"<tableNodeId>\\\",\\\"rowIndex\\\":0,\\\"columnIndex\\\":0,\\\"text\\\":\\\"Q1 Revenue\\\"}\\n 5. {\\\"action\\\":\\\"set_row\\\",\\\"nodeId\\\":\\\"<tableNodeId>\\\",\\\"rowIndex\\\":0,\\\"heightPt\\\":24,\\\"rule\\\":\\\"atLeast\\\"}\\n 6. {\\\"action\\\":\\\"set_borders\\\",\\\"nodeId\\\":\\\"<tableNodeId>\\\",\\\"mode\\\":\\\"applyTo\\\",\\\"applyTo\\\":\\\"all\\\",\\\"border\\\":{\\\"lineStyle\\\":\\\"single\\\",\\\"lineWeightPt\\\":1,\\\"color\\\":\\\"#000000\\\"}}\\n 7. {\\\"action\\\":\\\"set_shading\\\",\\\"target\\\":{\\\"kind\\\":\\\"block\\\",\\\"nodeType\\\":\\\"tableCell\\\",\\\"nodeId\\\":\\\"<cellNodeId>\\\"},\\\"color\\\":\\\"#E3F2FD\\\"}\\n 8. {\\\"action\\\":\\\"set_style_options\\\",\\\"nodeId\\\":\\\"<tableNodeId>\\\",\\\"styleOptions\\\":{\\\"headerRow\\\":true,\\\"bandedRows\\\":true}}\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"action\": {\n \"type\": \"string\",\n \"enum\": [\n \"delete\",\n \"delete_column\",\n \"delete_row\",\n \"insert_column\",\n \"insert_row\",\n \"merge_cells\",\n \"move_row\",\n \"set_borders\",\n \"set_cell\",\n \"set_cell_text\",\n \"set_column\",\n \"set_layout\",\n \"set_options\",\n \"set_row\",\n \"set_row_options\",\n \"set_shading\",\n \"set_style_options\",\n \"unmerge_cells\"\n ],\n \"description\": \"The action to perform. One of: delete, delete_column, delete_row, insert_column, insert_row, merge_cells, move_row, set_borders, set_cell, set_cell_text, set_column, set_layout, set_options, set_row, set_row_options, set_shading, set_style_options, unmerge_cells.\"\n },\n \"force\": {\n \"type\": \"boolean\",\n \"description\": \"Bypass confirmation checks.\"\n },\n \"changeMode\": {\n \"type\": \"string\",\n \"description\": \"Edit mode: \\\"direct\\\" applies changes immediately, \\\"tracked\\\" records as suggestions.\"\n },\n \"dryRun\": {\n \"type\": \"boolean\",\n \"description\": \"Preview the result without applying changes.\"\n },\n \"target\": {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"$ref\": \"#/$defs/TableAddress\"\n },\n {\n \"oneOf\": [\n {\n \"oneOf\": [\n {\n \"$ref\": \"#/$defs/TableRowAddress\"\n },\n {\n \"$ref\": \"#/$defs/TableAddress\"\n }\n ]\n },\n {\n \"$ref\": \"#/$defs/TableAddress\"\n }\n ]\n }\n ]\n },\n {\n \"oneOf\": [\n {\n \"$ref\": \"#/$defs/TableRowAddress\"\n },\n {\n \"$ref\": \"#/$defs/TableAddress\"\n }\n ]\n }\n ]\n },\n {\n \"oneOf\": [\n {\n \"$ref\": \"#/$defs/TableRowAddress\"\n },\n {\n \"$ref\": \"#/$defs/TableAddress\"\n }\n ]\n }\n ]\n },\n {\n \"oneOf\": [\n {\n \"$ref\": \"#/$defs/TableRowAddress\"\n },\n {\n \"$ref\": \"#/$defs/TableAddress\"\n }\n ]\n }\n ]\n },\n {\n \"oneOf\": [\n {\n \"$ref\": \"#/$defs/TableRowAddress\"\n },\n {\n \"$ref\": \"#/$defs/TableAddress\"\n }\n ]\n }\n ]\n },\n {\n \"$ref\": \"#/$defs/TableAddress\"\n }\n ]\n },\n {\n \"$ref\": \"#/$defs/TableAddress\"\n }\n ]\n },\n {\n \"$ref\": \"#/$defs/TableAddress\"\n }\n ]\n },\n {\n \"$ref\": \"#/$defs/TableAddress\"\n }\n ]\n },\n {\n \"oneOf\": [\n {\n \"$ref\": \"#/$defs/TableCellAddress\"\n },\n {\n \"$ref\": \"#/$defs/TableAddress\"\n }\n ]\n }\n ]\n },\n {\n \"$ref\": \"#/$defs/TableCellAddress\"\n }\n ]\n },\n {\n \"oneOf\": [\n {\n \"$ref\": \"#/$defs/TableCellAddress\"\n },\n {\n \"$ref\": \"#/$defs/TableAddress\"\n }\n ]\n }\n ]\n },\n {\n \"$ref\": \"#/$defs/TableOrCellAddress\"\n }\n ]\n },\n {\n \"$ref\": \"#/$defs/BlockNodeAddress\"\n }\n ]\n },\n {\n \"$ref\": \"#/$defs/BlockNodeAddress\"\n }\n ]\n },\n {\n \"$ref\": \"#/$defs/BlockNodeAddress\"\n }\n ],\n \"description\": \"Target address. For inline/set_style: prefer 'ref' from superdoc_search, or use {kind:'selection', start:{kind:'text', blockId, offset}, end:{kind:'text', blockId, offset}}. For paragraph actions (set_alignment, set_indentation, set_spacing, set_direction, set_flow_options): use {kind:'block', nodeType:'paragraph'|'heading'|'listItem', nodeId:'<nodeId from blocks list>'}.\"\n },\n \"nodeId\": {\n \"type\": \"string\"\n },\n \"preferredWidth\": {\n \"type\": \"number\",\n \"description\": \"Only for action 'set_layout'. Omit for other actions.\"\n },\n \"preferredWidthType\": {\n \"enum\": [\n \"dxa\",\n \"auto\",\n \"pct\"\n ],\n \"description\": \"Only for actions 'set_layout', 'set_cell'. Omit for other actions.\"\n },\n \"alignment\": {\n \"enum\": [\n \"left\",\n \"center\",\n \"right\"\n ],\n \"description\": \"Only for action 'set_layout'. Omit for other actions.\"\n },\n \"leftIndentPt\": {\n \"type\": \"number\",\n \"description\": \"Only for action 'set_layout'. Omit for other actions.\"\n },\n \"autoFitMode\": {\n \"enum\": [\n \"fixedWidth\",\n \"fitContents\",\n \"fitWindow\"\n ],\n \"description\": \"Only for action 'set_layout'. Omit for other actions.\"\n },\n \"tableDirection\": {\n \"enum\": [\n \"ltr\",\n \"rtl\"\n ],\n \"description\": \"Only for action 'set_layout'. Omit for other actions.\"\n },\n \"position\": {\n \"enum\": [\n \"above\",\n \"below\",\n \"left\",\n \"right\",\n \"first\",\n \"last\"\n ],\n \"description\": \"Required for action 'insert_column'.\"\n },\n \"count\": {\n \"type\": \"integer\",\n \"minimum\": 1,\n \"description\": \"Only for actions 'insert_row', 'insert_column'. Omit for other actions.\"\n },\n \"rowIndex\": {\n \"type\": \"integer\",\n \"minimum\": 0,\n \"description\": \"Only for actions 'insert_row', 'delete_row', 'move_row', 'set_row', 'set_row_options', 'unmerge_cells', 'set_cell_text'. Omit for other actions.\"\n },\n \"destination\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"first\",\n \"type\": \"string\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"kind\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"last\",\n \"type\": \"string\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"kind\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"before\",\n \"type\": \"string\"\n },\n \"rowIndex\": {\n \"type\": \"integer\",\n \"minimum\": 0\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"kind\",\n \"rowIndex\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"after\",\n \"type\": \"string\"\n },\n \"rowIndex\": {\n \"type\": \"integer\",\n \"minimum\": 0\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"kind\",\n \"rowIndex\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"before\",\n \"type\": \"string\"\n },\n \"target\": {\n \"$ref\": \"#/$defs/TableRowAddress\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"kind\",\n \"target\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"after\",\n \"type\": \"string\"\n },\n \"target\": {\n \"$ref\": \"#/$defs/TableRowAddress\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"kind\",\n \"target\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"before\",\n \"type\": \"string\"\n },\n \"nodeId\": {\n \"type\": \"string\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"kind\",\n \"nodeId\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"kind\": {\n \"const\": \"after\",\n \"type\": \"string\"\n },\n \"nodeId\": {\n \"type\": \"string\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"kind\",\n \"nodeId\"\n ]\n }\n ],\n \"description\": \"Required for action 'move_row'.\"\n },\n \"heightPt\": {\n \"type\": \"number\",\n \"exclusiveMinimum\": 0,\n \"description\": \"Required for action 'set_row'.\"\n },\n \"rule\": {\n \"enum\": [\n \"atLeast\",\n \"exact\",\n \"auto\"\n ],\n \"description\": \"Only for action 'set_row'. Omit for other actions.\"\n },\n \"allowBreakAcrossPages\": {\n \"type\": \"boolean\",\n \"description\": \"Only for action 'set_row_options'. Omit for other actions.\"\n },\n \"repeatHeader\": {\n \"type\": \"boolean\",\n \"description\": \"Only for action 'set_row_options'. Omit for other actions.\"\n },\n \"gridBefore\": {\n \"type\": \"integer\",\n \"minimum\": 0,\n \"description\": \"Only for action 'set_row_options'. Omit for other actions.\"\n },\n \"gridAfter\": {\n \"type\": \"integer\",\n \"minimum\": 0,\n \"description\": \"Only for action 'set_row_options'. Omit for other actions.\"\n },\n \"wBefore\": {\n \"type\": \"object\",\n \"properties\": {\n \"value\": {\n \"type\": \"integer\",\n \"minimum\": 0\n },\n \"type\": {\n \"enum\": [\n \"auto\",\n \"dxa\",\n \"nil\",\n \"pct\"\n ]\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"value\",\n \"type\"\n ],\n \"description\": \"Only for action 'set_row_options'. Omit for other actions.\"\n },\n \"wAfter\": {\n \"type\": \"object\",\n \"properties\": {\n \"value\": {\n \"type\": \"integer\",\n \"minimum\": 0\n },\n \"type\": {\n \"enum\": [\n \"auto\",\n \"dxa\",\n \"nil\",\n \"pct\"\n ]\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"value\",\n \"type\"\n ],\n \"description\": \"Only for action 'set_row_options'. Omit for other actions.\"\n },\n \"columnIndex\": {\n \"type\": \"integer\",\n \"minimum\": 0,\n \"description\": \"Required for actions 'delete_column', 'set_column'.\"\n },\n \"widthPt\": {\n \"type\": \"number\",\n \"exclusiveMinimum\": 0,\n \"description\": \"Required for action 'set_column'.\"\n },\n \"start\": {\n \"type\": \"object\",\n \"properties\": {\n \"rowIndex\": {\n \"type\": \"integer\",\n \"minimum\": 0\n },\n \"columnIndex\": {\n \"type\": \"integer\",\n \"minimum\": 0\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"rowIndex\",\n \"columnIndex\"\n ],\n \"description\": \"Required for action 'merge_cells'.\"\n },\n \"end\": {\n \"type\": \"object\",\n \"properties\": {\n \"rowIndex\": {\n \"type\": \"integer\",\n \"minimum\": 0\n },\n \"columnIndex\": {\n \"type\": \"integer\",\n \"minimum\": 0\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"rowIndex\",\n \"columnIndex\"\n ],\n \"description\": \"Required for action 'merge_cells'.\"\n },\n \"preferredWidthPt\": {\n \"type\": \"number\",\n \"description\": \"Only for action 'set_cell'. Omit for other actions.\"\n },\n \"verticalAlign\": {\n \"enum\": [\n \"top\",\n \"center\",\n \"bottom\"\n ],\n \"description\": \"Only for action 'set_cell'. Omit for other actions.\"\n },\n \"wrapText\": {\n \"type\": \"boolean\",\n \"description\": \"Only for action 'set_cell'. Omit for other actions.\"\n },\n \"fitText\": {\n \"type\": \"boolean\",\n \"description\": \"Only for action 'set_cell'. Omit for other actions.\"\n },\n \"text\": {\n \"type\": \"string\",\n \"description\": \"Required for action 'set_cell_text'.\"\n },\n \"color\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"pattern\": \"^(#?([0-9A-Fa-f]{6}|[0-9A-Fa-f]{3})|auto)$\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"description\": \"Required for action 'set_shading'.\"\n },\n \"styleId\": {\n \"type\": \"string\",\n \"description\": \"Only for action 'set_style_options'. Omit for other actions.\"\n },\n \"styleOptions\": {\n \"type\": \"object\",\n \"properties\": {\n \"headerRow\": {\n \"type\": \"boolean\"\n },\n \"lastRow\": {\n \"type\": \"boolean\"\n },\n \"totalRow\": {\n \"type\": \"boolean\"\n },\n \"firstColumn\": {\n \"type\": \"boolean\"\n },\n \"lastColumn\": {\n \"type\": \"boolean\"\n },\n \"bandedRows\": {\n \"type\": \"boolean\"\n },\n \"bandedColumns\": {\n \"type\": \"boolean\"\n }\n },\n \"additionalProperties\": false,\n \"description\": \"Only for action 'set_style_options'. Omit for other actions.\"\n },\n \"mode\": {\n \"enum\": [\n \"applyTo\",\n \"edges\"\n ],\n \"description\": \"Required for action 'set_borders'.\"\n },\n \"applyTo\": {\n \"enum\": [\n \"all\",\n \"outside\",\n \"inside\",\n \"top\",\n \"bottom\",\n \"left\",\n \"right\",\n \"insideH\",\n \"insideV\"\n ],\n \"description\": \"Only for action 'set_borders'. Omit for other actions.\"\n },\n \"border\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"lineStyle\": {\n \"type\": \"string\"\n },\n \"lineWeightPt\": {\n \"type\": \"number\",\n \"exclusiveMinimum\": 0\n },\n \"color\": {\n \"type\": \"string\",\n \"pattern\": \"^(#?([0-9A-Fa-f]{6}|[0-9A-Fa-f]{3})|auto)$\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"lineStyle\",\n \"lineWeightPt\",\n \"color\"\n ]\n },\n {\n \"type\": \"null\"\n }\n ],\n \"description\": \"Only for action 'set_borders'. Omit for other actions.\"\n },\n \"edges\": {\n \"type\": \"object\",\n \"properties\": {\n \"top\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"lineStyle\": {\n \"type\": \"string\"\n },\n \"lineWeightPt\": {\n \"type\": \"number\",\n \"exclusiveMinimum\": 0\n },\n \"color\": {\n \"type\": \"string\",\n \"pattern\": \"^(#?([0-9A-Fa-f]{6}|[0-9A-Fa-f]{3})|auto)$\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"lineStyle\",\n \"lineWeightPt\",\n \"color\"\n ]\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"bottom\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"lineStyle\": {\n \"type\": \"string\"\n },\n \"lineWeightPt\": {\n \"type\": \"number\",\n \"exclusiveMinimum\": 0\n },\n \"color\": {\n \"type\": \"string\",\n \"pattern\": \"^(#?([0-9A-Fa-f]{6}|[0-9A-Fa-f]{3})|auto)$\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"lineStyle\",\n \"lineWeightPt\",\n \"color\"\n ]\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"left\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"lineStyle\": {\n \"type\": \"string\"\n },\n \"lineWeightPt\": {\n \"type\": \"number\",\n \"exclusiveMinimum\": 0\n },\n \"color\": {\n \"type\": \"string\",\n \"pattern\": \"^(#?([0-9A-Fa-f]{6}|[0-9A-Fa-f]{3})|auto)$\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"lineStyle\",\n \"lineWeightPt\",\n \"color\"\n ]\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"right\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"lineStyle\": {\n \"type\": \"string\"\n },\n \"lineWeightPt\": {\n \"type\": \"number\",\n \"exclusiveMinimum\": 0\n },\n \"color\": {\n \"type\": \"string\",\n \"pattern\": \"^(#?([0-9A-Fa-f]{6}|[0-9A-Fa-f]{3})|auto)$\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"lineStyle\",\n \"lineWeightPt\",\n \"color\"\n ]\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"insideH\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"lineStyle\": {\n \"type\": \"string\"\n },\n \"lineWeightPt\": {\n \"type\": \"number\",\n \"exclusiveMinimum\": 0\n },\n \"color\": {\n \"type\": \"string\",\n \"pattern\": \"^(#?([0-9A-Fa-f]{6}|[0-9A-Fa-f]{3})|auto)$\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"lineStyle\",\n \"lineWeightPt\",\n \"color\"\n ]\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"insideV\": {\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"lineStyle\": {\n \"type\": \"string\"\n },\n \"lineWeightPt\": {\n \"type\": \"number\",\n \"exclusiveMinimum\": 0\n },\n \"color\": {\n \"type\": \"string\",\n \"pattern\": \"^(#?([0-9A-Fa-f]{6}|[0-9A-Fa-f]{3})|auto)$\"\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"lineStyle\",\n \"lineWeightPt\",\n \"color\"\n ]\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"additionalProperties\": false,\n \"description\": \"Only for action 'set_borders'. Omit for other actions.\"\n },\n \"defaultCellMargins\": {\n \"type\": \"object\",\n \"properties\": {\n \"topPt\": {\n \"type\": \"number\",\n \"minimum\": 0\n },\n \"rightPt\": {\n \"type\": \"number\",\n \"minimum\": 0\n },\n \"bottomPt\": {\n \"type\": \"number\",\n \"minimum\": 0\n },\n \"leftPt\": {\n \"type\": \"number\",\n \"minimum\": 0\n }\n },\n \"additionalProperties\": false,\n \"required\": [\n \"topPt\",\n \"rightPt\",\n \"bottomPt\",\n \"leftPt\"\n ],\n \"description\": \"Only for action 'set_options'. Omit for other actions.\"\n },\n \"cellSpacingPt\": {\n \"oneOf\": [\n {\n \"type\": \"number\",\n \"minimum\": 0\n },\n {\n \"type\": \"null\"\n }\n ],\n \"description\": \"Only for action 'set_options'. Omit for other actions.\"\n }\n },\n \"required\": [\n \"action\"\n ],\n \"additionalProperties\": false\n }\n }\n }\n ]\n}\n",
|